lunedì 2 novembre 2009

Lyra, componente etichette

Sui blog o altri siti che pubblicano notizie e articoli è abbastanza comune trovare un menù con una lista di collegamenti a pagine che mostrano l'elenco degli articoli appartenenti ad una determinata categoria. Un esempio è data dal riquadro Etichette presente nella colonna destra delle pagine di questo blog. Vediamo come implementare questa funzione in Lyra.

Quando si devono visualizzare informazioni in una colonna laterale o comunque in un'area diversa dal corpo principale della pagina si può utilizzare un componente.

Vediamo innanzi tutto come il componente viene richiamato dal layout:

apps/frontend/templates/layout.php

...
<div id="rightbar">
  <?php include_component('article', 'labels', array('catalog'=>'Argomento')) ?>
</div>
...

Gli argomenti passati alla funzione helper include_component() sono nell'ordine: il nome del modulo, il nome del componente, un array opzionale contenente parametri che saranno accessibili dal codice del componente (vedremo subito come).

In symfony un componente consiste in una action ed un template.

Action di un componente

Viene implementata come metodo [componente]Execute() di una classe [modulo]Components derivata da sfComponents e definita in apps/frontend/modules/[modulo]/actions/components.class.php. Nel nostro caso (componente labels, modulo article) quindi

apps/frontend/modules/article/actions/components.class.php

class articleComponents extends sfComponents
{
  public function executeLabels(sfWebRequest $request)
  {
    $catalog = Doctrine::getTable('LyraCatalog')
      ->findOneByName($this->catalog);
    $this->tree = $catalog->getLabelTree();
  }
}

$this->catalog contiene il valore del parametro catalog contenuto nell'array di parametri passato ad include_component(). Questo valore viene passato a findOneByName() per ottenere l'oggetto record corrispondente, poi con getLabelTree() otteniamo l'albero delle etichette associate al catalogo. Questo metodo va ovviamente implementato nella classe LyraCatalog.

lib/model/doctrine/LyraCatalog.class.php

class LyraCatalog extends BaseLyraCatalog
{
  public function getLabelTree()
  {
    $q = Doctrine_Query::create()
      ->from('LyraLabel l')
      ->where('l.catalog_id = ? and l.level = 0', $this->getId());

    $root = $q->fetchOne();

    return $root->getNode()->getDescendants();
  }
}

Per capire il codice va tenuto presente che esistono relazioni gerarchiche tra i record della tabella Etichette. I record a livello zero (ne esiste uno per ogni catalogo) sono le radici dell'albero delle categorie associate ad un catalogo. Con una query selezioniamo il record radice del catalogo ($root): i suoi discendenti sono l'albero delle categorie che ci interessa e che possiamo ottenere semplicemente con la chiamata ad un singolo metodo getDescendants() perché la tabella Etichette è costruita come nested set (vedere LyraLabel in config/doctrine/schema.yml).

Template di un componente

Il template di un componente non è diverso da quelli già visti per le singole azioni di un modulo.

<h4><?php echo __('HEAD_LABELS')?></h4>
<ul class="label-list">
<?php foreach($tree as $node): ?>
  <li class="lev<?php echo $node->getLevel(); ?>">
    <?php echo link_to($node->getName(),'article/label?id='.$node->getId()); ?>
  </li>
<?php endforeach ?>
</ul>

Tutto dovrebbe essere abbastanza chiaro. Faccio notare solo che:

  • $tree nel template contiene il valore della proprietà assegnata nell'azione con $this->tree con il meccanismo già visto in precedenza;
  • sarà necessario creare una nuova azione (label) nel modulo article che servirà a visualizzare la pagina con l'elenco degli articoli appartenenti alla categoria. La funzione helper link_to() genera un link per questa azione.

L'implementazione dell'azione label sarà fatta la prossima volta. Per il momento quanto sviluppato fino a questo punto si trova nella revisione 16 su Google Code.

Nessun commento:

Posta un commento

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