Zend Framework Tutorial - 5

newAction

La Action che si occupa di inserire una nuova news nel database ha una struttura particolare, che rende le poche righe di codice che la costituiscono davvero efficienti. Infatti newAction deve mostrare il form di inserimento, inserire la news se tutti i dati inviati sono corretti e mostrare nuovamente il form con i dati precedentemente inseriti se questi non sono corretti. Analizziamone il funzionamento.

In qualunque situazione ci troviamo assegnamo il titolo alla pagina e specifichiamo il nome del template da mostrare (righe 3 e 6). Infatti il template usato per inserire o modificare una news è unico, quindi non potrà rispettare la convenzione sui nomi e di conseguenza non verrebbe caricato automaticamente. La riga 6 serve proprio a specificare un template diverso da quello che l'oggetto viewRenderer, responsabile del caricamento automatico dei template, si sarebbe aspettato.

Se è stato effettuato l'invio del form ($request->isPost() in riga 9) allora dobbiamo provare ad inserire la nuova news nel database. Recuperiamo quindi i dati inseriti dall'utente con $request->getPost('nome_parametro') ed invochiamo il metodo insertUpdateNews del Model $news (riga 19). Se tutto va bene memorizziamo un messaggio di successo nel flashMessenger ed effettuiamo il redirect alla home page. Se invece il Model $news solleva un'eccezione a causa di un problema con i dati inseriti dall'utente, allora mostro un messaggio di errore (riga 23) insieme ai dati inviati dall'utente (righe 24-27)

public function newAction()
{
    $this->view->titoloPagina = 'Inserisci una news';

    // Utilizza 'news/news-form.phtml' invece di  'news/new.phtml'
    $this->_helper->viewRenderer->setScriptAction('news-form');

    $request = $this->getRequest();
    if($request->isPost())
    {
        $news = new News;

        $autore        = $request->getPost('autore');
        $titolo        = $request->getPost('titolo');
        $testoIntro    = $request->getPost('testo_intro');
        $testoCompleto = $request->getPost('testo_completo');

        try {
            $news->insertUpdateNews(false,$autore,$titolo,$testoIntro,$testoCompleto);
            $this->_flashMessenger->addMessage("News '$titolo' memorizzata con successo");
            $this->_redirect('/');
        } catch (Zend_Exception $e) {
            $this->view->errorMsg = $e->getMessage();
            $this->view->news = array('autore' => $autore,
            'titolo'        => $titolo,
            'testo_intro'   => $testoIntro,
            'testoCompleto' => $testoCompleto);
        }
    }
}

Di seguito è riportato il codice del template utilizzato per l'inserimento e la modifica di una news. Si noti l'utilizzo dei metodi $this->formText e $this->formTextarea, appartenenti alla categoria dei View Helpers, che servono a creare dinamicamente i campi di inserimento dati del form. Questi metodi accettano tre parametri: il nome del controllo (l'attributo name), il contenuto del controllo (l'attributo value, che non necessita di escape!) e un array contenente una o più coppie "nome_attributo"=>"valore". Nel nostro esempio questo array viene utilizzato per specificare una classe CSS.

news-form.phtml

<?php echo $this->render('header.phtml'); ?>
<p class="errore"><?php echo $this->escape($this->errorMsg)?></p>
<form action="" method="post">
    <fieldset>
    <legend>Dati della news</legend>
        <p><label>Autore*:<br />
            <?php echo $this->formText('autore', $this->news['autore'], array('class'=>'inputForm')) ?>
        </label></p>
        <p><label>Titolo*:<br />
            <?php echo $this->formText('titolo', $this->news['titolo'], array('class'=>'inputForm')) ?>
        </label></p>
        <p><label>Testo introduttivo*:<br />
            <?php echo $this->formTextarea('testo_intro', $this->news['testo_intro'],array('rows' => 5,'cols'=>50)) ?>
        </label></p>
        <p><label>Testo completo:<br />
            <?php echo $this->formTextarea('testo_completo', $this->news['testo_completo'],array('rows' => 5,'cols'=>50)) ?>
        </label></p>
        <p>* campo obbligatorio</p>
        <div class="buttons">
            <input type="submit" name="annulla" value="Annulla" /><input type="submit" name="invia" value="Invia" />
        </div>
    </fieldset>
</form>
<?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