Bonjour,

Cela fait plusieurs jours maintenant que j'essai d'appliquer la validation du model à une checkboxe. Voici le code de ma vue:

<?php 
echo $this->Form->checkbox('accepte_condition', array(
    'div' => array(
        'class' => "form-group ".($this->Form->isFieldError('accepte_condition') ? 'has-error' : '') ),
    'label' => false, 'hiddenfield' => false, 'value' => 'yes'
)); 
?>

Ensuite le code de mon model:

<?php public $validate = array('accepte_condition' => array(
                array(
                    'rule' => array('equalTo', 'yes'),
                    'required' => true,
                    'allowEmpty' => false,
                    'on' => 'inscription',
                    'message' => "Veuilez accepter les termes d'utilisation pour continuer la procédure d'inscription."
                    )
                )
    );

Et bien sur au niveau du conroller, je fais bien attention à ce que le nom de la checkbox soit présent dans la liste des champs à faire valider, comme ceci:

if($this->Utilisateur->save($d'Utilisateur'],true,array('accepte_condition'))){...etc..

Comment faire, pour que ma validation fonctionne ??
Merci d'avance de votre aide :) bonne journé

7 réponses


ker0x
Réponse acceptée

Essaye en mettant uniquement cela :

Dans ta vue :

<?php echo $this->Form->checkbox('accepte_condition', array(
    'div' => array(
        'class' => "form-group ".($this->Form->isFieldError('accepte_condition') ? 'has-error' : '') 
    ),
    'label' => false
)); ?>

Dans ton Model

'accepte_condition' => array(
    'rule' => array('equalTo', '1'),
    'message' => "Vous devez accepter les CGU"
),

Hello,
Ce code est faux :

'on' => 'inscription'

La doc : http://book.cakephp.org/2.0/fr/models/data-validation.html#la-cle-on

Hello.

Merci, en effet, j'ai enlevé la clé "on" pour finir, mais le problème persiste..

Merci de ta réponse, mais ça n'a rien changé..
Pour finir, j'ai simplement mis l'attribut "required" à l'élément HTML.

Sauf que le HTML ça se modifie dans le navigateur.

Bonsoir.
Il y a des choses qui ne vont pas.
Tu utilises un input de type checkbox et dans ta validation tu utilises une règle de validation avec un contenu alphanumérique (yes), ce qui n'est logiquement pas correct pour que ta validation soit efficace.
Ensuite, tu te trompe complètement pour la méthode

$this->Form->isFieldError()

Je t'invite à aller voir comment l'utiliser.
Et un conseil, tu ne dois jamais mettre de valeur positive par défaut concernant les CGU, notamment pour la plupart des champs avec case à cocher.
Les utilisateurs doivent avoir le choix d'accepter ou non, de toute manière s'ils ne les acceptent pas, ils ne pourront pas valider le formulaire, et la plupart des utilisateurs le savent très bien, mais dans ton cas, tu n'as pas le droit d'imposer un "règlement" à quelqu'un, sans qu'il n'ait l'opportunité de le lire avant de s'y engager.

@Lartak11 merci de ta réponse, par contre, je ne suis pas d'accord avec toi sur l'utilisation de

$this->Form->isFieldError()

En effet, car dans mon code, je test si la div entourant ma checkbox indique error, si oui, je lui ajout la class "has-error" afin d'entourer mon input du design bootstrap suivant : Texte du lien
Toute fois, le problème est maintenant résolu et donc voici la solution :
Code de ma view :

<?php echo $this->Form->input(
                    'accepte_condition',
                    array(
                      'label' => "   J'ai lu et accepte <a href='#''>les conditions generales d'utilisation</a>" ,
                      'div' => array('class' =>($this->Form->isFieldError('accepte_condition') ? 'has-error' : '')),
                      'error' => array('attributes' => array('wrap' => 'p', 'class' => 'help-block has-error')),
                      'type' => 'checkbox'));
                  ?>

Et la validation sur le model:

'accepte_condition' => array(
                array(
                    'rule' => array('equalTo', '1'),
                    'message' => "Veuilez accepter les termes d'utilisation pour continuer la procédure d'inscription."
                    )
                ),

Merci @GyZmO et @Lartak11 pour vos indications précieuse.