PageRenderTime 48ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/_plugins_/saisies/inc/saisies_lister.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 321 lines | 173 code | 30 blank | 118 comment | 23 complexity | 248b66f4a98e86b4c5889b34aacf6c69 MD5 | raw file
  1. <?php
  2. // Sécurité
  3. if (!defined('_ECRIRE_INC_VERSION')) return;
  4. /*
  5. * Prend la description complète du contenu d'un formulaire et retourne
  6. * les saisies "à plat" classées par identifiant unique.
  7. *
  8. * @param array $contenu Le contenu d'un formulaire
  9. * @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldsets
  10. * @return array Un tableau avec uniquement les saisies
  11. */
  12. function saisies_lister_par_identifiant($contenu, $avec_conteneur=true){
  13. $saisies = array();
  14. if (is_array($contenu)){
  15. foreach ($contenu as $ligne){
  16. if (is_array($ligne)) {
  17. $enfants_presents = (isset($ligne['saisies']) and is_array($ligne['saisies']));
  18. if (array_key_exists('saisie', $ligne) and (!$enfants_presents or $avec_conteneur)){
  19. $saisies[$ligne['identifiant']] = $ligne;
  20. }
  21. if ($enfants_presents) {
  22. $saisies = array_merge($saisies, saisies_lister_par_identifiant($ligne['saisies']));
  23. }
  24. }
  25. }
  26. }
  27. return $saisies;
  28. }
  29. /*
  30. * Prend la description complète du contenu d'un formulaire et retourne
  31. * les saisies "à plat" classées par nom.
  32. *
  33. * @param array $contenu Le contenu d'un formulaire
  34. * @param bool $avec_conteneur Indique si on renvoie aussi les saisies ayant des enfants, comme les fieldset
  35. * @return array Un tableau avec uniquement les saisies
  36. */
  37. function saisies_lister_par_nom($contenu, $avec_conteneur=true){
  38. $saisies = array();
  39. if (is_array($contenu)){
  40. foreach ($contenu as $ligne){
  41. if (is_array($ligne)){
  42. if (array_key_exists('saisie', $ligne) and (!isset($ligne['saisies']) OR !is_array($ligne['saisies']) or $avec_conteneur)){
  43. $saisies[$ligne['options']['nom']] = $ligne;
  44. }
  45. if (isset($ligne['saisies']) AND is_array($ligne['saisies'])){
  46. $saisies = array_merge($saisies, saisies_lister_par_nom($ligne['saisies']));
  47. }
  48. }
  49. }
  50. }
  51. return $saisies;
  52. }
  53. /*
  54. * Liste les saisies ayant une option X
  55. * # saisies_lister_avec_option('sql', $saisies);
  56. *
  57. *
  58. * @param String $option Nom de l'option cherchée
  59. * @param Array $saisies Liste de saisies
  60. * @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
  61. * @return liste de ces saisies triees par nom ayant une option X définie
  62. */
  63. function saisies_lister_avec_option($option, $saisies, $tri = 'nom') {
  64. $saisies_option = array();
  65. // tri par nom si ce n'est pas le cas
  66. $s = array_keys($saisies);
  67. if (is_int(array_shift($s))) {
  68. $trier = 'saisies_lister_par_' . $tri;
  69. $saisies = $trier($saisies);
  70. }
  71. foreach ($saisies as $nom_ou_id => $saisie) {
  72. if (isset($saisie['options'][$option]) and $saisie['options'][$option]) {
  73. $saisies_option[$nom_ou_id] = $saisie;
  74. }
  75. }
  76. return $saisies_option;
  77. }
  78. /*
  79. * Liste les saisies ayant une definition SQL
  80. *
  81. * @param Array $saisies liste de saisies
  82. * @param String $tri tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
  83. * @return liste de ces saisies triees par nom ayant une option sql définie
  84. */
  85. function saisies_lister_avec_sql($saisies, $tri = 'nom') {
  86. return saisies_lister_avec_option('sql', $saisies, $tri);
  87. }
  88. /*
  89. * Prend la description complète du contenu d'un formulaire et retourne
  90. * les saisies "à plat" classées par type de saisie.
  91. * $saisie['input']['input_1'] = $saisie
  92. *
  93. * @param array $contenu Le contenu d'un formulaire
  94. * @return array Un tableau avec uniquement les saisies
  95. */
  96. function saisies_lister_par_type($contenu) {
  97. $saisies = array();
  98. if (is_array($contenu)){
  99. foreach ($contenu as $ligne){
  100. if (is_array($ligne)){
  101. if (array_key_exists('saisie', $ligne) and (!is_array($ligne['saisies']))){
  102. $saisies[ $ligne['saisie'] ][ $ligne['options']['nom'] ] = $ligne;
  103. }
  104. if (is_array($ligne['saisies'])){
  105. $saisies = array_merge($saisies, saisies_lister_par_type($ligne['saisies']));
  106. }
  107. }
  108. }
  109. }
  110. return $saisies;
  111. }
  112. /*
  113. * Prend la description complète du contenu d'un formulaire et retourne
  114. * une liste des noms des champs du formulaire.
  115. *
  116. * @param array $contenu Le contenu d'un formulaire
  117. * @return array Un tableau listant les noms des champs
  118. */
  119. function saisies_lister_champs($contenu, $avec_conteneur=true){
  120. $saisies = saisies_lister_par_nom($contenu, $avec_conteneur);
  121. return array_keys($saisies);
  122. }
  123. /*
  124. * A utiliser dans une fonction charger d'un formulaire CVT,
  125. * cette fonction renvoie le tableau de contexte correspondant
  126. * de la forme $contexte['nom_champ'] = ''
  127. *
  128. * @param array $contenu Le contenu d'un formulaire (un tableau de saisies)
  129. * @return array Un tableau de contexte
  130. */
  131. function saisies_charger_champs($contenu) {
  132. // array_fill_keys est disponible uniquement avec PHP >= 5.2.0
  133. // return array_fill_keys(saisies_lister_champs($contenu, false), '');
  134. $champs = array();
  135. foreach (saisies_lister_champs($contenu, false) as $champ)
  136. $champs[$champ] = '';
  137. return $champs;
  138. }
  139. /*
  140. * Prend la description complète du contenu d'un formulaire et retourne
  141. * une liste des valeurs par défaut des champs du formulaire.
  142. *
  143. * @param array $contenu Le contenu d'un formulaire
  144. * @return array Un tableau renvoyant la valeur par défaut de chaque champs
  145. */
  146. function saisies_lister_valeurs_defaut($contenu){
  147. $contenu = saisies_lister_par_nom($contenu, false);
  148. $defauts = array();
  149. foreach ($contenu as $nom => $saisie){
  150. // Si le nom du champ est un tableau indexé, il faut parser !
  151. if (preg_match('/([\w]+)((\[[\w]+\])+)/', $nom, $separe)){
  152. $nom = $separe[1];
  153. // Dans ce cas on ne récupère que le nom, la valeur par défaut du tableau devra être renseigné autre part
  154. $defauts[$nom] = array();
  155. }
  156. else{
  157. $defauts[$nom] = isset($saisie['options']['defaut']) ? $saisie['options']['defaut'] : '';
  158. }
  159. }
  160. return $defauts;
  161. }
  162. /*
  163. * Compare deux tableaux de saisies pour connaitre les différences
  164. * @param array $saisies_anciennes Un tableau décrivant des saisies
  165. * @param array $saisies_nouvelles Un autre tableau décrivant des saisies
  166. * @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
  167. * @param string $tri Comparer selon quel tri ? 'nom' / 'identifiant'
  168. * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
  169. */
  170. function saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true, $tri = 'nom') {
  171. $trier = "saisies_lister_par_$tri";
  172. $saisies_anciennes = $trier($saisies_anciennes, $avec_conteneur);
  173. $saisies_nouvelles = $trier($saisies_nouvelles, $avec_conteneur);
  174. // Les saisies supprimées sont celles qui restent dans les anciennes quand on a enlevé toutes les nouvelles
  175. $saisies_supprimees = array_diff_key($saisies_anciennes, $saisies_nouvelles);
  176. // Les saisies ajoutées, c'est le contraire
  177. $saisies_ajoutees = array_diff_key($saisies_nouvelles, $saisies_anciennes);
  178. // Il reste alors les saisies qui ont le même nom
  179. $saisies_restantes = array_intersect_key($saisies_anciennes, $saisies_nouvelles);
  180. // Dans celles-ci, celles qui sont modifiées sont celles dont la valeurs est différentes
  181. $saisies_modifiees = array_udiff(array_diff_key($saisies_nouvelles, $saisies_ajoutees), $saisies_restantes, 'saisies_comparer_rappel');
  182. #$saisies_modifiees = array_udiff($saisies_nouvelles, $saisies_restantes, 'saisies_comparer_rappel');
  183. // Et enfin les saisies qui ont le même nom et la même valeur
  184. $saisies_identiques = array_diff_key($saisies_restantes, $saisies_modifiees);
  185. return array(
  186. 'supprimees' => $saisies_supprimees,
  187. 'ajoutees' => $saisies_ajoutees,
  188. 'modifiees' => $saisies_modifiees,
  189. 'identiques' => $saisies_identiques
  190. );
  191. }
  192. /*
  193. * Compare deux saisies et indique si elles sont égales ou pas
  194. */
  195. function saisies_comparer_rappel($a, $b){
  196. if ($a === $b) return 0;
  197. else return 1;
  198. }
  199. /*
  200. * Compare deux tableaux de saisies pour connaitre les différences
  201. * en s'appuyant sur les identifiants de saisies
  202. *
  203. * @see saisies_comparer()
  204. * @param array $saisies_anciennes Un tableau décrivant des saisies
  205. * @param array $saisies_nouvelles Un autre tableau décrivant des saisies
  206. * @param bool $avec_conteneur Indique si on veut prendre en compte dans la comparaison les conteneurs comme les fieldsets
  207. * @return array Retourne le tableau des saisies supprimées, ajoutées et modifiées
  208. */
  209. function saisies_comparer_par_identifiant($saisies_anciennes, $saisies_nouvelles, $avec_conteneur=true) {
  210. return saisies_comparer($saisies_anciennes, $saisies_nouvelles, $avec_conteneur, $tri = 'identifiant');
  211. }
  212. /*
  213. * Liste toutes les saisies configurables (ayant une description)
  214. *
  215. * @return array Un tableau listant des saisies et leurs options
  216. */
  217. function saisies_lister_disponibles(){
  218. static $saisies = null;
  219. if (is_null($saisies)){
  220. $saisies = array();
  221. $liste = find_all_in_path('saisies/', '.+[.]yaml$');
  222. if (count($liste)){
  223. foreach ($liste as $fichier=>$chemin){
  224. $type_saisie = preg_replace(',[.]yaml$,i', '', $fichier);
  225. $dossier = str_replace($fichier, '', $chemin);
  226. // On ne garde que les saisies qui ont bien le HTML avec !
  227. if (file_exists("$dossier$type_saisie.html")
  228. and (
  229. is_array($saisie = saisies_charger_infos($type_saisie))
  230. )
  231. ){
  232. $saisies[$type_saisie] = $saisie;
  233. }
  234. }
  235. }
  236. }
  237. return $saisies;
  238. }
  239. /*
  240. * Lister les saisies existantes ayant une définition SQL
  241. *
  242. * @return array Un tableau listant des saisies et leurs options
  243. */
  244. function saisies_lister_disponibles_sql() {
  245. $saisies = array();
  246. $saisies_disponibles = saisies_lister_disponibles();
  247. foreach ($saisies_disponibles as $type=>$saisie) {
  248. if (isset($saisie['defaut']['options']['sql']) and $saisie['defaut']['options']['sql']) {
  249. $saisies[$type] = $saisie;
  250. }
  251. }
  252. return $saisies;
  253. }
  254. /*
  255. * Charger les informations contenues dans le YAML d'une saisie
  256. *
  257. * @param string $type_saisie Le type de la saisie
  258. * @return array Un tableau contenant le YAML décodé
  259. */
  260. function saisies_charger_infos($type_saisie){
  261. include_spip('inc/yaml');
  262. $fichier = find_in_path("saisies/$type_saisie.yaml");
  263. $saisie = yaml_decode_file($fichier);
  264. if (is_array($saisie)){
  265. $saisie['titre'] = (isset($saisie['titre']) AND $saisie['titre'])
  266. ? _T_ou_typo($saisie['titre']) : $type_saisie;
  267. $saisie['description'] = (isset($saisie['description']) AND $saisie['description'])
  268. ? _T_ou_typo($saisie['description']) : '';
  269. $saisie['icone'] = (isset($saisie['icone']) AND $saisie['icone'])
  270. ? find_in_path($saisie['icone']) : '';
  271. }
  272. return $saisie;
  273. }
  274. /*
  275. * Quelles sont les saisies qui se débrouillent toutes seules, sans le _base commun
  276. *
  277. * @return array Retourne un tableau contenant les types de saisies qui ne doivent pas utiliser le _base.html commun
  278. */
  279. function saisies_autonomes(){
  280. $saisies_autonomes = pipeline(
  281. 'saisies_autonomes',
  282. array(
  283. 'fieldset',
  284. 'hidden',
  285. 'destinataires',
  286. 'explication'
  287. )
  288. );
  289. return $saisies_autonomes;
  290. }
  291. ?>