Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
<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 :
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 :
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 :
$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
J'ai trouvé !
http://davidcaylor.com/php/building-tab … -zend_form
Hors ligne
Voila le 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
Pages: 1