source: spip-zone/_plugins_/noizetier_layout/trunk/inc/noizetier_layout.php @ 118204

Last change on this file since 118204 was 118204, checked in by Charles Razack, 15 months ago

S'appuyer sur la profondeur pour décider si une noisette peut avoir un .container ou pas : on limite à 2 pour l'instant.

File size: 8.1 KB
Line 
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é
14if (!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 */
28function 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 */
76function 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 */
155function 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 */
203function 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 */
230function noizetier_layout_identifier_element_grille($id_noisette) {
231
232        include_spip('inc/config');
233        $elements       = array();
234        $noisette       = sql_fetsel('type_noisette,id_conteneur,profondeur', 'spip_noisettes', 'id_noisette='.intval($id_noisette));
235        $type_noisette  = $noisette['type_noisette'];
236        $id_conteneur   = $noisette['id_conteneur'];
237        $profondeur     = $noisette['profondeur'];
238        // $a_la_racine    = (strpos($id_conteneur, '/') !== false);
239        $dans_conteneur = (strpos($id_conteneur, 'noisette') !== false);
240        list($type_noisette_parente, $noisette_parente, $id_noisette_parente) = explode('|', $id_conteneur); // pas de fonction dans l'API pour avoir ces infos
241        $activer_container = lire_config('noizetier_layout/activer_container');
242
243        // Toutes les noisettes peuvent techniquement avoir un .container.
244        // Cependant pour simplifier, on n'active l'option que pour celles à une profondeur de 1 au max.
245        if (
246                $activer_container
247                and $profondeur <= 1
248        ) {
249                $elements[] = 'container';
250        }
251
252        // Noisette « conteneur » = row
253        if ($type_noisette == 'conteneur') {
254                $elements[] = 'row';
255        }
256
257        // Noisette enfante d'une noisette « conteneur » = column
258        if ($type_noisette_parente == 'conteneur') {
259                $elements[] = 'column';
260        }
261
262        // var_dump($id_noisette, $elements);
263
264        return $elements;
265}
266
267
268/**
269 * Récupérer la liste des classes dans les saisies de la grille
270 *
271 * Soit il y a la liste dans grille/data, sinon on se rabat sur options/data
272 *
273 * @param array $saisies
274 *     - Soit une seule saisie
275 *     - Soit les saisies d'un type d'élément de la grille
276 * @return array
277 *     Liste des classes
278 */
279function noizetier_layout_extraire_classes_saisies_grille($saisies) {
280
281        include_spip('inc/saisies');
282        $classes = array();
283
284        // S'il s'agit d'une saisie unique, encapsuler
285        reset($saisies);
286        if (!is_numeric(key($saisies))) {
287                $saisies = array($saisies);
288        }
289        // On met tout à plat et on parse
290        $saisies = saisies_lister_par_nom($saisies);
291        foreach ($saisies as $champ => $saisie) {
292                if ($saisie['saisie'] != 'fieldset') {
293                        // Soit l'info est dans grille/data
294                        if (!empty($saisie['grille']['data'])) {
295                                $classes = array_merge($classes, $saisie['grille']['data']);
296                        // Soit dans options/data (radios, checkbox, etc.)
297                        } elseif (!empty($saisie['options']['data'])) {
298                                $classes = array_merge($classes, array_keys($saisie['options']['data']));
299                        }
300                }
301        }
302        $classes = array_filter($classes);
303
304        return $classes;
305}
Note: See TracBrowser for help on using the repository browser.