source: spip-zone/_plugins_/noizetier/trunk/inc/noizetier_objet.php @ 110333

Last change on this file since 110333 was 110333, checked in by eric@…, 3 years ago

Renommage dans l'API des blocs.
Mise au point de l'API des objets.
Correction des fonctions réversibles de composition/décomposition des conteneurs pour le cas des objets.

  • Property svn:eol-style set to native
File size: 6.7 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'API de gestion des objets configurables par le noiZetier.
4 *
5 * @package SPIP\NOIZETIER\OBJET\API
6 */
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9}
10
11
12/**
13 * Renvoie la description complète ou uniquement une information précise pour un objet donné.
14 * Cette fonction est utilisable dans le public via la balise #NOIZETIER_OBJET_INFOS.
15 *
16 * @api
17 *
18 * @param string $type_objet
19 *        Type de l'objet comme `article`.
20 * @param string $id_objet
21 *        Id de l'objet.
22 * @param string $information
23 *        Champ précis à renvoyer ou chaîne vide pour renvoyer toutes les champs de l'objet.
24 *
25 * @return mixed
26 *         La description complète sous forme de tableau ou l'information précise demandée.
27 */
28function noizetier_objet_lire($type_objet, $id_objet, $information = '') {
29
30        static $description_objet = array();
31
32        if ($type_objet and intval($id_objet) and !isset($description_objet[$type_objet][$id_objet])) {
33                include_spip('inc/quete');
34                include_spip('base/objets');
35                $description = array();
36
37                // On calcule le titre de l'objet à partir de la fonction idoine
38                $description['titre'] = generer_info_entite($id_objet, $type_objet, 'titre');
39
40                // On recherche le logo de l'objet si il existe sinon on stocke le logo du type d'objet
41                // (le chemin complet)
42                $description['logo'] = '';
43                if ($type_objet != 'document') {
44                        $logo_infos = quete_logo(id_table_objet($type_objet), 'on', $id_objet, 0, false);
45                        $description['logo'] = isset($logo_infos['src']) ? $logo_infos['src'] : '';
46                }
47                if (!$description['logo']) {
48                        $description['logo'] = chemin_image("${type_objet}.png");
49                }
50
51                // On récupère le nombre de noisette déjà configurées dans l'objet.
52                $description['noisettes'] = 0;
53                $from = array('spip_noisettes');
54                $where = array(
55                        'plugin=' . sql_quote('noizetier'),
56                        'objet=' . sql_quote($type_objet),
57                        'id_objet=' . intval($id_objet)
58                );
59                if ($noisettes = sql_countsel($from, $where)) {
60                        $description['noisettes'] = $noisettes;
61                }
62
63                // On rajoute les blocs du type de page dont l'objet est une instance
64                include_spip('inc/noizetier_page');
65                $description['blocs'] = noizetier_page_lister_blocs($type_objet);
66
67                // On sauvegarde finalement la description complète.
68                $description_objet[$type_objet][$id_objet] = $description;
69        }
70
71        // On retourne les informations sur l'objet demandé.
72        if (!$information) {
73                $retour = isset($description_objet[$type_objet][$id_objet])
74                        ? $description_objet[$type_objet][$id_objet]
75                        : array();
76        } else {
77                $retour = isset($description_objet[$type_objet][$id_objet][$information])
78                        ? $description_objet[$type_objet][$id_objet][$information]
79                        : '';
80        }
81
82        return $retour;
83}
84
85/**
86 * Lister les contenus ayant des noisettes spécifiquement configurées pour leur page.
87 * Cette fonction est utilisable dans le public via la balise #NOIZETIER_OBJET_LISTE.
88 *
89 * @api
90 *
91 * @param array $filtres
92 *            Liste des champs sur lesquels appliquer les filtres des objets.
93 *
94 * @return array|string
95 *                 Tableau des descriptions de chaque objet trouvés. Ce tableau est éventuellement filtré sur
96 *         un ou plusieurs champs de la description.
97 */
98function noizetier_objet_repertorier($filtres = array()) {
99
100        static $objets = null;
101
102        if (is_null($objets)) {
103                // On récupère le ou les objets ayant des noisettes dans la table spip_noisettes.
104                $from = array('spip_noisettes');
105                $select = array('objet', 'id_objet', "count(type_noisette) as 'noisettes'");
106                $where = array(
107                        'plugin=' . sql_quote('noizetier'),
108                        'id_objet>0'
109                );
110                $group = array('objet', 'id_objet');
111                $objets_configures = sql_allfetsel($select, $from, $where, $group);
112                if ($objets_configures) {
113                        foreach ($objets_configures as $_objet) {
114                                // On ne retient que les objets dont le type est activé dans la configuration du plugin.
115                                if (noizetier_objet_type_active($_objet['objet'])) {
116                                        $description = noizetier_objet_lire($_objet['objet'], $_objet['id_objet']);
117                                        if ($description) {
118                                                // Si un filtre existe on teste le contenu de l'objet récupéré avant de le garder
119                                                // sinon on le sauvegarde immédiatement.
120                                                $objet_a_retenir = true;
121                                                if ($filtres) {
122                                                        foreach ($filtres as $_critere => $_valeur) {
123                                                                if (isset($description[$_critere]) and ($description[$_critere] == $_valeur)) {
124                                                                        $objet_a_retenir = false;
125                                                                        break;
126                                                                }
127                                                        }
128                                                }
129                                                if ($objet_a_retenir) {
130                                                        $objets[$_objet['objet']][$_objet['id_objet']] = $description;
131                                                }
132                                        }
133                                }
134                        }
135                }
136        }
137
138        return $objets;
139}
140
141/**
142 * Détermine si un type d'objet est activé dans la configuration du noiZetier.
143 * Si oui, ses objets peuvent recevoir une configuration de noisettes.
144 *
145 * @api
146 *
147 * @param string $type_objet
148 *              Type d'objet SPIP comme article, rubrique...
149 *
150 * @return boolean
151 *              True si le type d'objet est activé, false sinon.
152 */
153function noizetier_objet_type_active($type_objet) {
154
155        static $tables_actives = null;
156        $est_active = false;
157
158        // Si la liste des tables d'objet actives est null on la calcule une seule fois
159        if ($tables_actives === null) {
160                include_spip('inc/config');
161                $tables_actives = array_map('objet_type', lire_config('noizetier/objets_noisettes', array()));
162        }
163
164        // Si la liste est non vide, on détermine si le type d'objet est bien activé.
165        if ($tables_actives and in_array($type_objet, $tables_actives)) {
166                $est_active = true;
167        }
168
169        return $est_active;
170}
171
172
173/**
174 * Détermine, pour un objet donné, la liste des blocs ayant des noisettes incluses et renvoie leur nombre.
175 *
176 * @api
177 *
178 * @param string $objet
179 *            Le type d'objet comme `article`.
180 * @param int    $id_objet
181 *            L'id de l'objet.
182 *
183 * @return array
184 *             Tableau des nombre de noisettes incluses par bloc de la forme [bloc] = nombre de noisettes.
185 */
186function noizetier_objet_compter_noisettes($objet, $id_objet) {
187
188        static $blocs_compteur = array();
189
190        if (!isset($blocs_compteur["${objet}-${id_objet}"])) {
191                // Initialisation des compteurs par bloc
192                $nb_noisettes = array();
193
194                // Le nombre de noisettes par bloc doit être calculé par une lecture de la table spip_noisettes.
195                $from = array('spip_noisettes');
196                $select = array('bloc', "count(type_noisette) as 'noisettes'");
197                // -- Construction du where identifiant précisément le type et la composition de la page
198                $where = array(
199                        'plugin=' . sql_quote('noizetier'),
200                        'objet=' . sql_quote($objet),
201                        'id_objet=' . intval($id_objet)
202                );
203                $group = array('bloc');
204                $blocs_non_vides = sql_allfetsel($select, $from, $where, $group);
205                if ($blocs_non_vides) {
206                        // On formate le tableau [bloc] = nb noisettes
207                        $nb_noisettes = array_column($blocs_non_vides, 'noisettes', 'bloc');
208                }
209
210                // Sauvegarde des compteurs pour les blocs concernés.
211                $blocs_compteur["${objet}-${id_objet}"] = $nb_noisettes;
212        }
213
214        return $blocs_compteur["${objet}-${id_objet}"];
215}
Note: See TracBrowser for help on using the repository browser.