Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'ai une page qui affiche deux formulaires :
- Le formulaire de connexion :
pseudo
mot de passe
- Le formulaire d'inscription :
nom, prenom, pseudo, email, ville, mot de passe
Les affichages se font correctement, mais j'ai un problème lors de la validation
Je pense que j'ai un problème de conception avec mon fieldset et mes formulaires.
UtilisateurFieldset.php :
[lang=php] <?php namespace Utilisateur\Form; use Custom\Model\Commande; use Zend\Form\Fieldset; use Zend\InputFilter\InputFilterProviderInterface; use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator; class UtilisateurFieldset extends Fieldset implements InputFilterProviderInterface { public function __construct() { parent::__construct('utilisateur'); $this->setHydrator(new ClassMethodsHydrator(false)) ->setObject(new Commande()); $this->add(array( 'name' => 'id', 'attributes' => array( 'type' => 'hidden', ), )); $this->add(array( 'name' => 'nom', 'options' => array( 'label' => 'Nom', ), 'attributes' => array( 'type' => 'text', 'required' => true, 'class' => 'nom', ), )); $this->add(array( 'name' => 'prenom', 'options' => array( 'label' => 'Prenom', ), 'attributes' => array( 'type' => 'text', 'required' => true, 'class' => 'prenom', ), )); $this->add(array( 'name' => 'pseudo', 'options' => array( 'label' => 'Pseudo', ), 'attributes' => array( 'type' => 'text', 'required' => true, 'class' => 'pseudo', ), )); $this->add(array( 'name' => 'email', 'options' => array( 'label' => 'Email', ), 'attributes' => array( 'type' => 'mail', 'required' => true, 'class' => 'email', ), )); $this->add(array( 'name' => 'ville', 'options' => array( 'label' => 'Ville', ), 'attributes' => array( 'type' => 'text', 'required' => true, 'class' => 'ville', ), )); $this->add(array( 'name' => 'mdp', 'options' => array( 'label' => 'Mot de passe', ), 'attributes' => array( 'type' => 'password', 'required' => true, 'class' => 'mdp', ), )); } /** * @return array \*/ public function getInputFilterSpecification() { return array( 'nom' => array( 'required' => true, 'filters' => array( array( 'name' => 'StringTrim' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 2, 'max' => 100, ), ), ), ), 'prenom' => array( 'required' => true, 'filters' => array( array( 'name' => 'StringTrim' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 2, 'max' => 100, ), ), ), ), 'pseudo' => array( 'required' => true, 'filters' => array( array( 'name' => 'StringTrim' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 2, 'max' => 100, ), 'name' => 'Db\NoRecordExists', 'options' => array( 'adapter' => \Zend\Db\TableGateway\Feature\GlobalAdapterFeature::getStaticAdapter(), 'table' => 'utilisateur', 'field' => 'pseudo', ), ), ), ), 'email' => array( 'required' => true, 'filters' => array( array( 'name' => 'StringTrim' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 2, 'max' => 100, ), ), ), ), 'ville' => array( 'required' => true, 'filters' => array( array( 'name' => 'StringTrim' ) ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 2, 'max' => 100, ), ), ), ), 'mdp' => array( 'required' => true, ), ); } }
mon formulaire de connexion :
[lang=php] <?php namespace Utilisateur\Form; use Zend\Form\Form; use Zend\InputFilter\InputFilter; use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator; class ConnexionUtilisateurForm extends Form { public function __construct() { parent::__construct('connexion_utilisateur'); $this->setAttribute('method', 'post') ->setHydrator(new ClassMethodsHydrator(false)) ->setInputFilter(new InputFilter()); $this->add(array( 'name' => 'connexion', 'type' => 'Utilisateur\Form\UtilisateurFieldset', 'options' => array( 'use_as_base_fieldset' => true ) )); $this->setValidationGroup( array( 'utilisateur' => array( 'pseudo', 'mdp', ), 'csrf', 'btn_connexion', ) ); $this->add(array( 'name' => 'csrf', 'type' => 'Csrf', 'options' => array( 'csrf_options' => array( 'timeout' => 600 ) ) )); $this->add(array( 'name' => 'btn_connexion', // Nom du champ 'type' => 'Submit', // Type du champ 'attributes' => array( // On va définir quelques attributs 'value' => 'Connexion', // comme la valeur 'id' => 'submit', // et l'id ), )); } }
Mon formulaire d'inscription :
[lang=php] <?php namespace Utilisateur\Form; use Zend\Form\Form; use Zend\InputFilter\InputFilter; use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator; class InscriptionUtilisateurForm extends Form { public function __construct() { parent::__construct('inscription_utilisateur'); $this->setAttribute('method', 'post') ->setHydrator(new ClassMethodsHydrator(false)) ->setInputFilter(new InputFilter()); $this->add(array( 'name' => 'inscription', 'type' => 'Utilisateur\Form\UtilisateurFieldset', 'options' => array( 'use_as_base_fieldset' => true ) )); $this->setValidationGroup( array( 'utilisateur' => array( 'id', 'nom', 'prenom', 'pseudo', 'email', 'ville', 'mdp', ), 'csrf', 'btn_inscription', ) ); $this->add(array( 'name' => 'csrf', 'type' => 'Csrf', 'options' => array( 'csrf_options' => array( 'timeout' => 600 ) ) )); $this->add(array( 'name' => 'btn_inscription', // Nom du champ 'type' => 'Submit', // Type du champ 'attributes' => array( // On va définir quelques attributs 'value' => 'Valider', // comme la valeur 'id' => 'submit', // et l'id ), )); } }
mon action index de mon controller :
[lang=php] public function indexAction() { $formInscription = new InscriptionUtilisateurForm(); $formConnexion = new ConnexionUtilisateurForm(); $request = $this->getRequest(); $utilisateur = new Utilisateur(); $formInscription->bind($utilisateur); $formConnexion->bind($utilisateur); if ($request->isPost()) { if(isset($_POST['btn_connexion'])) { $formConnexion->setData($request->getPost()); if ($formConnexion->isValid()) { $this->flashMessenger()->addMessage(array('success' => 'Connexion reussie')); return $this->redirect()->toRoute('home'); } } if(isset($_POST['btn_inscription'])) { $formInscription->setData($request->getPost()); if ($formInscription->isValid()) { $this->flashMessenger()->addMessage(array('success' => 'Inscription valide. Merci de vous identifier')); return $this->redirect()->toRoute('utilisateur'); } } } return new ViewModel( array( 'formInscription' => $formInscription, 'formConnexion' => $formConnexion, ) ); }
Voici les erreurs lors d'une validation du formulaire de connexion ou d'inscription :
Warning: array_key_exists(): The first argument should be either a string or an integer in C:\Users\Romain\Documents\GitHub\royalepizza\vendor\ZF2\library\Zend\InputFilter\BaseInputFilter.php on line 502 Notice: Array to string conversion in C:\Users\Romain\Documents\GitHub\royalepizza\vendor\ZF2\library\Zend\InputFilter\BaseInputFilter.php on line 506 Exception : setValidationGroup() expects a list of valid input names; "Array" was not found
Merci de votre aide !
Hors ligne
Salut, est ce que tu as pris sérieusement 5 minutes pour lire le message d'erreur ??
setValidationGroup() expects a list of valid input names; "Array" was not found
Il te dit que le tableau que tu as mis dans setValidationGroup ne correspond à rien dans ton formulaire ... C'est normal tes fieldset ne s'appellent pas "utilisateur" mais "inscription" et "connexion".
Hors ligne
oui effectivement, j'avais cela, car je pensais qu'il fallait le nommé différement pour les 2 formulaires, je me suis trompé.
Désolé du dérangement
Hors ligne
Ben non comment veux-tu que le validationGroup sache de quel champ de quel fieldset tu parles si tu lui donnes pas le même nom ?
Hors ligne