giovedì 14 gennaio 2010

Lyra, parametri di configurazione articoli

Fino a questo punto l'aspetto dei contenuti è determinato esclusivamente dal layout e dai template creati nelle diverse action. Si presenta quindi l'esigenza di consentire all'utente un certo grado di personalizzazione dei contenuti attraverso opzioni o parametri di configurazione accessibili dal backend dell'applicazione.

Questo tipo di funzionalità è presente in molti cms e se ne capisce facilmente la ragione. Solo per fare un esempio, costringere l'utente alla modifica dei template per impostare un diverso formato della data di visualizzazione degli articoli sarebbe scomodo e quasi sicuramente causa di errori.

Vediamo quindi come verranno gestiti i parametri di configurazione dei contenuti in Lyra. Ogni parametro potrà essere impostato a livello di singolo articolo e di tipo di contenuto: se il valore di un parametro non è impostato in modo specifico per un singolo articolo, sarà utilizzato il valore del parametro impostato per il tipo di contenuto.

Facciamo un esempio.

1) parametri del tipo di contenuto article

2) parametri di un singolo articolo.

Con riguardo all'articolo in questione, il parametro 'Mostra data' è impostato su No, tutti gli altri prendono i valori predefiniti impostati sul tipo di contenuto (nell'esempio saranno tutti ).

Per vedere come i valori dei parametri di configurazione vengono letti dall'applicazione basta dare uno sguardo ad uno dei template del modulo article, ad esempio questo

apps/frontend/modules/article/templates/_byline.php

<div class="article-byline">
  <?php if($item->getCfg('show_author')): ?>
  <span class="article-author">
    <?php echo __('ARTICLE_WRITTEN_BY', array('%author%'=> $item->getArticleCreatedBy()->getUsername()));?>
  </span>
  <?php endif; ?>
  <?php if($item->getCfg('show_date')): ?>
  <span class="article-date">
    <?php echo __('ARTICLE_WRITTEN_ON', array('%date%'=>format_date($item->getCreatedAt(),'dd MMMM, yyyy'))); ?>
  </span>
  <?php endif; ?>
</div>

Il metodo getCfg() è implementato in una nuova classe LyraContent. Si sfrutta l'ereditarietà di Doctrine per derivare LyraArticle da questa classe base

config/doctrine/schema.yml

LyraContent:
  columns:
    ctype_id:
      type: integer(4)
    params:
      type: clob

LyraArticle:
  tableName: articles
  inheritance:
    extends: LyraContent
    type: concrete
...

Anche le classi che gestiranno gli altri tipi di contenuto saranno derivate da LyraContent in modo che le funzionalità relative ai parametri di configurazione siano comuni a tutti i contenuti gestiti dal cms.

L'impostazione dei parametri avviene nel backend tramite i form da cui provengono le schermate riportate all'inizio di questo articolo. La classe relativa è LyraParamsForm: i widget per inserire il valore di ogni parametro sono generati dinamicamente a partire dalle informazioni contenuto in un file YAML. Per quanto riguarda il tipo di contenuto article abbiamo config/params/article.yml, file analoghi saranno creati per ciascun tipo di contenuto. Per creare un nuovo parametro basta aggiungerne la definizione in questo file.

Analogamente a quanto visto per il form con le liste di selezione delle etichette, anche il form con i parametri di configurazione non viene utilizzato da solo, ma incorporato (embedded) in altri form: vedere le istruzioni nei metodi configure() di BackendLyraArticleForm e LyraContentTypeForm.

Nomino infine la classe LyraParams che contiene funzioni per la lettura/scrittura dei parametri di configurazione da e nel database (campo params di LyraContent e LyraContentType).

Per il momento sono disponibili un numero limitato di opzioni di configurazione, altre ne saranno aggiunte via via che servono, ho scritto anche i test funzionali per testare questa parte. Tutto questo è disponibile nella revisione 35.