Trouver toutes les rubriques enfants d'une rubrique #SPIP

20 November 2016

[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.

<?php
/**
 * Retrouver les enfants directs d'une rubrique.
 *
 * @param int $id_rubrique
 * @access public
 * @return array tableau contenant les id_rubrique direct.
 */
function trouver_enfant($id_rubrique) {
    include_spip('base/abstract_sql');
    $sous_rubriques = sql_allfetsel('id_rubrique', 'spip_rubriques', 'id_parent='.intval($id_rubrique));
    return array_column($sous_rubriques, 'id_rubrique');
}

/**
 * Trouver les sous-rubriques d'une rubrique.
 *
 * @param int $id_rubrique l'id de la rubrique
 * @return array une liste d'id_rubrique
 */
function trouver_enfants($id_rubrique) {

    // Trouver la première série de sous-rubrique.
    $sous_rubriques = trouver_enfant($id_rubrique);

    // S'il n'y a pas de sous rubriques, on sort de la boucle avec juste la rubrique de base
    if (count($sous_rubriques) === 0) {
        return array($id_rubrique);
    } else {
        // On cherche en profondeur.
        foreach ($sous_rubriques as $id_sous_rubrique) {
            $recur = trouver_enfant($id_sous_rubrique);

            // Il y a des enfants, on les ajoute à la liste des sous rubrique
            // déjà trouvée.
            if ($recur) {
                $sous_rubriques = array_merge($sous_rubriques, $recur);
            }
        }

        // Placer la rubrique initiale en première position.
        array_unshift($sous_rubriques, $id_rubrique);

        return $sous_rubriques;
    }
}