Bonjour,

Je chercher à afficher les messages d'erreur pour les différents champs de mon formulaire "subscribe", ce formulaire correspond donc à un Model qui est le Model Users.

Les régles de validation de mon Model Users

public function validationDefault(Validator $validator){
        $validator
            ->notEmpty('username', "Veuillez renseigner un pseudo.")
            ->add('username', 'unique', [
                'rule' => ['validateUnique'],
                'message' => "Ce pseudo n'est pas disponible.",
                'provider' => 'table',
            ], 'create')
            ->notEmpty('firstname', "Veuillez renseigner un nom.")
            ->notEmpty('lastname', "Veuillez renseigner un prénom.")
            ->notEmpty('email', "Veuillez renseigner un e-mail.")
            ->add('email', 'unique', [
                'rule' => ['validateUnique'],
                'message' => "Cette e-mail n'est pas disponible.",
                'provider' => 'table',
            ], 'create')
            ->add('email', 'validFormat', [
                'rule' => 'email',
                'message' => "L'e-mail est invalide."
            ])
            ->add('email', 'compareWith', [
                'rule' => ['compareWith', 'emailconfirm'],
                'message' => 'Les e-mails ne sont pas identiques.'
            ])
            ->notEmpty('emailconfirm', "Veuillez confirmer l'e-mail.")
            ->notEmpty('password', "Veuillez renseigner un mot de passe.")
            ->add('password', [
                'minLength' => [
                    'rule' => ['minLength', 8],
                    'last' => true,
                    'message' => 'Le mot de passe doit comporter au moins 8 caractères.'
                ],
                'maxLength' => [
                    'rule' => ['maxLength', 250],
                    'message' => 'Le mot de passe ne doit pas comporter plus de 250 caractères.'
                ]
            ])
            ->add('password', 'compareWith', [
                'rule' => ['compareWith', 'passwordconfirm'],
                'message' => 'Les mots de passe ne sont pas identiques.'
            ])
            ->notEmpty('passwordconfirm', 'Veuillez confirmer le mot de passe.')
            ->notEmpty('currentpassword', "Veuillez renseigner votre mot de passe actuel.");
        return $validator;
    }

Mon action subscribe dans mon UsersController

public function subscribe(){
        if(!empty($this->request->session()->read('Auth.User.id'))) return $this->redirect(['action' => 'index']);
        $d = $this->request->data;
        $usersTable = TableRegistry::get('Users');
        $user = null;
        if(!empty($d)){
            $user = $usersTable->newEntity($d, ['validation' => 'default']);
            if(empty($user->errors())){
                if($usersTable->save($user)){
                    $user = null;
                    $this->Flash->success(__("Le compte a été crée, un mail d'activation vient de vous être anvoyé."));
                }else{
                    $this->Flash->success(__('Impossible de crée le compte, veuillez réessayer.'));
                }
            }
        }
        $this->set(compact('user'));
    }

Ma vue subscribe.ctp

<?= $this->form->create($user, ['id' => 'RegistrationForm', 'class' => 'form grey lone account-new-customer', 'novalidate']) ?>
        <h3>Nom</h3>
        <fieldset class="mb20">
            <div class="row-6">
                <div class="form-row">
                    <label for='firstname'><span>Nom</span><span class="required-indicator"> *</span></label>
                    <div class="field-wrapper">
                        <?= $this->form->text('firstname', ['id' => 'firstname', 'class' => 'input-text']) ?>
                    </div>
                </div>
            </div>
            <div class="row-6">
                <div class="form-row">
                    <label for="lastname"><span>Prénom</span><span class="required-indicator"> *</span></label>
                    <div class="field-wrapper">
                        <?= $this->form->text('lastname', ['id' => 'lastname','class' => 'input-text']) ?>
                    </div>
                </div>
            </div>
            <div class="form-row">
                <label for='username'><span>Pseudo</span><span class="required-indicator"> *</span></label>
                <div class="field-wrapper">
                    <?= $this->form->text('username', ['id' => 'username', 'class' => 'input-text']) ?>
                </div>
            </div>
        </fieldset>
        <h3>Email / Login information</h3>
        <fieldset>
            <div class="form-row">
                <label for='email'><span>Email</span><span class="required-indicator"> *</span></label>
                <div class="field-wrapper">
                    <?= $this->form->text('email', ['id' => 'email', 'class' => 'input-text email']) ?>
                </div>
            </div>
            <div class="form-row">
                <label for='emailconfirm'><span>Confirmation email</span><span class="required-indicator"> *</span></label>
                <div class="field-wrapper">
                    <?= $this->form->text('emailconfirm', ['id' => 'emailconfirm', 'class' => 'input-text emailconfirm email']) ?>
                </div>
            </div>
            <div class="form-row">
                <label for='password'><span>Mot de passe</span><span class="required-indicator"> *</span></label>
                <div class="field-wrapper">
                    <?= $this->form->password('password', ['id' => 'password', 'class' => 'input-text password']) ?>
                </div>
                <div class="form-caption">8 caractéres minimum</div>
            </div>
            <div class="form-row">
                <label for='passwordconfirm'><span>Confirmation mot de passe</span><span class="required-indicator"> *</span></label>
                <div class="field-wrapper">
                    <?= $this->form->password('passwordconfirm', ['id' => 'passwordconfirm', 'class' => 'input-text passwordconfirm password']) ?>
                </div>
            </div>
        </fieldset>
        <button>CREATION DU COMPTE</button>
    <?= $this->form->end() ?>

Ce que je veux

Je veux qu'en cas d'erreur sur un champ de mon formulaire, l'erreur soit afficher sous le champ.
Il est à noter, que lors d'un debug() dans ma vue subscribe.ctp de mon Entity $user, les erreurs sont présentes.
Mais Cakephp3 ne fais pas le boulot de les afficher.

object(App\Model\Entity\User) {

    '[new]' => true,
    '[accessible]' => [
        '*' => true
    ],
    '[dirty]' => [],
    '[original]' => [],
    '[virtual]' => [],
    '[errors]' => [
        'username' => [
            '_empty' => 'Veuillez renseigner un pseudo.'
        ],
        'firstname' => [
            '_empty' => 'Veuillez renseigner un nom.'
        ],
        'lastname' => [
            '_empty' => 'Veuillez renseigner un prénom.'
        ],
        'email' => [
            '_empty' => 'Veuillez renseigner un e-mail.'
        ],
        'emailconfirm' => [
            '_empty' => 'Veuillez confirmer l'e-mail.'
        ],
        'password' => [
            '_empty' => 'Veuillez renseigner un mot de passe.'
        ],
        'passwordconfirm' => [
            '_empty' => 'Veuillez confirmer le mot de passe.'
        ]
    ],
    '[invalid]' => [
        'firstname' => '',
        'lastname' => '',
        'username' => '',
        'email' => '',
        'emailconfirm' => '',
        'password' => '',
        'passwordconfirm' => ''
    ],
    '[repository]' => 'Users'

}

J'ai retourné les sites évoquant ce problème je n'ai trouvé aucune solution pourtant je ne dois pas être le premier à le rencontrer.
J'ai sans doute oublié un passage dans la construction Régle de validation - Validation - Formulaire sous cakephp 3.
Si quelqu'un voit mon problème ou à une piste pour me debugger, je suis içi.
Merci l'équipe.

3 réponses


romses
Réponse acceptée

Déjà, je te conseille de faire ceci

<?= $this->Form->create($user,['id' => 'RegistrationForm', 'class' => 'form grey lone account-new-customer']); ?>
tu encapsule chaque imput de cette facon
<?=$this->Form->input('monchamp',['type'=>'text','label'=>'mon champ']); ?>

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

Un grand merci à toi Romses.
Mes form errors sont maintenant display dans ma view subscribe.ctp et en suivant ta syntaxe d'écriture d'autres formulaires traités dans dans d'autres controller et vues ne display toujours pas leur erreurs bien qu'elles soient comprise dans l'Entity et set à la vue.

CakePhp attend donc cette façon d'écrire les inputs pour être capable de display les errors?
Il y a une subtilité de syntaxe concernant l'écriture des inputs afin d'avoir les erreurs que je ne saisie pas..
Pourquoi d'autre formulaire ne veulent toujours pas afficher ces erreurs avec la syntaxe que tu m'as conseillé? :/

Merci l'équipe.

Mes form errors sont maintenant display dans ma view subscribe.ctp et en suivant ta syntaxe d'écriture d'autres formulaires traités dans dans d'autres controller et vues ne display toujours pas leur erreurs bien qu'elles soient comprise dans l'Entity et set à la vue.
tu les affichés?

CakePhp attend donc cette façon d'écrire les inputs pour être capable de display les errors?
oui

Il y a une subtilité de syntaxe concernant l'écriture des inputs afin d'avoir les erreurs que je ne saisie pas..

Comme tout autre framework, Cakephp à sa syntaxe pour gérer les messages flash, errors, il faut juste respecter la définition au niveau des models, controllers et vues.