source: spip-zone/_plugins_/compositions/compositions_fonctions.php @ 48990

Last change on this file since 48990 was 48990, checked in by cedric@…, 10 years ago

inclusion manquante (tetue)

File size: 11.2 KB
Line 
1<?php
2/*
3 * Plugin Compositions
4 * (c) 2007-2009 Cedric Morin
5 * Distribue sous licence GPL
6 *
7 */
8
9define('_COMPOSITIONS_MATCH','-([^0-9][^.]*)');
10
11/**
12 * Retrouver le nom du dossier ou sont stockees les compositions
13 * reglage par defaut, ou valeur personalisee via cfg
14 *
15 * @return string
16 */
17function compositions_chemin(){
18        $config_chemin = 'compositions/';
19        if (defined('_DIR_PLUGIN_Z') OR defined('_DIR_PLUGIN_ZCORE'))
20                $config_chemin = (isset($GLOBALS['z_blocs'])?reset($GLOBALS['z_blocs']):'contenu/');
21
22        if (isset($GLOBALS['meta']['compositions'])){
23                $config = unserialize($GLOBALS['meta']['compositions']);
24                if (isset ($config['chemin_compositions'])){
25                        $config_chemin = rtrim($config['chemin_compositions'],'/').'/';
26                }
27        }
28       
29        return $config_chemin;
30}
31
32/**
33 * Tester si la stylisation auto est activee
34 * @return string
35 */
36function compositions_styliser_auto(){
37        $config_styliser = true;
38        if (defined('_DIR_PLUGIN_Z') OR defined('_DIR_PLUGIN_ZCORE')){
39                $config_styliser = false; // Z s'occupe de styliser les compositions
40        }
41        elseif (isset($GLOBALS['meta']['compositions'])){
42                $config = unserialize($GLOBALS['meta']['compositions']);
43                $config_styliser = $config['styliser_auto'] != 'non';
44        }
45        return $config_styliser?' ':'';
46}
47
48/**
49 * Lister les compositions disponibles : toutes ou pour un type donne
50 * Si informer est a false, on ne charge pas les infos du xml
51 *
52 * @param string $type
53 * @param bool $informer
54 * @return array
55 */
56function compositions_lister_disponibles($type, $informer=true){
57        include_spip('inc/compositions');
58        $type = preg_replace(',\W,','',$type);
59        if ($type=='syndic') $type='site'; //grml
60        if (!strlen($type)) $type="[a-z0-9]+";
61
62
63        // rechercher les skel du type article-truc.html
64        // truc ne doit pas commencer par un chiffre pour eviter de confondre avec article-12.html
65        $match = "/($type)("._COMPOSITIONS_MATCH.")?[.]html$";
66
67        // lister les compositions disponibles
68        $liste = find_all_in_path(compositions_chemin(),$match);
69        $res = array();
70        if (count($liste)){
71                foreach($liste as $s) {
72                        $base = preg_replace(',[.]html$,i','',$s);
73                        if (preg_match(",$match,ims",$s,$regs)
74                          AND ($composition = !$informer
75                                OR $composition = compositions_charger_infos($base)))
76                                $res[$regs[1]][$regs[3]] = $composition;
77                        // retenir les skels qui ont un xml associe
78                }
79        }
80        // Pipeline compositions_lister_disponibles
81        if ($type=="[a-z0-9]+")
82                $type = '';
83        $res = pipeline('compositions_lister_disponibles',array(
84                'args'=>array('type' => $type,'informer' => $informer), 
85                'data'=> $res
86                )
87        );
88        return $res;
89}
90
91/**
92 * Liste les id d'un type donne utilisant une composition donnee
93 *
94 * @param string $type
95 * @param string $composition
96 * @return array
97 */
98function compositions_lister_utilisations($type,$composition){
99        $table_sql = table_objet_sql($type);
100        $_id_table_objet = id_table_objet($type);
101        return sql_allfetsel("$_id_table_objet as id,titre", $table_sql, "composition=".sql_quote($composition));
102}
103
104/**
105 * Selectionner le fond en fonction du type et de la composition
106 * en prenant en compte la configuration pour le chemin
107 * et le fait que la composition a pu etre supprimee
108 *
109 * @param string $composition
110 * @param string $type
111 * @param string $defaut
112 * @param string $ext
113 * @param bool $fullpath
114 * @param string $vide
115 * @return string
116 */
117function compositions_selectionner($composition,$type,$defaut="",$ext="html",$fullpath = false, $vide="composition-vide"){
118        if ($type=='syndic') $type='site'; //grml
119        $fond = compositions_chemin() . $type;
120
121        // regarder si compositions/article-xxx est disponible
122        if (strlen($composition)
123                AND $f = find_in_path("$fond-$composition.$ext"))
124                return $fullpath ? $f : $fond . "-$composition";
125        else
126                // sinon regarder si compositions/article-defaut est disponible
127                if (strlen($defaut)
128                        AND $f = find_in_path("$fond-$defaut.$ext"))
129                        return $fullpath ? $f : $fond . "-$defaut";
130
131        // se rabattre sur compositions/article si disponible
132        if ($f = find_in_path("$fond.$ext"))
133                return $fullpath ? $f : $fond;
134
135        // sinon une composition vide pour ne pas generer d'erreur
136        if ($vide AND $f = find_in_path("$vide.$ext"))
137                return $fullpath ? $f : $vide;
138
139        // rien mais ca fera une erreur dans le squelette si appele en filtre
140        return '';
141}
142
143/**
144 * Decrire une composition pour un objet
145 * @param string $type
146 * @param string $composition
147 * @return array|bool|string
148 */
149function compositions_decrire($type, $composition){
150        static $compositions = array();
151        if (!function_exists('compositions_charger_infos'))
152                include_spip('inc/compositions');
153        if ($type=='syndic') $type='site'; //grml
154        if (isset($compositions[$type][$composition]))
155                return $compositions[$type][$composition];
156        $ext = "html";
157        $fond = compositions_chemin() . $type;
158        if (strlen($composition)
159                AND $f = find_in_path("$fond-$composition.$ext")
160                AND $desc = compositions_charger_infos($f))
161                return $compositions[$type][$composition] = $desc;
162        return $compositions[$type][$composition] = false;
163}
164
165/**
166 * Un filtre a utiliser sur [(#COMPOSITION|composition_class{#ENV{type}})]
167 * pour poser des classes generiques sur le <body>
168 * si une balise <class>toto</class> est definie dans la composition c'est elle qui est appliquee
169 * sinon on pose simplement le nom de la composition
170 *
171 * @param string $composition
172 * @param string $type
173 * @return string
174 */
175function composition_class($composition,$type){
176        if ($desc = compositions_decrire($type, $composition)
177                AND isset($desc['class'])
178                AND strlen($desc['class']))
179                return $desc['class'];
180        return $composition;
181}
182
183/**
184 * Liste les types d'objets qui ont une composition
185 * utilise la valeur en cache meta sauf si demande de recalcul
186 * ou pas encore definie
187 *
188 * @staticvar array $liste
189 * @return array
190 */
191function compositions_types(){
192        static $liste = null;
193        if (is_null($liste)) {
194                if ($GLOBALS['var_mode'] OR !isset($GLOBALS['meta']['compositions_types'])){
195                        include_spip('inc/compositions');
196                        compositions_cacher();
197                }
198                $liste = explode(',',$GLOBALS['meta']['compositions_types']);
199        }
200        return $liste;
201}
202
203/**
204 * Renvoie la composition qui s'applique à un objet
205 * en tenant compte, le cas échéant, de la composition héritée
206 * si etoile=true on renvoi dire le champ sql
207 *
208 * @param string $type
209 * @param integer $id
210 * @param string $serveur
211 * @param bool $etoile
212 * @return string
213 */
214function compositions_determiner($type, $id, $serveur='', $etoile = false){
215        static $composition = array();
216
217        if (isset($composition[$etoile][$serveur][$type][$id]))
218                return $composition[$etoile][$serveur][$type][$id];
219
220        include_spip('base/abstract_sql');
221        $table = table_objet($type);
222        $table_sql = table_objet_sql($type);
223        $_id_table = id_table_objet($type);
224
225        $retour = '';
226
227        $trouver_table = charger_fonction('trouver_table', 'base');
228        $desc = $trouver_table($table,$serveur);
229        if (isset($desc['field']['composition']) AND $id){
230                $select = "composition";
231                if (isset($desc['field']['id_rubrique']))
232                        $select .= "," . (($type == 'rubrique') ? 'id_parent' : 'id_rubrique as id_parent');
233                $row = sql_fetsel($select, $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur);
234                if ($row['composition'] != '')
235                        $retour = $row['composition'];
236                elseif (!$etoile
237                  AND isset($row['id_parent'])
238                  AND $row['id_parent'])
239                        $retour = compositions_heriter($type, $row['id_parent'], $serveur);
240        }
241        return $composition[$etoile][$serveur][$type][$id] = (($retour == '-') ? '' : $retour);
242}
243
244/**
245 * Renvoie la composition héritée par un objet selon sa rubrique
246 *
247 * @param string $type
248 * @param integer $id_rubrique
249 * @param string $serveur
250 * @return string
251 */
252function compositions_heriter($type, $id_rubrique, $serveur=''){
253        if ($type=='syndic') $type='site'; //grml
254        if (intval($id_rubrique) < 1) return '';
255        $infos = null;
256        $id_parent = $id_rubrique;
257        do {
258                $row = sql_fetsel(array('id_parent','composition'),'spip_rubriques','id_rubrique='.intval($id_parent),'','','','',$serveur);
259                if (strlen($row['composition']) AND is_null($infos))
260                        $infos = compositions_lister_disponibles('rubrique');
261        }
262        while ($id_parent = $row['id_parent']
263                AND
264                (!strlen($row['composition']) OR !isset($infos['rubrique'][$row['composition']]['branche'][$type])));
265
266        if (strlen($row['composition']) AND isset($infos['rubrique'][$row['composition']]['branche'][$type]))
267                return $infos['rubrique'][$row['composition']]['branche'][$type];
268
269        return '';
270}
271
272/**
273 * #COMPOSITION
274 * Renvoie la composition s'appliquant à un objet
275 * en tenant compte, le cas échéant, de l'héritage.
276 *
277 * Sans precision, l'objet et son identifiant sont pris
278 * dans la boucle en cours, mais l'on peut spécifier notre recherche
279 * en passant objet et id_objet en argument de la balise :
280 * #COMPOSITION{article, 8}
281 *
282 * #COMPOSITION* renvoie toujours le champs brut, sans tenir compte de l'heritage
283 *
284 * @param array $p      AST au niveau de la balise
285 * @return array        AST->code modifié pour calculer le nom de la composition
286 */
287function balise_COMPOSITION_dist($p) {
288        $_composition = "";
289        if ($_objet = interprete_argument_balise(1, $p)) {
290                $_id_objet = interprete_argument_balise(2, $p);
291        } else {
292                $_composition = champ_sql('composition',$p);
293                $_id_objet = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
294                $_objet = "objet_type('" . $p->boucles[$p->id_boucle]->id_table . "')";
295        }
296        // si on veut le champ brut, et qu'on l'a sous la main, inutile d'invoquer toute la machinerie
297        if ($_composition AND $p->etoile)
298                $p->code = $_composition;
299        else {
300                $connect = $p->boucles[$p->id_boucle]->sql_serveur;
301                $p->code = "compositions_determiner($_objet, $_id_objet, '$connect', ".($p->etoile?'true':'false').")";
302                // ne declencher l'usine a gaz que si composition est vide ...
303                if ($_composition)
304                        $p->code = "((\$zc=$_composition)?(\$zc=='-'?'':\$zc):".$p->code.")";
305        }
306        return $p;
307}
308
309/**
310 * Indique si la composition d'un objet est verrouillée ou non,
311 * auquel cas, seul le webmaster peut la modifier
312 *
313 * @param string $type
314 * @param integer $id
315 * @param string $serveur
316 * @return string
317 */
318function compositions_verrouiller($type, $id, $serveur=''){
319        $config = unserialize($GLOBALS['meta']['compositions']);
320        if ($config['tout_verrouiller'] == 'oui')
321                return true;
322       
323        include_spip('base/abstract_sql');
324        $table = table_objet($type);
325        $table_sql = table_objet_sql($type);
326        $_id_table = id_table_objet($type);
327
328        $trouver_table = charger_fonction('trouver_table', 'base');
329        $desc = $trouver_table($table,$serveur);
330        if (isset($desc['field']['composition_lock']) AND $id){
331                $lock = sql_getfetsel('composition_lock', $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur);
332                if ($lock)
333                        return true;
334                elseif (isset($desc['field']['id_rubrique'])) {
335                        $id_rubrique = sql_getfetsel('id_rubrique', $table_sql, "$_id_table=".intval($id), '', '', '', '', $serveur);
336                        return compositions_verrou_branche($id_rubrique, $serveur);
337                }
338                else
339                        return false;
340        }
341        else return false;
342}
343
344/**
345 * Indique si les objets d'une branche sont verrouillés
346 * @param integer $id_rubrique
347 * @param string $serveur
348 * @return string
349 */
350function compositions_verrou_branche($id_rubrique, $serveur=''){
351       
352        if (intval($id_rubrique) < 1) return false;
353        if($infos_rubrique = sql_fetsel(array('id_parent','composition_branche_lock'),'spip_rubriques','id_rubrique='.intval($id_rubrique),'','','','',$serveur)) {
354                if ($infos_rubrique['composition_branche_lock'])
355                        return true;
356                else
357                        return compositions_verrou_branche($infos_rubrique['id_parent'],$serveur);
358        }
359        return '';
360}
361?>
Note: See TracBrowser for help on using the repository browser.