Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 08-02-2011 08:58:46

CinePhil
Membre
Date d'inscription: 24-03-2010
Messages: 19

[Résolu][Zend_Form] Populate qui ne fonctionne pas ou autre chose ?

Bonjour,
À partir du tutoriel "Débuter avec Zend_Framework, approche MVC", dans sa traduction française trouvée sur Developpez.com, j'ai créé une vue contenant à la fois la liste des données, provenant d'une table avec seulement un identifiant et un nom, et le formulaire d'ajout/modification des données.

Voici la vue :

Code:

<?php 
$this->headTitle('Gérer disciplines'); 
?>
<a href="<?php echo $this->url(array('controller' => 'accueilgestionnaire',
    'action' => 'index')); ?>">Retour à l'accueil gestionnaire</a><br />
<?php if($this->action == 'index') : ?>
    <a href="<?php echo $this->url(array('controller' => 'gererdisciplines',
        'action' => 'ajouter')); ?>">Ajouter une discipline</a>
<?php else : ?>
    <?php echo $this->form; 
    var_dump($this->form->getValue('dsc_id'));?>
<?php endif; ?>
<table>
    <tr>
        <th>Nom de la discipline</th>
        <th>&nbsp;</th>
    </tr>
<?php foreach($this->disciplines as $discipline) : ?>
    <tr>
        <td><?php echo $this->escape($discipline->dsc_nom);?></td>
        <td>
            <a href="<?php echo $this->url(array('controller'=>'gererdisciplines',
                'action'=>'modifier', 'dsc_id'=>$discipline->dsc_id));?>">Modifier</a>
            <a href="<?php echo $this->url(array('controller'=>'gererdisciplines',
                'action'=>'supprimer', 'dsc_id'=>$discipline->dsc_id));?>">Supprimer</a>
        </td>
    </tr>
<?php endforeach; ?>
</table>

=> Le formulaire de saisie n'apparaît que si l'action n'est pas "index".

Voici le formulaire :

Code:

class Application_Form_Discipline extends Zend_Form
{

    public function init()
    {
        $baseurl = Zend_Controller_Front::getInstance()->getBaseUrl();
        
        $this->setName('discipline');
        $this->setMethod('post');
        
        // Identifiant de la discipline
        $dsc_id = new Zend_Form_Element_Hidden('dsc_id');
        $dsc_id->addFilter('Int');
        
        // Nom de la discipline
        $dsc_nom = new Zend_Form_Element_Text('dsc_nom');
        $dsc_nom->setRequired(true)
                ->addFilter('StripTags')
                ->addFilter('StringTrim');
                
        // Bouton Envoyer
        $envoyer = new Zend_Form_Element_Submit('envoyer');
        $envoyer->setLabel('Enregistrer');

        $this->addElements(array($dsc_id, $dsc_nom, $envoyer));
                
    }
}

=> Les colonnes de la table s'appellent bien dsc_id et dsc_nom.

Voici le modèle :

Code:

class Application_Model_DbTable_Discipline extends Zend_Db_Table_Abstract
{

    protected $_name = 'te_discipline_dsc';
    protected $_primary = 'dsc_id';
    
    public function ajouterDiscipline($dsc_nom)
    {
        $data = array('dsc_nom' => $dsc_nom);
        return $this->insert($data);
    }
    
    public function modifierDiscipline($id, $nom)
    {
        $data = array(
            'dsc_nom' => $nom
        );
        $this->update($data, 'dsc_id = '. (int)$id);
    }
    
    public function obtenirDiscipline($id)
    {
        $id = (int)$id;
        $row = $this->fetchRow('dsc_id = ' . $id);
        if (!$row) 
        {
            throw new Exception("Impossible de trouver la discipline $id !");
        }
        $result = $row->toArray();
        return $result;
    }

}

Voici le contrôleur :

Code:

class GererDisciplinesController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        $this->view->title = "Gérer les disciplines d'enseignement";
        $disciplines = new Application_Model_DbTable_Discipline();
        $this->view->disciplines = $disciplines->fetchAll();
        $this->view->action = 'index';
                                
        $form = new Application_Form_Discipline();
    }

    public function ajouterAction()
    {
        $this->view->action = 'ajouter';
                                
        $form = new Application_Form_Discipline();
        $form->dsc_nom->setLabel('Nom de la discipline à ajouter');
        $this->view->form = $form;
        
        $disciplines = new Application_Model_DbTable_Discipline();
        $this->view->disciplines = $disciplines->fetchAll();
        
        $this->renderScript('/gererdisciplines/index.phtml');
        
        if ($this->getRequest()->isPost()) 
        {
            $formData = $this->getRequest()->getPost();
            if ($form->isValid($formData)) 
            {
                $dsc_nom = $form->getValue('dsc_nom');
                                        
                $discipline = new Application_Model_DbTable_Discipline();
                $dsc_id = $discipline->ajouterDiscipline($dsc_nom);
                $this->_helper->redirector('index', 'gererdisciplines');
            }
            else 
            {
                $form->populate($formData);
            }
        }
    }

    public function modifierAction()
    {
        $this->view->action = 'ajouter';
        
        $form = new Application_Form_Discipline();
        $form->dsc_nom->setLabel('Modifier le nom de la discipline en');
        $this->view->form = $form;
        
        $disciplines = new Application_Model_DbTable_Discipline();
        $this->view->disciplines = $disciplines->fetchAll();
        
        $this->renderScript('/gererdisciplines/index.phtml');
        
        if ($this->getRequest()->isPost()) 
        {
            $formData = $this->getRequest()->getPost();
            if ($form->isValid($formData)) 
            {
                $dsc_id = $form->getValue('dsc_id');
                $dsc_nom = $form->getValue('dsc_nom');
                
                $discipline = new Application_Model_DbTable_Discipline();
                $discipline->modifierDiscipline($dsc_id, $dsc_nom);
                
                $this->_helper->redirector('index', 'gererdisciplines');
            }
            else 
            {
                $form->populate($formData);
            }
        }
        else 
        {
            $dsc_id = $this->_getParam('dsc_id', 0);
            
            if ($dsc_id > 0) 
            {
                $result = $disciplines->obtenirDiscipline($dsc_id);
                var_dump($result);
                $form->populate($result);
            }
        }
    }

=> La partie ajouterAction fonctionne sans problème mais c'est dans la partie modifierAction que le populate ne fonctionne pas.

Dans le contrôleur, var_dump($result); affiche bien la valeur actuelle de la ligne à modifier mais dans la vue, var_dump($this->form->getValue('dsc_id') affiche un magnifique int(0) et la valeur actuelle du nom de la discipline n'apparaît pas dans la zone de texte. Si j'y saisis quelque chose et que je valide, la modification ne s'opère pas en BDD.

Quelqu'un aurait une explication sur le non fonctionnement de populate ?

Dernière modification par CinePhil (08-02-2011 14:07:07)

Hors ligne

 

#2 08-02-2011 14:06:49

CinePhil
Membre
Date d'inscription: 24-03-2010
Messages: 19

Re: [Résolu][Zend_Form] Populate qui ne fonctionne pas ou autre chose ?

J'ai trouvé !

C'est l'instruction suivante qui arrivait trop tôt dans le script du contrôleur :

Code:

$this->renderScript('/gererdisciplines/index.phtml');

Je l'ai déplacée après les populate et ça fonctionne.

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