Salut tout le monde,
J'ai commencé il y a quelques temps mon premier projet sur la 2.0, ceci après une longue période de non-utilisation de Cake, et je dois dire que c'est vraiment pas mal du tout.
Cela étant, je fais face à quelques problèmes, notamment pour le validate.
Je bosse actuellement sur mon premier model, User, et j'ai déjà établi quelques règles simples :
- le nom d'utilisateur doit être unique, ne doit pas être vide, et est alphanumeric.
- l'email doit être un email et ne dois pas être vide.
- le password ne doit pas être vide et doit faire 8 caractères minimum.
Donc jusqu'ici tout va bien, la méthode validate n'a pas changé du tout. De plus, chacune des différentes règles dispose d'un message particulier et le paramètre last est à true.
En revanche, c'est dans ce qui en ressort que j'ai quelques soucis.
J'utilise validates() vu que l'inscription se fait en Ajax, et je suis assez déstabilisé par la valeur et le tableau qui me sont retournés. Je passe à invalidFields le paramètre fieldList qui contient un seul champ (celui que je vérifie on keyup en ajax).
Quand tout va bien, effectivement, on me retourne true et invalidFields est vide.
En revanche, quand il y a une erreur, c'est le chaos.
Dans le cas où la chaîne n'est pas valide (donc un false sur alphanumeric, ou email), le message d'erreur est retourné 2 fois, et un autre champ est vérifié lui aussi...
Par exemple si je tape comme nom d'utilisateur "(-)Pakito(-)", l'array renvoyé est du genre :
array (
[username] => array(
[0] => 'Le nom d\'utilisateur n\'est pas valide',
[1] => 'Le nom d\'utilisateur n\'est pas valide'
)
[email] => array(
[0] => 'L\'email n\'est pas valide'
)
)
Totalement aberrant quand on sait que lorsque j'initialise User, les données que je lui passe ne comporte toujours qu'un seul et unique champ... Qui plus est, champ précisé par fieldList.
Dans le cas où c'est une condition différente (isUnique, minlenght, etc...), invalidFields renvoie bien false, mais aucun message d'erreur. Même pas un array vide, rien. Pourtant les règles sont bien testées puisque le moteur renvoie false, et les messages sont bien spécifiés dans mon Model.
Après y avoir passé une partie de la nuit, je sèche un peu... De plus, je ne comprends pas non plus que les valeurs du tableau des erreurs soient contenues dans des index numériques alors qu'on spécifie un nom de règle dans le Model.
Si ça renvoyait :
array(
[username] => array(
[unique] => 'Ce nom d\'utilisateur n\'est pas disponible'
)
)
ce serait nettement plus propre, d'une part, mais cela permettrait de gérer les erreurs de façon différente.
Pour exemple, dans le cas présent, je gère le format et le fait que le champ soit requis et non vide par un message ajouté à une div #error, mais en revanche, si le pseudo n'est pas disponible, je mets à jour le div #dispo.
Bref, j'ai cherché, dans la doc, dans les forums officiels, en anglais, en français, et rien.
Pourtant il n'y a pas d'erreur, puisque les critères sont bien appliqués avant un save. De même, le true/false d'invalidFields est bon.
Je sèche, et je m'en remets à vous ;)