Bonjour,
Quand je fais une erreur dans un formulaire, le formulaire n'ai pas validé, mais j'ai l'erreur qui ne s'affiche pas à coté du champs.
Je vous montre le code.
PostsController.php (controller) :
<?php
function see($id = null){
if(!is_numeric($id)){
$this->redirect(array(
'controller' => 'posts',
'action' => 'index'
),
301,
true);
die();
}
if($this->request->is('post')){ // Formulaire de commentaire
// $this->loadModel('Commentary');
if($this->Post->Commentary->save($this->request->data)){
$this->Session->setFlash('Votre commentaire à bien été pris en compte.', 'FlashMessage');
}else{
$this->Session->setFlash('Tous les champs du formulaire ne sont pas renseignés correctement.', 'FlashMessage', array('type'=>'info'));
}
debug($this->Post->Commentary->validationErrors);
}
$req = $this->Post->find('first',array(
'conditions'=>array(
'Post.online'=>1,
'Post.id'=>$id
)
));
if(!empty($req)){
$this->set('article',$req);
$this->set('title_for_layout', 'Blog :: '.$req'Post']'name']);
}else{
$this->redirect(array(
'controller' => 'posts',
'action' => 'index'
),
301,
true);
}
}
see.ctp (vue) :
<div class="commentArea">
<h2>Les commentaires</h2>
<?php
echo $this->Form->create('Post.Commentary', array(
'type' => 'post',
'url'=>array(
'controller'=>'posts',
'action'=>'see',
$article'Post']'id']
)
));
echo $this->Form->input('Commentary.name',array('label'=>'Votre pseudonyme : '));
echo $this->Form->input('Commentary.mail',array('label'=>'Votre e-Mail : ', 'type'=>'email'));
echo $this->Form->input('Commentary.content',array('label'=>'Votre commentaire : ','type'=>'textarea'));
echo $this->Form->end('Envoyer');
echo 'Tous les champs sont obligatoire !';
?>
</div>
Commentary.php (model) :
<?php
public $validate = array(
'name' => array(
'nameRule-1' => array(
'rule' => array('between', 3, 25),
'message' => 'Votre pseudonyme doit comporter au minimum 3 caractères et 25 maximum.'
),
'nameRule-2' => array(
'rule' => 'alphaNumeric',
'required' => true,
'message' => 'Votre pseudonyme doit être composé uniquement de lettre et de chiffres.'
)
),
'mail' => array(
'rule' => array('email', true),
'required' => true,
'message' => 'Veuillez remplir une adresse email valide.'
),
'content' => array(
'rule' => array('between', 10, 500),
'required' => true,
'message' => 'Votre commentaire doit comporter entre 10 et 500 caractères.'
)
);
Le debug($this->Post->Commentary->validationErrors); donne :
app/Controller/PostsController.php (line 56)
array(
'name' => array(
(int) 0 => 'Votre pseudonyme doit comporter au minimum 3 caractères et 25 maximum.'
),
'mail' => array(
(int) 0 => 'Veuillez remplir une adresse email valide.'
),
'content' => array(
(int) 0 => 'Votre commentaire doit comporter entre 10 et 500 caractères.'
)
Quand je laisse mon formulaire vide, j'ai bien "Tous les champs du formulaire ne sont pas renseignés correctement.", mais j'ai aucune erreur affichée sur le formulaire.
Et ce que je n'arrive pas à comprendre c'est que le "$this->validationErrors" soit "null". Je pense qu'il doit y avoir un paramètre que je n'ai pas renseigné pour activer le retour des erreurs dans la variable "validationErrors".
Merci.
BD
Bonjour,
J'ai enfin réussit, je vais expliquer ce que j'ai fait ça peut servir à quelqu'un.
Il y avait plusieurs problème :
Probleme au niveau du nommage des champs dans le formulaire : il ne fallait pas utiliser "Post.Commentary" dans la méthode create() mais uniquement "Commentary", idem dans la méthode input() (pas de "Commentary.name" mais juste "name")
Puis un problème de CSS, en effet, lorsqu'il y a une erreur, cakePHP ajoute la classe "message-error" à la <div> qui est parente du champs. Il se trouve que j'avais déjà une classe du même nom dans mon CSS en "display:none;" ...
Et voila, ça fonctionne !
Merci d'avoir répondu à mes questions.
BD
Ton formulaire utilise le model Post alors que ta fonction de sauvegarde utilise Commentary.
Pour sauvegarder si tes models ont des liaisons je te conseillerai plutôt d'utiliser
$this->Post->Commentary->save($this->request->data);
Ca t'éviterait d'utiliser un load supplémentaire et ça te permettrait de valider le formulaire. Sinon tu fais ton formulaire avec ...]->create('Commentary') au lieu de Post.
A mon avis le souci de validation vient de là.
Merci pour ta réponse.
J'ai un peu exploré toutes ces pistes, mais toujours le même problème.
Les liaisons étaient déjà en place :
modele post : $hasMany = 'Commentary';
modele commentary : $belongsTo = 'Post';
j'ai commenté le loadModel et ajouter "Post->" à la méthode save()
J'ai aussi modifié " $this->Form->create('Post' .... " par " $this->Form->create('Commentary' .... "
Et toujours le même problème, et la variable $this->validationErrors est toujours null .
Merci
J'ai du nouveau.
La variable qui me renvoie les erreurs est "$this->Post->Commentary->validationErrors". Par contre les message ne s'affiche toujours pas sur le formulaire. Le FormHelper n'est pas automatiquement configurer pour récupère les erreurs ?
J'ai fais quelques modif, je met à jour le code du premier message.
BD
La je t'avoue que tu me poses une vraie colle.
Je suis en train de finir un système de commentaire également sur un projet perso, je te donnerait mon code une fois que j'aurai finis, je pense d'ici une petite heure histoire que tu puisses comparer, mais la visiblement tout me semble bon, j'ai jamais eu ce souci encore...
J'ai eu la même erreur aussi, pas de validation de faite ou d'affichée, assez bizarre comme problème, du coup j'ai contourné le problème.
Grosso modo niveau models, j'ai mes validate normaux, et le Post est en belongsTo sur User et le Comment en belongsTo sur Post et User.
Controller PostsConroller.php, les vérifications sur le slug et sur l'id sont faites lors du routing, vu que j'ai désactivé le routing par défaut.
public function view($id=null, $slug=null)
{
// Si le formulaire de commentaire a été posté
if($this->request->is('post'))
{
// Chargement du model de Comment, et enregistrements des infos par défaut
$this->loadModel('Comment');
$this->request->data'Comment']'id'] = null;
$this->request->data'Comment']'post_id'] = $id;
$this->request->data'Comment']'user_id'] = $this->Auth->user('id');
// Sauvegarde des champs en gardant la validation
if($this->Comment->save($this->request->data, true, array('content', 'post_id', 'user_id')))
{
$this->Session->setFlash("Merci pour votre commentaire !");
$this->redirect($this->referer());
} else {
$this->Session->setFlash("Une erreur s'est produite lors de l'insertion de votre commentaire");
}
}
// Recherche du post courant
$data'post'] = $this->Post->find('first', array(
'fields' => array('Post.id', 'Post.name', 'Post.content', 'Post.summary', 'Post.created'),
'conditions' => array(
'Post.id' => $id,
'Post.is_online' => true,
),
'contain' => array(
'User' => array(
'fields' => array('User.username', 'User.displayname'),
),
'Comment' => array(
'fields' => array('Comment.content', 'Comment.created'),
'User' => array(
'fields' => array('User.id', 'User.username', 'User.displayname'),
),
),
),
));
$this->set($data);
}
Et mon formulaire dans le fichier Posts/view.ctp :
<?php echo $this->Form->create('Comment'); ?>
<fieldset>
<legend>Nouveau commentaire</legend>
<?php echo $this->Form->input('Comment.content',array('label' => "Commentaire", 'type' => 'textarea')); ?>
</fieldset>
<?php echo $this->Form->end("Envoyer"); ?>
C'est peut être pas la meilleure façon de procéder, je laisse soin à Grafikart ou un autre de corriger, s'ils ont une meilleure méthode, mais le résultat est déjà positif dans le sens ou ça fonctionne.