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

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

permettre de forcer les dimensions d'un type de logo

Dans ce cas, les logos de ce type seront automatiquement recadrés a l'affichage,
et le plugin massicot obligera tout recadrage a respecter ces dimensions.

File size: 8.7 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_simple',
55                        array_filter(array_keys(lister_tables_objets_sql()))
56                );
57        }
58
59        if (lire_config('activer_logos') !== 'oui') {
60                return array();
61        }
62
63        // Logos par défaut
64        $roles_logos = array(
65                'logo' => array(
66                        'label' => 'logos_roles:logo',
67                        'objets' => $tous_les_objets,
68                )
69        );
70
71        if (lire_config('activer_logos_survol') === 'oui') {
72                $roles_logos['logo_survol'] = array(
73                        'label' => 'logo_survol',
74                        'objets' => $tous_les_objets,
75                );
76        }
77
78        $roles_logos = pipeline('roles_logos', $roles_logos);
79
80        if (is_array(lire_config('logos_roles/roles_logos'))) {
81                include_spip('inc/filtres');
82                foreach (lire_config('logos_roles/roles_logos') as $r) {
83                        $roles_logos['logo_' . $r['slug']] = array(
84                                'label' => extraire_multi($r['titre']) ?: $r['slug'],
85                                'objets' => $r['objets'],
86                        );
87
88                        if (isset($r['dimensions']) and
89                                        isset($r['dimensions']['largeur']) and ($r['dimensions']['largeur'] > 0) and
90                                        isset($r['dimensions']['hauteur']) and ($r['dimensions']['hauteur'] > 0)) {
91                                $roles_logos['logo_' . $r['slug']]['dimensions'] = $r['dimensions'];
92                        }
93                }
94        }
95
96        include_spip('base/objets');
97
98        /* Filtrer par objet */
99        if ($objet and $objet = table_objet_simple($objet)) {
100                $roles_logos_objet = array();
101                foreach ($roles_logos as $cle_role => $options) {
102                        if ((! is_array($options['objets']))
103                                        or in_array($objet, array_map('table_objet_simple', $options['objets']))) {
104                                $roles_logos_objet[$cle_role] = $options;
105                        }
106                }
107
108                $roles_logos = $roles_logos_objet;
109        }
110
111        /* Filtrer par rôle */
112        if (! is_null($role)) {
113                return $roles_logos[$role];
114        }
115
116        return $roles_logos;
117}
118
119/**
120 * Trouver les dimensions d'un rôle
121 *
122 * @param string $role : Le rôle dont on veut connaître les dimensions
123 *
124 * @return array|null  : Un tableau avec des clés 'hauteur' et 'largeur', rien si
125 *                       pas de dimensions définies
126 */
127function get_dimensions_role($role) {
128
129        $roles_logos = lister_roles_logos();
130
131        if (isset($roles_logos[$role])
132                        and is_array($roles_logos[$role])
133                        and isset($roles_logos[$role]['dimensions'])
134                        and is_array($roles_logos[$role]['dimensions'])) {
135                return $roles_logos[$role]['dimensions'];
136        }
137}
138
139/**
140 * Trouve l'identifiant du document associé à un fichier
141 *
142 * @param string $fichier : le nom du fichier
143 *
144 * @return integer : l'identifiant du document
145 */
146function trouver_document_fichier($fichier) {
147
148        $fichier = str_replace(_DIR_IMG, '', $fichier);
149
150        include_spip('base/abstract_sql');
151
152        return sql_getfetsel('id_document', 'spip_documents', 'fichier='.sql_quote($fichier));
153}
154
155/**
156 * Déterminer si un logo est le logo par défaut d'un objet donné
157 *
158 * @param string $logo : le logo en question
159 * @param integer $id_objet : l'identifiant de l'objet
160 * @param string $objet : le type de l'objet
161 * @param string $role : le rôle du logo
162 *
163 * @return boolean : true si oui, false sinon…
164 */
165function est_logo_par_defaut($logo, $id_objet, $objet, $role) {
166
167        $chercher_logo = charger_fonction('chercher_logo', 'inc/');
168
169        $def_logo = lister_roles_logos($objet, $role);
170
171        if (isset($def_logo['defaut'])) {
172                $logo_defaut = find_in_path($def_logo['defaut']);
173        }
174
175        if (! isset($logo_defaut)) {
176                $logo_defaut = $chercher_logo($id_objet, id_table_objet($objet), 'on');
177                $logo_defaut = $logo_defaut[0];
178        }
179
180        return ($logo === $logo_defaut);
181}
182
183/**
184 * Traitement automatique sur les logos. Permet de compléter le résultat des
185 * balises #LOGO_* pour trouver les logos définis par rôles de documents.
186 *
187 * @param string $logo : le code html du logo
188 * @param string $objet : le type d'objet
189 * @param int $id_objet : l'identifiant de l'objet
190 * @param string $role
191 *     le role, ou `on` ou `off` pour la rétro-compatibilité
192 *
193 * @return string : le code html du logo qui va bien
194 */
195function trouver_logo_par_role($logo, $objet, $id_objet, $role) {
196
197        if (! $logo) {
198                $chercher_logo = charger_fonction('chercher_logo', 'inc/');
199                $balise_img = charger_filtre('balise_img');
200
201                $logo = $chercher_logo($id_objet, id_table_objet($objet), $role);
202                if (isset($logo[0])) {
203                        $logo = $balise_img($logo[0]);
204                } else {
205                        return '';
206                }
207        }
208
209        return $logo;
210}
211
212/**
213 * Traitement automatique sur les logos. Forcer les dimensions d'un logo suivant
214 * les dimensions définies par son rôle.
215 *
216 * @param string $logo : le code html du logo
217 * @param string $objet : le type d'objet
218 * @param int $id_objet : l'identifiant de l'objet
219 * @param string $role
220 *     le role, ou `on` ou `off` pour la rétro-compatibilité
221 *
222 * @return string : le code html du logo aux bonnes dimensions
223 */
224function forcer_dimensions_role($logo, $objet, $id_objet, $role) {
225
226        include_spip('inc/filtres');
227
228        if ($dimensions = get_dimensions_role($role)) {
229                $image_recadre = charger_filtre('image_recadre');
230                $image_passe_partout = charger_filtre('image_passe_partout');
231                $logo = $image_recadre(
232                        $image_passe_partout($logo, $dimensions['largeur'], $dimensions['hauteur']),
233                        $dimensions['largeur'],
234                        $dimensions['hauteur']
235                );
236        }
237
238        return $logo;
239}
240
241/**
242 * Surcharge du critère `logo`
243 *
244 * @uses lister_objets_avec_logos_roles()
245 *     Pour obtenir les éléments qui ont un logo
246 *
247 * @param string $idb Identifiant de la boucle
248 * @param array $boucles AST du squelette
249 * @param Critere $crit Paramètres du critère dans cette boucle
250 * @return void
251 */
252function critere_logo($idb, &$boucles, $crit) {
253
254        $not = $crit->not;
255        $boucle = &$boucles[$idb];
256
257        $c = "sql_in('" .
258                $boucle->id_table . '.' . $boucle->primary
259                        . "', lister_objets_avec_logos_roles('" . $boucle->primary . "'), '')";
260
261        if ($crit->cond) {
262                $c = "($arg ? $c : 1)";
263        }
264
265        if ($not) {
266                $boucle->where[] = array("'NOT'", $c);
267        } else {
268                $boucle->where[] = $c;
269        }
270}
271
272/**
273 * Retourne pour une clé primaire d'objet donnée les identifiants ayant un logo
274 *
275 * Version pour les logos par rôle de la fonction lister_objets_avec_logos du
276 * core. On utilise l'API chercher_logo au lieu de parcourir le dossier IMG/.
277 *
278 * @param string $type
279 *     Nom de la clé primaire de l'objet
280 * @return string
281 *     Liste des identifiants ayant un logo (séparés par une virgule)
282 **/
283function lister_objets_avec_logos_roles($type) {
284
285        $logos = array();
286        $chercher_logo = charger_fonction('chercher_logo', 'inc/');
287
288        $rows = sql_allfetsel($type, table_objet_sql($type));
289
290        foreach ($rows as $r) {
291                if (! empty($chercher_logo($r[$type], $type))) {
292                        $logos[] = $r[$type];
293                }
294        }
295
296        return join(',', $logos);
297}
298
299/**
300 * Une ré-implémentation naïve de table_objet
301 *
302 * C'est utile parce que la fonction table_objet appelle la fonction
303 * lister_tables_objet_sql, et qu'on ne peut donc pas l'utiliser avant que la
304 * table des tables ne soit calculée, comme p.ex. dans le pipeline
305 * declarer_objets_sql.
306 *
307 * @param string $type
308 *     Nom de la table SQL (le plus souvent)
309 *     Tolère un nom de clé primaire.
310 * @return string
311 *     Nom de l'objet
312 */
313function table_objet_simple($type) {
314
315        // S'il n'y a pas de "s" à la fin, on le met.
316        if (substr($type, -1) !== 's') {
317                $type .= 's';
318        }
319
320        // S'il y a un "spip_" ou un "id_" au début, on le retire.
321        return preg_replace(',^spip_|^id_,', '', $type);
322}
Note: See TracBrowser for help on using the repository browser.