Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] [RESOLU] Blog, commentaires et récursivité

Posted by zragg on 08/12/2009 15:30

Bonjour,

Je m'essaye au développement d'un blog. Oui, je sais, y en a déjà pas mal mais bon, pour commencer, je trouve que c'est pas trop mal. Je n'ai pas l'intention de réinventer la roue, donc je me suis inspiré de jblog. La partie affichage et saisie d'article, c'est bon. La gestion des utilisateurs est encore un peu sommaire mais ça va.

Nan, mon problème vient des commentaires. J'ai beau retourner dans tous les sens jcomments, un commentaire ne répond qu'à un article mais pas à un autre commentaire et ça, c'est pas bon pour mon public ;o). J'ai donc eu comme idée d'un Dao suivant

 <property name="id" fieldname="id" datatype="int" required="true"/>
 <property name="scope" fieldname="scope" datatype="int" required="true"/>
 <property name="scope_id" fieldname="scope_id" datatype="int" required="true"/>
 <property name="texte" fieldname="texte" datatype="text" required="true"/>
 <property name="isCensure" fieldname="isCensure" datatype="int" required="true" default="0"/>

Avec scope qui est un id de table et scope_id qui est la clé primaire de la table ciblée (je suis d'un clair) Pour faire simple, j'ai 2 lignes dans la table scope

  • 0:article
  • 1:commentaire

1 ligne dans articles

  • 0:article de test

et 3 ligne dans commentaires

  • 0:0:0:blabla:0
  • 1:0:0:preums:0
  • 2:1:1:ratai:0

le troisième commentaire répond au second.

J'ai eu dans l'idée d'une zone qui s'intègre elle même et qui ne retourne rien s'il n'y a pas de commentaire fils. Mais outre le fait que je ne vois pas trop comment faire, j'ai eu des sueurs froides sur le nombre de requêtes par article. Donc je sollicite de l'aide sur comment penser la chose.

Merci de votre attention

  [Opened] Re: Blog, commentaires et récursivité

Reply #1 Posted by laurentj on 08/12/2009 23:54

Un des moyens traditionnel de stocker un arbre dans une seule table, c'est d'utiliser une representation intervalaire : http://brouardf.club.fr/SQL/Tree/SQL_tre(..)

Ou sinon, enregistrer effectivement l'id du commentaire parent. récupérer tout les commentaires correspondant à un scope. boucler dessus en les classant avant affichage. Le code de ce truc pourrait être (écrit en 5 minutes, certainement améliorable...)

  class Comment {
    public $id;
    public $children = array();
    public $record;
    function __construct($id) {  $this->id = $id; }
  }
  
  // ordonné par date
  $rs = $daocomment->getList($ressourceId);
  
  $allComments = array();
  $topComments = array();
  
  // classement et recreation de la hierarchie 
  foreach($rs as $record) {
    $id = $record->id;
    if (!isset($allComments[$id]))
      $allComments[$id] = new Comment($id);
  
    $allComments[$id]->record = $record;
    $pid = $record->parent_id;
    if ($pid) {
      if (!isset($allComments[$pid])) {
        $allComments[$pid] = new Comment($pid);
      }
      $allComments[$pid]->children[] = $allComments[$id];
    }
    else {
      $topComments[$id] = $allComments[$id];
    }
  }
  
  // affichage de la hierarchie
  function childList($list) {
    echo "<ul>";
    foreach($list as $id=>$comment) {
      echo "<li><div>".htmlspecialchars($comment->record->texte)."</div>";
      if (count($comment->children))
        childList($comment->children);
      echo "</li>";
    }
    echo "</ul>";
  }
  
  childList($topComments);

Cependant cette solution n'est valable si on veut afficher tout les commentaires en même temps. Ou alors on peut afficher seulement une partie des commentaires, mais on est quand même obligé de charger tout les commentaires pour reconstruire la hierarchie.

Bref, cette solution est plus basique, plus facile à réaliser, mais présente des inconvénients.

La solution avec représentation intervallaire est plus compliqué à réaliser, mais elle est plus souple, et certainement plus performante.

Et je confirme : par pitié, pas de select recursifs ! ;-)

PS: il y a une troisième solution si tu es sous postgresql : cette base sait gérer directement les arbres il me semble, avec un type de donnée particulier ou des fonctions spéciales.

 
Page
  1. Re: Blog, commentaires et récursivité