source: spip-zone/_plugins_/elements/elements_fonctions.php @ 123150

Last change on this file since 123150 was 65760, checked in by marcimat@…, 8 years ago

Transmettre _element (le type d'élément) aux squelettes d'éléments... ça peut servir pour des noms de classes CSS

File size: 6.0 KB
Line 
1<?php
2
3/**
4 * Déclarations des fonctions pour les squelettes
5 * @package SPIP\Elements\Fonctions
6 */
7
8// Securite
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11
12/**
13 * Retourne un tableau de description de tous les éléments
14 * autorisés par la configuration, classés par nom
15 *
16 * @return array
17 *     Liste des éléments
18**/
19function lister_elements_autorises_par_nom() {
20        $elems = lister_elements_par_nom();
21        $autorises = lire_config('elements/elements', array());
22        $elems = array_intersect_key($elems, array_flip($autorises));
23        return $elems;
24}
25
26
27/**
28 * Retourne un tableau de description de tous les éléments connus
29 * classés par nom
30 *
31 * @param string $nom
32 *     Éventuel nom d'élément dont on voudrait la description uniquement
33 * @return array|null
34 *     - Liste des éléments
35 *     - Ou seulement l'élément indiqué par $nom
36 *     - null si l'élément n'est pas trouvé.
37**/
38function lister_elements_par_nom($nom = '') {
39        $elem = elements_lister_descriptions();
40        if ($nom) {
41                if (isset($elem[$nom])) {
42                        return $elem[$nom];
43                } else {
44                        return null;
45                }
46        }
47        ksort($elem);
48        return $elem;
49}
50
51
52/**
53 * Obtenir les infos de tous les éléments disponibles dans les dossiers elements/
54 * C'est un GROS calcul lorsqu'il est a faire.
55 *
56 * @note Inspiré de noizetier_obtenir_infos_noisettes_direct()
57 *
58 * @return array
59 */
60function elements_lister_descriptions(){
61        static $liste_elements = array();
62
63        // deja calculé ?
64        if ($liste_elements) {
65                return $liste_elements;
66        }
67
68        $match = "[^-]*[.]html$";
69        $liste = find_all_in_path('elements/', $match);
70
71        if (count($liste)){
72                foreach($liste as $squelette=>$chemin) {
73                        $element = preg_replace(',[.]html$,i', '', $squelette);
74                        $dossier = str_replace($squelette, '', $chemin);
75                        // On ne garde que les squelettes ayant un fichier YAML de config
76                        if (file_exists("$dossier$element.yaml")
77                                AND ($infos_element = elements_decrire_yaml($dossier.$element))
78                        ){
79                                $infos_element['element'] = $element; // ajout du type d'élement dans la description
80                                $liste_elements[$element] = $infos_element;
81                        }
82                }
83        }
84
85        // supprimer de la liste les noisettes necissant un plugin qui n'est pas actif
86        foreach ($liste_elements as $element => $infos_element)
87                if (isset($infos_element['necessite']))
88                        foreach ($infos_element['necessite'] as $plugin)
89                                if (!defined('_DIR_PLUGIN_'.strtoupper($plugin)))
90                                        unset($liste_elements[$element]);
91
92        return $liste_elements;
93}
94
95
96
97/**
98 * Charger les informations contenues dans le YAML d'un élément
99 *
100 * @note Inspiré de noizetier_charger_infos_noisette_yaml()
101 *
102 * @param string $element Chemin du fichier d'élément
103 * @param string $info    Information a obtenir (sinon prend tout)
104 * @return array|string   Liste des informations
105 */
106function elements_decrire_yaml($element, $info=""){
107                // on peut appeler avec le nom du squelette
108                $fichier = preg_replace(',[.]html$,i','',$element).".yaml";
109                include_spip('inc/yaml');
110                include_spip('inc/texte');
111                $infos_element = array();
112                if ($infos_element = yaml_charger_inclusions(yaml_decode_file($fichier))) {
113                        if (isset($infos_element['nom']))
114                                $infos_element['nom'] = _T_ou_typo($infos_element['nom']);
115                        if (isset($infos_element['description']))
116                                $infos_element['description'] = _T_ou_typo($infos_element['description']);
117                        if (isset($infos_element['icon']))
118                                $infos_element['icon'] = $infos_element['icon'];
119
120                        if (!isset($infos_element['parametres']))
121                                $infos_element['parametres'] = array();
122
123                        // contexte
124                        if (!isset($infos_element['contexte'])) {
125                                $infos_element['contexte'] = array();
126                        }
127                        if (is_string($infos_element['contexte'])) {
128                                $infos_element['contexte'] = array($infos_element['contexte']);
129                        }
130
131                        // ajax
132                        if (!isset($infos_element['ajax'])) {
133                                $infos_element['ajax'] = 'oui';
134                        }
135                        // inclusion
136                        if (!isset($infos_element['inclusion'])) {
137                                $infos_element['inclusion'] = 'statique';
138                        }
139                }
140
141                if (!$info)
142                        return $infos_element;
143                else 
144                        return isset($infos_element[$info]) ? $infos_element[$info] : "";
145}
146
147
148/**
149 * À partir des infos d'éléments stockés en bdd dans spip_elements/elements
150 * retrouve la description yaml des éléments correspondants
151 *
152 * @param array $elements
153 *     Liste d'elements sélectionnés tels qu'enregistrés dans la bdd
154 *     mais désélialisés
155 * @retrun array
156 *     Liste dans le même ordre des éléments avec leurs description yaml
157 *
158**/
159function elements_obtenir_desriptions($elements) {
160        $descriptions = array();
161        $liste = lister_elements_par_nom();
162        // pour chaque element choisi, retrouve la description yaml du type d'element
163        foreach ($elements as $k=>$e) {
164                $type = $e['element'];
165                if (isset($liste[$type])) {
166                        $descriptions[$k] = $liste[$type];
167                }
168        }
169        return $descriptions;
170}
171
172
173/**
174 * Retourne le code HTML d'un élément
175 *
176 * @param string $element
177 *     Nom de l'élément
178 * @param array $args
179 *     Valeurs enregistrées dans la base pour l'élément.
180 *     L'index 'contexte' contient le contexte transmis à l'inclusion
181 * @return string
182 *     Code HTML de l'élément
183**/
184function elements_inclure_element($element, $args=array()) {
185        if (!$element) {
186                return '';
187        }
188       
189        $contexte = $args['contexte'];
190        $contexte['_element'] = $args['element'];
191        $code = recuperer_fond("elements/$element", $contexte);
192        return $code;
193}
194
195
196/**
197 * Retourne le code HTML du titre d'un élément
198 *
199 * Le titre est défini par un squelette elements/{element}_titre.html
200 * lorsqu'il est présent. Sinon laissé vide.
201 *
202 * @param string $element
203 *     Nom de l'élément
204 * @param array $args
205 *     Valeurs enregistrées dans la base pour l'élément.
206 *     L'index 'contexte' contient le contexte transmis à l'inclusion
207 * @return string
208 *     Code HTML du titre de l'élément, sinon rien.
209**/
210function elements_inclure_element_titre($element, $args=array()) {
211        if (!$element) {
212                return '';
213        }
214        $element_titre = $element . '_titre';
215
216        if (!trouver_fond($element_titre, 'elements')) {
217                return '';
218        }
219
220        $contexte = $args['contexte'];
221        $contexte['_element'] = $args['element'];
222        $code = recuperer_fond("elements/$element_titre", $contexte);
223        return $code;
224}
Note: See TracBrowser for help on using the repository browser.