2009-02-03 6 views
2

Quel est le meilleur moyen d'ajouter dynamiquement NOUVEAU dhtml à un formulaire généré via Zend_Form. Exemple, disons que la forme est créée comme ceci:Zend_Form + contenu DHTML

class formUser extends Zend_Form { 
    public function __construct($options = null) { 
     parent::__construct($options); 

     $page1 = new Zend_Form_Element_Text('page1'); 
     $page1->setLabel('Page 1'); 

     $submit = new Zend_Form_Element_Submit('submit'); 
     $this->addElements(array($page1, $submit)); 
    } 
} 

Ici la forme crée un et un seul élément appelé « page1 » mais si je voulais jeter un bouton « Ajouter » dans la vue qui serait générer dynamiquement plus d'éléments, comme page2, page3, page4, etc, tout en l'intégrant avec Zend_Form?

Here is the effect I'm talking about

This isn't me, but he's got the same question and maybe worded it better

Dans mon cas, ses enfants et en fait une relation parent. Autour de cette zone, une personne pourrait avoir 0 ou 15 enfants et je ne lèverais pas un sourcil.

Merci!

+0

pouvez-vous poster un cas d'utilisation ou plus d'informations sur quand/pourquoi vous voulez/devez avoir page1, page2, etc ajouté? – cbrulak

+0

J'ai posté un exemple de page –

Répondre

0

Un indice pour accomplir votre tâche pourrait être de définir une entrée cachée où vous pourriez incrémenter votre 'pageNb' lorsque vous ajoutez un nouvel élément.

Ensuite, pour filtrer & valider votre formulaire, vous pouvez utiliser une boucle pour créer dynamiquement votre élément et ses exigences de validation dans votre contrôleur.

Quelque chose comme:

// PHP

$userForm = new formUser(); 

for ($i = 0; $i < $_POST['pageNumber']; ++$i) 
{ 
    $element = new Zend_Form_Element_Text('page' . $i); 
    $element->addValidator('SomeValidator'); 

    $userForm->addElement($element); 
} 

if ($userForm->isValid($_POST]) 
{ 
// bla bla bla 
} 

// Javascript

function addNewInput() 
{ 
    pageNb = document.getElementbyId('pageNb').value; 
    pageNb.value = ++pageNb; 
    // here put the trick to create a new node/input element. 
    newElement.id = pageNb.value; 
} 
+0

im intéressé par l'aspect dhtml ou javascript de celui-ci. Sans un chargement de page –

+0

Que voulez-vous dire exactement? –

0

Je ne pense pas que vous avez besoin de trucs Zend spécial pour résoudre ce - l'exemple javascript vous Posté ajoutera le code HTML dans votre page où vous le souhaitez, puis lorsque vous le soumettez, vous aurez vos données sur la page affichée tout de même. Assurez-vous de suivre le schéma de nommage que vous utilisez lorsque vous démarrez. Vous pouvez même utiliser le tableau

$element->setIsArray(true); 

pour créer HTML comme celui-ci

name="foo[]" id="foo" 
2

Je n'ai pas le temps d'aller dans les détails de codage ce moment, mais voici comment j'aller à ce sujet:

Puisque vous voulez que la structure de votre formulaire (et pas seulement ses données) soit modifiable, vous devrez l'instancier et la stocker dans votre session. Au lieu de générer simplement un balisage HTML supplémentaire, JavaScript devrait faire un appel Ajax à votre serveur. L'action appelée de cette façon lorsque le bouton "Ajouter" est cliqué, modifie alors le magasin d'instance Zend_Form dans votre session. L'appel Ajax peut ensuite renvoyer le balisage supplémentaire à insérer ou la nouvelle version du balisage de formulaire entier. Dans le premier cas, il appartiendra à votre code JavaScript de s'assurer que le balisage est inséré de manière à ce que l'affichage du navigateur soit cohérent avec la représentation Zend_Form sur le serveur. Dans ce dernier cas - où le formulaire entier est retourné - l'entrée de l'utilisateur devrait être transférée dans l'appel Ajax ou il serait perdu lorsque le formulaire est remplacé par sa nouvelle version.

Questions connexes