2011-02-07 2 views
8

En html normale, nous pourrions avoir un champ de tableau comme person[]entrée de tableau comme name = « personne [] » sous forme zend

<input name="person[]" type="text" /> 
<input name="person[]" type="text" /> 
<input name="person[]" type="text" /> 

Pour autant que je sache, Zend_Form ne pas. J'ai lu another answer qui a suggéré qu'il pourrait être fait en utilisant un décorateur qui ajouterait le [] au bon endroit. Voici le code pour cette question spécifique

$html = ''; // some code html 
$i = 0; 
foreach ($element->getMultiOptions() as $value => $label){ 
    $html .= '<input type="checkbox" ' 
      .   'name="'.$element->getName().'[]" ' 
      .   'id="'$element->getName()'-'.$i.'" ' 
      .   'value="'.$value.'" />'; 
    $i++; 
} 
return $html; 

Cela ressemble à un bon début, mais je me demande si vous utilisez un décorateur suffit. Les valeurs renvoyées doivent être lues correctement et envoyées au serveur, puis validées côté serveur. Alors, un décorateur est-il une mauvaise idée? Un élément personnalisé aurait-il plus de sens ici? Je n'ai pas vu un bon exemple qui montre comment cela peut être fait.

+0

Consultez le manuel: http://framework.zend.com/manual/fr/zend.form.advanced.html –

Répondre

13

Je pense que ZF ne permet pas la création de champs de texte de saisie individuels nommés person[], bien que vous puissiez le faire pour tout le formulaire ou un sous-formulaire. Cependant, cela permet quelque chose de similaire. Plus précisément, vous pouvez créer des champs nommés person[0], person[1], etc.

Pour ce faire, vous pouvez faire ce qui suit:

$in1 = $this->createElement('text', '0'); 
$in2 = $this->createElement('text', '1'); 
$in1->setBelongsTo('person'); 
$in2->setBelongsTo('person'); 

De cette façon, vous pouvez normalement attacher vos valideurs, filtres, etc. à in1 $ ou $ in2 et ils fonctionneraient comme prévu. Dans votre action, après validation de formulaire, vous pouvez obtenir un tableau des champs de saisie de texte de personne:

$values = $yourForm->getValues(); 
var_dump($values['person']); 

Fait intéressant, ce qui suit PAS travail:

$in1 = $this->createElement('text', 'person[0]'); 
$in2 = $this->createElement('text', 'person[1]'); 

espère que cela vous aidera .

+3

J'ai vu quelque chose de similaire à votre idée pendant que je cherchais, mais cela ne fonctionne pas lorsque le le nombre de 'person []' est dynamique. Prenez ce scénario: vous demandez à l'utilisateur des emails de ses amis mais vous lui présentez seulement 1 '' et un bouton 'en ajouter un de plus s'il veut en ajouter d'autres. Le bouton 'ajouter un de plus' est juste un javascript qui ajoute '' au formulaire. Le nombre de fois que l'utilisateur clique sur "ajouter un de plus" est inconnu. Sans zend_form, j'utilise juste 'person []' pour cela, puis je l'envoie au backend pour validation. Pour ce champ, je parcourt tous les tableaux et vérifie chacun. – jblue

+0

@jblue. oui, je vois que ce n'est pas si difficile. Mais je pense qu'il y a d'autres possibilités qui pourraient être envisagées. On pourrait utiliser des sous-formulaires et marquer le sous-formulaire ZF comme un tableau (voir l'utilisation anticipée de ZF). Une autre possibilité serait de générer plus d'entrées dans ZF, et de masquer tout sauf le premier. JS ne ferait que montrer le reste si nécessaire. Encore un autre, serait de créer des champs d'entrée pour un ZF de manière dynamique en php. Si JS génère 10 champs de saisie, alors, après l'envoi, vous ajoutez ces champs dans votre formulaire Zend, avec les filtres (etc.) que vous voulez, remplissez-le et validez comme d'habitude. – Marcin