var Phenix = function () {
Troll du Web depuis 1996

Trouver toutes les rubriques enfants d’une rubrique #SPIP

[Edit] : Comme signalé dans un commentaire, il existe bien une fonction native qui s’occupe de cela.

Il est parfois intéressant d’avoir la liste complètes des sous-rubriques d’une rubrique.

Par exemple, pour conditionner l’affichage d’un élément à une rubrique et tous ces enfants.

Il n’existe pas de fonction SPIP pour faire cela (ou en tout cas je ne l’ai pas trouvée). Voici donc un peu de code pour régler le problème.
C’est un collègue qui est à l’origine de cette fonction, je l’ai adaptée.

Attention, il faut PHP >= 5.5 ou installer le plugin SPIP bonux, à cause de la fonction array_column.

  1. /**
  2.  * Retrouver les enfants directs d'une rubrique.
  3.  *
  4.  * @param int $id_rubrique
  5.  * @access public
  6.  * @return array tableau contenant les id_rubrique direct.
  7.  */
  8. function trouver_enfant($id_rubrique) {
  9. include_spip('base/abstract_sql');
  10. $sous_rubriques = sql_allfetsel('id_rubrique', 'spip_rubriques', 'id_parent='.intval($id_rubrique));
  11. return array_column($sous_rubriques, 'id_rubrique');
  12. }
  13.  
  14. /**
  15.  * Trouver les sous-rubriques d'une rubrique.
  16.  *
  17.  * @param int $id_rubrique l'id de la rubrique
  18.  * @return array une liste d'id_rubrique
  19.  */
  20. function trouver_enfants($id_rubrique) {
  21.  
  22. // Trouver la première série de sous-rubrique.
  23. $sous_rubriques = trouver_enfant($id_rubrique);
  24.  
  25. // S'il n'y a pas de sous rubriques, on sort de la boucle avec juste la rubrique de base
  26. if (count($sous_rubriques) === 0) {
  27. return array($id_rubrique);
  28. } else {
  29. // On cherche en profondeur.
  30. foreach ($sous_rubriques as $id_sous_rubrique) {
  31. $recur = trouver_enfant($id_sous_rubrique);
  32.  
  33. // Il y a des enfants, on les ajoute à la liste des sous rubrique
  34. // déjà trouvée.
  35. if ($recur) {
  36. $sous_rubriques = array_merge($sous_rubriques, $recur);
  37. }
  38. }
  39.  
  40. // Placer la rubrique initiale en première position.
  41. array_unshift($sous_rubriques, $id_rubrique);
  42.  
  43. return $sous_rubriques;
  44. }
  45. }

3 Messages

Un message, un commentaire ?

modération a priori

Ce forum est modéré a priori : votre contribution n’apparaîtra qu’après avoir été validée par un administrateur du site.

Qui êtes-vous ?
Votre message
  • Pour créer des paragraphes, laissez simplement des lignes vides.