You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

300 lines
9.2 KiB

  1. <?php
  2. if (!defined('_ECRIRE_INC_VERSION')) {
  3. return;
  4. }
  5. /**
  6. * Retourne la description complète ou une liste de champs précisés dans l'appel
  7. * d'un objet rubrique identifié par son id.
  8. *
  9. * @param int $id_rubrique Id de la rubrique.
  10. * @param array|string $informations Identifiant d'un champ ou de plusieurs champs de la description d'une rubrique.
  11. * Si l'argument est vide, la fonction renvoie la description complète.
  12. *
  13. * @return mixed La description brute complète ou partielle de la rubrique :
  14. * - sous la forme d'une valeur simple si l'information demandée est unique (chaine ou tableau à un élément)
  15. * - sous la forme d'un tabelau associatif sinon.
  16. * - sous la forme d'un tableau vide si une erreur s'est produite.
  17. */
  18. function rubrique_lire($id_rubrique, $informations = array()) {
  19. // Initialisation du tableau statique des descriptions
  20. static $descriptions_rubrique = array();
  21. // Initialisation de la description (sortie en cas d'erreur).
  22. $description = array();
  23. if ($id_rubrique = intval($id_rubrique)) {
  24. if (!isset($descriptions_rubrique[$id_rubrique])) {
  25. // Initialisation des attributs de la requête.
  26. $from = array('spip_rubriques');
  27. $where[] = 'id_rubrique=' . $id_rubrique;
  28. // Acquisition de tous les champs du plugin et sauvegarde de celle-ci à l'index du préfixe.
  29. $descriptions_rubrique[$id_rubrique] = array();
  30. if ($description = sql_fetsel('*', $from, $where)) {
  31. $descriptions_rubrique[$id_rubrique] = $description;
  32. }
  33. }
  34. // On extrait la description complète maintenant que l'on sait qu'elle existe.
  35. $description = $descriptions_rubrique[$id_rubrique];
  36. }
  37. // On ne retourne que les champs demandés
  38. if ($description and $informations) {
  39. // Extraction des seules informations demandées.
  40. // -- si on demande une information unique on renvoie la valeur simple, sinon on renvoie un tableau.
  41. // -- si une information n'est pas un champ valide elle n'est pas renvoyée sans monter d'erreur.
  42. if (is_array($informations)) {
  43. if (count($informations) == 1) {
  44. // Tableau d'une seule information : on revient à une chaine unique.
  45. $informations = array_shift($informations);
  46. } else {
  47. // Tableau des informations valides
  48. $description = array_intersect_key($description, array_flip($informations));
  49. }
  50. }
  51. if (is_string($informations)) {
  52. // Valeur unique demandée.
  53. $description = isset($description[$informations]) ? $description[$informations] : '';
  54. }
  55. }
  56. return $description;
  57. }
  58. /**
  59. * Renvoie l'information brute demandée pour l'ensemble des types de plugins d'une typologie donnée
  60. * ou toute les descriptions si aucune information n'est explicitement demandée.
  61. *
  62. * @api
  63. *
  64. * @param array $filtres Liste des couples (champ, valeur) ou tableau vide.
  65. * @param array $informations Identifiant d'un champ ou de plusieurs champs de la description d'un type de plugin.
  66. * Si l'argument est vide, la fonction renvoie les descriptions complètes.
  67. *
  68. * @return array Description complète ou information précise pour chaque type de plugin de la typologie concernée.
  69. */
  70. function rubrique_repertorier($filtres = array(), $informations = array()) {
  71. // On récupère la description complète de toutes les rubriques
  72. // -- Table, colonnes et tri
  73. $from = array('spip_rubriques');
  74. $select = '*';
  75. $order_by = array('id_rubrique');
  76. // -- Calcul du where à partir des filtres.
  77. $where = array();
  78. if ($filtres) {
  79. foreach ($filtres as $_champ => $_critere) {
  80. $operateur = '=';
  81. $valeur = $_critere;
  82. if (substr($_critere, 0, 1) == '!') {
  83. $operateur = '!=';
  84. $valeur = ltrim($_critere, '!');
  85. }
  86. $where[] = $_champ . $operateur . (intval($valeur) ? intval($valeur) : sql_quote($valeur));
  87. }
  88. }
  89. // -- Appel SQL : le retour est toujours un tableau éventuellement vide.
  90. $rubriques_description = sql_allfetsel($select, $from, $where, '', $order_by);
  91. // Refactoring du tableau suivant les champs demandés.
  92. if (!$informations) {
  93. $rubriques = $rubriques_description;
  94. } else {
  95. $rubriques = array();
  96. $informations = array_flip($informations);
  97. foreach ($rubriques_description as $_cle => $_rubrique) {
  98. $rubriques[] = array_intersect_key($rubriques_description[$_cle], $informations);
  99. }
  100. }
  101. return $rubriques;
  102. }
  103. /**
  104. * Libère, pour l'auteur l'ayant demandé, les éditions sur les rubriques.
  105. *
  106. * @uses lire_tableau_edition()
  107. * @uses ecrire_tableau_edition()
  108. *
  109. * @param int $id_auteur Identifiant de l'auteur
  110. *
  111. * @return void
  112. */
  113. function rubrique_debloquer_edition($id_auteur) {
  114. $edition = lire_tableau_edition();
  115. foreach ($edition as $_objet => $_data) {
  116. if ($_objet == 'rubrique') {
  117. foreach ($_data as $_id => $_auteurs) {
  118. if (isset($_auteurs[$id_auteur])) {
  119. unset($edition[$_objet][$_id][$id_auteur]);
  120. ecrire_tableau_edition($edition);
  121. }
  122. }
  123. }
  124. }
  125. }
  126. function rubrique_lire_categorie_secteur($id_rubrique) {
  127. static $categories = array();
  128. if (!isset($categories[$id_rubrique])) {
  129. $categories[$id_rubrique] = '';
  130. $id_secteur = rubrique_lire($id_rubrique, 'id_secteur');
  131. $categories[$id_rubrique] = rubrique_lire($id_secteur, 'categorie');
  132. }
  133. return $categories[$id_rubrique];
  134. }
  135. function rubrique_determiner_type($id_rubrique) {
  136. static $types = array();
  137. if (!isset($types[$id_rubrique])) {
  138. $types[$id_rubrique] = '';
  139. if (rubrique_dans_secteur_plugin($id_rubrique)) {
  140. // On vérifie que la rubrique est soit une catégorie de profondeur inférieure à 1, soit un plugin de
  141. // profondeur 2
  142. $rubrique = rubrique_lire($id_rubrique);
  143. if ((($rubrique['profondeur'] <= 1) and $rubrique['categorie'])
  144. or (($rubrique['profondeur'] == 2) and $rubrique['prefixe'])) {
  145. $types[$id_rubrique] = 'plugin';
  146. }
  147. } elseif (rubrique_dans_secteur_apropos($id_rubrique)) {
  148. $types[$id_rubrique] = 'apropos';
  149. } elseif (rubrique_dans_secteur_carnet($id_rubrique)) {
  150. $types[$id_rubrique] = 'carnet';
  151. } elseif (rubrique_dans_secteur_galaxie($id_rubrique)) {
  152. $types[$id_rubrique] = 'galaxie';
  153. }
  154. }
  155. return $types[$id_rubrique];
  156. }
  157. /**
  158. * Vérifie que la rubrique concernée fait bien partie du secteur-apropos.
  159. * Le secteur-apropos est déterminé par la configuration du secteur exclus dans
  160. * le plugin Exclure Secteur.
  161. *
  162. * @param int $id
  163. * Id de la rubrique concernée.
  164. * @param mixed $id_rubrique
  165. *
  166. * @return bool
  167. * True si la rubrique fait partie du secteur-apropos, false sinon.
  168. */
  169. function rubrique_dans_secteur_apropos($id_rubrique) {
  170. $est_apropos = false;
  171. include_spip('inc/config');
  172. $apropos = lire_config('secteur/exclure_sect', array());
  173. if ($apropos
  174. and ($id_secteur = intval(rubrique_lire($id_rubrique, 'id_secteur')))
  175. and in_array($id_secteur, $apropos)) {
  176. $est_apropos = true;
  177. }
  178. return $est_apropos;
  179. }
  180. /**
  181. * Vérifie que la rubrique concernée fait bien partie du secteur-carnet.
  182. * Le secteur-carnet est déterminé par la configuration de l'espace wiki dans le plugin
  183. * Autorité.
  184. *
  185. * @param mixed $id_rubrique Id de la rubrique concernée.
  186. *
  187. * @return bool True si la rubrique fait partie du secteur-carnet, false sinon.
  188. */
  189. function rubrique_dans_secteur_carnet($id_rubrique) {
  190. $est_carnet = false;
  191. include_spip('inc/config');
  192. $carnet = lire_config('autorite/espace_wiki', array());
  193. if ($carnet
  194. and ($id_secteur = intval(rubrique_lire($id_rubrique, 'id_secteur')))
  195. and in_array($id_secteur, $carnet)) {
  196. $est_carnet = true;
  197. }
  198. return $est_carnet;
  199. }
  200. /**
  201. * Vérifie que la rubrique concernée fait bien partie du secteur-galaxie.
  202. * Les secteurs-galaxie sont déterminés par une configuration du plugin Contrib.
  203. *
  204. * @param mixed $id_rubrique Id de la rubrique concernée.
  205. *
  206. * @return bool True si la rubrique fait partie du secteur-galaxie, false sinon.
  207. */
  208. function rubrique_dans_secteur_galaxie($id_rubrique) {
  209. $est_galaxie = false;
  210. include_spip('inc/config');
  211. $galaxie = lire_config('contrib/secteurs', array());
  212. if ($galaxie
  213. and ($id_secteur = intval(rubrique_lire($id_rubrique, 'id_secteur')))
  214. and in_array($id_secteur, $galaxie)) {
  215. $est_galaxie = true;
  216. }
  217. return $est_galaxie;
  218. }
  219. /**
  220. * Vérifie que la rubrique concernée fait bien partie d'un secteur-plugin.
  221. * Il suffit de vérifier que le secteur a bien une catégorie non vide.
  222. *
  223. * @param int $id
  224. * Id de la rubrique concernée.
  225. * @param mixed $id_rubrique
  226. *
  227. * @return bool
  228. * True si la rubrique fait partie d'un secteur-plugin, false sinon.
  229. */
  230. function rubrique_dans_secteur_plugin($id_rubrique) {
  231. static $est_plugin = array();
  232. if (!isset($est_plugin[$id_rubrique])) {
  233. $est_plugin[$id_rubrique] = false;
  234. if (rubrique_lire_categorie_secteur($id_rubrique)) {
  235. $est_plugin[$id_rubrique] = true;
  236. }
  237. }
  238. return $est_plugin[$id_rubrique];
  239. }
  240. /**
  241. * Récupère les id de tous les secteurs-plugin.
  242. *
  243. * @return array
  244. * Liste des id des secteurs-pllugin ou tableau vide.
  245. */
  246. function rubrique_lister_secteur_plugin() {
  247. // On sélectionne les rubriques de profondeur nulle et ayant une catégorie.
  248. $from = 'spip_rubriques';
  249. $where = array(
  250. 'profondeur=0',
  251. 'categorie!=' . sql_quote('')
  252. );
  253. if ($secteurs = sql_allfetsel('id_rubrique', $from, $where)) {
  254. $secteurs = array_column($secteurs, 'id_rubrique');
  255. }
  256. return $secteurs;
  257. }