diff --git a/inc/contrib_rubrique.php b/inc/contrib_rubrique.php index 33c2e43..bac851e 100644 --- a/inc/contrib_rubrique.php +++ b/inc/contrib_rubrique.php @@ -3,6 +3,63 @@ if (!defined('_ECRIRE_INC_VERSION')) { return; } +/** + * Retourne la description complète ou une liste de champs précisés dans l'appel + * d'un objet plugin identifié par son préfixe. + * + * @param int $id_rubrique Id de la rubrique. + * @param array|string $informations Identifiant d'un champ ou de plusieurs champs de la description d'une rubrique. + * Si l'argument est vide, la fonction renvoie la description complète. + * + * @return mixed La description brute complète ou partielle de la rubrique : + * - sous la forme d'une valeur simple si l'information demandée est unique (chaine) + * - sous la forme d'un tabelau associatif indexé par le nom du champ sinon. + */ +function rubrique_lire($id_rubrique, $informations = array()) { + + // Initialisation du tableau statique des descriptions + static $descriptions_rubrique = array(); + + if (($id_rubrique = intval($id_rubrique)) + and !isset($descriptions_rubrique[$id_rubrique])) { + // Initialisation des attributs de la requête. + $from = array('spip_rubriques'); + $where[] = 'id_rubrique=' . $id_rubrique; + + // Acquisition de tous les champs du plugin et sauvegarde de celle-ci à l'index du préfixe. + $descriptions_rubrique[$id_rubrique] = array(); + if ($description = sql_fetsel('*', $from, $where)) { + $descriptions_rubrique[$id_rubrique] = $description; + } + } + + // On extrait la description complète maintenant que l'on sait qu'elle existe. + $description = $descriptions_rubrique[$id_rubrique]; + + // On ne retourne que les champs demandés + if ($description and $informations) { + // Extraction des seules informations demandées. + // -- si on demande une information unique on renvoie la valeur simple, sinon on renvoie un tableau. + // -- si une information n'est pas un champ valide elle n'est pas renvoyée sans monter d'erreur. + if (is_array($informations)) { + if (count($informations) == 1) { + // Tableau d'une seule information : on revient à une chaine unique. + $informations = array_shift($informations); + } else { + // Tableau des informations valides + $description = array_intersect_key($description, array_flip($informations)); + } + } + + if (is_string($informations)) { + // Valeur unique demandée. + $description = isset($description[$informations]) ? $description[$informations] : ''; + } + } + + return $description; +} + function rubrique_lire_profondeur($id_rubrique) { static $profondeurs = array(); @@ -70,16 +127,21 @@ function rubrique_determiner_type($id_rubrique) { static $types = array(); if (!isset($types[$id_rubrique])) { + $types[$id_rubrique] = ''; if (rubrique_dans_secteur_plugin($id_rubrique)) { - $types[$id_rubrique] = 'plugin'; + // On vérifie que la rubrique est soit une catégorie de profondeur inférieure à 1, soit un plugin de + // profondeur 2 + $rubrique = rubrique_lire($id_rubrique); + if ((($rubrique['profondeur'] <= 1) and $rubrique['categorie']) + or (($rubrique['profondeur'] == 2) and $rubrique['prefixe'])) { + $types[$id_rubrique] = 'plugin'; + } } elseif (rubrique_dans_secteur_apropos($id_rubrique)) { $types[$id_rubrique] = 'apropos'; } elseif (rubrique_dans_secteur_carnet($id_rubrique)) { $types[$id_rubrique] = 'carnet'; } elseif (rubrique_dans_secteur_galaxie($id_rubrique)) { $types[$id_rubrique] = 'galaxie'; - } else { - $types[$id_rubrique] = ''; } } @@ -194,7 +256,7 @@ function rubrique_dans_secteur_plugin($id_rubrique) { */ function rubrique_lister_secteur_plugin() { - // On sélectionne les rubriques de profndeur nulle et ayant une catégorie. + // On sélectionne les rubriques de profondeur nulle et ayant une catégorie. $from = 'spip_rubriques'; $where = array( 'profondeur=0',