source: spip-zone/_plugins_/noizetier/trunk/noizetier_fonctions.php @ 110124

Last change on this file since 110124 was 110124, checked in by eric@…, 19 months ago

Correction de la gestion des blocs pour une composition virtuelle.
Passage d'un filtre en balise.

File size: 11.9 KB
Line 
1<?php
2/**
3 * Ce fichier contient les filtres et balises du noiZetier.
4 *
5 */
6if (!defined('_ECRIRE_INC_VERSION')) {
7        return;
8}
9
10
11// --------------------------------------------------------------------------------
12// --------------------- API TYPES DE NOISETTE : COMPLEMENT -----------------------
13// --------------------------------------------------------------------------------
14include_spip('inc/noizetier_type_noisette');
15
16
17// --------------------------------------------------------------------------------
18// ------------------------- API NOISETTES : COMPLEMENT ---------------------------
19// --------------------------------------------------------------------------------
20
21/**
22 * Compile la balise `#NOIZETIER_NOISETTE_PREVIEW` qui permet d'afficher la prévisualisation d'une noisette
23 * si le squelette idoine existe (type_noisette-preview.html) dans le même répertoire que celui du type de noisette.
24 * La signature de la balise est : `#NOIZETIER_NOISETTE_PREVIEW`.
25 *
26 * @package SPIP\NOIZETIER\NOISETTE\BALISE
27 * @balise
28 *
29 * @param Champ $p
30 *        Pile au niveau de la balise.
31 *
32 * @return Champ
33 *         Pile complétée par le code à générer.
34 **/
35function balise_NOIZETIER_NOISETTE_PREVIEW_dist($p) {
36
37        $id_noisette = champ_sql('id_noisette', $p);
38        $type_noisette = champ_sql('type_noisette', $p);
39        $parametres = champ_sql('parametres', $p);
40
41        $inclusion = "recuperer_fond(
42                'noisette_preview',
43                array_merge(unserialize($parametres), array('type_noisette' => $type_noisette))
44        )";
45
46        $p->code = "$inclusion";
47        $p->interdire_scripts = false;
48
49        return $p;
50}
51
52
53// --------------------------------------------------------------------------------
54// ------------------------- API CONTENEURS : COMPLEMENT --------------------------
55// --------------------------------------------------------------------------------
56
57
58// -------------------------------------------------------------------
59// --------------------------- API ICONES ----------------------------
60// -------------------------------------------------------------------
61
62/**
63 * Retourne le chemin complet d'une icone.
64 * La fonction vérifie d'abord que l'icone est dans le thème du privé (chemin_image),
65 * sinon cherche dans le path SPIP (find_in_path).
66 *
67 * @package SPIP\NOIZETIER\ICONE\API
68 * @api
69 * @filtre
70 *
71 * @param string $icone
72 *
73 * @return string
74 */
75 function noizetier_icone_chemin($icone){
76        // TODO : faut-il garder cette fonction ou simplifier en utilisant uniquement chemin_image() ?
77        if (!$chemin = chemin_image($icone)) {
78                $chemin = find_in_path($icone);
79        }
80
81        return $chemin;
82}
83
84/**
85 * Compile la balise `#NOIZETIER_ICONE_LISTE` qui fournit la liste des icones d'une taille donnée en pixels
86 * disponibles dans les thèmes SPIP de l'espace privé.
87 * La signature de la balise est : `#NOIZETIER_ICONE_LISTE{taille}`.
88 *
89 * @package SPIP\NOIZETIER\ICONE\BALISE
90 * @balise
91 *
92 * @example
93 *     ```
94 *     #NOIZETIER_BLOC_INFOS{24}, renvoie les icones de taille 24px présents dans les thèmes du privé
95 *     ```
96 *
97 * @param Champ $p
98 *        Pile au niveau de la balise.
99 *
100 * @return Champ
101 *         Pile complétée par le code à générer.
102 **/
103function balise_NOIZETIER_ICONE_LISTE_dist($p) {
104        $taille = interprete_argument_balise(1, $p);
105        $taille = str_replace('\'', '"', $taille);
106        $p->code = "calculer_liste_icones($taille)";
107
108        return $p;
109}
110
111/**
112 * @param int $taille
113 *
114 * @return array|string
115 */
116function calculer_liste_icones($taille = 24) {
117
118        static $icones = null;
119
120        if (is_null($icones)) {
121                $pattern = ".+-${taille}[.](jpg|jpeg|png|gif)$";
122                $icones = find_all_in_path('prive/themes/spip/images/', $pattern);
123        }
124
125        return $icones;
126}
127
128
129// -------------------------------------------------------------------
130// ---------------------------- API BLOCS ----------------------------
131// -------------------------------------------------------------------
132
133/**
134 * Renvoie le nombre de noisettes de chaque bloc configurables d'une page, d'une composition
135 * ou d'un objet.
136 *
137 * @package SPIP\NOIZETIER\BLOC\API
138 * @api
139 * @filtre
140 *
141 * @param string $page_ou_objet
142 *              L'identifiant de la page, de la composition ou de l'objet au format:
143 *              - pour une page : type
144 *              - pour une composition : type-composition
145 *              - pour un objet : type_objet-id_objet
146 *
147 * @return array
148 */
149function noizetier_bloc_compter_noisettes($page_ou_objet) {
150
151        static $blocs_compteur = array();
152
153        if (!isset($blocs_compteur[$page_ou_objet])) {
154                // Initialisation des compteurs par bloc
155                $nb_noisettes = array();
156
157                // Le nombre de noisettes par bloc doit être calculé par une lecture de la table spip_noisettes.
158                $from = array('spip_noisettes');
159                $select = array('bloc', "count(type_noisette) as 'noisettes'");
160                // -- Construction du where identifiant précisément la page ou l'objet concerné
161                $identifiants = explode('-', $page_ou_objet);
162                if (isset($identifiants[1]) and ($id = intval($identifiants[1]))) {
163                        // L'identifiant est celui d'un objet
164                        $where = array('objet=' . sql_quote($identifiants[0]), 'id_objet=' . $id);
165                } else {
166                        if (!isset($identifiants[1])) {
167                                // L'identifiant est celui d'une page
168                                $identifiants[1] = '';
169                        }
170                        $where = array('type=' . sql_quote($identifiants[0]), 'composition=' . sql_quote($identifiants[1]));
171                }
172                $group = array('bloc');
173                $compteurs = sql_allfetsel($select, $from, $where, $group);
174                if ($compteurs) {
175                        // On formate le tableau [bloc] = nb noisettes
176                        foreach ($compteurs as $_compteur) {
177                                $nb_noisettes[$_compteur['bloc']] = $_compteur['noisettes'];
178                        }
179                }
180                $blocs_compteur[$page_ou_objet] = $nb_noisettes;
181        }
182
183        return (isset($blocs_compteur[$page_ou_objet])
184                ? $blocs_compteur[$page_ou_objet]
185                : array());
186}
187
188/**
189 * Compile la balise `#NOIZETIER_BLOC_INFOS` qui fournit un champ ou tous les champs descriptifs d'un bloc Z
190 * donné. Ces champs sont lus dans le fichier YAML du bloc si il existe.
191 * La signature de la balise est : `#NOIZETIER_BLOC_INFOS{bloc, information}`.
192 *
193 * @package SPIP\NOIZETIER\BLOC\BALISE
194 * @balise
195 *
196 * @example
197 *     ```
198 *     #NOIZETIER_BLOC_INFOS{content}, renvoie tous les champs descriptifs du bloc content
199 *     #NOIZETIER_BLOC_INFOS{content, nom}, renvoie le titre du bloc content
200 *     ```
201 * @param Champ $p
202 *        Pile au niveau de la balise.
203 *
204 * @return Champ
205 *         Pile complétée par le code à générer.
206 **/
207function balise_NOIZETIER_BLOC_INFOS_dist($p) {
208        $bloc = interprete_argument_balise(1, $p);
209        $bloc = str_replace('\'', '"', $bloc);
210        $information = interprete_argument_balise(2, $p);
211        $information = isset($information) ? str_replace('\'', '"', $information) : '""';
212        $p->code = "calculer_infos_bloc($bloc, $information)";
213
214        return $p;
215}
216
217/**
218 * @param string $bloc
219 * @param string $information
220 *
221 * @return array|string
222 */
223function calculer_infos_bloc($bloc = '', $information = '') {
224
225        include_spip('inc/noizetier_bloc');
226        return noizetier_bloc_lire($bloc, $information);
227}
228
229
230// -------------------------------------------------------------------
231// ---------------------------- API PAGES ----------------------------
232// -------------------------------------------------------------------
233
234/**
235 * Compile la balise `#NOIZETIER_PAGE_INFOS` qui fournit un champ ou tous les champs descriptifs d'une page
236 * ou d'une composition donnée. Ces champs sont lus dans la table `spip_noizetier_pages`.
237 * La signature de la balise est : `#NOIZETIER_PAGE_INFOS{page, information}`.
238 *
239 * La fonction peut aussi renvoyée une information spéciale `est_modifiee` qui indique si la configuration
240 * du fichier YAML ou XML de la page a été modifiée ou pas.
241 *
242 * @package SPIP\NOIZETIER\PAGE\BALISE
243 * @balise
244 *
245 * @example
246 *     ```
247 *     #NOIZETIER_PAGE_INFOS{article}, renvoie tous les champs descriptifs de la page article
248 *     #NOIZETIER_PAGE_INFOS{article, nom}, renvoie le titre de la page article
249 *     #NOIZETIER_PAGE_INFOS{article-forum, nom}, renvoie le titre de la composition forum de la page article
250 *     #NOIZETIER_PAGE_INFOS{article, est_modifiee}, indique si la configuration de la page article a été modifiée
251 *     ```
252 *
253 * @param Champ $p
254 *        Pile au niveau de la balise.
255 *
256 * @return Champ
257 *         Pile complétée par le code à générer.
258 **/
259function balise_NOIZETIER_PAGE_INFOS_dist($p) {
260
261        // Récupération des arguments de la balise.
262        // -- seul l'argument information est optionnel.
263        $page = interprete_argument_balise(1, $p);
264        $page = str_replace('\'', '"', $page);
265        $information = interprete_argument_balise(2, $p);
266        $information = isset($information) ? str_replace('\'', '"', $information) : '""';
267
268        // Calcul de la balise
269        $p->code = "calculer_infos_page($page, $information)";
270
271        return $p;
272}
273
274/**
275 * @param        $page
276 * @param string $information
277 *
278 * @return array
279 */
280function calculer_infos_page($page, $information = '') {
281
282        include_spip('inc/noizetier_page');
283        if ($information == 'est_modifiee') {
284                // Initialisation du retour
285                $retour = true;
286
287                // Détermination du répertoire par défaut
288                $repertoire = noizetier_page_repertoire();
289
290                // Récupération du md5 enregistré en base de données
291                $from = 'spip_noizetier_pages';
292                $where = array('page=' . sql_quote($page));
293                $md5_enregistre = sql_getfetsel('signature', $from, $where);
294
295                if ($md5_enregistre) {
296                        // On recherche d'abord le fichier YAML et sinon le fichier XML pou compatibilité ascendante.
297                        if (($fichier = find_in_path("${repertoire}${page}.yaml"))
298                        or ($fichier = find_in_path("${repertoire}${page}.xml"))) {
299                                $md5 = md5_file($fichier);
300                                if ($md5 == $md5_enregistre) {
301                                        $retour = false;
302                                }
303                        }
304                }
305        } else {
306                $retour = noizetier_page_lire($page, $information);
307        }
308
309        return $retour;
310}
311
312
313// --------------------------------------------------------------------
314// ---------------------------- API OBJETS ----------------------------
315// --------------------------------------------------------------------
316
317/**
318 * Compile la balise `#NOIZETIER_OBJET_INFOS` qui fournit un champ ou tous les champs descriptifs d'un objet
319 * donné. Ces champs sont lus dans la table de l'objet.
320 * La signature de la balise est : `#NOIZETIER_OBJET_INFOS{type_objet, id_objet, information}`.
321 *
322 * @package SPIP\NOIZETIER\OBJET\BALISE
323 * @balise
324 *
325 * @example
326 *     ```
327 *     #NOIZETIER_OBJET_INFOS{article, 12}, renvoie tous les champs descriptifs de la page article
328 *     #NOIZETIER_OBJET_INFOS{article, 12, nom}, renvoie le titre de la page article
329 *     ```
330 *
331 * @param Champ $p
332 *        Pile au niveau de la balise.
333 *
334 * @return Champ
335 *         Pile complétée par le code à générer.
336 **/
337function balise_NOIZETIER_OBJET_INFOS_dist($p) {
338
339        // Récupération des arguments de la balise.
340        // -- seul l'argument information est optionnel.
341        $objet = interprete_argument_balise(1, $p);
342        $objet = str_replace('\'', '"', $objet);
343        $id_objet = interprete_argument_balise(2, $p);
344        $id_objet = isset($id_objet) ? $id_objet : '0';
345        $information = interprete_argument_balise(3, $p);
346        $information = isset($information) ? str_replace('\'', '"', $information) : '""';
347
348        // Calcul de la balise
349        $p->code = "calculer_infos_objet($objet, $id_objet, $information)";
350
351        return $p;
352}
353
354/**
355 * @param        $objet
356 * @param        $id_objet
357 * @param string $information
358 *
359 * @return mixed
360 */
361function calculer_infos_objet($objet, $id_objet, $information = '') {
362
363        include_spip('inc/noizetier_objet');
364        return noizetier_objet_lire($objet, $id_objet, $information);
365}
366
367
368/**
369 * Compile la balise `#NOIZETIER_OBJET_LISTE` qui renvoie la liste des objets possédant des noisettes
370 * configurées. Chaque objet est fourni avec sa description complète.
371 * La signature de la balise est : `#NOIZETIER_OBJET_LISTE`.
372 *
373 * @balise
374 *
375 * @param Champ $p
376 *        Pile au niveau de la balise.
377 *
378 * @return Champ
379 *         Pile complétée par le code à générer.
380 **/
381function balise_NOIZETIER_OBJET_LISTE_dist($p) {
382
383        // Aucun argument à la balise.
384        $p->code = "calculer_liste_objets()";
385
386        return $p;
387}
388
389/**
390 * @return array|string
391 */
392function calculer_liste_objets() {
393
394        include_spip('inc/noizetier_objet');
395        return noizetier_objet_repertorier();
396}
Note: See TracBrowser for help on using the repository browser.