Un des points faibles de CakePHP 1.1 est sa gestion de la validation des modèles. Certes, elle existe, ce qui est déjà fort utile et mieux que rien ! Mais elle reste très basique, ce qui en limite grandement l'intérêt. Pour combler ce vide, la communauté a créé un système avancé de validation. Si ça vous intéresse, lisez ce billet. Pensez à regarder aussi les commentaires (dont un de votre serviteur pour ajouter une fonctionnalité).
Heureusement, comme les développeurs de CakePHP sont des gens bien (et doués), ils ont largement redressé la barre avec la version 1.2. Je dirai même que le nouveau système de validation est sacrément bien foutu ! Penchons-nous un peu là-dessus pour voir ce qu'on peut en tirer.
Note : Cet article a été écrit pour la version 1.2.0.5427 alpha de CakePHP. Les fonctionnalités décrites dans cet article sont susceptibles d'être
Structure d'une règle de validation
Exemple 1 : Une seule règle de validation montrant toutes les clés utilisables
'field_name' => array(
'allowEmpty' => false,
'required' => true,
'rule' => 'fonction',
'message' => 'Message en cas d\'erreur',
'on' => 'create',
'last' => false
)
);
allowEmpty
- optionnel, booléen
- valeurs possibles : null (par défaut), true, false
- Rappel : empty(0) renvoie true. Donnée invalide s'il vaut false et que le champ est présent mais qu'il est vide (empty(...)) et que ce ne soit pas un nombre ou s'il vaut true et que le champ est vide (empty(...)) mais que sa valeur n'est pas 0.
required
- optionnel, booléen
- valeurs possibles : null (par défaut), true, false
- donnée invalide s'il vaut true et que le champ n'est pas présent (!isset(...))
Remarques :
- « required = true » et « allowEmpty = false » ne désignent pas la même chose. Le premier dit que le champ doit être présent, le deuxième dit qu'il peut être vide.
- required et allowEmpty, s'ils sont présents, sont prioritaires sur la règle elle-même : elle ne sera pas appliquée si la valeur saisie ne valide pas ces premiers critères.
rule
- obligatoire, chaîne ou tableau
- valeur : nom d'une méthode de la classe Validation ou d'une méthode personnelle (définie dans le modèle ou dans AppModel) ou une expression régulière.
- fonctionnement détaillé plus loin
message
- optionnel, chaîne
- message affiché à côté du champ dans le formulaire dans le cas où la valeur saisie ne satisfait pas les critères de validation
- si ce paramètre n'est pas fourni, le message sera « This field cannot be left blank »
on
- optionnel, chaîne
- valeurs possibles : null (par défaut), 'create', 'update'
- détermine sur quelles actions doit être appliquée la règle associée
- la règle associée n'est pas appliquée s'il vaut « create » et que l'enregistrement existe déjà ou s'il vaut « update » et que l'enregistrement n'existe pas
last
- optionnel, booléen
- valeurs possibles : null, true, false
- cette valeur n'est pour le moment pas utilisée, je la mentionne uniquement pour dire qu'elle existe
Exemple 2 : Plusieurs règles appliquées à un même champ
'email' => array(
array(
'required' => true,
'rule' => 'email',
'message' => 'Champ obligatoire, saisir un e-mail valide.'
),
array(
'rule' => array('validateUnique', 'email'),
'message'=>'E-mail déjà utilisé.'
)
)
);
Valeurs possible pour l'index "rule"
Nom d'une méthode
Il peut s'agir d'une méthode définie dans la classe Validation (cf. partie suivante) ou d'une que vous avez définie dans votre modèle ou dans AppModel (cf. partie encore après)
Dans ce cas, vous pouvez passer directement le nom de la méthode :
'rule' => 'url'
ou un tableau si la méthode doit recevoir des paramètres :
'rule' => array('between', 10, 20)
Si c'est un tableau qui est passé, la première valeur est le nom de la méthode. Les autres valeurs sont passées à la méthode.
Une expression régulière
Exemple : 'rule' => '/^[[:alnum:]\040\'\.()-]{3,}$/i'
Méthodes de la classe Validation
Certaines méthodes ne sont pas listées ci-après car elles sont présentes mais non implémentées ou non fonctionnelles. En effet, à l'heure actuelle, cette classe n'est pas terminée.
Pour les méthodes acceptant en paramètre des valeurs spécifiques (ex : type de carte de crédit, format de date...), je vous laisserai regarder le code pour voir quelles valeurs vous conviennent, je ne détaillerai pas cela ici.
alphaNumeric
- la valeur doit ne contenir que des chiffres / lettres
- pas de paramètre
between
- la longueur de la chaîne doit être entre les deux valeurs passées
- deux paramètres : longueurs min et max
blank
- la valeur doit être vide ou ne contenir que des espaces / tabulations / retours chariot
- pas de paramètre
cc
- vérifie que le format de la chaîne correspond à un numéro de carte de crédit
- un paramètre optionnel : le type de vérification (« fast » par défaut)
comparison
- compare la valeur saisie à une valeur donnée
- deux paramètres : l'opérateur (>, <, >=, <=, !=, ==) et la valeur de référence
custom
- applique à la valeur une expression régulière que vous indiquez
- un paramètre : l'expression régulière
date
- vérifie que le format de la chaîne correspond à un format de date donné
- un paramètre optionnel : le format de la date (« ymd » par défaut)
decimal
- vérifie que la valeur est un nombre décimal
- un paramètre optionnel : autoriser (true) ou pas (par défaut) le format scientifique
- vérifie que le format de la chaîne correspond à un e-mail
- pas de paramètre
ip
- vérifie que le format de la chaîne correspond à une adresse IPv4
- pas de paramètre
minLength
- vérifie que la chaîne a une taille minimale
- un paramètre : taille minimale
maxLength
- vérifie que la chaîne a une taille maximale
- un paramètre : taille maximale
numeric
- vérifie que la valeur est un nombre
- pas de paramètre
phone
- vérifie que le format de la chaîne correspond à un numéro de téléphone (uniquement format US pour le moment)
- deux paramètres : null ou expression régulière que vous définissez et initiales du pays concerné par la vérification
postal
- vérifie que le format de la chaîne correspond à un code postal (UK, US et Canada pour le moment)
- deux paramètres : null ou expression régulière que vous définissez et initiales du pays concerné par la vérification
ssn
- vérifie que le format de la chaîne correspond à un numéro de sécurité sociale (US, Danemark et Pays-Bas pour le moment)
- deux paramètres : null ou expression régulière que vous définissez et initiales du pays concerné par la vérification
url
- vérifie que le format de la chaîne correspond à une url
- pas de paramètre
Méthodes définies par l'utilisateur
Vous pouvez définir vos propres méthodes pour valider des champs d'un modèle. La seule obligation est que la méthode doit dans tous les cas retourner un booléen.
Exemple : Un message posté dans mon livre d'or ne doit pas contenir plus de 3 liens
'message' => array(
array(
'required' => true,
'allowEmpty' => false,
'message' =>'Champ obligatoire.',
'on' => 'create'
),
array(
'rule' => 'validateLinksNumber',
'message' =>'Votre message contient trop de liens.'
)
),
);
Et dans AppModel :
Conclusion
Et voilà, j'espère que vous y voyez plus clair. Pour ceux qui veulent se mettre à CakePHP 1.2, ça vous évitera déjà de galérer sur cette étape de la validation des données. Pour le reste, va falloir quand même un peu bosser. ;) Happy baking...
Articles similaires
- Un plugin de forum pour vos applications CakePHP
- CakePHP dans le dossier public_html de votre user sous Ubuntu 9.10
- Mettre CakePHP à l'heure Française sur un serveur à l'autre bout du monde
- De l'avenir de CakePHP
- CakePHP tri sur un champ calculé avec paginate
- Première conférence CakePHP en Europe du 9 au 12 juillet 2009
- CakePHP composant Auth et redirection pour le formulaire de login
- CakePHP 1.2 final est sortie
- CakePHP 1.2 RC4 est sortie
- CakePHP : validation Ajax




Bonjour, J'ai beau tourner
Bonjour,
J'ai beau tourner dans tous les sens, je ne m'en sors pas. Lorsque je valide "à blanc" mon formulaire, j'ai un seul message qui s'affiche, celui concernant l'email. Il y a également un décallage "vide" vers le bas pour username, passaword et passwordCompare, mais pourtant aucun message ne s'y affiche.
Est ce qu'il serait possible de m'expliquer pourquoi ma validation ne fonctionne pas ?
var $validate = array ('username' => array (
'rule' => array('between', 6, 40) ,
'message' => 'Le nom d utilisateur doit être de 6 à 40 caractères'
),
'password' => array (
'rule' => array('between', 6, 40) ,
'message' => 'Le mot de passe doit être de 6 à 40 caractères'
),
'passwordCompare' => array(
'rule' => '',
'message' => 'Les champs doivent être identiques !'
),
'email' => array(
'rule' => 'email',
'message' => 'Merci de saisir un e-mail valide.'
),
'website' => array(
'rule' => 'url' ,
'allowEmpty' => true ,
'message' => 'Merci d\'entrer une url valide.'
)
);
Merci d'avance !
pistes
bonjour,
que veux-tu dire par "un décallage 'vide' vers le bas" ?
si c'est bien ce que je comprends, t'as essayé de sélectionner ce qu'il y a sur ces espaces pour voir si y a pas du texte ? au quel cas ça serait un problème de couleur => CSS
sinon perso je précise à chaque fois les valeurs pour "required", "allowempty", "rule" et "message", essaie de rajouter les 2 premiers partout pour voir si ça change quelque chose
à part ça, je vois pas trop là, ton schéma de validation a l'air correct (à part 'rule' => '', je sais pas comment il le comprend)
donc essaie déjà ça et si ça continue, revient poster ici, on investiguera un peu plus
a+
Dia
Evolution ... premiers résultats et nouveaux problèmes :o)
Bonjour,
Je m'excuse par avance de la longueur du message :o)
J'ai essayé d'avancer un peu avec les conseils. J'ai enlevé le champ de validation du password pour limiter les dégats.
D'autre part, je viens de me rendre compte que si le 'message' contient des caractères accentués (éèùàï...) le message ne s'affiche pas. C'est la galère... J'ai essayer de passer ma page en iso-8859-1, ca ne change rien. Le décallage vers le bas provient de là, le div error s'affiche, sans message s'il a des caractères accentués. Quelle solution pour le français soit interprété ?
J'ai fait d'autres tests toute le journée, je n'arrive toujours pas au résultat escompté :
1) si j'utilise :
var $validate = array('username' => array (array('required' => true,'allowEmpty' => false,'message' =>'Champ obligatoire.',)),
'password' => array (array('required' => true,'allowEmpty' => false,'message' =>'Champ obligatoire.',)),
'email' => array(array('required' => true,'allowEmpty' => false,'message' =>'Champ obligatoire.',)),
'website' => array(array('required' => false,'rule' => 'url' ,'allowEmpty' => true ,'message' => 'Merci d entrer une url valide.'))
);
Resultat :
si je valide mon formulaire "à blanc", les champs utilisateur, mdp, mail et site ont un label en gras (par défaut) avec la classe input required (a ce propos, je ne comprends pas comment repasser en classe normale pour le champ website, bien que j'ai utilisé 'required' => 'false', il est tagué comme requis
, idem si je le déclare à 'null').en validant le formulaire, les 2 champs utilisateur, mdp et email marquent "champ obligatoire".
le fait d'utiliser la condition 'required' => true, ne semble pas utile, puisque cela ne change pas le comportmeent, la validation devant de toute façon vérifier "non vide" 'allowEmpty' => false.
Bon, du coup, ici, je ne teste que la condition "le champ est vide" excepté pour website ou la règle 'rule' => 'url' est bien prise en compte. Passons au contenu pour les 3 autres champs.
2) username
Mon soucis principal provient du type de caractères accentués :
'username' => array ('minlength' => array('rule' => array('minLength', 6),'message' => 'Password must be 6 charactèrs in length'),
'maxlength' => array('rule' => array('maxLength', 40),'message' => 'Password must be less than 40 charactèrs in length'),
'alphaNumAndSpaces' => array('rule' => array('custom', '/^[\da-zA-Z éèêëäâàïîöôüûù]+$/'), 'message' => 'seul chiffre, espaces et lettre')
),
Le soucis, c'est que malgré le régex, si je met des caractères accentués, j'ai le message d'erreur, et en prime, le champ se vide alors que le contenu devrait se réafficher dans l'input.
Si j'utilise 'rule' => array('custom', '/^[\da-zA-Z ]+$/') c'est bon, il n'autorise que les 0-9a-zA-Z et espace. Mais j'ai besoin des caractères accentués.
Un autre soucis, de regex cette fois que je n'arrive pas à construire, est que l'utilisateur peut mettre une chaine constituée uniquement d'espaces, et c'est quand même valide. Ca pose probleme. Quel regex utiliser pour interdire un input avec plus de 2 espaces consécutifs ?
3) password
Je m'en suis limité à le forcer à 6 caractères minimum. Mais problemes d'accents pour le message.
'password' => array('minlength' => array('rule' => array('minLength', 6),'message' => 'Le mdp doit etre de 6 carateres minimum')),J'ai également trouvé un "probleme". Dans ma table, mon champ mdp est de type varchar(40), de toute façon sera 32 car hashé (md5). Etonnament, lors de la contruction de l'input, le maxlength ne fonctionne pas, alors qu'il fonctionne pour tous les autres types d'inputs.
echo $form->input('password', array('label' => 'Mot de passe :')); // type varchar(40)renvoie :
Mot de passe :
alors que
echo $form->input('username', array('label' => 'Nom d\'utilisateur :')); // type carchar(40)renvoie :
Nom d'utilisateur :
Est ce normal que le maxlength ne soit pas pris en compte ?
4) email
Je m'en suis résolu à ceci, qui fonctionne (sauf si message carac. accentués)
'email' => array(array('rule' => 'email','message' =>'email non valide',)),5) website
Fonctionne tel qu'indiqué au départ, je n'ai rien modifié. SOus réserve que le message n'ai pas d'accents, encore une fois.
Merci d'avance, et encore désolé pour la longueur du message, ca fait peut être beaucoup d'un coup !
Correction du 3)
Je viens de m'apercevoir que le code html avait été interprété plutot que de s'afficher malgré la balise code.
Voici la partie corrigée :
echo $form->input('password', array('label' => 'Mot de passe :')); // type varchar(40)renvoie :
< div class="input required">< label for="UserPassword">Mot de passe :
< input name="data[User][password]" value="" id="UserPassword" type="password">
< /div>
alors que
echo $form->input('username', array('label' => 'Nom d\'utilisateur :')); // type carchar(40)renvoie :
< div class="input required">< label for="UserUsername">Nom d'utilisateur :
< input name="data[User][username]" maxlength="40" value="" id="UserUsername" type="text">
< /div>
Ici, maxlength est bien interprété automatiquement, alors qu'il ne l'est pas dans le cas de l'input type password.
moi aussi je peux écrire des romans :p
0)
y a quand même pas mal de monde qui a des soucis avec l'UTF-8 !
alors, moi dans mon cas, ce qui marche nikel : tout mettre en UTF-8, càd :
- enregistrer les fichiers en UTF-8 (à régler sur l'éditeur que tu utilises)
- BD en UTF-8 (à régler sur ton SGBD, penser à régler aussi le charset de la connexion)
- Configure::write('App.encoding', 'UTF-8'); dans core.php
- 'encoding' => 'utf8' dans database.php
- < ? php echo $html->charset('utf-8'); ? > dans ton layout
et j'ai jamais eu aucun problème sachant que j'affiche du français, de l'anglais, de l'espagnol, de l'allemand et du russe (cyrillique) ^^
1)
- regarde comment a été généré ton fichier de vue (create et edit), ton champ website doit avoir la classe 'required', tu la vires
- required vérifie que le champ doit etre présent à la validation du formulaire, allowEmpty se charge de regarder s'il peut être vide ou pas, avec allowEmpty à false, required n'est effectivement pas utile, mais je mets tjrs les 4 entrées que j'ai citées dans mon précédent message, pour garder tjrs la même structure et être sûr de ce que je déclare comme conditions...
- j'ai le même soucis, pour tous mes champs, il génère < div class="input required" > mais perso je surcharge tjrs le label donc je mets en gras avec une étoile qd c'est obligatoire et en normal quand ça l'est pas
2)
- pour empêcher les espaces consécutifs tu peux mettre une méthode pour les supprimer dans beforeValidate
- essaie /[^\\dA-Z éèêëäâàïîöôüûù]/i (je suis une quiche en regex, faut pas venir gueuler si elle marche pas XD)
- pour le contenu qui se réaffiche pas, j'ai eu ce problème uniquement quand j'utilisais mal beforeValidate sinon ça me l'a jamais fait
3)
- aucune idée :/
4)
ce que j'utilise :
'email' => array(
'required' => true,
'allowEmpty' => true,
'rule' => 'email',
'message' => 'Champ optionnel, laisser vide ou entrer un e-mail valide.'
),
5)
ce que j'utilise :
'website' => array(
'required' => true,
'allowEmpty' => true,
'rule' => 'url',
'message' => 'Champ optionnel, laisser vide ou entrer une URL valide.'
),
en espérant t'avoir aidé :)
Dia
Salut, Je vois que tu es
Salut,
Je vois que tu es romancier dans l'âme :o) Trève de plaisanterie, tu m'as déjà débloqué d'une étape: les caractères accentués passent! En l'occurence, sous notepad++ > format > convertir UTF8. Ce qui est édjà beaucoup.
Reste quelques détails :
- Tu parles de régler le charset de la connection à la bdd : comment réaliser ceci ?
- Oui le champ website prend la classe required. Mais comment l'enlever, puisque celle ci est montée automatiquement pour tous les champs subissant validation (y compris si on enleve 'required' => '' de $validate) ? Je ne suis pas maitre de la construction en utilisant le form helper.
- Comment surcharger le label ?
- beforeValidate... a retenir et appliquer !
- mon regex, finalement fonctionne après encodage utf8
Bon ben tu vois, finalement, je ne fais plus de romans, seulement des nouvelles et je suis presque sorti de mon problème de compréhension sur la validation des formulaires (3 jours quand même !):o) J'suis pas encore prêt d'utiliser le cake en développement, y'a encore beaucoup à apprendre :-D
Merci !
Re:
- pour mysql par exemple, tu peux régler, via phpMyAdmin, "l'interclassement pour la connexion MySQL"
- en regardant un peu le helper form et plus précisément la méthode input, j'ai trouvé ça :
if (in_array($this->field(), $this->fieldset['validates'])) {
$divOptions = $this->addClass($divOptions, 'required');
}
ce que je traduis comme ça : lors de la construction du div englobant le input, si le champ concerné est dans le tableau, alors on ajoute la classe required
je suppose que tous les champs pour lesquels on définit une règle de validation se retrouvent dans ce tableau (pas sûr mais ça me parait probable)
donc, en rappelant que c'est une version beta, je dirai que c'est "normal", plus qu'à attendre que cette partie évolue
- dans ta vue, tu mets par exemple :
echo $form->input('email', array('label' => 'E-mail : '));
echo $form->input('website', array('label' => 'Site Web : '));
là on vient bien que je différencie "à la mano" les champs obligatoires des autres
de rien !
Dia
Merci
Bon ben c'est parfait tout ça. Merci.
Y'a juste un détail, concernant la surchage des labels. J'appliquais déjà cette méthode, mais je ne vois pas pourquoi tu dis que "on voit bien que je différencie les champs obligatoires des autres". En quoi y'a t il une différence entre un champ obligatoire et un autre ? l'absence d'une étoile ?
oui, la différence c'est la
oui, la différence c'est la mise en gras et l'étoile, c'est juste une différence visuelle puisque tu as toi même expérimenté que de base tous les champs se retrouvent avec les mêmes classes...
Dia
Merci ...
... du temps accordé :o)
Complément
Plus de question cette fois, mais des informations à partager... Et vi, j'étais pas tout à fait convaincu :o)
En réalité, quel intéret d'encapsuler chaque élément de formulaire dans un div ? A priori, il n'y a pas de raison à cela, hormis une disposition particulière via css, sinon je ne voit pas, puisque l'on peut en toute rigueur mettre des classes css à tout élément.
Du coup, pourquoi ne pas supprimer tout simplement les div d'encapsulation (< div> - < label> - < /label> - < input /> - < /div>) et attribuer une classe aux labels et aux inputs directement ?
$form->input('website', array(
'div' => false, // on vire l'encapsulation
'label' => array(
'text' =>'Site Web :', // le texte du label
'class'=>'notRequired' // une classe spécifique au label qui subit validation, mais l'input n'est pas obligatoire
),
'class'=>'notRequired' // idem que pour le label
)
)
retourne :
< label for="UserWebsite" class="notRequired">Site Web :
< /label>
< input name="data[User][website]" class="notRequired" maxlength="255" value="" id="UserWebsite" type="text">
Je me suis donc dit par l'occasion, si on a vraiment besoin du div d'encapsulation, pourquoi ne pas tout simplement "overwriter" la classe du div.
J'ai tenté un tableau 'div' => array('class'=>'input') , mais en fait, ca ne permet pas d' "overwriter" le "input required" créé par défaut si le champ est soumis à validation. Je pense que la méthode de validation se fait après la création du champ (?)
A l'occasion, si qq'un découvre comment overwriter la classe du div d'encapsulation... Peut être une méthode afterValidate() ? A explorer.
J'espère que ça sera utile à d'autres ;o)
Conclusion : la meilleure documentation reste le code source de CakePHP !
Last but not least
Depuis la sortie des versions RC, j'ai observé un léger changement sur l'ordre d'apparition des messages d'erreurs lors de la soumissions des formulaires
ex :
'word' => array(
array(
'required' => true,
'allowEmpty'=> false,
'rule' => '/\S+/',
'message' => 'Champ obligatoire.'
),
array(
'rule' => array('minLength', 3),
'message' => '3 caractères minimum.'
), ...
)
si je valide un champ vide, avant, j'avais d'abord "champ obligatoire" qui apparaissait et c bien ce que je voulais comme comportement
depuis les RC, c'est "3 caracs min" qui s'affichait en premier (sachant qu'on peut revenir au comportement précédent en inversant l'ordre de déclaration des règles de validation)
en fait il s'avère que les règles de validation sont bien effectuées dans l'ordre où elles sont déclarées mais le message d'erreur affiché est celui de la DERNIÈRE validation qui n'est pas passée
donc, soit on change l'ordre dans lequel sont déclarées les règles de validation (ok mais pas très logique), soit, on utilise "last"
spécifier "last" à true sur une règle de validation fera que si cette règle n'est pas passée, les autres règles appliquées au champ ne seront pas testées
pour reprendre mon exemple, je rajoute "last" => true à la règle "champ obligatoire" et c'est bien ce message d'erreur qui apparait à nouveau en premier...
j'espère que j'ai été à peu près clair :p
Dia
validation formulaire
Boonsoir,
J'ai dans mon mondèle ce code tout simple pour tester le fonctionnement de la validation du champ Nombre de mon formulaire mais ça ne fonctionne pas:
var $validate = array(
'Nombre' => 'numeric');
Merci pour votre réponse.
et avec ça ? var $validate
et avec ça ?
var $validate = array(
'Nombre' => array('rule' => 'numeric')
);
Dia
Merci Dia pour votre
Merci Dia pour votre réponse !
Non ça ne marche pas.
Sans doute n'ai je pas bien compris comment cela fonctionné.
Je vais vous en dire plus le pb désormais doit être ailleurs.
Donc
le controller
tests_controller.php
class TestsController extends AppController {
var $helpers = array('Html','Form');
function index(){
}
function test(){
$nombre=$this->data['Test']['Nombre'];
$this->set('nombre',$nombre);
}
}
?>
Puis le model
test.php
class Test extends AppModel {
var $validate = array('Nombre' => array('rule' => 'numeric')
);
}
?>
et la vue par défault
index.ctp
echo $form->create('Test');
echo $form->input('Nombre');
echo $form->end('Test');
?>
et enfin la vue de résultat
test.ctp
J'ajoute que j'ai une table tests avec un champ nombre (int).
Bien-sûr j'y arrive très bien avec des contrôles php classiques mais bon je préférais utiliser cakephp plutôt.
Vous voyer un code très simple pour essayer de comprendre !
Encore Merci !
J'ai oublié le code de la
J'ai oublié le code de la vue de résultat test.ctp:
désolé!
Non je ne l'avait pas
Non je ne l'avait pas oublié ça n'a pas convenu au système.
Je vais essayez sans les balises php:
echo $nombre;
le champ dans ta table test
le champ dans ta table test c'est "Nombre" ou "nombre" ?
quelle version de CakePHP tu utilises ?
y a un truc que je ne
y a un truc que je ne comprends pas bien :
votre action "index" affiche un formulaire, qui pointe sur l'action "test" ?
pasque dans le code que vous montrez, c'est pas spécifié l'action du form
de plus dans votre action "test", y a pas d'appel au modèle, pas de validate ni de save...
donc si vous avez effectivement copié ici tout votre code c'est normal que les règles de validation définies dans le modèle ne soit pas appliquées
j'espère que ça vous éclaire déjà un peu
Dia
Bonsoir, Oui on y est,
Bonsoir,
Oui on y est, effectivement il y a les deux pb que tu soulèves (j'ai vu ça ce matin en relisant le commentaire et en me replongeant dans book (que je avais fait que survolé ...) mais en tout cas merci pour tes réponses et ta réactivité)
le premier c'est une erreur dans le code que je t'ai envoyé (c'est dû au vrac qu'il y a au niveau de mes fichiers dans mon éditeur de texte mais sur le serveur c'était ok), cela concerne la vue par défaut et plus précisément la balise de création du formulaire "Test":
echo $form->create('Test');
il faut dans mon code de test utiliser $options['action']
echo $form->create('Test', array('action' => 'test'));
echo $form->input('Nombre');
echo $form->end('Test');
?>
et le deuxième (réel celui-ci) venait du fait que je n'utilisais pas la fct save en effet j'en avais pas besoins mais alors je devais faire mes contrôles dans le controller :
class TestController extends AppController {
var $helpers = array('Html','Form');
function index(){
}
function test () {
$this->Test->set( $this->data );
if ($this->Test->validates()) {
$nombre=(int)$this->data['Test']['nombre'];
$this->set('nombre',$nombre);
}
else {
$erreur = $this->Test->invalidFields();
$this->set('erreur',$erreur);
}
}
}
?>
et il ne reste plus qu'à traiter l'array dans ma vue.
Ca te semble propre ?
oui encore une étourderie
oui encore une étourderie le cast ne sert plus à rien après le passage par le model !
ok
ça fait un moment que j'ai pas fait du cake mais ça m'a l'air bien là :)
et effectivement tu peux virer le cast
Dia