Creare un modulo per Orchard

by Andrea 21 April 2011 04:59

Chi già conosce le Aree di ASP.NET MVC non dovrà imparare nulla di nuovo. Creare un modulo per Orchard infatti è la medesima cosa di creare un'Area in un progetto ASP.NET MVC.
(Walkthrough: Organizing an ASP.NET MVC Application using Areas)

Iniziamo utilizzando il tool da command-line Orchard.exe che troviamo nella bin del progetto, avendo precedentemente abilitato il modulo 'Code Generation'.
Modules_projectAll'interno della console digitiamo 'codegen module Dottor.Articles'
in modo da far creare ad Orchard un progetto contenente tutta la struttura per un nuovo modulo, chiamato 'Dottor.Articles', e verrà creato all'interno della cartella Modules.

La struttura del progetto appena creato è molto simile a quella di un'area di ASP.NET MVC. Le cartelle presenti di default hanno dei nomi ben parlanti:

  • Controllers: per i controller che utilizzeremo all'interno del modulo
  • Model: per il model, e la parte di interazione con la base dati
  • Scripts: file javascript specifici del modulo da realizzare
  • Styles: fogli di stile
  • View: conterrà le View, cioè la parte di UI del modulo corrente

Pre prima cosa, personalizziamo il file Module.txt, modificandolo con le informazioni specifiche nel nuovo modulo.

Name: Dottor.Articles
AntiForgery: enabled
Author: Andrea Dottor
Website: http://www.dottor.net
Version: 1.0
OrchardVersion: 1.0
Description: Modulo per la visualizzazione di articoli
Features:
    Dottor.Articles:
        Description: Modulo per la visualizzazione di articoli

Avendo detto che il modulo è un'Area di ASP.NET MVC, lo andiamo subito a specializzare andando a specificare le eventuali regole di routing, creando un file Routes.cs nella root del nostro modulo.
Questo file conterrà una classe Routes che implementerà Orchard.Mvc.Routes.IRouteProvider. In questa classe andremo a specificare le regole di routing per indirizzare gli url verso le corrette action dei nostri controller.
Nel caso di questo modulo, avremmo solamente due url possibili:

  • /Articles -> che visualizzerà la lista di articoli
  • /Articles/{id}/{slug} -> che visualizzerà un preciso articolo

la classe sarà quindi la seguente:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Orchard.Mvc.Routes;
using System.Web.Routing;
using System.Web.Mvc;
 
namespace Dottor.Articles
{
    public class Routes : IRouteProvider
    {
        public void GetRoutes(ICollection<RouteDescriptor> routes)
        {
            foreach (var routeDescriptor in GetRoutes())
                routes.Add(routeDescriptor);
        }
 
        public IEnumerable<RouteDescriptor> GetRoutes()
        {
            return new[] {
                new RouteDescriptor {
                    Priority = 5,
                    Route = new Route(
                        "Articles",
                        new RouteValueDictionary {
                            {"area", "Dottor.Articles"},
                            {"controller", "Home"},
                            {"action", "List"}
                        },
                        new RouteValueDictionary(),
                        new RouteValueDictionary {
                            {"area", "Dottor.Articles"}
                        },
                        new MvcRouteHandler())
                },
                new RouteDescriptor {
                    Priority = 5,
                    Route = new Route(
                        "Articles/{id}/{slug}",
                        new RouteValueDictionary {
                            {"area", "Dottor.Articles"},
                            {"controller", "Home"},
                            {"action", "Details"}
                        },
                        new RouteValueDictionary{
                            {"id", "\\d+"}
                        },
                        new RouteValueDictionary {
                            {"area", "Dottor.Articles"}
                        },
                        new MvcRouteHandler())
                }
            };
        }
    }
}

Da questo punto in poi, nulla è diverso dalla normale programmazione ASP.NET MVC

  • Creare un controller HomeController.cs
    • Creare una action List() che ritorna una lista di articoli
    • Creare una action Details(int id, string slug) che ritorna il specifico articolo
  • Crare all'interno della cartella View, una cartella Home
    • Creare all'interno di Home una view List.cshtml che si occupa di renderizzare la lista di articoli, che avranno il link alla pagina di dettaglio
    • Creare all'interno di Home una view Details.cshtml che si occupa di renderizzare il singolo articolo

Modules_enableFinito lo sviluppo del modulo, dalla sezione Modules della dashoboard di Orchard sarà possibile abilitarlo.

Per accedere a questa nuova sezione/modulo, dovremmo (ma non è obbligatorio) creare una nuova voce di menù che ci permetta di accedere con facilità.
Quindi, dalla sezione Navigation della dashboard, aggiungiamo una nuova voce di menù, che abbia come url lo stesso impostato nelle regole di routing (/Articles).

Modules_navigation

Creata la voce di menù, saremo pronti a navigare utilizzando le funzionalità che il nuovo modulo metterà a disposizione.

Alcune considerazioni personali.
Lo sviluppo di un nuovo modulo ha una curva di apprendimento quasi pari a zero per una persona che già conosce ASP.NET MVC, e quindi direi che la cosa è del tutto positiva. Mentre, uno sviluppatore che conosca solo ASP.NET Web Form dovrà faticare un pò per entrare nell'ottica del nuovo pattern, e i tempi inizialmente si potranno dilungare, e anche di molto.

In questo esempio, ho recuperato la lista degli articoli da un database differente da quello utilizzato da Orchard, e quindi nulla di diverso da quello che viene fatto abitualmente.
Uno dei prossimi argomenti che vedremo, sarà il come utilizzare il database di Orchard per salvare tutte le informazioni del modulo, e avere quindi la possibilità di renderlo pubblico (e quindi utilizzabile in qualsiasi intallazione di Orchard).

Per approfondire l'argomento: http://www.orchardproject.net/docs/

Tags: , ,

ASP .NET | .NET | Microsoft

Comments are closed