Bonjour,
Je suis développe actuellement la partie commentaire d'un de mes projets, et je rencontre quelques difficultées du fait de la découverte récente des frameworks php de mon environnement de travail en général. C'est aussi là raison pour laquelle je préfere le faire sans plugin.
J'ai 3 model, User, Comment, Post
avec pour Post, un hasmany = Comment.
J'arrive à afficher correctement les commentaires et les ajouter dans la base de donnée via un petit form.
Cependant, dans ma table 'posts' j'ai ajouter une ligne prenant en compte le nombre de commentaire pour chaque post.
Je souhaiterai que lorsque j'ajoute un commentaire à un post, celà met à jour la table posts , et pas seulement un ajout dans la table comments.
J'ai vu qu'il y avait la fonction aftersave() qui pouvait s'en charger mais je ne comprends pas bien comment l'utiliser.
dans cette discussion, il propose une alternative mais il faudrait que je puisse, il me semble recuperer la valeur du champ 'comment_count' de la table posts pour ensuite lui ajouter 1. et je dois malheureusement mal m'y prendre puisque chacune de mes tentative echoue. J'arrive a récuperer cette valeur de champ, dansi ma vue. Mais je ne sais pas si je peux aussi le faire directement dans ma fonction addcomment ..
si celà peux vous aider à y voir plus clair:
//Controller/CommentsController.php
public function addcomment(){
if($this->request->is('post')){
$this->Comment->create();
if($this->Comment->save($this->request->data)){
$this->Session->setFlash(__('Le commentaire à bien été prise en compte.'));
return $this->redirect(array("controller"=>"quotes", "action"=>"index"));
}
$this->Session->setFlash(__('Il nous est malheureusement impossible de prendre en compte votre commentaire.'));
}
}
Auriez-vous des suggestions ?
Salut à toi Franck,
CakePHP embarque une méthode saveField qui te permet de mettre à jour un seul champ.
Pour l'utiliser (d'après la doc), tu as besoin de lui définir un id avant ton saveField, par exemple :
$this->Post->id = $this->request->data['Post']['id'];
$this->Post->saveField('comment_count', $nbComments);
Pour l'utilisation du afterSave, je te conseille la vidéo de Grafikart à ce sujet, qui te permettra d'avoir une vision globale de ce type de fonction.
PallMallShow.
Il n'est pas necessaire dans ton cas d'utiliser un saveField.
Un simple counterCache suffit et je pense, plus approprié ;)
Bon j'ai finalement reussi a faire ce que je voulais. J'ai dû rajouter un hasone = 'Quote' dans mon Comment.php,
et la fonction addcommment($param1, $param2) est devenu :
public function addcomment($idquote, $commentcount){
if($this->request->is('post')){
$this->Comment->create();
if($this->Comment->save($this->request->data)){
$this->request->data['Quote']['id'] = $idquote;
$this->request->data['Quote']['comment_count'] = $commentcount+1;
$this->Comment->Quote->save($this->request->data);
$this->Session->setFlash(__('Le commentaire à bien été prise en compte.'));
return $this->redirect(array("controller"=>"quotes", "action"=>"view", $idquote));
}
$this->Session->setFlash(__('Il nous est malheureusement impossible de prendre en compte votre commentaire.'));
}
}
Merci a PallMallShow et Romano83, puis je laisse un lien vers le passage de la doc qui m'a aidé ICI, au niveau des models liés (hasone hasmany belongsto)
Merci beaucoup PallMallShow, je vais d'un coté regarder l'utilisation de l'aftersave() que tu m as conseillé et de l'autre essayer avec le savefied.
Par contre une petite question, il m'est donc nécessaire de demander des params à ma fonction addcomment() ?
tel que :
Markdown
//Controller/CommentsController.php
public function addcomment($nbcomments, $idPost){
if($this->request->is('post')){
$this->Comment->create();
if($this->Comment->save($this->request->data)){
$this->Session->setFlash(__('Le commentaire à bien été prise en compte.'));
return $this->redirect(array("controller"=>"quotes", "action"=>"index"));
}
$this->Session->setFlash(__('Il nous est malheureusement impossible de prendre en compte votre commentaire.'));
}
}
Pour ensuite pouvoir faire les requetes avec les bonnes données.
De plus ces paramètres devrait être envoyer depuis le formulaire, mais je le sais pas comment faire le lien entre mon formulaires et les parametres de la fonction.
Je m'y remets de suite.
N'hésite pas si tu bloques sur un point ;)
Hésites pas non plus à marquer les réponses qui t'ont aidés, un fois le problème résolu !
Merci bcp a vous, cela m'a bcp aider, j'ai finalement opté pour le CounterCache qui ici correspond parfaitement à ce que je cherchais. Ceci dit la fonction afterSave() me semble tres utile aussi dans certaines situations. je vais peut etre essayer avec histoire de voir si j arrive à l'utiliser ^^je au final je garde countercache hien ^^
Ceci dit, apres plusieurs essais, cela ne fonctionne pas tres bien. Le champ 'comment_count', n'est pas bien mis à jour à chaque ajout de commentaire.
J'ai donc essayé avec avec savefield(), mais helas ça n'est psa non plus tres concluant. Ca me donne l'erreur suivant :
Error: Call to a member function saveField() on null
File: /Users/marcmorandi/Documents/web/cakephp/sites_cake/cakephp2.6.2-tppt/app/Controller/CommentsController.php
Line: 13
et voici a quoi ressemble ma fonction :
<?php
Class CommentsController extends AppController{
public function addcomment($idquote, $commentcount){
if($this->request->is('post')){
$this->Comment->create();
if($this->Comment->save($this->request->data)){
//$this->Quote->id = $this->request->data['Quote']['id'];
$this->Quote->id = $idquote;
$commentcount = $commentcount + 1;
$this->Quote->saveField('comment_count', $commentcount);
$this->Session->setFlash(__('Le commentaire à bien été prise en compte.'));
return $this->redirect(array("controller"=>"quotes", "action"=>"view", $idquote));
}
$this->Session->setFlash(__('Il nous est malheureusement impossible de prendre en compte votre commentaire.'));
}
}
}
?>
Je crois que ca vient du fait que j'utilise le model "Quote" dans le controller du model "Comment", mais dans la logique c est ce que j'aimerai faire; Y a t il un moyen ?