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.