Bonjour à tous,
je suis confronté à deux petits soucis avec mes commentaires, j'essaye de créer des règles de validations dans mon model Comment.php sur le contenu de mon commentaire. Je ne le fais pas sur le pseudo et le mail puisque seul les membres peuvent commenter.
Actuellement sans les règles, un membre peut poster un commentaire sans contenu, vide. Lorsque j'essaye de créer des règles plus rien fonctionne, que ce soit sans ou avec un contenu. Mon second soucis et que je n'arrive pas à créer une fonction delete pour un commentaire, à priori c'est lié à l'id du commentaire (pour info j'ai crée un CommentsController.php que pour cette fonction, je ne sais pas si c'est un bon choix, le reste étant dans mon PostsController.php).
Voici mes codes :
PostControllers
function show($id = null,$slug = null){
if(!$id)
throw new NotFoundException('Aucune article ne correspond à cet ID');
if(!empty($this->request->data)){
if($this->Post->Comment->validates()){
$this->Post->Comment->save($this->request->data);
$this->Session->setFlash("Votre commentaire a bien été enregistré !", "notif");
}else{
$this->Session->setFlash("Votre commentaire n'a pas été enregistré !", "notif", array('type' => 'error'));
}
}
$d'comments'] = $this->Post->Comment->find('all',array(
'conditions' => array('Comment.post_id' => $id),
'recursive' => 0,
));
$post = $this->Post->find('first',array(
'conditions' => array('Post.id' => $id,'type'=>'post'),
'recursive' => 0,
));
if(empty($post))
throw new NotFoundException('Aucune article ne correspond à cet ID');
if($slug != $post'Post']'slug'])
$this->redirect($post'Post']'link'],301);
$d'post'] = $post;
$this->set($d);
}
CommentsControllers
function delete($id){
$this->Session->setFlash('Le commentaire a bien été supprimée','notif',array('type'=>'success'));
$this->Comment->delete($id);
$this->redirect($this->referer());
}
Model : Comment.php
public $validate = array(
'content' => array(
'rule' => 'notEmpty',
'required' => true,
'message' => 'Vous devez entrer un commentaire'
)
);
View : show.ctp
<?php foreach($comments as $comment): ?>
<?php if(AuthComponent::user('id') == $comment'User']'id']): ?>
<?php echo $this->Html->link($this->Html->image("/img/icons/delete.png", array('class' => 'comment-edit right')),
array('controller' => 'Comments', 'action' => 'delete')); ?>
<?php endif; ?>
<?php echo $comment'User']'username']; ?>
<?php echo $comment'Comment']'content']; ?>
<?php endforeach; ?>
Merci de votre aide
Merci pour ta réponse AbdelakbirG,
J'ai résolu mon problème avec :
PostsController.php
if(!empty($this->request->data)){
$this->Post->Comment->set($this->request->data);
if($this->Post->Comment->validates()){
$this->Post->Comment->save($this->request->data);
$this->Session->setFlash("Votre commentaire a bien été enregistré !", "notif");
}else{
$this->Session->setFlash("Votre commentaire n'a pas été enregistré !", "notif", array('type' => 'error'));
}
}
Post.php
public $validate = array(
'content' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => 'Vous devez entrer un commentaire'
)
)
);
Pour ma fonction delete du commentaire, j'ai opter de ne pas passer par un controller CommentsController mais
par mon PostsController
function delComment($id){
$this->Post->Comment->delete($id);
$this->Session->setFlash("Le commentaire a bien été supprimé","notif");
$this->redirect($this->referer());
}
une fonction simple, mais qui retourne une erreur à cause de l'id, que j'ai résolu en précisant dans la view l'id qu'il faut delete, c'est à dire $comment'Comment']'id'] . J'ai mis une bonne semaine à trouver que je pouvais mettre ce paramètre dans mon link.
<?php echo $this->Html->link($this->Html->image("/img/icons/delete.png")),
array('controller' => 'posts', 'action' => 'delComment',$comment'Comment']'id']), array('escape' => false)); ?>
Merci de votre aide
salut,
pour la validation ou non d'un commentaires vide fait comme ceci, il y a une erreur dans la configuration de $validate je pense.
public $validate = array(
'content' => array(
'allowEmpty' => false,
'message' => 'Vous devez entrer un commentaire'
)
);
Pour vérifier si un champ est vide, dans $validate tu as "allowEmpty", que tu dois mettre a false si tu ne veux pas autoriser le champ vide, le "rule" est pour vérifier si l'entrée de l'utilisateur est bien au format voulu (email etc...).
Pour voir aussi si une requete a bien été envoyé:
// verifie si une données est posté et créé une nouvelle entrée
$this->request->is('post');
// vérifie qu'une donnée est MODIFIE.
$this->request->is('put');
++ :)
Merci Csbilouze pour tes précisions,
J'ai essayé de remplacer mon $validate par le tien,mais maintenant j'ai une erreur
Warning (2): preg_match() [function.preg-match]: Empty regular expression [CORE/Cake/Model/Model.php, line 2987]
Je connaissais c'est deux requête pour vérifier les données, dans ma fonction champ j'ai mis
!empty($this->request->data)
pour vérifier que mes données ne sont pas vide, quel est la différence entre cette requête et celle-ci
$this->request->is('post');
Est ce lié à mon erreur sur le $validate ?
Merci
Salut,
j'ai relu la doc et refait le validate, essai avec ca
public $validate = array(
'content' => array(
'required' => array(
'rule' => array('notEmpty'),
'message' => 'Vous devez entrer un commentaire'
)
);
Pour la question,!empty() vérifie seulement si ton data est vide, is('post') vérifie si une donnée est posté et pas modifié, is('put') vérifie si une données est postée et modifié.
Tiens moi au courant pour ton $validate.
++
Bon j'avance un peu, j'ai suivi tes conseils
if($this->request->is('post')){
if(!empty($this->request->data)){
if($this->Post->Comment->validates()){
$this->Post->Comment->save($this->request->data);
$this->Session->setFlash("Votre commentaire a bien été enregistré !", "notif");
}else{
$this->Session->setFlash("Votre commentaire n'a pas été enregistré !", "notif", array('type' => 'error'));
}
}else{
$this->Session->setFlash("Votre commentaire est vide !", "notif", array('type' => 'error'));
}
}
et
public $validate = array(
'content' => array(
'rule' => 'notEmpty',
'message' => 'Vous devez entrer votre message'
)
);
Là ca fonctionne, je ne peux plus envoyer de contenu vide par contre j'ai le message que le message a bien été envoyé même si ce n'est pas le cas. Je dois certainement me perdre dans mes conditions, et puis je ne suis pas sûr que mon $validate fonctionne car je je n'est pas son message d'erreur 'Vous devez entrer votre message'..
Merci
Désolé j'avais pas rafraîchit ma page et je n'avais pas vu ta réponse.
Ton $validate ne change pas la donne par rapport au mien. Je n'ai pas le message d'erreur du validate et j'ai toujours le notif de succes même quand le champ est vide.
Merci de prendre du temps pour moi Csbilouze
ton code est trop complexe, il y a beaucoup d'actions pour rien essai comme ceci (en fonction de la doc)
if($this->request->is('post')){
$this->Post->Comment->save($this->request->data);
$this->Session->setFlash("Votre commentaire a bien été enregistré !", "notif");
}
else{
$this->Session->setFlash("Votre commentaire n'a pas été enregistré !", "notif", array('type' => 'error'));
}
cela suffit en lisant la doc, le validate est appelé automatiquement en vérifiant le champs commentaire (si tu as mis le bon nom)
Par contre tu as oublié le array('required') dans validate
public $validate = array(
'content' => array(
'required' => array(
'rule' => array('notEmpty'),
'message' => 'Vous devez entrer un commentaire'
)
)
);
Pour le $validate je l'avais bien mis, c'est juste que je l'ai vu après mon post que tu avais répondu, d'ailleurs manque une parenthèse.
J'ai suivi tes conseils, cette fois-çi, j'ai toujours le message d'error même si le commentaire est posté. Décidément il est joueur ce matin le $validate !! Je n'ai pas non plus le message d'erreur du validate(ce qui n'est pas grave en soit pour celui là)
Je ne sais pas si cela à son importance mais j'ai mis Markitup sur ce textearea..
Mais je ne penses pas que cela est un lien avec mon soucis. C'est ce que utilise Grafikart pour ces textarea comme celui çi d'ailleurs.
En faisant ta méthode, je me suis rendu compte que j'avais automatiquement le message notif d'erreur lorsque je veux accéder à la vue de mon article, sans même utiliser le commentaire.
Salut Csbilouze et les autres,
J'ai enfin trouvé :
il fallait ajouter cette ligne là
$this->Post->Comment->set($this->request->data);
avant la condition dans le controller.
Le message d'erreur du validate ne fonctionne toujours pas mais les notifs sont cette fois ci bon donc ça me va.
Dans le model j'ai mis exactement ce que tu m'a conseillé.
Merci d'avoir essayer avec moi
Je vais maintenant me focaliser sur cette fonction delete, si vous avez une idée je suis preneur.
A+
tu peux essayer avec c'est code :)
PostControllers
function show($id = null,$slug = null){
if(!$id)
throw new NotFoundException('Aucune article ne correspond à cet ID');
if($this->request->is('put') || $this->request->is('post')){
if($this->Post->Comment->save($this->request->data)){
$this->Session->setFlash("Votre commentaire a bien été enregistré !", "notif");
}else{
$this->Session->setFlash("Votre commentaire n'a pas été enregistré !", "notif", array('type' => 'error'));
}
}
$d'comments'] = $this->Post->Comment->find('all',array(
'conditions' => array('Comment.post_id' => $id),
'recursive' => 0,
));
$post = $this->Post->find('first',array(
'conditions' => array('Post.id' => $id,'type'=>'post'),
'recursive' => 0,
));
if(empty($post))
throw new NotFoundException('Aucune article ne correspond à cet ID');
if($slug != $post'Post']'slug'])
$this->redirect($post'Post']'link'],301);
$d'post'] = $post;
$this->set($d);
}
Model : Comment.php
public $validate = array(
'content' => array(
array('rule' =>'notEmpty' ,
'required' => 'true',
'allowEmpty' => false,
'message' => "Vous devez entrer un commentaire"
)
);