source: spip-zone/_plugins_/logos_roles/branches/v1/logos_roles_fonctions.php @ 109583

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

report de r109580 : Évite des erreurs MySQL 1146

Dans le pipeline declarer_objets_sql, il ne faut surtout pas utiliser de
fonctions qui appellent lister_objets_sql() - comme p.ex. table_objet() -
puisque ça revient à appeler le pipeline depuis le pipeline…

Merci à Placido pour le signalement !

File size: 7.4 KB
Line 
1<?php
2/**
3 * Fonctions utiles au plugin Logos par rôles
4 *
5 * @plugin     logos_roles
6 * @copyright  2016
7 * @author     bystrano
8 * @licence    GNU/GPL
9 */
10
11/**
12 * Lister les rôles de logos
13 *
14 * Le tableau retourné utilise les noms des rôles comme clés, et des tableaux
15 * d'options comme valeur, p.ex :
16 *
17 *      array(
18 *              'logo' => array(
19 *                      'label' => 'Logo',
20 *                      'objets' => array('articles', 'rubriques', 'syndic'),
21 *              ),
22 *              'logo_survol' => array(
23 *                      'label' => 'Logo survol',
24 *                      'objets' => array('articles', 'rubriques'),
25 *              ),
26 *      )
27 *
28 * @param string|null $objet : Un nom d'objet auquel se restreindre. La fonction
29 *     ne retourne alors que les rôles de logos que l'on peut attribuer à cet
30 *     objet.
31 * @param string|null $role : Un rôle auquel se restreindre. On accepte `on` ou
32 *     `off` pour la rétro-compatibilité
33 * @param string|null $tous_les_objets : Une liste des objets éditoriaux à
34 *     prendre en compte. Ça n'est nécessaire que dans le cas où l'on appelle
35 *     cette fonction à un moment où l'API lister_tables_objets_sql n'est pas
36 *     encore disponible, notamment dans le pipeline declarer_tables_objets_sql.
37 *     Dans les autres cas on utilise l'API pour trouver les tables, pas besoin
38 *     de les spécifier.
39 *
40 * @return array : Retourne le tableau décrivant les rôles de logos. Si on a
41 *     passé un paramètre rôle, on retourne directement la définition plutôt
42 *     qu'une liste avec un seul rôle.
43 */
44function lister_roles_logos($objet = null, $role = null, $tous_les_objets = null) {
45
46        if ($role === 'on') {
47                $role = 'logo';
48        } elseif ($role === 'off') {
49                $role = 'logo_survol';
50        }
51
52        if (! $tous_les_objets) {
53                $tous_les_objets = array_map(
54                        'table_objet',
55                        array_filter(array_keys(lister_tables_objets_sql()))
56                );
57        }
58
59        // Logos par défaut
60        $roles_logos = pipeline(
61                'roles_logos',
62                array(
63                        'logo' => array(
64                                'label' => 'Logo',
65                                'objets' => $tous_les_objets,
66                        ),
67                        'logo_survol' => array(
68                                'label' => 'Logo survol',
69                                'objets' => $tous_les_objets,
70                        ),
71                )
72        );
73
74        foreach (lire_config('logos_roles/roles_logos') as $r) {
75                $roles_logos['logo_' . $r['slug']] = array(
76                        'label' => $r['titre'] ?: $r['slug'],
77                        'objets' => $r['objets'],
78                );
79        }
80
81        include_spip('base/objets');
82
83        /* Filtrer par objet */
84        if ($objet and $objet = table_objet($objet)) {
85                $roles_logos_objet = array();
86                foreach ($roles_logos as $cle_role => $options) {
87                        if ((! is_array($options['objets']))
88                                        or in_array($objet, array_map('table_objet', $options['objets']))) {
89                                $roles_logos_objet[$cle_role] = $options;
90                        }
91                }
92
93                $roles_logos = $roles_logos_objet;
94        }
95
96        /* Filtrer par rôle */
97        if (! is_null($role)) {
98                return $roles_logos[$role];
99        }
100
101        return $roles_logos;
102}
103
104/**
105 * Trouver les dimensions d'un rôle
106 *
107 * @param string $role : Le rôle dont on veut connaître les dimensions
108 *
109 * @return array|null  : Un tableau avec des clés 'hauteur' et 'largeur', rien si
110 *                       pas de dimensions définies
111 */
112function get_dimensions_role($role) {
113
114        $roles_logos = lister_roles_logos();
115
116        if (isset($roles_logos[$role])
117                        and is_array($roles_logos[$role])
118                        and isset($roles_logos[$role]['dimensions'])
119                        and is_array($roles_logos[$role]['dimensions'])) {
120                return $roles_logos[$role]['dimensions'];
121        }
122}
123
124/**
125 * Trouve l'identifiant du document associé à un fichier
126 *
127 * @param string $fichier : le nom du fichier
128 *
129 * @return integer : l'identifiant du document
130 */
131function trouver_document_fichier($fichier) {
132
133        $fichier = str_replace(_DIR_IMG, '', $fichier);
134
135        include_spip('base/abstract_sql');
136
137        return sql_getfetsel('id_document', 'spip_documents', 'fichier='.sql_quote($fichier));
138}
139
140/**
141 * Déterminer si un logo est le logo par défaut d'un objet donné
142 *
143 * @param string $logo : le logo en question
144 * @param integer $id_objet : l'identifiant de l'objet
145 * @param string $objet : le type de l'objet
146 * @param string $role : le rôle du logo
147 *
148 * @return boolean : true si oui, false sinon…
149 */
150function est_logo_par_defaut($logo, $id_objet, $objet, $role) {
151
152        $chercher_logo = charger_fonction('chercher_logo', 'inc/');
153
154        $def_logo = lister_roles_logos($objet, $role);
155
156        if (isset($def_logo['defaut'])) {
157                $logo_defaut = find_in_path($def_logo['defaut']);
158        }
159
160        if (! isset($logo_defaut)) {
161                $logo_defaut = $chercher_logo($id_objet, id_table_objet($objet), 'on');
162                $logo_defaut = $logo_defaut[0];
163        }
164
165        return ($logo === $logo_defaut);
166}
167
168/**
169 * Traitement automatique sur les logos. Permet de compléter le résultat des
170 * balises #LOGO_* pour trouver les logos définis par rôles de documents.
171 *
172 * @param string $logo : le code html du logo
173 * @param string $objet : le type d'objet
174 * @param int $id_objet : l'identifiant de l'objet
175 * @param string $role
176 *     le role, ou `on` ou `off` pour la rétro-compatibilité
177 *
178 * @return string : le code html du logo qui va bien
179 */
180function trouver_logo_par_role($logo, $objet, $id_objet, $role) {
181
182        if (! $logo) {
183                $chercher_logo = charger_fonction('chercher_logo', 'inc/');
184                $balise_img = charger_filtre('balise_img');
185
186                $logo = $chercher_logo($id_objet, id_table_objet($objet), $role);
187                $logo = $balise_img($logo[0]);
188        }
189
190        return $logo;
191}
192
193/**
194 * Traitement automatique sur les logos. Forcer les dimensions d'un logo suivant
195 * les dimensions définies par son rôle.
196 *
197 * @param string $logo : le code html du logo
198 * @param string $objet : le type d'objet
199 * @param int $id_objet : l'identifiant de l'objet
200 * @param string $role
201 *     le role, ou `on` ou `off` pour la rétro-compatibilité
202 *
203 * @return string : le code html du logo aux bonnes dimensions
204 */
205function forcer_dimensions_role($logo, $objet, $id_objet, $role) {
206
207        include_spip('inc/filtres');
208
209        if ($dimensions = get_dimensions_role($role)) {
210                $image_recadre = charger_filtre('image_recadre');
211                $image_passe_partout = charger_filtre('image_passe_partout');
212                $logo = $image_recadre(
213                        $image_passe_partout($logo, $dimensions['largeur'], $dimensions['hauteur']),
214                        $dimensions['largeur'],
215                        $dimensions['hauteur']
216                );
217        }
218
219        return $logo;
220}
221
222/**
223 * Surcharge du critère `logo`
224 *
225 * @uses lister_objets_avec_logos_roles()
226 *     Pour obtenir les éléments qui ont un logo
227 *
228 * @param string $idb Identifiant de la boucle
229 * @param array $boucles AST du squelette
230 * @param Critere $crit Paramètres du critère dans cette boucle
231 * @return void
232 */
233function critere_logo($idb, &$boucles, $crit) {
234
235        $not = $crit->not;
236        $boucle = &$boucles[$idb];
237
238        $c = "sql_in('" .
239                $boucle->id_table . '.' . $boucle->primary
240                        . "', lister_objets_avec_logos_roles('" . $boucle->primary . "'), '')";
241
242        if ($crit->cond) {
243                $c = "($arg ? $c : 1)";
244        }
245
246        if ($not) {
247                $boucle->where[] = array("'NOT'", $c);
248        } else {
249                $boucle->where[] = $c;
250        }
251}
252
253/**
254 * Retourne pour une clé primaire d'objet donnée les identifiants ayant un logo
255 *
256 * Version pour les logos par rôle de la fonction lister_objets_avec_logos du
257 * core. On utilise l'API chercher_logo au lieu de parcourir le dossier IMG/.
258 *
259 * @param string $type
260 *     Nom de la clé primaire de l'objet
261 * @return string
262 *     Liste des identifiants ayant un logo (séparés par une virgule)
263 **/
264function lister_objets_avec_logos_roles($type) {
265
266        $logos = array();
267        $chercher_logo = charger_fonction('chercher_logo', 'inc/');
268
269        $rows = sql_allfetsel($type, table_objet_sql($type));
270
271        foreach ($rows as $r) {
272                if (! empty($chercher_logo($r[$type], $type))) {
273                        $logos[] = $r[$type];
274                }
275        }
276
277        return join(',', $logos);
278}
Note: See TracBrowser for help on using the repository browser.