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

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

Correction de la balise #NOIZETIER_PAGE_INFOS (argument 2) et PHPDoc

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