Bonjour,
Voila je rencontre un petit problème avec mon code, je travaille sur un projet de blog en php mvc.
Depuis 3 jours je suis bloquer sur le module de commentaire imbriqué.
j'ai suivi le tuto déjas dispo sur le site à ce sujet mais j'ai du mal a l'adapter sur ma structure model, vue et controler .
j'ai vraiment tout essayer sans succès. Si une âme charitable veut bien aider, merci par avance .
voici pour commencer mon model commentaire avec mes proccess d'ajout , de recup de commentaire :
// recupère le commentaire parent
public function addcomment($auteur, $contenu, $idEpisode, $email, $id_parent, $depth)
{
$req = 'INSERT INTO comment SET contenu = ?, parent_id = ?, episode_id = ?, depth = ?';
$this->executerRequete($req,array($contenu,$auteur, $idEpisode, $email,$id_parent, $depth));
}
// ajoute un commentaire
public function commentParent($parentId)
{
$req ='SELECT id, depth FROM comment WHERE id = ?';
$comment = $this->executerRequete($req,array($parentId));
$comment->fetch();
}
/**
* Récupère tous les commentaire organisé par ID
* @param $post_id
* @return array
*/
public function findAllById($episode_id)
{
$sql = ('SELECT * FROM comment WHERE episode_id = ?');
$comments =$this->executerRequete($sql, array($episode_id));
$comments->fetchAll();
$comments_by_id = [];
foreach ($comments as $comment) {
$comments_by_id[$comment->id] = $comment;
}
return $comments_by_id;
}
/**
* Permet de récupérer les commentaires avec les enfants
* @param $episode_id
* @param bool $unset_children Doit-t-on supprimer les commentaire qui sont des enfants des résultats ?
* @return array
*/
public function findAllWithChildren($episode_id, $unset_children = true)
{
// On a besoin de 2 variables
// comments_by_id ne sera jamais modifié alors que comments
$comments = $comments_by_id = $this->findAllById($episode_id);
foreach ($comments as $id => $comment) {
if ($comment->parent_id != 0) {
$comments_by_id[$comment->parent_id]->children[] = $comment;
if ($unset_children) {
unset($comments[$id]);
}
}
}
return $comments;
}
/**
* Récupère un commentaire
* @param $id
* @return mixed
* @throws \Exception
*/
public function find($id)
{
// On récupère le commentaire à supprimer
$sql='SELECT * FROM comment WHERE id = ?';
$comment = $this->executerRequete($sql, array($id));
$comment->fetch();
if ($comment === false) {
throw new \Exception("Ce commentaire n'existe pas");
}
return $comment;
}
/**
* Permet de supprimer un commentaire en replaçant les enfants
* @param $id
*/
public function delete($id)
{
$comment = $this->find($id);
// On supprime le commentaire
$this->executerRequete('DELETE FROM comment WHERE id = ?',array($id));
// On monte tous les enfants
$this->executerRequete('UPDATE comment SET parent_id = ?, depth = depth - 1 WHERE parent_id = ?',array($comment->parent_id, $comment->id));
}
/**
* Permet de supprimer un commentaire et ces enfants
* @param $id
* @return PDOStatement
*/
public function deleteWithChildren($id)
{
// On récupère le commentaire à supprimer
$comment = $this->find($id);
$comments = $this->findAllWithChildren($comment->episode_id, false);
$ids = $this->getChildrenIds($comments[$comment->id]);
$ids[] = $comment->id;
// On supprime le commentaire et ses enfants
return $this->executerRequete('DELETE FROM comment WHERE id IN (' . implode(',', $ids) . ')');
}
/**
* Get all chidren ids of a comment
* @param $comment
* @return array
*/
private function getChildrenIds($comment)
{
$ids = [];
foreach ($comment->children as $child) {
$ids[] = $child->id;
if (isset($child->children)) {
$ids = array_merge($ids, $this->getChildrenIds($child));
}
}
return $ids;
}
mon controleur post :
// Ajoute un commentaire sur un episode
public function commenter() {
$idEpisode = $this->requete->getParametre("id");
$auteur = $this->requete->getParametre("auteur");
$contenu = $this->requete->getParametre("contenu");
$email = $this->requete->getParametre("email");
$depth = $this->requete->getParametre("depth");
$parent_id = $this->requete->getParametre("parent_id");
if (isset($_POST['content']) && !empty($_POST['content'])) {
$parent_id = isset($_POST['parent_id']) ? $_POST['parent_id'] : 0;
$depth = 0;
$comment = $this->commentaire->commentParent($parent_id);
if ($comment == false) {
throw new Exception('Ce parent n\'existe pas');
}
$depth = $comment->depth + 1;
}
if($depth >= 3){
echo 'Vous ne pouvez pas répondre à une réponse d\'une réponse ';
} else {
$this->commentaire->addcomment($auteur, $contenu, $email,$idEpisode, $parent_id, $depth);
}
// Exécution de l'action par défaut pour réafficher la liste des episodes
$this->executerAction("index");
}
ma vue :
<?php $this->titre = "Blog de l'écrivain - " . $this->nettoyer($episode['titre']); ?>
</div>
<div class="parallax-container">
<div class="parallax">
<img src="Web/img/post.png" alt="<?= $this->nettoyer($episode['titre'])?>"/>
</div>
</div>
<div class="container">
<article>
<header>
<h1 class="titreEpisode"><?= $this->nettoyer($episode['titre']) ?></h1>
<time><?= $this->nettoyer($episode['date'] )?></time>
</header>
<p><?=$episode['contenu']?></p>
</article>
<hr />
<header>
<h1 id="titreReponses">Réponses à <?= $this->nettoyer($episode['titre']) ?></h1>
</header>
<?php foreach ($commentaires as $commentaire): ?>
<?php require('comment.php'); ?>
<?php endforeach; ?>
<hr />
<form action="episode/commenter" id="form-comment" method="post">
<div class="row">
<input type="hidden" name="parent_id" value="0" id="parent_id">
<input type="hidden" name="episode_id" value="1" id="episode_id">
<input type="hidden" name="id" value="<?= $this->nettoyer($episode['id'] )?>" />
<h4>Poster un commentaire</h4>
<div class="input-field col s12">
<textarea name="contenu" id="contenu" class="form-control" placeholder="Votre commentaire" required></textarea>
</div>
<div class="input-field col s12 m6">
<input id="auteur" name="auteur" type="text"
required /><br />
<label for="pseudo">Pseudo</label>
</div>
<div class="input-field col s12 m6">
<input type="email" name="email" id="email" required/>
<label for="email">Adresse email</label>
</div>
<div class="col s12">
<button type="submit" name="submit" class="btn waves-effect" value="commenter">
Commenter cette episode
</button>
</div>
</form>
</div>
</div>
je voudrais afficher en dessous de chaque poste, les commentaires liées au poste en question et avoir la possibiliter de repondre au commentaire avec une profondeur de 3 pour l'imbrication, j'utilise le js qui est fourni dans le tuto imbrication de commentaire aussi, mais il se passe rien .
donc sur le rendu, j'ai mon post avec le formulaire d'ajout de commentaire, mais les commentaires ne s'affiche pas et l'ajout de commentaire ne fonctionne pas, il me dit que le paramètre depth n'est pas défini et Paramètre 'parent_id' absent de la requête.
j'ai fait des tas de modif mais sans succès, d'autant plus que je suis q'un simple petit dev.
merci encore.
faut prendre les problèmes 1 par 1
déja pourquoi les comments ne s'affichent pas ?
$commentaires t'as quoi la dedans ? on peut voir ton <?php require('comment.php'); ?> ?
si tu utilise un mvc, tu doit avoir une route qui va dans ton controlleur... genre monsite.fr/post/index
on peux aussi voir la methode de ce controlleur ?
ensuite une fois que tu aura renseignés quelques comments en bdd et que ca s'affiche correctment, tu pourra passer à la fonction répondre.
$commentaires un tableau contenant tout les commentaires,
voici le contenu de mon comment.php:
<div class="card-panel" id="comment-<?= $this->nettoyer( $commentaire["id"]); ?>">
<div class="panel-body">
<strong><?= $this->nettoyer($commentaire['auteur'])?> (<?= date("d/m/Y", strtotime($this->nettoyer($commentaire['date'])))?>)</strong>
<p><?= $this->nettoyer($commentaire['contenu']) ?></p>
<?php if($commentaire->depth <= 1): ?>
<p class="text-right">
<button class="btn btn-default reply" data-id="<?= $this->nettoyer($commentaire["id"]); ?>">Répondre</button>
</p>
<?php endif; ?>
</div>
</div>
<div style="margin-left: 50px;">
<?php if(isset($commentaire->children)): ?>
<?php foreach($commentaire->children as $commentaire): ?>
<?php require('Vue/Episode/comment.php'); ?>
<?php endforeach; ?>
<?php endif; ?>
</div>
voici ma classe controleur:
require_once 'Configuration.php';
require_once 'Requete.php';
require_once 'Vue.php';
/**
* Classe abstraite contrôleur.
* Fournit des services communs aux classes contrôleurs dérivées.
*
*/
abstract class Controleur
{
/** Action à réaliser */
private $action;
/** Requête entrante */
protected $requete;
/**
* Définit la requête entrante
*
* @param Requete $requete Requete entrante
*/
public function setRequete(Requete $requete)
{
$this->requete = $requete;
}
/**
* Exécute l'action à réaliser.
* Appelle la méthode portant le même nom que l'action sur l'objet Controleur courant
*
* @throws Exception Si l'action n'existe pas dans la classe Controleur courante
*/
public function executerAction($action)
{
if (method_exists($this, $action)) {
$this->action = $action;
$this->{$this->action}();
}
else {
$classeControleur = get_class($this);
throw new Exception("Action '$action' non définie dans la classe $classeControleur");
}
}
/**
* Méthode abstraite correspondant à l'action par défaut
* Oblige les classes dérivées à implémenter cette action par défaut
*/
public abstract function index();
/**
* Génère la vue associée au contrôleur courant
*
* @param array $donneesVue Données nécessaires pour la génération de la vue
* @param string $action Action associée à la vue (permet à un contrôleur de générer une vue pour une action spécifique)
*/
protected function genererVue($donneesVue = array(), $action = null)
{
// Utilisation de l'action actuelle par défaut
$actionVue = $this->action;
if ($action != null) {
// Utilisation de l'action passée en paramètre
$actionVue = $action;
}
// Utilisation du nom du contrôleur actuel
$classeControleur = get_class($this);
$controleurVue = str_replace("Controleur", "", $classeControleur);
// Instanciation et génération de la vue
$vue = new Vue($actionVue, $controleurVue);
$vue->generer($donneesVue);
}
/**
* Effectue une redirection vers un contrôleur et une action spécifiques
*
* @param string $controleur Contrôleur
* @param type $action Action Action
*/
protected function rediriger($controleur, $action = null)
{
$racineWeb = Configuration::get("racineWeb", "/");
// Redirection vers l'URL /racine_site/controleur/action
header("Location:" . $racineWeb . $controleur . "/" . $action);
}
}
Encore merci.
tu vois rien du tout qui s'affiche niveau commentaire ? ou c'est juste les texte que tu ne voit pas ?
parce que du moment que tu as un truc dans $commentaires, tu devrai au moin voir apparaitre une boite de type card-panel
en fait le formulaire s'affiche, mais le traitement ne fonctionnement pas, les commentaires enregistrés ne s'affiche pas, et l'ajout de commentaire renvoit l'erreur suivante : Paramètre 'depth' absent de la requête.
Ce que je comprend pas c'est que je recupère ce param dans mon controleur.
// Ajoute un commentaire sur un episode
public function commenter() {
$idEpisode = $this->requete->getParametre("id");
$auteur = $this->requete->getParametre("auteur");
$contenu = $this->requete->getParametre("contenu");
$email = $this->requete->getParametre("email");
$depth = $this->requete->getParametre("depth");
$parent_id = $this->requete->getParametre("parent_id");
if (isset($_POST['content']) && !empty($_POST['content'])) {
$parent_id = isset($_POST['parent_id']) ? $_POST['parent_id'] : 0;
$depth = 0;
$comment = $this->commentaire->commentParent($parent_id);
if ($comment == false) {
throw new Exception('Ce parent n\'existe pas');
}
$depth = $comment->depth + 1;
}
if($depth >= 3){
echo 'Vous ne pouvez pas répondre à une réponse d\'une réponse ';
} else {
$this->commentaire->addcomment($auteur, $contenu, $email,$idEpisode, $parent_id, $depth);
}
// Exécution de l'action par défaut pour réafficher la liste des episodes
$this->executerAction("index");
}
je recupère les commentaires avec les enfants comme ceci :
// Affiche les détails sur un episode
public function index()
{
$idEpisode = $this->requete->getParametre("id");
$episode = $this->episode->getEpisode($idEpisode);
$commentaires = $this->commentaire->findAllWithChildren(1);
$this->genererVue(array('episode' => $episode, 'commentaires' => $commentaires));
}
Mais apparement ca n'a pas l'air de fonctionner et j'ai pas d'erreur sur l'affichage.
Merci.