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

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

Par cohérence avec les autres API on rajoute l'argument $information en deuxème position de page_noizetier_lire() et par conséquence on revoit les appels (l'argument $traiter_typo est mis à false par défaut).
Et en plus on corrige la balise #PAGE_NOIZETIER_INFOS qui ne fonctionnait pas pour une demande d'information unique car justement l'API précédente ne le permettait pas !

File size: 11.3 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// --------------------------------------------------------------------------------
14
15
16// --------------------------------------------------------------------------------
17// ------------------------- API NOISETTES : COMPLEMENT ---------------------------
18// --------------------------------------------------------------------------------
19
20
21// --------------------------------------------------------------------------------
22// ------------------------- API CONTENEURS : COMPLEMENT --------------------------
23// --------------------------------------------------------------------------------
24
25
26// -------------------------------------------------------------------
27// --------------------------- API ICONES ----------------------------
28// -------------------------------------------------------------------
29
30/**
31 * Compile la balise `#ICONE_NOIZETIER_LISTE` qui fournit la liste des icones d'une taille donnée en pixels
32 * disponibles dans les thèmes SPIP de l'espace privé.
33 * La signature de la balise est : `#ICONE_NOIZETIER_LISTE{taille}`.
34 *
35 * @package SPIP\NOIZETIER\ICONE\BALISE
36 * @balise
37 *
38 * @example
39 *     ```
40 *     #ICONE_NOIZETIER_LISTE{24}, renvoie les icones de taille 24px présents dans les thèmes du privé
41 *     ```
42 *
43 * @param Champ $p
44 *        Pile au niveau de la balise.
45 *
46 * @return Champ
47 *         Pile complétée par le code à générer.
48 **/
49function balise_ICONE_NOIZETIER_LISTE_dist($p) {
50        $taille = interprete_argument_balise(1, $p);
51        $taille = str_replace('\'', '"', $taille);
52        $p->code = "calculer_liste_icones($taille)";
53
54        return $p;
55}
56
57/**
58 * @internal
59 *
60 * @param int $taille
61 *
62 * @return array|string
63 */
64function calculer_liste_icones($taille = 24) {
65
66        static $icones = null;
67
68        if (is_null($icones)) {
69                $pattern = ".+-${taille}[.](jpg|jpeg|png|gif)$";
70                $icones = find_all_in_path('prive/themes/spip/images/', $pattern);
71        }
72
73        return $icones;
74}
75
76
77// -------------------------------------------------------------------
78// ---------------------------- API BLOCS ----------------------------
79// -------------------------------------------------------------------
80
81/**
82 * Compile la balise `#BLOC_Z_INFOS` qui fournit un champ ou tous les champs descriptifs d'un bloc Z
83 * donné. Ces champs sont lus dans le fichier YAML du bloc si il existe.
84 * La signature de la balise est : `#BLOC_Z_INFOS{bloc, information}`.
85 *
86 * @package SPIP\NOIZETIER\BLOC\BALISE
87 * @balise
88 *
89 * @example
90 *     ```
91 *     #BLOC_Z_INFOS{content}, renvoie tous les champs descriptifs du bloc content
92 *     #BLOC_Z_INFOS{content, nom}, renvoie le titre du bloc content
93 *     ```
94 * @param Champ $p
95 *        Pile au niveau de la balise.
96 *
97 * @return Champ
98 *         Pile complétée par le code à générer.
99 **/
100function balise_BLOC_Z_INFOS_dist($p) {
101        $bloc = interprete_argument_balise(1, $p);
102        $bloc = str_replace('\'', '"', $bloc);
103        $information = interprete_argument_balise(2, $p);
104        $information = isset($information) ? str_replace('\'', '"', $information) : '""';
105        $p->code = "calculer_infos_bloc($bloc, $information)";
106
107        return $p;
108}
109
110/**
111 * @internal
112 *
113 * @param string $bloc
114 * @param string $information
115 *
116 * @return array|string
117 */
118function calculer_infos_bloc($bloc = '', $information = '') {
119
120        include_spip('inc/noizetier_bloc');
121        return bloc_z_lire($bloc, $information);
122}
123
124
125// -------------------------------------------------------------------
126// ---------------------------- API PAGES ----------------------------
127// -------------------------------------------------------------------
128
129/**
130 * Compile la balise `#PAGE_NOIZETIER_INFOS` qui fournit un champ ou tous les champs descriptifs d'une page
131 * ou d'une composition donnée. Ces champs sont lus dans la table `spip_noizetier_pages`.
132 * La signature de la balise est : `#PAGE_NOIZETIER_INFOS{page, information}`.
133 *
134 * La fonction peut aussi renvoyer d'autres informations calculées, à savoir :
135 * - `est_modifiee` qui indique si la configuration du fichier YAML ou XML de la page a été modifiée ou pas.
136 * - `compteurs_type_noisette` qui donne le nombre de types de noisettes disponibles pour la page ou la composition
137 *    donnée en distinguant les types de noisettes communs à toutes les pages, les types de noisettes spécifiques à
138 *    un type de page et les types de noisettes spécifiques à une composition.
139 * - `compteurs_noisette` qui donne le nombre de noisettes incluses dans chaque bloc de la page.
140 *
141 * @package SPIP\NOIZETIER\PAGE\BALISE
142 * @balise
143 *
144 * @example
145 *     ```
146 *     #PAGE_NOIZETIER_INFOS{article}, renvoie tous les champs descriptifs de la page article
147 *     #PAGE_NOIZETIER_INFOS{article, nom}, renvoie le titre de la page article
148 *     #PAGE_NOIZETIER_INFOS{article-forum, nom}, renvoie le titre de la composition forum de la page article
149 *     #PAGE_NOIZETIER_INFOS{article, est_modifiee}, indique si la configuration de la page article a été modifiée
150 *     #PAGE_NOIZETIER_INFOS{article, compteurs_type_noisette}, fournit les compteurs de types de noisette compatibles
151 *     #PAGE_NOIZETIER_INFOS{article, compteurs_noisette}, fournit les compteurs de noisettes incluses par bloc
152 *     ```
153 *
154 * @param Champ $p
155 *        Pile au niveau de la balise.
156 *
157 * @return Champ
158 *         Pile complétée par le code à générer.
159 **/
160function balise_PAGE_NOIZETIER_INFOS_dist($p) {
161
162        // Récupération des arguments de la balise.
163        // -- seul l'argument information est optionnel.
164        $page = interprete_argument_balise(1, $p);
165        $page = str_replace('\'', '"', $page);
166        $information = interprete_argument_balise(2, $p);
167        $information = isset($information) ? str_replace('\'', '"', $information) : '""';
168
169        // Calcul de la balise
170        $p->code = "calculer_infos_page($page, $information)";
171
172        return $p;
173}
174
175/**
176 * @internal
177 *
178 * @param        $page
179 * @param string $information
180 *
181 * @return mixed
182 */
183function calculer_infos_page($page, $information = '') {
184
185        include_spip('inc/noizetier_page');
186        if ($information == 'est_modifiee') {
187                // Initialisation du retour
188                $retour = true;
189
190                // Détermination du répertoire par défaut
191                $repertoire = page_noizetier_initialiser_dossier();
192
193                // Récupération du md5 enregistré en base de données
194                $from = 'spip_noizetier_pages';
195                $where = array('page=' . sql_quote($page));
196                $md5_enregistre = sql_getfetsel('signature', $from, $where);
197
198                if ($md5_enregistre) {
199                        // On recherche d'abord le fichier YAML et sinon le fichier XML pour la compatibilité ascendante.
200                        if (($fichier = find_in_path("${repertoire}${page}.yaml"))
201                        or ($fichier = find_in_path("${repertoire}${page}.xml"))) {
202                                $md5 = md5_file($fichier);
203                                if ($md5 == $md5_enregistre) {
204                                        $retour = false;
205                                }
206                        }
207                }
208        } elseif ($information == 'compteurs_type_noisette') {
209                // Initialisation des compteurs par bloc
210                $retour = array(
211                        'composition' => 0,
212                        'type'        => 0,
213                        'commun'      => 0
214                );
215
216                // Acquisition du type et de la composition éventuelle.
217                $type = page_noizetier_extraire_type($page);
218                $composition = page_noizetier_extraire_composition($page);
219
220                // Les compteurs de types de noisette d'une page sont calculés par une lecture de la table 'spip_types_noisettes'.
221                $from = array('spip_types_noisettes');
222                $where = array(
223                        'plugin=' . sql_quote('noizetier'),
224                        'type=' . sql_quote($type),
225                        'composition=' . sql_quote($composition)
226                );
227                $compteur = sql_countsel($from, $where);
228
229                // On cherche maintenant les 3 compteurs possibles :
230                if ($composition) {
231                        // - les types de noisette spécifiques de la composition si la page en est une.
232                        if ($compteur) {
233                                $retour['composition'] = $compteur;
234                        }
235                        $where[2] = 'composition=' . sql_quote('');
236                        $compteur = sql_countsel($from, $where);
237                        if ($compteur) {
238                                $retour['type'] = $compteur;
239                        }
240                } else {
241                        // - les types de noisette spécifiques de la page ou du type de la composition
242                        if ($compteur) {
243                                $retour['type'] = $compteur;
244                        }
245                }
246                // - les types de noisette communs à toutes les pages.
247                $where[1] = 'type=' . sql_quote('');
248                $compteur = sql_countsel($from, $where);
249                if ($compteur) {
250                        $retour['commun'] = $compteur;
251                }
252
253                $retour['total'] = array_sum($retour);
254        } elseif ($information == 'compteurs_noisette') {
255                $retour = page_noizetier_compter_noisettes($page);
256        } else {
257                $retour = page_noizetier_lire($page, $information, true);
258        }
259
260        return $retour;
261}
262
263
264// --------------------------------------------------------------------
265// ---------------------------- API OBJETS ----------------------------
266// --------------------------------------------------------------------
267
268/**
269 * Compile la balise `#OBJET_NOIZETIER_INFOS` qui fournit un champ ou tous les champs descriptifs d'un objet
270 * donné. Ces champs sont lus dans la table de l'objet.
271 * La signature de la balise est : `#OBJET_NOIZETIER_INFOS{type_objet, id_objet, information}`.
272 *
273 * La fonction peut aussi renvoyer d'autres informations calculées, à savoir :
274 * - `compteurs_noisette` qui donne le nombre de noisettes incluses dans chaque bloc de l'objet.
275 *
276 * @package SPIP\NOIZETIER\OBJET\BALISE
277 * @balise
278 *
279 * @example
280 *     ```
281 *     #OBJET_NOIZETIER_INFOS{article, 12}, renvoie tous les champs descriptifs de la page article
282 *     #OBJET_NOIZETIER_INFOS{article, 12, nom}, renvoie le titre de la page article
283 *     #OBJET_NOIZETIER_INFOS{article, 12, compteurs_noisette}, fournit les compteurs de noisettes incluses par bloc
284 *     ```
285 *
286 * @param Champ $p
287 *        Pile au niveau de la balise.
288 *
289 * @return Champ
290 *         Pile complétée par le code à générer.
291 **/
292function balise_OBJET_NOIZETIER_INFOS_dist($p) {
293
294        // Récupération des arguments de la balise.
295        // -- seul l'argument information est optionnel.
296        $objet = interprete_argument_balise(1, $p);
297        $objet = str_replace('\'', '"', $objet);
298        $id_objet = interprete_argument_balise(2, $p);
299        $id_objet = isset($id_objet) ? $id_objet : '0';
300        $information = interprete_argument_balise(3, $p);
301        $information = isset($information) ? str_replace('\'', '"', $information) : '""';
302
303        // Calcul de la balise
304        $p->code = "calculer_infos_objet($objet, $id_objet, $information)";
305
306        return $p;
307}
308
309/**
310 * @internal
311 *
312 * @param        $objet
313 * @param        $id_objet
314 * @param string $information
315 *
316 * @return mixed
317 */
318function calculer_infos_objet($objet, $id_objet, $information = '') {
319
320        include_spip('inc/noizetier_objet');
321        if ($information == 'compteurs_noisette') {
322                $retour = objet_noizetier_compter_noisettes($objet, $id_objet);
323        } else {
324                $retour = objet_noizetier_lire($objet, $id_objet, $information);
325        }
326        return $retour;
327}
328
329
330/**
331 * Compile la balise `#OBJET_NOIZETIER_LISTE` qui renvoie la liste des objets possédant des noisettes
332 * configurées. Chaque objet est fourni avec sa description complète.
333 * La signature de la balise est : `#OBJET_NOIZETIER_LISTE`.
334 *
335 * @balise
336 *
337 * @param Champ $p
338 *        Pile au niveau de la balise.
339 *
340 * @return Champ
341 *         Pile complétée par le code à générer.
342 **/
343function balise_OBJET_NOIZETIER_LISTE_dist($p) {
344
345        // Aucun argument à la balise.
346        $p->code = "calculer_liste_objets()";
347
348        return $p;
349}
350
351/**
352 * @internal
353 *
354 * @return array|string
355 */
356function calculer_liste_objets() {
357
358        include_spip('inc/noizetier_objet');
359        return objet_noizetier_repertorier();
360}
Note: See TracBrowser for help on using the repository browser.