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

Last change on this file since 118190 was 118184, checked in by Charles Razack, 11 months ago

On rend optionnelle l'option qui permet de gérer les conteneurs internes aux noisettes (limitant leur largeur interne). Ça n'est utile que si le thème du site est adapté, et sinon ça apporte de la confusion.

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', '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 */
282function 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}
Note: See TracBrowser for help on using the repository browser.