1 | <?php |
---|
2 | /** |
---|
3 | * Fonctions utiles au plugin Noizetier : agencements |
---|
4 | * |
---|
5 | * @api Grille |
---|
6 | * @plugin Noizetier : agencements |
---|
7 | * @copyright 2019 |
---|
8 | * @author Mukt |
---|
9 | * @licence GNU/GPL |
---|
10 | * @package SPIP\Noizetier_agencements\Fonctions |
---|
11 | */ |
---|
12 | |
---|
13 | // Sécurité |
---|
14 | if (!defined('_ECRIRE_INC_VERSION')) { |
---|
15 | return; |
---|
16 | } |
---|
17 | |
---|
18 | |
---|
19 | /** |
---|
20 | * Description de la grille : breakpoints etc. |
---|
21 | * |
---|
22 | * @param string $info |
---|
23 | * Pour renvoyer une clé en particulier |
---|
24 | * @return array|string |
---|
25 | * Tableau associatif ou chaîne si on demande un info précise (pour certaines) |
---|
26 | * Tableau vide en cas d'erreur |
---|
27 | */ |
---|
28 | function noizetier_layout_decrire_grille($info = null) { |
---|
29 | |
---|
30 | // Ne pas faire plusieurs fois le travail |
---|
31 | static $grille; |
---|
32 | if ($grille and isset($grille[$info])) { |
---|
33 | return $grille[$info]; |
---|
34 | } elseif ($grille) { |
---|
35 | return $grille; |
---|
36 | } |
---|
37 | |
---|
38 | $grille = $retour = array(); |
---|
39 | if ( |
---|
40 | noizetier_layout_grille() |
---|
41 | and $decrire_grille = charger_fonction('decrire_grille', 'grille/'._NOIZETIER_GRILLE) |
---|
42 | ) { |
---|
43 | $grille = $decrire_grille(); |
---|
44 | // Un coup pour les plugins |
---|
45 | $grille = pipeline( |
---|
46 | 'noizetier_decrire_grille', |
---|
47 | array( |
---|
48 | 'args' => array( |
---|
49 | 'grille' => _NOIZETIER_GRILLE, |
---|
50 | ), |
---|
51 | 'data' => $grille, |
---|
52 | ) |
---|
53 | ); |
---|
54 | // Retourner tout ou partie |
---|
55 | if ($info and isset($grille[$info])) { |
---|
56 | $retour = $grille[$info]; |
---|
57 | } else { |
---|
58 | $retour = $grille; |
---|
59 | } |
---|
60 | } |
---|
61 | |
---|
62 | return $retour; |
---|
63 | } |
---|
64 | |
---|
65 | |
---|
66 | /** |
---|
67 | * Description des saisies relatives à la grille pour l'édition d'une noisette |
---|
68 | * |
---|
69 | * @param string $element |
---|
70 | * Indique de quel type d'élément il s'agit : container | row | column |
---|
71 | * @param int $id_noisette |
---|
72 | * N° d'une noisette (optionnel) |
---|
73 | * @return array |
---|
74 | * Description des saisies pour l'élément demandé |
---|
75 | */ |
---|
76 | function noizetier_layout_lister_saisies($element = null, $id_noisette = 0) { |
---|
77 | |
---|
78 | // Ne pas faire plusieurs fois le travail |
---|
79 | static $saisies; |
---|
80 | if ($saisies and isset($saisies[$id_noisette][$element])) { |
---|
81 | return $saisies[$id_noisette][$element]; |
---|
82 | } elseif ($saisies[$id_noisette]) { |
---|
83 | return $saisies[$id_noisette]; |
---|
84 | } |
---|
85 | |
---|
86 | $saisies = $retour = array(); |
---|
87 | if ( |
---|
88 | noizetier_layout_grille() |
---|
89 | and $lister_saisies = charger_fonction('lister_saisies', 'grille/'._NOIZETIER_GRILLE) |
---|
90 | ) { |
---|
91 | $saisies_grille = $lister_saisies($id_noisette); |
---|
92 | // Un coup pour les plugins |
---|
93 | $saisies_grille = pipeline( |
---|
94 | 'noizetier_lister_saisies_grille', |
---|
95 | array( |
---|
96 | 'args' => array( |
---|
97 | 'grille' => _NOIZETIER_GRILLE, |
---|
98 | 'id_noisette' => $id_noisette, |
---|
99 | ), |
---|
100 | 'data' => $saisies_grille, |
---|
101 | ) |
---|
102 | ); |
---|
103 | // On ajoute les saisies |
---|
104 | foreach (array('container', 'row', 'column', '*') as $item) { |
---|
105 | if (isset($saisies_grille[$item])) { |
---|
106 | switch ($item) { |
---|
107 | // Celles directement à la racine |
---|
108 | // (pour l'instant, toutes) |
---|
109 | case 'container': |
---|
110 | case 'row': |
---|
111 | case 'column': |
---|
112 | case '*': |
---|
113 | $saisies[$id_noisette][$item] = $saisies_grille[$item]; |
---|
114 | break; |
---|
115 | // Les autres dans un fieldset |
---|
116 | default: |
---|
117 | $saisies[$id_noisette][$item] = array( |
---|
118 | array( |
---|
119 | 'saisie' => 'fieldset', |
---|
120 | 'options' => array( |
---|
121 | 'nom' => 'grille_'.$item, |
---|
122 | 'label' => _T('noizetier_layout:grid_'.$item.'_legend'), |
---|
123 | 'pliable' => 'oui', |
---|
124 | // 'plie' => 'oui', |
---|
125 | ), |
---|
126 | 'saisies' => $saisies_grille[$item], |
---|
127 | ), |
---|
128 | ); |
---|
129 | break; |
---|
130 | } |
---|
131 | } |
---|
132 | } |
---|
133 | // Retourner tout ou partie |
---|
134 | if ($element and isset($saisies[$id_noisette][$element])) { |
---|
135 | $retour = $saisies[$id_noisette][$element]; |
---|
136 | } else { |
---|
137 | $retour = $saisies[$id_noisette]; |
---|
138 | } |
---|
139 | } |
---|
140 | |
---|
141 | return $retour; |
---|
142 | } |
---|
143 | |
---|
144 | |
---|
145 | /** |
---|
146 | * Identifie les classes d'un noisette qui correspondent à la grille, et retourne un contexte |
---|
147 | * |
---|
148 | * @param string $element |
---|
149 | * Type d'élément de la grille : container | row | column |
---|
150 | * @param string $classes_element |
---|
151 | * Classes attribuées à l'élément |
---|
152 | * @return array |
---|
153 | * Tableau associatif champ => valeur |
---|
154 | */ |
---|
155 | function noizetier_layout_contextualiser_classes($element, $classes_element, $id_noisette = 0) { |
---|
156 | |
---|
157 | include_spip('inc/saisies'); |
---|
158 | $contexte = array(); |
---|
159 | $saisies = noizetier_layout_lister_saisies($element, $id_noisette); |
---|
160 | $classes_element = array_filter(explode(' ', $classes_element)); |
---|
161 | $saisies_par_nom = saisies_lister_par_nom($saisies); |
---|
162 | |
---|
163 | foreach ($saisies_par_nom as $champ => $saisie) { |
---|
164 | if ( |
---|
165 | isset($saisie['grille']) |
---|
166 | and $saisie['saisie'] != 'fieldset' |
---|
167 | ) { |
---|
168 | // Soit la valeur postée |
---|
169 | if (_request($champ)) { |
---|
170 | $contexte[$champ] = _request($champ); |
---|
171 | // Soit retrouver la valeur d'après la classe |
---|
172 | } else { |
---|
173 | $classes_champ = noizetier_layout_extraire_classes_saisies_grille($saisie); |
---|
174 | if ($valeur = array_intersect($classes_element, $classes_champ)) { |
---|
175 | // Certaines valeurs ne doivent pas être des tableaux |
---|
176 | if (empty($saisie['grille']['multiple'])) { |
---|
177 | $valeur = array_shift($valeur); |
---|
178 | } |
---|
179 | $contexte[$champ] = $valeur; |
---|
180 | } |
---|
181 | } |
---|
182 | } |
---|
183 | } |
---|
184 | |
---|
185 | return $contexte; |
---|
186 | } |
---|
187 | |
---|
188 | |
---|
189 | /** |
---|
190 | * Créer la variante d'une classe pour un média |
---|
191 | * |
---|
192 | * Par exemple : |
---|
193 | * - gridle : gr-6 => gr-6@desktop |
---|
194 | * - bootstrap : col-6 => col-lg-6 |
---|
195 | * |
---|
196 | * @param string $classe |
---|
197 | * Classe à modifier |
---|
198 | * @param string $media |
---|
199 | * Le media |
---|
200 | * @return string |
---|
201 | * La classe modifiée |
---|
202 | */ |
---|
203 | function noizetier_layout_creer_classe_media($classe, $media) { |
---|
204 | |
---|
205 | $classe_media = $classe; |
---|
206 | if ($creer_classe_media = charger_fonction('creer_classe_media', 'grille/'._NOIZETIER_GRILLE, true)) { |
---|
207 | $classe_media = $creer_classe_media($classe, $media); |
---|
208 | } |
---|
209 | |
---|
210 | return $classe_media; |
---|
211 | } |
---|
212 | |
---|
213 | |
---|
214 | |
---|
215 | /** |
---|
216 | * Détecter à quel élément de la grille correspond une noisette |
---|
217 | * |
---|
218 | * - Si la noisette est à la racine ou dans un conteneur lambda : container |
---|
219 | * - Si c'est une ligne : row |
---|
220 | * - Si elle est dans une ligne : column |
---|
221 | * |
---|
222 | * @note |
---|
223 | * Par commodité, une noisette peut à la fois être container + row/column |
---|
224 | * |
---|
225 | * @param int $id_noisette |
---|
226 | * N° de la noisette |
---|
227 | * @return array |
---|
228 | * Tableau : container | row | column |
---|
229 | */ |
---|
230 | function noizetier_layout_identifier_element_grille($id_noisette) { |
---|
231 | |
---|
232 | include_spip('inc/config'); |
---|
233 | $elements = array(); |
---|
234 | $noisette = sql_fetsel('type_noisette,id_conteneur', 'spip_noisettes', 'id_noisette='.intval($id_noisette)); |
---|
235 | $type_noisette = $noisette['type_noisette']; |
---|
236 | $id_conteneur = $noisette['id_conteneur']; |
---|
237 | $a_la_racine = (strpos($id_conteneur, '/') !== false); |
---|
238 | $dans_conteneur = (strpos($id_conteneur, 'noisette') !== false); |
---|
239 | list($type_noisette_parente, $noisette_parente, $id_noisette_parente) = explode('|', $id_conteneur); // pas de fonction dans l'API pour avoir ces infos |
---|
240 | $activer_container = lire_config('noizetier_layout/activer_container'); |
---|
241 | |
---|
242 | // Toutes les noisettes peuvent techniquement avoir un .container en enfant direct. |
---|
243 | // Cependant pour simplifier, on n'active l'option que pour celles à la racine |
---|
244 | // ou enfants directs d'une noisette conteneur. |
---|
245 | if ( |
---|
246 | $activer_container |
---|
247 | and ( |
---|
248 | $a_la_racine |
---|
249 | or $type_noisette_parente == 'conteneur' |
---|
250 | ) |
---|
251 | ) { |
---|
252 | $elements[] = 'container'; |
---|
253 | } |
---|
254 | |
---|
255 | // Noisette « conteneur » = row |
---|
256 | if ($type_noisette == 'conteneur') { |
---|
257 | $elements[] = 'row'; |
---|
258 | } |
---|
259 | |
---|
260 | // Noisette enfante d'une noisette « conteneur_row » = column |
---|
261 | if ($type_noisette_parente == 'conteneur') { |
---|
262 | $elements[] = 'column'; |
---|
263 | } |
---|
264 | |
---|
265 | // var_dump($id_noisette, $elements); |
---|
266 | |
---|
267 | return $elements; |
---|
268 | } |
---|
269 | |
---|
270 | |
---|
271 | /** |
---|
272 | * Récupérer la liste des classes dans les saisies de la grille |
---|
273 | * |
---|
274 | * Soit il y a la liste dans grille/data, sinon on se rabat sur options/data |
---|
275 | * |
---|
276 | * @param array $saisies |
---|
277 | * - Soit une seule saisie |
---|
278 | * - Soit les saisies d'un type d'élément de la grille |
---|
279 | * @return array |
---|
280 | * Liste des classes |
---|
281 | */ |
---|
282 | function noizetier_layout_extraire_classes_saisies_grille($saisies) { |
---|
283 | |
---|
284 | include_spip('inc/saisies'); |
---|
285 | $classes = array(); |
---|
286 | |
---|
287 | // S'il s'agit d'une saisie unique, encapsuler |
---|
288 | reset($saisies); |
---|
289 | if (!is_numeric(key($saisies))) { |
---|
290 | $saisies = array($saisies); |
---|
291 | } |
---|
292 | // On met tout à plat et on parse |
---|
293 | $saisies = saisies_lister_par_nom($saisies); |
---|
294 | foreach ($saisies as $champ => $saisie) { |
---|
295 | if ($saisie['saisie'] != 'fieldset') { |
---|
296 | // Soit l'info est dans grille/data |
---|
297 | if (!empty($saisie['grille']['data'])) { |
---|
298 | $classes = array_merge($classes, $saisie['grille']['data']); |
---|
299 | // Soit dans options/data (radios, checkbox, etc.) |
---|
300 | } elseif (!empty($saisie['options']['data'])) { |
---|
301 | $classes = array_merge($classes, array_keys($saisie['options']['data'])); |
---|
302 | } |
---|
303 | } |
---|
304 | } |
---|
305 | $classes = array_filter($classes); |
---|
306 | |
---|
307 | return $classes; |
---|
308 | } |
---|