source: spip-zone/_plugins_/foundation_6/trunk/foundation_6_fonctions.php @ 108231

Last change on this file since 108231 was 108231, checked in by p@…, 2 years ago

Nouvelle fonctionnalité de la balise #COLONNES: des colonnes calculée.

Lorsque l'on veux créer une grille de 4 objets mais qu'il n'y en a que 3 de publiés, la balise va automatiquement adapter le nombre de colonne.
Cette option s'active en ajoutant une étoile au nombre de colonne. Exemple :

`
<article class="#COLONNES{#ARRAY{large, 4*}}">
`

Il faut bien entendu être dans une boucle pour utiliser cette option.

File size: 5.6 KB
Line 
1<?php
2/**
3 * Fonction d'upgrade/installation du plugin foundation-4-spip
4 *
5 * @plugin         foundation_6
6 * @copyright  2013
7 * @author         Phenix
8 * @licence        GNU/GPL
9 */
10if (!defined('_ECRIRE_INC_VERSION')) {
11        return;
12}
13
14// Inclure les fonctions de foundation
15include_spip('inc/foundation');
16
17/**
18 * Rendre les iframes responsives via un filtre et
19 * la classe responsive-embed de Foundation.
20 *
21 * @param string $texte HTML dans lequel chercher des iframes
22 * @access public
23 * @return string
24 */
25function filtre_responsive_embed_dist($texte) {
26        include_spip('inc/foundation');
27        // On détecte toute les iFrames et on les rends responsives.
28        return preg_replace_callback('%<iframe(.*)></iframe>%m', 'responsive', $texte);
29}
30
31
32/**
33 * Assurer la rétro-compatibilité avec l'ancien nom de ce filtre
34 *
35 * @deprecated Utiliser filtre_responsive_embed_dist()
36 * @see filtre_responsive_embed_dist()
37 *
38 * @param mixed $texte
39 * @access public
40 * @return mixed
41 */
42function filtre_iframe_responsive($texte) {
43        $responsive_embed = charger_filtre('responsive_embed');
44        return $responsive_embed($texte);
45}
46
47/**
48 * Cette balise va permettre de rendre le squelette compatible
49 * avec toutes les versions de Foundation.
50 * La syntaxe est la suivante:
51 *
52 * #COLONNES{nombre,type}
53 * nombre: le nombre de colonne foundation
54 * (optionnel) type: Dans le cas des version utilisant une
55 * syntaxe avec prefix, on lui passe le type (défaut: large)
56 *
57 * @param mixed $p
58 * @access public
59 * @return mixed
60 */
61function balise_COLONNES_dist($p) {
62        // On récupère les paramètres de la balise.
63        $nombre_colonnes = interprete_argument_balise(1, $p);
64        $type = interprete_argument_balise(2, $p);
65
66        // Dans le cas ou on ce trouve dans une boucle SPIP, on va passer le total
67        // de la boucle à la fonction class_grid_foundation.
68        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
69        if ($b !== '') {
70                $total_boucle = "\$Numrows['$b']['total']";
71                $p->boucles[$b]->numrows = true;
72        } else {
73                $total_boucle = 'null';
74        }
75
76        // On met une valeur par défaut à type.
77        if (!$type) {
78                $type = "'large'";
79        }
80
81        // On calcule la class
82        $p->code = "class_grid_foundation($nombre_colonnes, $type, $total_boucle).'columns'";
83        $p->interdire_scripts = false;
84
85        return $p;
86}
87
88/**
89 * Generer un bouton d'action qui accepte les class de foundation
90 */
91function balise_BOUTON_ACTION($p) {
92
93        $args = array();
94        for ($k = 1; $k <= 6; $k++) {
95                $_a = interprete_argument_balise($k, $p);
96                if (!$_a) {
97                        $_a = "''";
98                }
99                $args[] = $_a;
100        }
101        // supprimer les args vides
102        while (end($args) == "''" and count($args) > 2) {
103                array_pop($args);
104        }
105        $args = implode(',', $args);
106
107        $bouton_action = chercher_filtre('bouton_action');
108        $p->code = "$bouton_action($args)";
109        $p->interdire_scripts = false;
110        return $p;
111}
112
113/**
114 * On surcharge le filtre bouton_action pour ajouter $class
115 * sur la balise <button> au lieu de pour assurer la
116 * compatibilité avec les class button de foundation
117 */
118function filtre_bouton_action($libelle, $url, $class = '', $confirm = '', $title = '', $callback = '') {
119        if ($confirm) {
120                $confirm = 'confirm("' . attribut_html($confirm) . '")';
121                if ($callback) {
122                        $callback = "$confirm?($callback):false";
123                } else {
124                        $callback = $confirm;
125                }
126        }
127        $onclick = $callback?" onclick='return ".addcslashes($callback, "'")."'":'';
128        $title = $title ? " title='$title'" : '';
129
130        if (test_espace_prive()) {
131                return "<form class='bouton_action_post $class' method='post' action='$url'><div>".form_hidden($url)
132                 ."<button type='submit' class='submit'$title$onclick>$libelle</button></div></form>";
133        } else {
134
135                // Détection de la class ajax
136                // Code reprit (et modifié) du plugin bootstrap:
137                // https://zone.spip.org/trac/spip-zone/browser/_plugins_/bootstrap/trunk/bootstrap3_fonctions.php#L109
138                $array_class = explode(' ', $class);
139                $ajax_index = array_search('ajax', $array_class);
140                if ($ajax_index !== false) {
141                        $ajax = ' ajax';
142                        // On a plus besoin de la class ajax dans la liste des class,
143                        // ça pourrait créer des problèmes
144                        unset($array_class[$ajax_index]);
145                        $class = implode(' ', $array_class);
146                } else {
147                        $ajax = '';
148                }
149
150                return "<form class='bouton_action_post $ajax' method='post' action='$url'><div>".form_hidden($url)
151                ."<button type='submit' class='submit $class'$title$onclick>$libelle</button></div></form>";
152        }
153}
154
155/**
156 * Filtre pour afficher des étoiles à la suite via les
157 * icone foundation.
158 *
159 * @param int $nombre
160 * @access public
161 * @return string
162 */
163function filtre_etoile_foundation_dist($nombre) {
164
165        $config = lire_config('foundation');
166
167        if (!$config['foundation-icons']) {
168                return '<span>Les icones foundation ne sont pas activée !</span>';
169        }
170
171        $etoile = '<span class="foundation_etoile">';
172        for ($i=0; $i<$nombre; $i++) {
173                $etoile .= '<span class="fi-star"></span>';
174        }
175        $etoile .= '</span>';
176
177        return $etoile;
178}
179
180
181if (!function_exists('balise_LIRE_CONSTANTE_dist')) {
182        /**
183         * Balise LIRE_CONSTANT pour SPIP
184         *
185         * @param mixed $p
186         * @access public
187         * @return mixed
188         */
189        function balise_LIRE_CONSTANTE_dist($p) {
190                $constante = interprete_argument_balise(1, $p);
191
192                $p->code = "constant($constante)";
193
194                $p->interdire_scripts = false;
195
196                return $p;
197        }
198}
199
200function balise_CALCULER_COLONNES($p) {
201        // Nombre maximum de colonne
202        $max = interprete_argument_balise(1, $p);
203
204        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
205        if ($b === '' || !isset($p->boucles[$b])) {
206                $msg = array(
207                        'zbug_champ_hors_boucle',
208                        array('champ' => "#$b" . 'CALCULER_COLONNES')
209                );
210                erreur_squelette($msg, $p);
211        } else {
212                $p->code = "calculer_colonnes($max, \$Numrows['$b']['total'])";
213                $p->boucles[$b]->numrows = true;
214                $p->interdire_scripts = false;
215        }
216
217        return $p;
218}
Note: See TracBrowser for help on using the repository browser.