/_plugins_/menus/trunk/inc/menus.php

https://bitbucket.org/pombredanne/spip-zone-treemap · PHP · 184 lines · 127 code · 19 blank · 38 comment · 24 complexity · 5ae246a4ab60361ca9429180c4a53932 MD5 · raw file

  1. <?php
  2. // Sécurité
  3. if (!defined("_ECRIRE_INC_VERSION")) return;
  4. /**
  5. * Lister les types d'entrée de menus disponibles dans les dossiers menus/
  6. *
  7. * @staticvar array $resultats
  8. * @param bool $informer
  9. * @return array
  10. */
  11. function menus_lister_disponibles($informer=true){
  12. static $resultats = null;
  13. $plugins_actifs = unserialize($GLOBALS['meta']['plugin']);
  14. if (is_null($resultats[$informer])){
  15. $resultats[$informer] = array();
  16. // rechercher les skel du type truc.html
  17. $match = ".+[.]html$";
  18. // lister les entrées disponibles
  19. $liste = find_all_in_path('menus/', $match);
  20. if (count($liste)){
  21. foreach($liste as $squelette=>$chemin) {
  22. $type = preg_replace(',[.]html$,i', '', $squelette);
  23. $dossier = str_replace($squelette, '', $chemin);
  24. // On ne garde que les squelettes ayant un XML de config
  25. if (file_exists("$dossier$type.xml")
  26. AND (
  27. $entree = !$informer OR ($entree = menus_charger_infos($dossier.$type))
  28. )){
  29. //on ne garde que les menus repondants aux necessites
  30. $necessite = true;
  31. if (! empty($entree['necessites']['plugin'])) {
  32. /* la globale $plugins liste tout en majuscule */
  33. $entree['necessites']['plugin'] = array_map("strtoupper", $entree['necessites']['plugin']);
  34. foreach($entree['necessites']['plugin'] as $plugin) {
  35. if ( ! array_key_exists($plugin,$plugins_actifs) )
  36. $necessite = false;
  37. }
  38. }
  39. if ($necessite)
  40. $resultats[$informer][$type] = $entree;
  41. }
  42. }
  43. }
  44. $resultats[$informer] = pipeline('menus_lister_disponibles',array(
  45. 'args' => array(),
  46. 'data' => $resultats[$informer]
  47. )
  48. );
  49. }
  50. return $resultats[$informer];
  51. }
  52. /**
  53. * Decrire un type de menu
  54. *
  55. * @staticvar array $infos
  56. * @param string $type
  57. * @return array
  58. */
  59. function menus_informer($type){
  60. static $infos = array();
  61. if (!isset($infos[$type])){
  62. $fichier = find_in_path("menus/$type.html");
  63. $infos[$type] = menus_charger_infos($fichier);
  64. }
  65. return $infos[$type];
  66. }
  67. /**
  68. * Charger les informations contenues dans le xml d'une entrée de menu
  69. *
  70. * @param string $type
  71. * @param string $info
  72. * @return array
  73. */
  74. function menus_charger_infos($type, $info=""){
  75. // on peut appeler avec le nom du squelette
  76. $fichier = preg_replace(',[.]html$,i','',$type).".xml";
  77. include_spip('inc/xml');
  78. include_spip('inc/texte');
  79. $entree = array();
  80. if ($xml = spip_xml_load($fichier, false)){
  81. if (count($xml['entree'])){
  82. $xml = reset($xml['entree']);
  83. $entree['nom'] = _T_ou_typo(spip_xml_aplatit($xml['nom']));
  84. $entree['rang'] = intval(trim(spip_xml_aplatit($xml['rang'])));
  85. $entree['rang'] = ($entree['rang'] ? $entree['rang'] : 1000);
  86. $entree['description'] = isset($xml['description']) ? _T_ou_typo(spip_xml_aplatit($xml['description'])) : '';
  87. $entree['icone'] = isset($xml['icone']) ? find_in_path(reset($xml['icone'])) : '';
  88. $entree['refuser_sous_menu'] = isset($xml['refuser_sous_menu']);
  89. // Décomposition des paramètres
  90. $entree['parametres'] = array();
  91. if (spip_xml_match_nodes(',^parametre,', $xml, $parametres)){
  92. foreach (array_keys($parametres) as $parametre){
  93. list($balise, $attributs) = spip_xml_decompose_tag($parametre);
  94. $entree['parametres'][$attributs['nom']] = array(
  95. 'label' => (isset($attributs['label']) && $attributs['label']) ? _T($attributs['label']) : $attributs['nom'],
  96. 'obligatoire' => (isset($attributs['obligatoire']) && $attributs['obligatoire'] == 'oui') ? true : false,
  97. 'class' => (isset($attributs['class']) && $attributs['class']) ? $attributs['class'] : ''
  98. );
  99. }
  100. }
  101. //Décomposition des necessites
  102. if (spip_xml_match_nodes(',^necessite,', $xml, $necessites)){
  103. $entree['necessites']['plugin'] = array();
  104. foreach (array_keys($necessites) as $necessite){
  105. list($balise, $attributs) = spip_xml_decompose_tag($necessite);
  106. array_push($entree['necessites'][$attributs['type']] , $attributs['nom']);
  107. }
  108. }
  109. }
  110. }
  111. if (!$info)
  112. return $entree;
  113. else
  114. return isset($entree[$info]) ? $entree[$info] : "";
  115. }
  116. // Suprrimer une entrée (et les éventuels sous-menus en cascade)
  117. function menus_supprimer_entree($id_menus_entree){
  118. include_spip('base/abstract_sql');
  119. $id_menus_entree = intval($id_menus_entree);
  120. // On regarde d'abord s'il y a un sous-menu
  121. $id_menu = intval(sql_getfetsel(
  122. 'id_menu',
  123. 'spip_menus',
  124. 'id_menus_entree = '.$id_menus_entree
  125. ));
  126. // Dans ce cas on le supprime d'abord
  127. $ok = true;
  128. if ($id_menu)
  129. $ok = menus_supprimer_menu($id_menu);
  130. // Si c'est bon, on peut alors supprimer l'entrée
  131. if ($ok)
  132. $ok = sql_delete(
  133. 'spip_menus_entrees',
  134. 'id_menus_entree = '.$id_menus_entree
  135. );
  136. return $ok;
  137. }
  138. // Supprimer un menu (et donc toutes ses entrées aussi)
  139. function menus_supprimer_menu($id_menu){
  140. include_spip('base/abstract_sql');
  141. $id_menu = intval($id_menu);
  142. // On récupère toutes les entrées
  143. $entrees = sql_allfetsel(
  144. 'id_menus_entree',
  145. 'spip_menus_entrees',
  146. 'id_menu = '.$id_menu
  147. );
  148. if (is_array($entrees))
  149. $entrees = array_map('reset', $entrees);
  150. // On les supprime
  151. $ok = true;
  152. if (is_array($entrees))
  153. foreach ($entrees as $id_menus_entree){
  154. if ($ok)
  155. $ok = menus_supprimer_entree($id_menus_entree);
  156. }
  157. // Si tout s'est bien passé on peut enfin supprimer le menu
  158. if ($ok)
  159. $ok = sql_delete(
  160. 'spip_menus',
  161. 'id_menu = '.$id_menu
  162. );
  163. return $ok;
  164. }
  165. ?>