Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'aimerai faire simplement ça
// Controller $genre = new Zend_Form_Element_Text('genre[]'); $form->addElement($genre); // Ma vue <?= $this->form->getElement('genre[]'); ?> ou <?= $this->form->genre[]; ?>
et ça ne marche pas dès que je met [], comment faire pour faire plusieurs input text si il est impossible de mettre un tableau dans le nom ? la seule solution est elle de faire genre1 genre2 genre3 etc.. ?
Dernière modification par citronbleu-v (25-05-2009 22:17:41)
Hors ligne
Regarde un peu ce chapitre de la documentation : http://framework.zend.com/manual/fr/zen … yNotation, je pense que tu y trouveras la réponse à ton problème.
Hors ligne
Je viens de zieuter la documentation que tu m'as fourni et en effet ça à l'air d'être la solution à mon problème (du moins se que j'ai pu déchiffrer , faut encore que je fasse des progrès en anglais). Je testerai ceci, car j'aime pas trop nommer mes champs avec des nombres (mail1, mail2, mail3).
Là je suis entrain de me casser la tête pour trouver la meilleure solution de faire l'ajout de nouveaux champs. J'hésite à faire cette fonctionnalité seulement coté serveur car avec du javascript / php (voire Ajax) c'est assai complexe à gérer (par rapport au ré-affichage du formulaire dans le cas où il y a une erreur ).
exemple :
[ champ1 ] ajouter un nouveau champ
[ champ2 ] x
[ champ3 ] x
etc..
Hors ligne
Merci beaucoup, c'était bien ça la solution, ça m'a enfin permis de faire du multi-champs .
voici le code que j'ai utilisé coté serveur si ça peut aider :
$form = new Zend_Form(); ..... //-- Genre $subGenre = new Zend_Form_SubForm(); $subGenre->addElement('text', '1'); // Chez moi la valeur 0 ne fonctionne pas bien. La valeur doit être un string if ($_POST) { foreach( $this->_getParam('genre') as $key => $value) { if ($key == 1) continue ; $subGenre->addElement('text', (string) $key); } } $subGenre->setDecorators( array('FormElements', array('HtmlTag', array('tag' => 'span', 'class' => 'genre')))); $subGenre->setElementDecorators( array('ViewHelper', array('HtmlTag', array('tag' => 'div'))) ); $form->addSubForm($subGenre, 'genre'); //-- finGenre
bon par contre je pense qu'il y a moyen d'optimiser ce code du genre car on répète addElement 2 fois.
Je mettrai peut en être plus tard, sur mon site ou le forum comment j'ai fait coté serveur et client avec jQuery.
Hors ligne
Tes précisions sur le sujet m'intéressent. J'en suis arrivé au même code que toi, mais je n'arrive pas à récupérer les valeurs des champs postés...
Pourrais tu nous donner le reste du code ?
Merci
Hors ligne
Alors si tu as besoins du code javascript, c'est un plugin jQuery que j'ai construit (voir ci-dessous). Il contient quelques paramètres par défaut que tu peux modifier dans var _config.
Bon je ne l'ai pas commenté, c'est un peut fait en vrac mais il fonctionne et je pense qu'il y a moyen de l'implémenter facilement en connaissant un petit peut jQuery.
---------- monFichier.js ---------- $(document).ready(function() { $('.maClass').duplicateElement({textLink : 'Ajouter un nouvel élément'}); // Ou mieux, ça permet de prendre du texte dans un div de notre fichier html et donc de pouvoir utiliser l'i18n. $('.maClass').duplicateElement({textLink : $('.unDivHidden').html()}); }); ---------- addNewElement.js ---------- (function($) { $.fn.duplicateElement = function( options ) { // Paramètres var _root; var _info; var _config = { textLink : ' Ajouter un nouveau champ', textDelete : ' x', nameElements : '', maxElements : '5', callBack : function( element ) { } } // Initialisation $.fn.extend( _config, options ); _root = $(this); init(); // Initialisation function init() { // Création du champ d'informations _info = $('<span>' + generateInfo() + '</span>'); _root.children().each(function (i) { // Lien d'ajout if (i == 0) { $(this).append( createAddLink() ); _config.callBack( $(this) ); return ; } // Lien de suppression $(this).append( createRemoveLink() ); _config.callBack( $(this) ); }); } // Création du lien ajouter un nouveau champ function createAddLink() { var link = $('<a href="">' + _config.textLink + '</a>'); link.click( addElement ); var container = $('<span />'); container.append( link ); container.append( _info ); return container; } // Création du lien de suppression function createRemoveLink() { var link = $('<a href="">' + _config.textDelete + '</a>'); link.click( removeElement ); return link; } // Suppression d'un élément function removeElement(event) { event.stopPropagation(); $(event.target).parent().remove(); _info.text( generateInfo() ); return false; } // Ajout d'un élément function addElement(event) { event.stopPropagation(); if(getNumberElements() >= _config.maxElements) return false; var element = _root.find(':first').clone(); element.find(':last').remove(); element.find(':last').remove(); element.find('.ui-datepicker-trigger').remove(); element.append( createRemoveLink() ); var newName = element.find('select, input').each(function (i) { $(this).val(''); $(this).removeAttr('id'); $(this).removeClass('hasDatepicker'); $(this).attr('name', $(this).attr('name').replace( /(\W*)(\[\w*\])/ ,'[' + (getNumberElements() + 1) + ']')); }); _root.append( element ); _info.text( generateInfo() ); _config.callBack( element ); return false; } // Génération de la notification du nombre d'éléments function generateInfo() { return ' (' + getNumberElements() + '/' + _config.maxElements + ')'; } // Retourne le nombre d'éléments function getNumberElements() { return _root.children().size(); } } })(jQuery);
En gros le PHP s'occupe de mettre tous les champs nues ou remplis dans le cas d'une modification.
[ champ1 ]
[ champ2 ]
Et avec le javascript on associe les liens de suppression et celui d'ajout. Il s'occupe donc d'effacer dynamiquement (sans recharger la page) un champ ou d'en ajouter à la suite en copiant et vidant le premier.
[ champ1 ] ajouter un nouveau champ
[ champ2 ] x
[ champ3 ] x
L'inconvénient de mon système c'est que l'utilisateur est obligé d'avoir le javascript activé pour pouvoir ajouter ou supprimer des champs.
Pour le code PHP je ne l'ai pas sous la main là, mais normalement celui que j'ai mis au dessus devrait fonctionner même si il est un peut zarbi.
Le java-script change le nom des inputs en mettant <input name="genre[nouveauNombre]" />.
Je crois que j'avais fait ça comme ça et non pas <input name="genre[]" /> (plus simple) car je crois que Zend gérer mal un truc comme je voulais. Mais ce truc en question, je l'avais résolvé plus tard en mettant juste <input name="genre[ ]" /> << ne pas oublier l'espace.
Je crois donc qu'on peut faire quelque chose sans passer par Zend_Form_SubForm du genre :
foreach($this->_getParam('genre') as $key => $value) { $form->addElement('text', 'genre[ ]'); // Ne surtout pas oublier l'espace, A Tester }
Dernière modification par citronbleu-v (09-12-2009 22:32:37)
Hors ligne
Merci pour l'info ! Mon formulaire fonctionne bien désormais. Même si je trouve que l'implémentation n'est pas des plus simples et logique
Dernière modification par martinsupiot (16-12-2009 21:12:10)
Hors ligne