Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-04-2011 14:46:38

Kenny
Membre
Date d'inscription: 09-04-2011
Messages: 11

[RESOLU][Zend_Form][1.11]Form., cible & traitement:meilleure solution?

Bonjour,

Je suis en train de faire mon site perso, dont un blog fait maison.

Pour ajouter un article, j'utilise :
    - Un Zend_Form pour le formulaire
    - Un controller Article comportant les actions add et edit
    - et les vues associées aux actions

Maintenant pour rendre cohérent l'ensemble, plusieurs solutions s'offrent a moi, et je ne sais pas laquelle choisir :

Solution 1 : Le zend form à pour cible (son action) une action "process" qui se chargera de sauvegarder ou éditer (présence ou non d'un id) l'article. Ainsi dans l'action add et edit, je n'ai qu'a rendre visuelement le formulaire.

Solution 2 : Le zend form cible soit add (cible que je spécifierai dans l'action via un setAction('article/add')), ainsi dans l'action add, je vérifie si le formulaire a été soumis et si oui je sauvegarde l'article. Idem dans edit. Le problème c'est qu'il y a redondance de code.

Solution 3: Dans chaque actions edit et add, je rend le fomulaire, et si le formulaire a été soumis, j'appelle une autre action "process" (via ActionStack ?) qui se chargera de sauvegarder ou de modifier l'article.

Voila, je ne sais pas si j'ai été assez clair, n'hésitez pas a me demander plus d'infos. Et surtout si vous avez une solution autre que les 3 citées au dessus, je suis preneur ! Je cherche la solution qui colle le plus au MVC, et la plus maintenable !

Merci d'avance smile

Dernière modification par Kenny (11-04-2011 20:49:23)

Hors ligne

 

#2 10-04-2011 00:52:33

nuxwin
Membre
Lieu: Caen (14)
Date d'inscription: 17-03-2011
Messages: 66

Re: [RESOLU][Zend_Form][1.11]Form., cible & traitement:meilleure solution?

Bonjour ;

Pour répondre, voici un exemple concret assez simple:

Code:

[lang=php]
/**
 * Posts controller
 *
 * @author Laurent Declercq <l.declercq@nuxwin.com>
 * @version 1.0.0
 */
class PostsController extends Zend_Controller_Action
{

    /**
     * List posts
     *
     * @return void
     */
    public function indexAction()
    {
        $model = new Model_DbTable_Posts();
        // Todo get max post per pages from user settings (currently hardcoded to 15)
        $pageablePosts = $model->getPageablePostsList($this->_request->getParam('page', 1));
        $this->view->assign('paginator', $pageablePosts);
    }

    /**
     * Show a specific post
     *
     * @return void
     */
    public function showAction()
    {
        $id = (int) $this->_getParam('id');

        $model = new Model_DbTable_Posts();
        $row = $model->fetchRow($model->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
            ->setIntegrityCheck(false)
            ->where('posts.id = ?', $id)
            ->join('users', '`users`.`id` = `posts`.`author_id`', array('username', 'firstname', 'lastname'))
        );

        if (!$row) {
            $this->getResponse()->setHttpResponseCode(404);
            throw new Zend_Controller_Action_Exception('Post not found!', 404);
        }

        $this->view->assign('post', $row);
    }

    /**
     * Create a new post
     *
     * @return void
     */
    public function addAction()
    {
        $form = new Form_Post();
        $identity = Zend_Auth::getInstance()->getIdentity()->id;

        if ($this->_request->isPost() && $form->isValid($this->_request->getPost())) {
            $data = $form->getValues('postForm');
            $data['author_id'] = $identity['id'];

            $model = new Model_DbTable_Posts();
            $id = $model->insert($data);

            $this->_redirect("/posts/{$id}");
        }

        $this->view->assign('form', $form);
    }

    /**
     * Update a post
     *
     * @return void
     */
    public function editAction()
    {
        $id = (int) $this->_request->getParam('id');
        $model = new Model_DbTable_Posts();

        if (null == ($row = $model->find($id)->current())) {
            throw new Zend_Controller_Action_Exception("Post not found!", 404);
        } else {
            $form = new Form_Post();

            if ($this->_request->isPost() && $form->isValid($this->_request->getPost('postForm'))) {
                $row->setFromArray($form->getValues('postForm'))->save();
                $this->_redirect("posts/{$id}");
            } else {
                $form->populate($row->toArray());
            }

            $form->setAction("/posts/{$id}/edit");
            $this->view->assign('form', $form);
        }
    }

    /**
     * Deletes a post and its comments
     *
     * @return void
     */
    public function deleteAction()
    {
        $model = new Model_DbTable_Posts();
        $row = $model->find((int) $this->_request->getParam('id', 0))->current();

        if(null !== $row) {
            $row->delete();
        }

        $this->_redirect('/');
    }
}

Etant précisé que l'action par défaut du formulaire est "/posts/add" soit l'action add du contrôleur PostsController.

Dernière modification par nuxwin (10-04-2011 01:36:38)

Hors ligne

 

#3 11-04-2011 20:48:45

Kenny
Membre
Date d'inscription: 09-04-2011
Messages: 11

Re: [RESOLU][Zend_Form][1.11]Form., cible & traitement:meilleure solution?

Merci de votre réponse smile (votre controller est pas mal instructif !)
Donc pour l'action edit, il faut set une nouvelle action pour le formulaire, et éventuellement set le label du bouton d'envoi. Dommage que le Zend_Form ne puisse pas savoir si il se trouve dans le cas d'une édition ou d'une création pour set les éléments et l'action en conséquence (sans créer une nouvelle classe en étendant Zend_Form).

Hors ligne

 

#4 11-04-2011 22:58:40

nuxwin
Membre
Lieu: Caen (14)
Date d'inscription: 17-03-2011
Messages: 66

Re: [RESOLU][Zend_Form][1.11]Form., cible & traitement:meilleure solution?

Re ;

Je trouves justement bien mieux d'avoir une classe par formulaire. Pour rappel, c'est au contrôleur de gérer les évènement et mettre à jour la vue. Zend_Form ne représente qu'un formulaire HTML. C'est au contrôleur de le piloter, de prendre telle ou telle décision selon le contexte, l'action courante.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages