giovedì 12 novembre 2009

Lyra, gestione commenti backend

Iniziamo lo sviluppo della gestione commenti nel backend. Prima di tutto creiamo il modulo.

./symfony doctrine:generate-admin backend LyraComment --module=comment

Poi passiamo alla personalizzazione del file generator.yml.

apps/backend/modules/comment/config/generator.yml

...
config:
      ...
      list:
        title: TITLE_COMMENTS
        display: [comment_article,author_name,content,_published,created_at]
        fields:
          comment_article: {label: TH_ARTICLE_TITLE}
          author_name: {label: TH_AUTHOR_NAME}
          author_email: {label: TH_AUTHOR_EMAIL}
          author_url: {label: TH_AUTHOR_URL}
          content: {label: TH_CONTENT}
          created_at: {label: TH_CREATED_AT, date_format: dd.MM.yy hh:ss}
          updated_at: {label: TH_UPDATED_AT, date_format: dd.MM.yy hh:ss}
        batch_actions:
          _delete: ~
          publish: {label: PUBLISH}
          unpublish: {label: UNPUBLISH}
        table_method: getBackendItemsQuery
...

Vediamo i vari 'blocchi' uno ad uno.

Elenco commenti

In list definiamo la configurazione delle lista commenti: impostiamo il titolo della pagina (title) in una forma che dovrà essere tradotta nei file di lingua, l'elenco delle colonne (display) con le relative intestazioni e formato (fields) e le azioni batch delete (predefinita), publish e unpublish che dovremo implementare in modo del tutto analogo a quanto fatto per la gestione articoli (simfony, personalizzare il backend).

Da notare la presenza di comment_article nella lista dei campi da mostrare nelle colonne dell'elenco: non è un campo della tabella Commenti, ma l'identificatore di una relazione impostata nello schema, solo che nel file di configurazione si separano le parole con il carattere sottolineato, nella definizione dello schema si utilizza il 'camel case'.

config/doctrine/schema.yml

LyraComment:
 ...
  relations:
    CommentArticle:
      class: LyraArticle
      local: article_id
      foreign: id
      foreignAlias: ArticleComments
      onDelete: CASCADE

In questo modo possiamo avere nell'elenco il titolo dell'articolo invece dell'ID.

La colonna _published mostra il contenuto di un partial. Serve a consentire la modifica dello stato pubblicato non pubblicato del commento restando nella visualizzazione elenco. La spiegazione nei dettagli è nell'articolo precedente perché il funzionamento è identico a quello della stessa colonna della gestione articoli: le azioni publish ed unpublish, collegate alle icone nel partial (apps/backend/modules/comment/templates/_published.php), sono gestite come di regola dalla classe commentActions, il metodo publish() è implementato in LyraComment.

Azioni batch

Anche per quanto riguarda questa parte posso tranquillamente rimandare all'articolo precedente visto che il funzionamento delle azioni batch publish e unpublish è identico a quello della gestione articoli.

Query creazione lista

Quando in una lista che mostra i record di una tabella il contenuto di una colonna viene ottenuto da una tabella correlata, come nel nostro caso il titolo dell'articolo dalla tabella articoli, conviene modificare la query utilizzata per l'estrazione dei record ed aggiungere una JOIN tra le tabelle. In questo modo si evita l'esecuzione di una query SQL distinta per ogni riga della lista.

La chiave table_method indica il nome del metodo che ritorna la query da eseguire e che viene implementato nel modello.

lib/model/doctrine/LyraCommentTable.class.php

class LyraCommentTable extends Doctrine_Table
{
  ...
  public function getBackendItemsQuery(Doctrine_Query $q)
  {
    $rootAlias = $q->getRootAlias();
    $q->leftJoin($rootAlias . '.CommentArticle a');

    return $q;
  }
}

Filtri commenti

apps/backend/modules/comment/config/generator.yml

...
    config:
      ...
      list:
      ...
      filter:
        display: [article_id, is_active]
      ...

In filter impostiamo i filtri di ricerca che ci consentono di visualizzare nell'elenco i commenti pubblicati o non pubblicati (is_active) e tutti i commenti di un determinato articolo (article_id).

Modifica commento

apps/backend/modules/comment/config/generator.yml

...
    config:
     ...
      list:
       ...
      filter:
       ...
      form:
        class: BackendLyraCommentForm
       ...

Come si è visto la pubblicazione di un commento può essere fatta rimanendo nella visualizzazione elenco, se invece serve modificare il testo o uno degli altri campi si utilizza la funzione modifica standard.

In form specifichiamo la classe da utilizzare per il modulo di inserimento e modifica commenti del backend. La classe deriva da quella creata per il frontend a sua volta derivata dalla classe base generata da Doctrine.

lib/form/doctrine/BackendLyraCommentForm.class.php

class BackendLyraCommentForm extends LyraCommentForm
{
  public function configure()
  {
      parent::configure();
      $this->widgetSchema['is_active']->setLabel('IS_ACTIVE');

      $this->widgetSchema->setHelp('author_email',false);
      $this->widgetSchema->moveField('is_active', sfWidgetFormSchema::FIRST);

  }
  protected function removeFields()
  {
      unset($this['created_at'], $this['updated_at']);
  }
}

Nel metodo configure(), prima richiamiamo la configurazione della classe base e poi impostiamo le configurazioni specifiche per il backend. Sovrascrivendo il metodo removeFields() possiamo rendere visibili nel form di backend campi che erano stati resi invisibili nel form di frontend, in particolare il campo is_active che contiene lo stato pubblicato / non pubblicato del commento.

Resta da sistemare il link che porta dall'elenco articoli alla lista dei commenti inseriti su un articolo.

apps/backend/modules/article/templates/_comments.php

<?php
$total = $lyra_article->countComments();
echo $total . ' / ' . ($total - $lyra_article->countActiveComments());
?>
 (<?php echo link_to(__('LINK_SHOW_COMMENTS'),'@lyra_comment_comment?id=' . $lyra_article->getId()); ?>)

Si crea il link in base alla rotta che porta alla lista commenti (azione index) aggiungendo un parametro id (articolo). Poi nella classe actions del modulo commenti si legge il parametro per impostare automaticamente un filtro che visualizzi i commenti dell'articolo con quel determinato ID.

apps/backend/modules/comment/actions/actions.class.php

class commentActions extends autoCommentActions
{
  ...
  public function executeIndex(sfWebRequest $request)
  {
    if($request->getParameter('id')) {
      $this->setFilters(array('article_id'=>$request->getParameter('id')));
    }
    parent::executeIndex($request);
    
  }
}

Impostato il filtro, si passa il controllo all'azione della classe base che è poi quella creata dal generatore del backend.

Ho infine corretto un errore nella classe actions del modulo article del frontend: dopo la modifica delle rotte degli articoli (in Generare URL SEF in symfony) il reindirizzamento alla pagina dell'articolo dopo aver inserito un commento non funzionava più. Tutto questo si trova nella revisione 20.

Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.