Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 01-04-2014 18:05:19

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Deux formulaires sur une même page

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 :

Code:

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

Code:

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

Code:

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

Code:

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

Code:

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

 

#2 01-04-2014 18:49:21

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Deux formulaires sur une même page

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

 

#3 01-04-2014 18:58:06

romsVLM
Membre
Date d'inscription: 23-01-2014
Messages: 89

Re: Deux formulaires sur une même page

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

 

#4 02-04-2014 09:17:00

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Deux formulaires sur une même page

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 wink ?

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