source: spip-zone/_plugins_/blocsdepliables/blocsdepliables_fonctions.php

Last change on this file was 112559, checked in by patfr@…, 12 months ago

Rendre à César... Et surtout éviter les erreurs 500 !

File size: 7.7 KB
Line 
1<?php
2/**
3 * Plugin Blocs Dépliables
4 * (c) 2013 Collectif, issu du plugin "Le Couteau Suisse"
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12
13/* Trois ou quatre balises pour creer des blocs depliables :
14
15#BLOC_TITRE                     / {une_URL} si ajax, {un_numero} si bloc numerote, {visible} si bloc deplie /
16Mon titre
17#BLOC_RESUME                    / facultatif /
18Mon resume qui disparait si on clique
19#BLOC_DEBUT
20Mon bloc depliable              / qui est aussi l'emplacement pour l'Ajax si le fragment est donne /
21#BLOC_FIN
22
23*/
24
25@define('_BLOC_TITLE_SEP', '||');
26
27function blocdepliable_balise_titre() {
28        static $h=null;
29        if (is_null($h)) {
30                include_spip('inc/config');
31                $h = lire_config('blocsdepliables/balise_titre', 'h4');
32        }
33        return $h;
34}
35
36if(!function_exists('balise_BLOC_TITRE')) {
37
38// Pour la balise suivante, l'ordre des arguments importe peu
39// Un bloc replie, titre simple : #BLOC_TITRE
40// Un bloc replie AJAX : #BLOC_TITRE{fragment} (fragment est une URLs)
41// Un bloc replie numerote : #BLOC_TITRE{numero} (numero est un nombre entier)
42// Un bloc deplie ou replie : ajouter l'argument 'visible' ou 'invisible' : #BLOC_TITRE{visible}
43// Par defaut : les blocs sont replies
44function balise_BLOC_TITRE($p) {
45        // Les arguments : 'visible' ou 'invisible', un numero, une URL
46        $p->code = "blocs_balises('titre', array(".blocs_arguments($p).'))';
47        $p->interdire_scripts = false;
48        return $p;
49}
50
51function blocs_arguments(&$p) {
52        $i = 0;
53        $args = array();
54        while (($a = interprete_argument_balise(++$i, $p)) != null) {
55                $args[] = $a;
56        }
57        return join(',', $args);
58}
59
60// 3 balises obsoletes
61function balise_BLOC_TITRE_NUM(&$p) {
62        return balise_BLOC_TITRE($p);
63}
64function balise_BLOC_VISIBLE_TITRE_NUM(&$p) {
65        return balise_BLOC_VISIBLE_TITRE($p);
66}
67function balise_BLOC_VISIBLE_TITRE(&$p) {
68        // Produire le premier argument {visible}
69        $texte = new Texte;
70        $texte->type='texte';
71        $texte->texte='visible';
72        array_unshift($p->param, array(0 => null, 1 => array(0 => $texte)));
73        return balise_BLOC_TITRE($p);
74}
75
76function balise_BLOC_RESUME($p) {
77        $p->code = "blocs_balises('resume')";
78        $p->interdire_scripts = false;
79        return $p;
80}
81
82function balise_BLOC_DEBUT($p) {
83        $p->code = "blocs_balises('debut', array(".blocs_arguments($p).'))';
84        $p->interdire_scripts = false;
85        return $p;
86}
87
88function balise_BLOC_FIN($p) {
89        $p->code = "blocs_balises('fin')";
90        $p->interdire_scripts = false;
91        return $p;
92}
93
94function balise_BLOC_TITRE_DEBUT($p) {
95        $p->code = "blocs_balises('titre_debut', array(".blocs_arguments($p).'))';
96        $p->interdire_scripts = false;
97        return $p;
98}
99
100function balise_BLOC_TITRE_FIN($p) {
101        $p->code = "blocs_balises('titre_fin')";
102        $p->interdire_scripts = false;
103        return $p;
104}
105
106// Renvoie un code JQuery pour deplier un bloc au chargement de la page.
107// Exemple pour deplier le 5eme bloc : #BLOC_DEPLIER{4} (l'index commence a zero)
108function balise_BLOC_DEPLIER($p) {
109        $eq = interprete_argument_balise(1, $p);
110        $p->code = "bloc_deplier_script(intval($eq))";
111        $p->interdire_scripts = false;
112        return $p;
113}
114// Renvoie un code JQuery pour deplier un bloc numerote au chargement de la page.
115// Exemple pour deplier le bloc .cs_bloc4 : #BLOC_DEPLIER_NUM{4}
116function balise_BLOC_DEPLIER_NUM($p) {
117        $eq = interprete_argument_balise(1, $p);
118        $p->code = "bloc_num_deplier_script(intval($eq))";
119        $p->interdire_scripts = false;
120        return $p;
121}
122
123// Renvoie un code JQuery pour courcuiter la variable configurant les blocs uniques
124// Argument : oui/non ou 0/1
125function balise_BLOC_UNIQUE($p) {
126        $arg = interprete_argument_balise(1, $p);
127        $p->code = "bloc_unique_script($arg)";
128        $p->interdire_scripts = false;
129        return $p;
130}
131
132// fonction (SPIP>=2.0) pour le calcul de la balise #BLOC_DEPLIER
133function bloc_deplier_script($num = 0) {
134        $h = blocdepliable_balise_titre();
135        return $num<0?'':http_script("jQuery(document).ready(function() { jQuery('{$h}.blocs_titre').eq($num).click(); });");
136}
137// fonction (SPIP>=2.0) pour le calcul de la balise #BLOC_DEPLIER_NUM
138function bloc_num_deplier_script($num = -1) {
139        return $num<0?'':http_script("jQuery(document).ready(function() { jQuery('div.cs_bloc$num').children('.blocs_titre').eq(0).click(); });");
140}
141// fonction (SPIP>=2.0) pour le calcul de la balise #BLOC_UNIQUE
142function bloc_unique_script($num = 1) {
143        $num = ($num==='oui' || intval($num)>0)?1:0;
144        return http_script("var blocs_replier_tout = $num;");
145}
146
147// fonction pour le calcul des balises de type #BLOC_XXX
148// $args ne sert que pour #BLOC_TITRE et contient les arguments de la balise sous forme de tableau
149function blocs_balises($type, $args = array()) {
150        // statut binaire : bit1=ajax bit2=titre bit3=resume bit4=debut
151        // 2 = ajax (20 si distant) ; 1 = titre pas d'ajax (10 si distant); idem negatif = bloc visible
152        static $bloc_stade;
153        $k = isset($bloc_stade) ? count($bloc_stade) : 0;
154        $stade = $k ? abs($bloc_stade[--$k]) : 0;
155        $distant = $replie = 1;
156        $id = $numero = '';
157        switch ($type) {
158                case 'titre_debut':// id pour le bloc distant
159                        $id = ' id="cs_bloc_id_' . array_shift($args) . '"';
160                        $distant = 10;
161                        break;
162                case 'titre':
163                        foreach ($args as $a) {
164                                if (is_numeric($a = trim($a))) {
165                                        $numero = ' cs_bloc'.$a.'" id="deplier_num'.$a;
166                                } elseif ($a=='visible') {
167                                        $replie = -1;
168                                } elseif ($a=='invisible') {
169                                        $replie = 1;
170                                } elseif (strlen($a)) {
171                                        $fragment = $a;
172                                }
173                        }
174                        if (isset($fragment)) {
175                                $ajax=' blocs_ajax ';
176                                $bloc_stade[]=2*$distant*$replie;
177                        } else {
178                                $fragment = 'javascript:;';
179                                $ajax = '';
180                                $bloc_stade[]=1*$distant*$replie;
181                        }
182                        $replie = $replie>0?' blocs_replie':'';
183                        $h = blocdepliable_balise_titre();
184                        return "<div class=\"cs_blocs$numero\"><$h class=\"blocs_titre$replie$ajax\"$id><a href=\"$fragment\" class=\"ouvrir_fermer\">";
185                case 'resume':
186                        $class=$bloc_stade[$k]>0?'':' blocs_invisible blocs_slide';
187                        if ($stade<1 || $stade>2) {
188                                // on DOIT arriver de titre
189                                die("Erreur : #BLOC_RESUME sans #BLOC_TITRE ($stade)");
190                        }
191                        $bloc_stade[$k]=$bloc_stade[$k]>0?3:-3; // 3 = resume
192                        $h = blocdepliable_balise_titre();
193                        return "</a></$h><div class=\"blocs_resume$class\">";
194                case 'debut':
195                        if (count($args)) {
196                                // debut d'un bloc depliable a distance
197                                foreach ($args as $a) {
198                                        if ($a=='visible') {
199                                                $replie = -1;
200                                        } elseif ($a=='invisible') {
201                                                $replie = 1;
202                                        } elseif (strlen($a)) {
203                                                $id = " cs_bloc_id_$a";
204                                        }
205                                }
206                                $bloc_stade[]=11;
207                                $class = $replie>0?' blocs_invisible blocs_slide':'';
208                                return "<div class=\"blocs_destination$class$id\">";
209                        }
210                        $class=$bloc_stade[$k]<0?'':' blocs_invisible blocs_slide';
211                        $bloc_stade[$k]=$bloc_stade[$k]>0?4:-4; // 4=debut
212                        if ($stade == 3) {
213                                // on arrive du resume, fermer la div resume seulement
214                                return "</div><div class=\"blocs_destination$class\">";
215                        } else {
216                                if ($stade<1 || $stade>2) {
217                                        // on DOIT arriver de titre
218                                        die("Erreur : #BLOC_DEBUT sans #BLOC_TITRE ($stade)");
219                                }
220                                $h = blocdepliable_balise_titre();
221                                return "</a></$h><div class=\"blocs_destination$class\">";
222                        }
223                        break;
224                case 'titre_fin':
225                        $k=isset($bloc_stade)?abs(array_pop($bloc_stade)):0;
226                        $h = blocdepliable_balise_titre();
227                        if ($k==10 || $k==20) {
228                                // on DOIT arriver de #BLOC_TITRE_DEBUT
229                                return "</a></$h></div>";
230                        }
231                        die("Erreur : #BLOC_TITRE_FIN sans #BLOC_TITRE_DEBUT ($k)");
232                case 'fin':
233                        $k=isset($bloc_stade)?abs(array_pop($bloc_stade)):0;
234                        switch ($k) {
235                                case 4:
236                                        return '</div></div>';
237                                case 11:
238                                        return '</div>';
239                                default:
240                                        die("Erreur : #BLOC_FIN sans #BLOC_DEBUT ($k)");
241                        }
242        }
243}
244
245} // if(!function_exists('balise_BLOC_TITRE'))
Note: See TracBrowser for help on using the repository browser.