Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-05-2009 22:27:27

citronbleu-v
Membre
Lieu: Béziers ou Arles
Date d'inscription: 03-02-2009
Messages: 79
Site web

[Résolu][Zend_Form] multiple INPUT ?

Bonjour,

j'aimerai faire simplement ça

Code:

       // 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

 

#2 22-05-2009 19:21:43

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: [Résolu][Zend_Form] multiple INPUT ?

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

 

#3 23-05-2009 03:36:53

citronbleu-v
Membre
Lieu: Béziers ou Arles
Date d'inscription: 03-02-2009
Messages: 79
Site web

Re: [Résolu][Zend_Form] multiple INPUT ?

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 smile, 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

 

#4 25-05-2009 22:15:45

citronbleu-v
Membre
Lieu: Béziers ou Arles
Date d'inscription: 03-02-2009
Messages: 79
Site web

Re: [Résolu][Zend_Form] multiple INPUT ?

Merci beaucoup, c'était bien ça la solution, ça m'a enfin permis de faire du multi-champs smile.

voici le code que j'ai utilisé coté serveur si ça peut aider :

Code:

$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

 

#5 07-12-2009 07:50:32

martinsupiot
Membre
Lieu: Nantes
Date d'inscription: 20-03-2007
Messages: 52
Site web

Re: [Résolu][Zend_Form] multiple INPUT ?

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

 

#6 09-12-2009 22:29:58

citronbleu-v
Membre
Lieu: Béziers ou Arles
Date d'inscription: 03-02-2009
Messages: 79
Site web

Re: [Résolu][Zend_Form] multiple INPUT ?

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.

Code:

----------
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 :

Code:

    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

 

#7 10-12-2009 09:57:40

martinsupiot
Membre
Lieu: Nantes
Date d'inscription: 20-03-2007
Messages: 52
Site web

Re: [Résolu][Zend_Form] multiple INPUT ?

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages