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 15/11/2011, 09h59   #1
Nouveau Membre du Club
 
Avatar de eaglesnipe
 
Homme Yoann Rousseau
Ingénieur Etudes et Développement
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Nom : Homme Yoann Rousseau
Localisation : France

Informations professionnelles :
Activité : Ingénieur Etudes et Développement
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 35
Points : 35
Par défaut Formulaire composé (Zend_SubForm) et récupération des données soumises

Bonjour à tous et à toutes !

Je manipule depuis peu le Frameword PHP Zend (version 1.11.11) qui se révèle être fort puissant, mais je rencontre depuis quelques jours quelques problèmes concernant la gestion des formulaires.

Voici le contexte.

J'ai une matrice qui permet la saisie d'un ensemble d'informations (identiques) pour x clients. Actuellement, ce x vaut 10, mais rien ne dit qu'il ne soit pas amener à évoluer. Afin (notamment) de permettre cette évolution future, j'ai créé un formulaire client classique qui contient l'ensemble des champs nécessaires. Dans mon controller, j'itère alors sur le nombre de clients à gérer, créer le formulaire pour chacun d'eux, et ajoute ce formulaire à un formulaire global avec addSubForm().

Le code ressemble donc à ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$clients = array('clientA', 'clientB', 'clientC', ...);
 
$combinedForm = new Zend_Form();
foreach ($clients as $client) {
    $form = new Application_Form_Form_Client();
    $form->setElementsBelongTo($client);
    $form->setIsArray(true);
    $combinedForm->addSubForm($form, $client);
}
 
$combinedForm->addElement('submit', 'submit', array(
    'label' => 'Test',
));
 
if ($this->getRequest()->isPost() && $combinedForm->isValid($this->_getAllParams())) {
    Zend_Debug::dump($this->_getAllParams());
}
Les instructions suivantes

Code :
1
2
$form->setElementsBelongTo($client);
$form->setIsArray(true);
me permettent de structurer mes name de la façon suivante : clientX[champs], de manière à avoir des identifiants uniques accessibles après soumission.

Et là est tout le problème.. Après soumission, lorsque j'affiche tous les paramètres de la request, cette dernière ne me retourne les données que du premier formulaire (donc du premier client)..

Et là pour le coup, j'avoue ne pas comprendre. Sachant que comme le montre le bout de code précédent, mon bouton submit est propre au formulaire global, et devrait donc soumettre toutes les données de l'ensemble des formulaires non ?

J'attends donc vos lumières pour m'aider sur ce problème car là, je sèche...

Merci à vous !
eaglesnipe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 11h10   #2
Nouveau Membre du Club
 
Avatar de eaglesnipe
 
Homme Yoann Rousseau
Ingénieur Etudes et Développement
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Nom : Homme Yoann Rousseau
Localisation : France

Informations professionnelles :
Activité : Ingénieur Etudes et Développement
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 35
Points : 35
En fait, j'ai un peu plus cerné le problème. Il se trouve que le code généré est le suivant :





On remarque donc que le premier client (clientA) n'est pas encadré par une balise <form>. Cette dernière a en effet été remplacée par la balise <dl>.

En revanche, les autres clients sont encadrés par <form>, ce qui a donc pour conséquence que leurs données ne sont pas transmises lors de la soumission du formulaire global.

La question devient alors : mais pourquoi diantre ce comportement différent entre le premier client et les autres ? Les formulaires sont tous générés dans la même boucle, alors pourquoi l'ajout d'un subform ne se comporte pas de la même manière ? Obscur pour moi tout ça pour le coup...
eaglesnipe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 14h54   #3
Nouveau Membre du Club
 
Avatar de eaglesnipe
 
Homme Yoann Rousseau
Ingénieur Etudes et Développement
Inscription : janvier 2008
Messages : 46
Détails du profil
Informations personnelles :
Nom : Homme Yoann Rousseau
Localisation : France

Informations professionnelles :
Activité : Ingénieur Etudes et Développement
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2008
Messages : 46
Points : 35
Points : 35
Et re !

Solution enfin trouvée !

Je la poste ici pour ceux qui rencontreraient le même problème.

Mon formulaire Application_Form_Form_Client() était implémenté comme suit :

Code :
1
2
3
4
5
class Application_Form_Form_Client extends Zend_Form {
 
    // et tout plein de code ici :-) 
 
}
Dériver de Zend_Form pour manipuler un formulaire, quoi de plus logique ? (surtout qu'initialement n'était pas prévu l'utilisation des sous-formulaires). Un simple remplacement de la déclaration en ceci :

Code :
1
2
3
4
5
class Application_Form_Form_Client extends Zend_Form_SubForm {
 
    // et tout plein de code ici :-) 
 
}
permet de résoudre le tout !

En fait, tout du moins apparemment, l'ajout en SubForm d'un Zend_Form se contente d'insérer le formulaire dans son intégralité (bloc <form></form>). Passer le tout en Zend_Form_SubForm permet à Zend d'indicer correctement les champs et de les inclure au formulaire précédent.

Et en plus ca permet toujours d'accéder aux sous formulaires de la manière suivante :

Code :
1
2
3
4
5
6
7
8
9
$combinedForm->clientA;
$combinedForm->clientB;
//...
 
//ou
 
$combinedForm->getSubForm('clientA');
$combinedForm->getSubForm('clientB');
//...
Maintenant de là à savoir pourquoi le comportement était correct pour le premier client mais pas les autres...

Bon code à tous/toutes !
eaglesnipe 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 13h16.


 
 
 
 
Partenaires

Hébergement Web