Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 27-05-2008 10:54:28

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

[Zend_form ou Zend_input_filter] Formulaire multiligne

Bonjour je galère depuis plusieurs jours et je ne parviens toujours pas à creer/gerer les erreurs/enregistrer un formulaire multilignes.

Mon formulaire est par exemple :

Code:

<form name="formDataManager" id="formDataManager" method="post" action="/app/backoffice/users/modifier">
    <div id="main">
        <table style="width:100%;" cellpadding="0" cellspacing="0" class="list" id="toolbox">
            <thead>
                <tr>
                    <th class="center" title="RmContactId">
                        Identifiant Utilisateur                    
                    </th>
                    <th class="center">
                        Nom d'utilisateur                    
                    </th>
                    <th class="center">
                        Mot de passe                    
                    </th>
                    <th class="center">
                        Confirmation du mot de passe                    
                    </th>
                    <th class="center">
                        Profil                    
                    </th>                                
                </tr>
            </thead>
            <tbody>                            
                <tr class="row1">
                    <td class="center">
                        <img src="/app/backoffice/html/images/bt-RmCivility.png"><br>
                        <input type="hidden" name="id_utilisateur[1]" value="1">
                        1                    
                    </td>
                    <td class="center"><input type="text" name="login[1]" value="sebastien"></td>
                    <td class="center"><input type="text" name="password[1]" value=""></td>
                    <td class="center"><input type="text" name="password_verif[1]" value=""></td>
                    <td class="center">
                        <select name="profil[1]" id="profil-1">
                            <option value="admin" label="admin" selected="selected">admin</option>
                                <option value="user" label="user">user</option>
                        </select>
                    </td>                                
                </tr>
                            
                <tr class="row1">
                    <td class="center">
                        <img src="/app/backoffice/html/images/bt-RmCivility.png"><br>
                        <input type="hidden" name="id_utilisateur[2]" value="2">
                        2                    
                    </td>
                    <td class="center"><input type="text" name="login[2]" value="test"></td>
                    <td class="center"><input type="text" name="password[2]" value=""></td>
                    <td class="center"><input type="text" name="password_verif[2]" value=""></td>
                    <td class="center">
                        <select name="profil[2]" id="profil-2">
                            <option value="admin" label="admin">admin</option>
                            <option value="user" label="user">user</option>
                        </select>
                    </td>                                
                </tr>            
                <tr>
                    <td colspan=5>
                        <input type="submit" name="valider" value="Valider" title="Valider les enregistrements sélectionnés.">
                    </td>                        
                </tr>    
            </tbody>
        </table>
    </div>
</form>

Je recois donc en post :

Code:

Array
(
    [order] => 
    [ordertype] => 
    [page] => 
    [nb_par_page] => 
    [id_utilisateur] => Array
        (
            [1] => 1
            [2] => 2
        )

    [login] => Array
        (
            [1] => sebastien
            [2] => 
        )

    [password] => Array
        (
            [1] => 
            [2] => 
        )

    [password_verif] => Array
        (
            [1] => 
            [2] => 
        )

    [profil] => Array
        (
            [1] => admin
            [2] => admin
        )

    [valider] => Valider
)

Avec Zend_input_filter j'ai aucun moyen de savoir quel enregistrement est faux, par exemple si je fais une erreur sur le login, je vais obtenir :

Code:

Array
(
    [login] => Array
        (
            [stringLengthTooShort] => Le champ "Nom d'utilisateur" doit faire entre 5 et 20 caractères.
        )

)

Aucune indication de quel ligne proviens l'erreur !

Mon code de validation :

Code:

$formData = $this->_request->getPost();
            
            //Définition des filtres et critères de validation
            $filters = array(                
                'login'                => array('StringTrim','StripTags','StringToLower'),
                'password'            => array('StringTrim','StripTags','StringToLower'),
                'password_verif'    => array('StringTrim','StripTags','StringToLower')                
            );
                    

            $validators = array(                    
                "login"            =>array('allowEmpty' => false,
                                        new Zend_Validate_StringLength(5,20),                                 
                                        'messages' => array(sprintf($this->view->_('Champ "%3$s" entre %1$d et %2$d caractères'),5,20,$this->view->_('login')))
                                        ),
                "password"        =>array('allowEmpty' => true,
                                        'alnum', 
                                        'messages'=> sprintf($this->view->_('Champ "%1$s" doit être alphanumérique'),$this->view->_('password'))
                                        ),                       
                 "password_verif"=>array('allowEmpty' => true,
                                        'alnum', 
                                        'messages'=> sprintf($this->view->_('Champ "%1$s" doit être alphanumérique'),$this->view->_('password_confirm')))                       
                 
            );
             
               $options = array(
                    'notEmptyMessage'     => $this->view->_("Empty '%field%'"),
                    'missingMessage'     => $this->view->_("Empty '%field%'")                       
                );
                
            
            $box = new Zend_Filter_Input($filters,$validators);
            $box->setOptions($options);
            $box->setData($formData);
            
            //Vérification du formulaire
            if ($box->isValid())

Bref, de même avec Zend_form, je ne parviens pas à creer de formulaire multiligne avec des tableaux en nom d'input (id_utilisateur[], profil[])
Si quelqu'un a une solution cela m'aiderait beaucoup, car je trouve plus rien à faire que de ne pas utiliser Zend_form et zend_input_filter

Hors ligne

 

#2 27-05-2008 15:26:50

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [Zend_form ou Zend_input_filter] Formulaire multiligne

Hors ligne

 

#3 27-05-2008 17:44:47

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [Zend_form ou Zend_input_filter] Formulaire multiligne

Voila le code

Code:

public function getForm($rows, $populate)
    {
        $form = new MyZend_Form();
        
        $form->setMethod('post')        
             ->setAttribs(array('action'=>$this->view->url(array('controller'=>'users','action'=>'modifier'))));
        
        $subForm = new MyZend_Form_SubForm();
                
        foreach($rows as $row)
        {        
            $row = $row->toArray();
            
            $login_value = $profil_value = '';
            if($populate)
            {
                $login_value     = $row['login'];
                $profil_value     = $row['profil'];            
            }            
        
            $id = $row['id_utilisateur'];
            
              $rowForm = new MyZend_Form_SubForm();
               
              $login = new Zend_Form_Element_Text('login');
              $login    ->setLabel($this->view->_('login'))
                    ->addFilters(array('Stringtrim','StringToLower','StripTags'))
                    ->addValidator('alnum')        
                    ->addValidator('StringLength', false, array(6, 20))                      
                      ->setValue($login_value);
                      
              $password = new Zend_Form_Element_Text('password');
            $password    ->setLabel($this->view->_('password'))
                        ->addFilters(array('Stringtrim','StringToLower','StripTags'))                                    
                        ->addValidator('alnum')
                        ->addValidator('StringLength', false, array(6, 20))
                          ->setRequired(true);
                                                  
            $profil = new Zend_Form_Element_Select('profil',array('style'=>'width:115px'));    
            $profil    ->addMultiOptions(array('admin'=>'admin','user'=>'user'))        
                    ->setLabel($this->view->_('profil'))
                    ->setValue($profil_value);
                    
              $rowForm->addElements(array($login,$password,$profil));
            $rowForm->setElementDecorators(array(
                                                'ViewHelper',
                                                'Errors',
                                                array('HtmlTag', array('tag' => 'td')),
                                                array('Label',   array('tag' => 'th')),
                                                array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
                                                ));
              $subForm->addSubForm($rowForm, $id);
        }
        
        $subForm->setSubFormDecorators(array(
              'FormElements',            
              array('HtmlTag', array('tag' => 'table', 'border'=>1, 'cellpadding'=>0, 'cellspacing'=>0, 'class'=>'listvert', 'id'=>'toolbox', 'style'=>'margin-bottom:10px', 'id'=>'list')),    
        ));
        
        $form->addSubForm($subForm, 'users');        
        $form->setSubFormDecorators(array(
              'FormElements',            
              array('HtmlTag', array('tag' => 'div')),
        ));
        
        $form->setDecorators(array(
            'FormElements',
            array('HtmlTag', array('tag' => 'div')),
            'Form'
        ));
        
        $form->addElement('submit', 'submit', array('label' => 'Valider','name'=>'valider'));
        
        $form->submit->setDecorators(array(
            array(
                'decorator' => 'ViewHelper',
                'options' => array('helper' => 'formSubmit')),
            array(
                'decorator' => array('div' => 'HtmlTag'),
                'options' => array('tag' => 'div')
                )            
        ));        
        return $form;
    }

Maintenant j'ai un autre problème, je voudrai définitivement définir les décorateurs que ce soit pour les labels, elements, subforms ... en gros ce modèle va me servir sur beaucoup de page.
Je ne parviens pas à trouver ou je peux faire ça, j'ai étendu zend_form pour y passer mon traducteur à chaque instanciation, mais je ne vois pas ou définir tous ces décorateurs !

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