IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Form PHP Discussion :

Formulaire composé (Zend_SubForm) et récupération des données soumises [ZF 1.11]


Sujet :

Zend_Form PHP

  1. #1
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 75
    Points : 76
    Points
    76
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 75
    Points : 76
    Points
    76
    Par défaut
    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...

  3. #3
    Membre régulier Avatar de eaglesnipe
    Homme Profil pro
    Ingénieur Etudes et Développement
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 75
    Points : 76
    Points
    76
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Récupération des données d'un formulaire
    Par projetM dans le forum Langage
    Réponses: 3
    Dernier message: 22/05/2006, 00h01
  2. Réponses: 3
    Dernier message: 23/04/2006, 12h14
  3. Récupération des données d'un formulaire
    Par placenargac dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/02/2006, 15h10
  4. [HTML][FORMULAIRE] Probleme dans la récupération des données
    Par baddounet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 15/08/2005, 18h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo