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

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

Correction : prise en compte de la colonne plugin dans certaines where non encore mis à jour. en espérant que ce soit les derniers !

  • Property svn:eol-style set to native
File size: 7.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 * Renvoie la liste des types d'objet ne pouvant pas être personnalisés car ne possédant pas
143 * de page détectable par le noiZetier.
144 *
145 * @api
146 *
147 * @return array|null
148 */
149function noizetier_objet_lister_exclusions() {
150
151        static $exclusions = null;
152
153        if (is_null($exclusions)) {
154                $exclusions = array();
155                include_spip('base/objets');
156
157                // On récupère les tables d'objets sous la forme spip_xxxx.
158                $tables = lister_tables_objets_sql();
159                $tables = array_keys($tables);
160
161                // On récupère la liste des pages disponibles et on transforme le type d'objet en table SQL.
162                $where = array('composition=' . sql_quote(''), 'est_page_objet=' . sql_quote('oui'));
163                $pages = sql_allfetsel('type', 'spip_noizetier_pages', $where);
164                $pages = array_map('reset', $pages);
165                $pages = array_map('table_objet_sql', $pages);
166
167                // On exclut donc les tables qui ne sont pas dans la liste issues des pages.
168                $exclusions = array_diff($tables, $pages);
169        }
170
171        return $exclusions;
172}
173
174/**
175 * Détermine si un type d'objet est activé dans la configuration du noiZetier.
176 * Si oui, ses objets peuvent recevoir une configuration de noisettes.
177 *
178 * @api
179 *
180 * @param string $type_objet
181 *              Type d'objet SPIP comme article, rubrique...
182 *
183 * @return boolean
184 *              True si le type d'objet est activé, false sinon.
185 */
186function noizetier_objet_type_active($type_objet) {
187
188        static $tables_actives = null;
189        $est_active = false;
190
191        // Si la liste des tables d'objet actives est null on la calcule une seule fois
192        if ($tables_actives === null) {
193                include_spip('inc/config');
194                $tables_actives = array_map('objet_type', lire_config('noizetier/objets_noisettes', array()));
195        }
196
197        // Si la liste est non vide, on détermine si le type d'objet est bien activé.
198        if ($tables_actives and in_array($type_objet, $tables_actives)) {
199                $est_active = true;
200        }
201
202        return $est_active;
203}
204
205
206/**
207 * Détermine, pour un objet donné, la liste des blocs ayant des noisettes incluses et renvoie leur nombre.
208 *
209 * @api
210 *
211 * @param string $objet
212 *            Le type d'objet comme `article`.
213 * @param int    $id_objet
214 *            L'id de l'objet.
215 *
216 * @return array
217 *             Tableau des nombre de noisettes incluses par bloc de la forme [bloc] = nombre de noisettes.
218 */
219function noizetier_objet_compter_noisettes($objet, $id_objet) {
220
221        static $blocs_compteur = array();
222
223        if (!isset($blocs_compteur["${objet}-${id_objet}"])) {
224                // Initialisation des compteurs par bloc
225                $nb_noisettes = array();
226
227                // Le nombre de noisettes par bloc doit être calculé par une lecture de la table spip_noisettes.
228                $from = array('spip_noisettes');
229                $select = array('bloc', "count(type_noisette) as 'noisettes'");
230                // -- Construction du where identifiant précisément le type et la composition de la page
231                $where = array(
232                        'plugin=' . sql_quote('noizetier'),
233                        'objet=' . sql_quote($objet),
234                        'id_objet=' . intval($id_objet)
235                );
236                $group = array('bloc');
237                $blocs_non_vides = sql_allfetsel($select, $from, $where, $group);
238                if ($blocs_non_vides) {
239                        // On formate le tableau [bloc] = nb noisettes
240                        $nb_noisettes = array_column($blocs_non_vides, 'noisettes', 'bloc');
241                }
242
243                // Sauvegarde des compteurs pour les blocs concernés.
244                $blocs_compteur["${objet}-${id_objet}"] = $nb_noisettes;
245        }
246
247        return $blocs_compteur["${objet}-${id_objet}"];
248}
Note: See TracBrowser for help on using the repository browser.