martedì 9 febbraio 2010

Lyra, tipo di contenuto 'pagina'

Chi ha familiarità con Wordpress o Drupal conosce la differenza tra articolo (story in Drupal) e pagina. Un concetto grosso modo analogo è presente in Joomla che distingue i contenuti standard dai contenuti statici (Joomla 1.0) o dai contenuti non categorizzati (Joomla 1.5). Chi non sapesse invece di cosa si sta parlando troverà un'ottima spiegazione in questo articolo di Html.it.

La ragione di questa distinzione è semplice: in molti casi (in un blog, ma anche nei siti che pubblicano notizie come quotidiani online e simili) è utile gestire in modo diverso gli articoli veri e propri che contengono informazioni 'datate' e i contenuti che contengono informazioni meno sensibili al decorrere del tempo e quindi in un certo senso più 'statiche': ad esempio una pagina con il profilo dell'autore del blog, la descrizione o l'organico dell'azienda.

Anche il modo in cui sono presentate queste due categorie di contenuti è spesso diverso: di regola un articolo contiene l'indicazione della data di pubblicazione e dell'autore, mentre queste informazioni non sono mostrate in una pagina; gli articoli sono presentati in ordine cronologico in prima pagina o nella pagina della rispettiva categoria, mentre le pagine sono accessibili da link o menù; anche il formato delle URL può essere diverso.

E se volessimo creare qualcosa del genere in Lyra? Arrivati a questo punto non è difficile farlo: basterà creare un nuovo tipo di contenuto, page, tanto per non stare ad inventarci nomi diversi, anch'esso gestito dallo stesso modello e modulo che già utilizziamo per il contenuto article.

In effetti le differenze tra articoli e pagine non sono tanto rilevanti da giustificare la creazione di modelli separati: ci basta 'clonare' un tipo di contenuto esistente e sfruttare i parametri di configurazione (vedere Lyra, parametri di configurazione articoli) per differenziare l'apetto degli articoli e delle pagine.

Per prima cosa ho inserito un nuovo record nella tabella content_types nel file con i dati di esempio.

data/fixtures/content_types.yml

LyraContentType:
  ...
  Pagina:
    name: Page
    type: page
    module: article
    model: LyraArticle
    ...

Ho modificato il file routing.yml del backend perché a questo punto fa comodo avere l'ID del tipo di contenuto nella rotta

apps/backend/config/routing.yml
...
lyra_article:
  class: sfDoctrineRouteCollection
  options:
    model:                LyraArticle
    module:               article
    prefix_path:          /article/:ctype_id
    column:               id
    object_actions:
      publish: get
      unpublish: get
      feature: get
      unfeature: get
    with_wildcard_routes: true
...

e pure quello del frontend per differenziare il formato delle URL di articoli e pagine

apps/frontend/config/routing.yml

page_show:
  url: /:slug.html
  class: sfDoctrineRoute
  options:
    type: object
    model: LyraArticle
    method: findItem
  param:
    module: article
    action: show
  requirements:
    sf_method: [get]

I parametri del nuovo tipo di contenuto possono essere impostati dal backend, ad esempio possiamo modificare l'aspetto del contenuto pagina in modo da non mostrare autore e data di creazione e non consentire i commenti.

Altre modifiche si possono vedere nel log della revisione 41. Il tutto richiede un po' di lavoro manuale, ma è possibile che in futuro queste operazioni possano essere gestite direttamente dal backend.

mercoledì 3 febbraio 2010

Lyra, parametri di configurazione globali

Dopo la gestione dei parametri di configurazione a livello di contenuto e di tipo di contenuto, mi è sembrato logico creare una funzione che consenta di impostare dal backend dei parametri di configurazione globali.

Le definizioni di tali parametri, analogamente a quanto avviene per i parametri dei contenuti, è contenuta in un file YAML (config/lyra_params.yml). A partire da questo file viene generato il form (LyraSettingsForm) per l'inserimento e la modifica dei valori che vengono salvati nel database (tabella settings, modello LyraSettings). Infine la classe LyraCfg serve a leggere il valore di un parametro.

Come si vede dalla figura attualmente ci sono solo due parametri di configurazione, quando ne serviranno altri sarà sufficiente aggiungere le definizioni in lyra_params.yml.

Tanto per fare un esempio vediamo come si utilizza il parametro Moderazione commenti.

config/lyra_params.yml

...
moderate_comments:
    type: list
    choices: [moderate_all, moderate_no_auth, moderate_none]
    default: moderate_all
...

Il tipo list indica che il parametro può assumere un valore tra quelli indicati in choices.

  • moderate_all: tutti i commenti sono sempre moderati. Compaiono sul sito solo previa approvazione dell'amministratore.
  • moderate_no_auth: solo i commenti degli utenti anonimi (cioè che visitano il sito senza aver fatto il login) sono moderati.
  • moderate_none: nessuna moderazione, ogni commento è immediatamente visibile sul sito.

Da notare che gli identificativi dei parametri come i valori delle opzioni sono sempre in inglese nel file YAML, ma vengono tradotti nei file di lingua (nella figura all'inizio si vedono infatti in italiano).

In questa parte della funzione updateObject() di LyraCommentForm, a seconda del valore scelto per il parametro si imposta o meno a true il campo is_active (pubblicato) del commento appena inserito.

lib/form/doctrine/LyraCommentsForm.class.php
...
      switch(LyraCfg::get('moderate_comments')) {
        case 'moderate_none':
          $publish = true;
          break;
        case 'moderate_no_auth':
          $publish = $user_auth;
          break;
        case 'moderate_all':
        default:
          $publish = false;
          break;
      }
      $item->setIsActive($publish);
...

Accenno solo brevemente alle altre modifiche contenute nelle revisioni 37 e 38: i file contenenti le definizioni dei parametri di configurazione dei contenuti / tipi di contenuto non sono più nella cartella config dell'applicazione, ma nella cartella config del modulo (backend). Ad esempio

config/params/article.yml

non esiste più, l'equivalente è ora

apps/backend/modules/article/config/params.yml

Il codice nel metodo configure() di LyraArticleForm che gestiva la configurazione dei form embedded usati per visualizzare e modificare i parametri di configurazione dell'articolo è stato spostato in LyraContentForm. Questa parte sarà standard e comune a tutti i tipi di contenuto, inserendola nella classe base eviteremo future duplicazioni di codice. Il tutto sarà più chiaro in seguito appena saranno creati altri tipi di contenuto in aggiunta ad article.

Sono stati aggiunti nuovi campi a LyraContentType: type, model, plugin. A cosa servono si avrà modo di vederlo nelle prossime puntate. Per il momento è tutto.