Vous êtes ici

Réorganisation de commentaires hardcore

Portrait de DrupalFacile
Soumis par DrupalFacile le ven, 23/11/2012 - 08:31

Il y a des moments où on doit faire les choses un peu moins proprement que d'habitude. C'est mal, oui, mais c'est parfois nécessaire et le tout est de bien savoir ce que l'on fait et de sauvegarder sa base de données avant de l'altérer définitivement.

Vous aurez peut-être remarqué qu'il n'est pas aisé de réorganiser les commentaires postés sur Drupal 7. D'ailleurs, pourquoi donc vouloir les "réorganiser" ? Tout simplement parce-que parfois, les visiteurs veulent répondre à un commentaire et en postent en fait un "nouveau" qui n'aura pas d'indentation de "réponse", ce qui fera perdre en lisibilité, voire en pertinence du commentaire. Par exemple :

[[{"type":"media","view_mode":"media_original","fid":"1406","attributes":{"alt":"","class":"media-image","height":"337","typeof":"foaf:Image","width":"311"}}]]

Voici ce que ça donne en base de données :

mysql> SELECT cid,pid,subject,status,thread FROM comment WHERE status = 1 AND cid > 35216 ORDER BY cid DESC;
+-------+-------+-------------------------------+--------+--------+
| cid   | pid   | subject                       | status | thread |
+-------+-------+-------------------------------+--------+--------+
| 35251 |     0 | Tabledrag classique           |      1 | 02/    |
| 35241 |     0 | Bonjour,                      |      1 | 01/    |
| 35216 |     0 | CSS menu Superfish            |      1 | 06/    |
+-------+-------+-------------------------------+--------+--------+
4 rows in set (0.00 sec)

Ici, le commentaire avec le cid 35251 est en fait une réponse au cid 35241. Regardons un peu le schéma de base de données pour y voir plus clair :

  • pid : comment.cid auquel le commentaire courant se rapporte. Si la valeur est à 0, le commentaire n'est pas une réponse à un précédent commentaire
  • thread : representation alpha-décimale de la place du commentaire dans une discussion. Consiste en une chaîne de base 36 avec un préfixe (integer) indiquant sa longueur
Ainsi, il faut donc que la colonne pid référence le cid du commentaire auquel il se rapporte. Facile, il suffit de changer la valeur par 35251. Maintenant, pour ce qui est de la colonne thread, la suite de chiffre 0x/ (lettre ou chiffre, donc) indique la position du commentaire.  Si 01/ indique le premier commentaire d'un nœud, lorsque vous aurez une réponse à ce commentaire, le format sera le suivant : 01.00/ Vous suivez toujours ? Si cette réponse obtient également une réponse, le format sera alors 01.00.00/ et ainsi de suite.
 
Pour revenir à notre exemple, il suffit donc de modifier la colonne pid et thread comme convenu pour que le commentaire 35251 soit donc une réponse au commentaire 35241 et soit donc également déplacé en conséquence.
mysql> SELECT cid,pid,subject,status,thread FROM comment WHERE status = 1 AND cid > 35191 ORDER BY cid DESC;
+-------+-------+-------------------------------+--------+--------+
| cid   | pid   | subject                       | status | thread |
+-------+-------+-------------------------------+--------+--------+
| 35251 | 35241 | Tabledrag classique           |      1 | 01.00/ |
| 35241 |     0 | Bonjour,                      |      1 | 01/    |
| 35216 |     0 | CSS menu Superfish            |      1 | 06/    |
+-------+-------+-------------------------------+--------+--------+
4 rows in set (0.00 sec)

Ce qui nous donne le résultat final escompté :

[[{"type":"media","view_mode":"media_original","fid":"1411","attributes":{"alt":"","class":"media-image","height":"315","typeof":"foaf:Image","width":"336"}}]]

Et voilà !

Partager ce contenu