lunedì 19 ottobre 2009

Lyra, inserimento e modifica articoli (frontend)

Come accennato quando sono state delineate le funzionalità principali della versione iniziale di Lyra, gli articoli potranno essere inseriti e modificati sia dal frontend che dal backend dell'applicazione.

Il backend ancora non c'è, ma si può iniziare lo sviluppo delle funzioni di inserimento e modifica dei contenuti da frontend. Questo permette tra l'altro di spendere qualche parola sulla gestione dei form in symfony.

Classi form

Quando si eseguono i comandi doctrine:build-forms, doctrine:build-all o doctrine:build-all-reload il framework utilizza le informazioni contenute nel file config/doctrine/schema.yml per genereare automaticamente le classi dei form: in particolare in lib/form/doctrine/base troviamo le classi base che vengono ricreate ogni volta che si esegue uno dei comandi appena nominati, in lib/form/doctrine troviamo le classi derivate dalle classi base che sono inizialmente create vuote e mai sovrascritte da comandi del framework. Quindi è in queste ultime che dovremo scrivere il codice per personalizzare un form. Al momento la classe che ci interessa è LyraArticleForm.

Azioni di inserimento, modifica, cancellazione

Procediamo con ordine iniziando dalle azioni. Dato che l'inserimento, modifica e cancellazione dei dati sono operazioni frequenti che è facile standardizzare, symfony genera le relative azioni automaticamente quando si crea un modulo. I metodi che processano queste azioni per il modulo article si trovano nella classe articleActions in apps/frontend/modules/article/actions/actions.class.php. Quelli che ci interessano (vedremo la cancellazione un'altra volta) sono:

  • executeNew() visualizza il form per l'inserimento di un articolo;
  • executeCreate() valida il form di inserimento (chiamando il metodo protetto processForm()) e, in mancanza di errori, crea un nuovo articolo;
  • executeEdit() visualizza il form per la modifica di un articolo;
  • executeUpdate() valida il form di modifica (sempre tramite processForm()) e, in mancanza di errori, salva le modifiche.

Il flusso tra queste operazioni, visualizzazione del form, validazione e salvataggio dello stesso con creazione o modifica del record o rivisualizzazione del form con errori in caso di mancata validazione, è spiegato in dettaglio nel tutorial ufficiale: Giorno 10: Form, vedere in particolare il diagramma sotto il paragarafo "L'azione del form".

Barra di amministrazione

Ovviamente gli utenti devono avere a disposizione dei link attraverso i quali eseguire una una delle azioni appena viste. Ispirandomi a Jobeet, l'applicazione di esempio di symfony, creo una barra di amministrazione: un semplice DIV che si sovrappone al contenuto e racchiude una lista di link. La barra dovrà essere visibile solo agli utenti autorizzati alle operazioni di inserimento, modifica e cancellazione articoli, ma per il momento, mancando qualsiasi gestione utenti, sarà visibile a tutti. Questo non è un problema perché in questa fase l'applicazione viene eseguita solo in locale.

Creiamo come prima cosa un partial

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

<div id="admin-bar">
  <span class="action"><?php echo link_to(__('LINK_NEW'), 'article/new') ?></span>
  <span class="action"><?php echo link_to(__('LINK_EDIT'), 'article/edit?id='.$item->getId()) ?></span>
  <span class="action"><a href="#"><?php echo __('LINK_LOGOUT') ?></a></span>
</div>

Il formato delle rotte utilizzate nelle funzioni helper link_to() è quello già visto in precedenza: modulo/azione/parametri. Per il testo (ancora) dei link si utilizza una costante che sarà sostituita dalla traduzione nella lingua selezionata per l'interfaccia. Di questo si occupa la funzione helper __(), già incontrata in Lyra, azioni del modulo article a proposito della traduzione del link 'leggi tutto'. I file di traduzione si trovano nella cartella apps/frontend/i18n

Il partial viene richiamato dal template che visualizza l'articolo a tutta pagina.

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

<?php include_partial('article/admin_bar', array('item' => $item)); ?>
<h1 class="article-title">
...

Personalizzazione del form

Già a questo punto le operazioni di inserimento e modifica di un articolo funzionerebbero grazie al codice autogenerato presente nei metodi di gestione delle azioni. Bisogna però personalizzare l'aspetto del form nel metodo configure() della classe LyraArticleForm. Non riporto per intero il codice perché si tratta di operazioni semplici ed esempi analoghi di configurazione di un form si trovano nel codice di Jobeet: vengono rimossi dalla visualizzazione tutti i campi che non devono essere gestiti dall'utente, vengono rinominate le etichette di campi utilizzando costanti stringa da tradurre e viene modificato l'ordine di alcuni campi.

L'unica parte più complessa è la generazione delle liste di selezione attraverso le quali si scelgono le etichette da assegnare all'articolo. Per poter dare anche solo qualche cenno di spiegazione di questa parte, occorre prima capire l'utilizzo di Cataloghi ed Etichette per categorizzare i contenuti in Lyra. Ho già accennato qualcosa, ma arrivati a questo punto è necessaria una trattazione più esauriente che merita un post a parte, il prossimo.

Tutte le modifiche sono incluse nella revisione 12. Per allinearsi a questa revisione oltre al checkout della propria copia di lavoro locale è necessario eseguire i comandi

./symfony doctrine:build-all-reload
./symfony cc

A questo punto scrivendo nella barra indirizzi del browser

http://lyra/frontend_dev.php/

si apre la prima pagina con gli articoli dei dati di esempio. Visualizzando un articolo a pagina intera compare la barra di amministrazione: è già possibile modificare o inserire un articolo anche se il form è ancora abbastanza rudimentale. Bisogna ricordarsi di impostare sempre lo stato Pubblicato e Prima pagina perché senza backend e avendo nel frontend solo la prima pagina, questo è l'unico modo per vedere l'articolo inserito.

Nessun commento:

Posta un commento

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