Zend Framework Tutorial - 5

viewAction

Se l'utente clicca sul titolo di una news in home page, il sito mostra una pagina contenente il testo completo della news selezionata. Per identificare univocamente la news di interesse abbiamo creato il link associato nella forma /news/view/id/news_id dove news_id è il valore della chiave primaria della tabella delle news. Come si può vedere dal codice del metodo viewAction, per recuperare questo valore usiamo la funzione $this->_getParam('id') che ricorda il metodo $this->_hasParam visto nella pagina precedente.

In realtà il metodo $this->_getParam('nome_parametro') è una scorciatoia che equivale al più prolisso $this->getRequest()->getParam('nome_parametro'). Cosa fa $this->getRequest()? Ci restituisce l'oggetto Request, costruito dallo Zend Framework per contenere tutti i dati associati alla richiesta corrente dell'utente: il nome del Controller, il nome della Action, le coppie nome/valore presenti nell'URL e tutti gli eventuali parametri contenuti in $_GET, $_POST, $_COOKIE, $_SERVER e $_ENV. In poche parole tutti i dati provenienti dall'estero, dall'utente, vengono racchiusi automaticamente dallo Zend Framework nell'oggetto Request (similmente a ciò che avviene in una servlet del Java). Tutti questi dati sono nella forma chiave=>valore quindi potenzialmente si sovrappongono l'uno con l'altro (a parità di chiave) secondo l'ordine in cui sono stati elencati, similmente a quello che avviene nell'array $_REQUEST. Se però si vuole recuperare esattamente un particolare parametro, ad esempio proveniente dall'array $_POST, allora si può usare $request->getPost('nome_parametro') dove $request è ovviamente l'oggetto Request ottenuto nel Controller attraverso $this->getRequest().

E' evidente che lo Zend Framework vuole che lo sviluppatore non acceda direttamente alle variabili superglobali ma che lo faccia attraverso l'oggetto Request. In questo modo tutti i dati provenienti dall'esterno sono raggruppati in un unico oggetto e sono accessibili tutti allo stesso modo, indipendentemente dalla loro particolare provenienza. Inoltre così si evita di modificare involontariamente uno di questi dati (if ($_POST['parametro'] = 'valore') al posto di if ($_POST['parametro'] == 'valore')).

E' bene precisare comunque che l'oggetto Request non filtra in alcun modo i dati in esso conservati, operazione affidata ad altri componenti del framework che in questo tutorial non abbiamo considerato.

Chiarito le modalità di accesso ai dati provenienti dall'esterno vediamo il codice dell'Action che mostra una news all'utente:

public function viewAction()
{
    $news = new News();

    $newsId = $this->_getParam('id');
    $news = $news->getNewsById($newsId);

    if(!$news) {
        throw new Zend_Controller_Action_Exception;
    }

    $this->view->titoloPagina = $news['titolo'];
    $this->view->news = $news;
}

Tutte le istruzioni dovrebbero ormai essere chiare, tranne che per l'eccezione sollevata nel caso in cui il metodo getNewsById() del Model non restituisce alcun risultato. Se questo avviene significa che l'id della news recuperato dall'URL non corrisponde ad una news memorizzata nel database. Questo problema viene gestito simulando un errore di "pagina non trovata". L'eccezione Zend_Controller_Action_Exception interrompe l'esecuzione di viewAction() e risale fino al Front Controller (o meglio fino al dispatcher) che reagisce richiamando l'ErrorController che a sua volta mostrata una pagina di errore. L'ErrorController quindi, oltre ad essere richiamato automaticamente dal framework, può essere invocato in maniera programmatica da qualunque altro Controller, nel modo appena visto.

Terminata l'esecuzione della viewAction, per le convenzioni sui nomi dei template, viene automaticamente caricato il template /views/scripts/news/view.phtml, riportato di seguito.

<?php echo $this->render('header.phtml'); ?>
<div class="news">
    <div class="autore">di <?php echo $this->escape($this->news['autore']) ?> | <?php echo $this->escape($this->news['data']) ?></div>
    <div class="modifica">
        <a href="<?php echo BASE_URL?>news/edit/id/<?php echo $this->escape($this->news['news_id']) ?>/">Modifica</a>
        -
        <a href="<?php echo BASE_URL?>news/delete/id/<?php echo $this->escape($this->news['news_id']) ?>/">Cancella</a>
    </div>
    <div class="testo">
        <?php echo nl2br($this->escape($this->news['testo_intro'])) ?>
        <br />
        <?php echo nl2br($this->escape($this->news['testo_completo'])) ?>
    </div>
</div>
<a href="<?php echo BASE_URL?>">&lt;&lt; Indietro</a>
<?php echo $this->render('footer.phtml'); ?>

1 commento

1 Grisou Grisou lunedì 23 novembre 2009, ore 21:43
Ciao, grazie anche a questi tutorial, dai quali ho preso alcuni spunti ho convertito il mio vecchio sito (Grisou.org) precedentemente realizzato con Joomla! ad un'applicazione custom realizzata con Zend_Framework. Spero presto di poter portare questa esperienza nella società per cui lavoro (Excite - www.excite.it / GoAdv - www.goadv.net),
Effettua l'accesso o registrati per inserire un commento