Bonjour,

Voila je rencontre un petit problème avec mon code.
Dans mon UsersTable.php j'ai 2 règles de validation,

<?php
namespace App\Model\Table;

use Cake\ORM\Table;
use Cake\Validation\Validator;
$validator = new Validator();

class UsersTable extends Table
{
    public function initialize(array $config)
    {
        $this->addBehavior('Timestamp');
    }

     public function validationSignup(Validator $validator)
    {

        $validator
            ->notEmpty('username')
            ->requirePresence('username')
            ->add('username', 'unique', [
                'rule' => 'validateUnique',
                 'provider' => 'table',
                 'message' => 'Nom d\'utilisateur déja utilisé'
                 ])

            ->requirePresence('mail')
            ->add('mail', 'validFormat', [
                'rule' => 'email',
                'message' => 'E-mail non valide'
            ])
             ->add('mail', 'unique', [
                'rule' => 'validateUnique',
                 'provider' => 'table',
                 'message' => 'E-mail déja utilisé'
                 ])
             ->add('password2', 'no-misspelling',[
                'rule' => ['compareWith', 'password'],
                'message' => 'Les mot de passe ne sont pas égaux'
                ])

            ->notEmpty('nom')
            ->requirePresence('nom')
            ->notEmpty('prenom')
            ->requirePresence('prenom')

             ->notEmpty('password')
            ->requirePresence('password')

             ->notEmpty('password2')
            ->requirePresence('password2');

        return $validator;
    }

    public function validationContact(Validator $validator)
    {
        $validator
            ->add('nom', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('Le champ est vide.'),
            ])
            ->add('prenom', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('Le champ est vide.')
            ])

            ->add('mail', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('Le champ est vide.')
            ])

            ->add('mail2', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('Le champ est vide.')
            ])

             ->add('subjet', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('Le champ est vide.')
            ])

              ->add('content', 'notEmpty', [
                'rule' => 'notEmpty',
                'message' => __('Le champ est vide.')
            ])

              ->add('mail2', 'no-misspelling',[
                'rule' => ['compareWith', 'mail'],
                'message' => 'Les adresses E-mail ne sont pas égaux'
                ]);
        return $validator;
    }

}

Mais je ne parvient pas à validé le formulaire de contact quand je fait:

$validation = $this->Users->newEntity($this->request->data,['validate' => 'Contact']);
if($validation->error()){
//etc...
}

J'obtiens les règle de validation de la fonction signup
Sortie en débug de $validation
object(Cake\ORM\Entity) {

'categoris' => '41',
'[new]' => true,
'[accessible]' => [
    '*' => true
],
'[dirty]' => [
    'categoris' => true
],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [
    'nom' => [
        '_empty' => 'This field cannot be left empty'
    ],
    'prenom' => [
        '_empty' => 'This field cannot be left empty'
    ],
    'mail' => [
        '_empty' => 'This field cannot be left empty'
    ],
    'mail2' => [
        '_empty' => 'This field cannot be left empty'
    ],
    'subjet' => [
        '_empty' => 'This field cannot be left empty'
    ],
    'content' => [
        '_empty' => 'This field cannot be left empty'
    ]
],
'[repository]' => 'Users'

}

Une idée ? :/
Merci :)

4 réponses


Bonsoir.
Pour commencer, le nom de la validation n'est pas en CamelCase, mais en minuscule, donc :

'validate' => 'contact'

Ensuite, que veux-tu dire exactement par :

Mais je ne parvient pas à validé le formulaire de contact

Veux-tu dire que les erreurs du formulaire ne sont pas retournées au niveau du formulaire ?
Montres nous le code de ton formulaire de contact.
Et puis, c'est quoi ce : $validator = new Validator(); dans ton UsersTable ?

Ben dans mon UsersController.php j'ai :
Une fonction signup()
et une fonction contact()
UsersController.php

public function signup(){
$user = $this->Users->newEntity($this->request->data,['validate' => 'Signup']);
$this->set('user', $user);

        if (!empty($this->request->data)) {

             if ($this->request->is(['post', 'put'])) {
        //$validaor = $this->Users->patchEntity($user ,$this->request->data);
        $validaor = $this->Users->newEntity($this->request->data,['validate' => 'Signup']);

        if ($validaor->errors()) {
                    $this->set('_errors', $validaor->errors());           

        $validaor->errors();            
       $this->set('user', $user);
        }else{

                            $token = md5(time() . '-' . uniqid());
                            $now = Time::parse();
                            $UsersTable = TableRegistry::get('Users');
                            $Users = $UsersTable->newEntity();

                            $Users->mail = $this->request->data['mail'];
                            $Users->username = $this->request->data['username'];
                            $Users->nom = $this->request->data['nom'];
                            $Users->prenom = $this->request->data['prenom'];
                            $Users->password = (new DefaultPasswordHasher)->hash($this->request->data['password']);
                            $Users->token = $token;
                            $Users->role = "membre";
                            $Users->created = $now->i18nFormat('dd-MM-yyyy');
                            $Users->active = 0;
                            $Users->tokens = 0;
                            $Users->tokens_bonus = 0;

                            if ($this->Users->save($Users)) {
$this->Flash->success(__('Votre compte a bien été crée, vous allez recevoir un E-Mail pour activer votre compte.'));

                                # code...

                                $email = new Email('default');
                                $email->template('welcome');
                                $email->viewVars([
                                    'token' => $token,
                                    'id' => $Users->id,
                                    'prenom' => $Users->prenom,
                                    'nom' => $Users->nom

                                    ])

                                    ->emailFormat('html')
                                    ->from(['dinasty-corp@hotmail.fr' => 'Dinasty-Serv'])
                                    ->to($this->request->data['mail'])
                                    ->subject('Bienvenu chez Dinasty-Serv')
                                    ->send();
                                    $this->redirect(['controller' => 'pages'] );

                                 }

                }
            }
        }
    }

public function contact(){
$this->loadModel('categories');

    $demande = $this->categories->find('list')->where(['type' => 'contact'])->toArray();

    $this->set('demande', $demande);
    if ($this->request->is('post')) {

        $validation = $this->Users->newEntity($this->request->data,['validate' => 'Contact']);

        debug($validaor);

        if ($validaor->errors()) {
             $this->Flash->error(__('Une erreur est survenu.'));

         }
    }
}

Ben en gros pour le formulaire de contact il utilise les règle de la fonction Signup du UsersTable.php

et pour le $validator = new Validator();
Dabs la doc de cakephp 3 :/

use Cake\Validation\Validator;

$validator = new Validator();

http://book.cakephp.org/3.0/fr/core-libraries/validation.html

Bonsoir.
Pour information, il est possible de définir quel validateur doit utiliser un formulaire : FormHelper » Utiliser des Validateurs Personnalisés.
Tu ne penses pas avoir une erreur ici ? :

$validation = $this->Users->newEntity($this->request->data,['validate' => 'Contact']);
debug($validaor);
if ($validaor->errors()) {

Ta variable passe de $validation à $validaor.

et pour le $validator = new Validator();
Dabs la doc de cakephp 3 :/

Cette déclaration est pour ceux qui utilisent la validation de CakePHP en dehors du Framework.

Pour terminer, je t'avais demandé de montrer ton formulaire, mais tu ne l'as pas fait.
Si tu n'as pas réellement besoin d'aide, autant le dire directement.

Bonjour,
houla ça ne sert à rien de s'énerver XD
En effet il y a une erreur dans la variable $valida or car j'ai copié le code que j'étais en train d'éditer je n'ai pas fait attention.
Voilà le code du formulaire;

<section id="contact-page">
        <div class="container">
            <div class="center">        
                <h2>Contactez Dinasty-Serv</h2>
                <p class="lead"></p>
            </div> 
            <div class="row contact-wrap"> 

               <?= $this->Form->create('contact', ['context' => ['validator' => 'contact']]); ?>
                    <div class="col-sm-5 col-sm-offset-1">
                        <div class="form-group">
                            <label>Votre nom</label>
                               <?= $this->Form->input('nom',array( 'class' => "form-control", 'label' =>'')); ?>
                               <label>Votre prénom</label>
                                <?= $this->Form->input('prenom',array('class' => "form-control", 'label' =>'')); ?>
                                <label>Votre adresse E-Mail</label>
                                <?= $this->Form->input('mail',array( 'class' => "form-control", 'label' =>'')); ?>
                                <label>Confirmation de votre adresse E-Mail</label>
                                <?= $this->Form->input('mail2',array('class' => "form-control", 'label' =>'')); ?>

                        </div>

                        <div class="form-group">

                            <?= $this->Form->button("<i class='fa fa-icon-ok'>Envoyer</i>", array('type' => 'submit','id' => 'ok_button', 'class' => 'btn btn-primary btn-lg', 'escape' => false)); ?>

                        </div>  

                    </div>

                    <div class="col-sm-5">
                        <label>Votre demande concerne</label>
                     <?= $this->Form->input('categoris',array('class' => "form-control", 'type' => 'select' , 'label' =>'', 'options' => $demande)); ?>

                     <label>Sujet de votre demande</label>
                     <?= $this->Form->input('subjet',array( 'class' => "form-control", 'label' =>'')); ?>

                     <label>Détail de votre demande</label>
                     <?= $this->Form->input('content',array('class' => "form-control", 'label' =>'', 'type' => 'textarea')); ?>

                    </div>
                    <?= $this->Form->end(); ?>

            </div><!--/.row-->
        </div><!--/.container-->
    </section>

je sais que je fais souvent des erreurs bêtes dans mon codage, mais il y a encore beaucoup de choses que je ne connais pas sur Cakephp et je tiens à te remercier aussi car généralement c'est toi qui résous mes problèmes.

Ta solution fonctionne merci mais les messages d'erreur de n'affiche pas sur la page :/