Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Form
Zend_Form Forum d'entraide pour le composant Zend_Form du Zend Framework (création de formulaires, helpers, AJAX etc.). Avant de poster -> FAQ Zend_Form.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2011, 16h55   #1
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Par défaut Populate qui ne fonctionne pas ou autre chose ?

Bonjour,
À partir du tutoriel "Débuter avec Zend Framework, approche MVC", j'ai réalisé un ensemble similaire déjà évoqué dans cette discussion.
Pour rappel donc, j'ai le formulaire d'ajout ou de modification qui apparaît dans la même vue que le tableau de données, contrairement à l'exemple des albums du tutoriel.

L'ajout se passe correctement mais pour la modification, la discipline choisie n'apparaît pas dans le formulaire de modification.

Le formulaire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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));
 
    }
}
Le modèle :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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;
    }
 
}
Le contrôleur :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    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 vue :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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; ?>
<?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>
J'ai mis un var_dump dans le contrôleur pour vérifier que je récupère bien les données et c'est le cas.
Il semblerait donc que ce soit le $form->populate($result); qui n'opère pas comme il le devrait.

Si dans la vue je fais ceci :
Code :
1
2
3
4
<?php else : ?>
    <?php echo $this->form; 
    var_dump($this->form->getValue('dsc_id'));?>
<?php endif; ?>
J'obtiens un magnifique int(0) !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 17h05   #2
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : octobre 2006
Messages : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
Est-ce que les champs de ton formulaire son nommé exactement de la même façon que les champs de ta base ?
Sinon le populate ne marche pas et tu doit faire la correspondance entre les noms de champs de ta base et ceux du formulaire
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 21h30   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Oui elles (les colonnes de la table) s'appellent bien dsc_id et dsc_nom comme les champs du formulaire.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 11h22   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Une piste peut-être...
Dans l'affichage de l'écran de modification, j'ai le var_dump de la vue qui affiche int(0) juste après le formulaire, ce qui est normal, mais le var_dump du contrôleur donnant la valeur actuelle de la ligne à modifier n'apparaît qu'après le tableau des données, donc bien après le formulaire.

Cela voudrait-il dire que le populate arrive trop tard, après l'affichage du formulaire ?
Et si oui, comment changer ça ?

EDIT :
La piste était bonne !
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.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h38.


 
 
 
 
Partenaires

Hébergement Web