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

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

report de r109581 : éviter un warning et une notice

File size: 7.5 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        if (is_array(lire_config('logos_roles/roles_logos'))) {
75                foreach (lire_config('logos_roles/roles_logos') as $r) {
76                        $roles_logos['logo_' . $r['slug']] = array(
77                                'label' => $r['titre'] ?: $r['slug'],
78                                'objets' => $r['objets'],
79                        );
80                }
81        }
82
83        include_spip('base/objets');
84
85        /* Filtrer par objet */
86        if ($objet and $objet = table_objet($objet)) {
87                $roles_logos_objet = array();
88                foreach ($roles_logos as $cle_role => $options) {
89                        if ((! is_array($options['objets']))
90                                        or in_array($objet, array_map('table_objet', $options['objets']))) {
91                                $roles_logos_objet[$cle_role] = $options;
92                        }
93                }
94
95                $roles_logos = $roles_logos_objet;
96        }
97
98        /* Filtrer par rôle */
99        if (! is_null($role)) {
100                return $roles_logos[$role];
101        }
102
103        return $roles_logos;
104}
105
106/**
107 * Trouver les dimensions d'un rôle
108 *
109 * @param string $role : Le rôle dont on veut connaître les dimensions
110 *
111 * @return array|null  : Un tableau avec des clés 'hauteur' et 'largeur', rien si
112 *                       pas de dimensions définies
113 */
114function get_dimensions_role($role) {
115
116        $roles_logos = lister_roles_logos();
117
118        if (isset($roles_logos[$role])
119                        and is_array($roles_logos[$role])
120                        and isset($roles_logos[$role]['dimensions'])
121                        and is_array($roles_logos[$role]['dimensions'])) {
122                return $roles_logos[$role]['dimensions'];
123        }
124}
125
126/**
127 * Trouve l'identifiant du document associé à un fichier
128 *
129 * @param string $fichier : le nom du fichier
130 *
131 * @return integer : l'identifiant du document
132 */
133function trouver_document_fichier($fichier) {
134
135        $fichier = str_replace(_DIR_IMG, '', $fichier);
136
137        include_spip('base/abstract_sql');
138
139        return sql_getfetsel('id_document', 'spip_documents', 'fichier='.sql_quote($fichier));
140}
141
142/**
143 * Déterminer si un logo est le logo par défaut d'un objet donné
144 *
145 * @param string $logo : le logo en question
146 * @param integer $id_objet : l'identifiant de l'objet
147 * @param string $objet : le type de l'objet
148 * @param string $role : le rôle du logo
149 *
150 * @return boolean : true si oui, false sinon…
151 */
152function est_logo_par_defaut($logo, $id_objet, $objet, $role) {
153
154        $chercher_logo = charger_fonction('chercher_logo', 'inc/');
155
156        $def_logo = lister_roles_logos($objet, $role);
157
158        if (isset($def_logo['defaut'])) {
159                $logo_defaut = find_in_path($def_logo['defaut']);
160        }
161
162        if (! isset($logo_defaut)) {
163                $logo_defaut = $chercher_logo($id_objet, id_table_objet($objet), 'on');
164                $logo_defaut = $logo_defaut[0];
165        }
166
167        return ($logo === $logo_defaut);
168}
169
170/**
171 * Traitement automatique sur les logos. Permet de compléter le résultat des
172 * balises #LOGO_* pour trouver les logos définis par rôles de documents.
173 *
174 * @param string $logo : le code html du logo
175 * @param string $objet : le type d'objet
176 * @param int $id_objet : l'identifiant de l'objet
177 * @param string $role
178 *     le role, ou `on` ou `off` pour la rétro-compatibilité
179 *
180 * @return string : le code html du logo qui va bien
181 */
182function trouver_logo_par_role($logo, $objet, $id_objet, $role) {
183
184        if (! $logo) {
185                $chercher_logo = charger_fonction('chercher_logo', 'inc/');
186                $balise_img = charger_filtre('balise_img');
187
188                $logo = $chercher_logo($id_objet, id_table_objet($objet), $role);
189                if (isset($logo[0])) {
190                        $logo = $balise_img($logo[0]);
191                } else {
192                        return '';
193                }
194        }
195
196        return $logo;
197}
198
199/**
200 * Traitement automatique sur les logos. Forcer les dimensions d'un logo suivant
201 * les dimensions définies par son rôle.
202 *
203 * @param string $logo : le code html du logo
204 * @param string $objet : le type d'objet
205 * @param int $id_objet : l'identifiant de l'objet
206 * @param string $role
207 *     le role, ou `on` ou `off` pour la rétro-compatibilité
208 *
209 * @return string : le code html du logo aux bonnes dimensions
210 */
211function forcer_dimensions_role($logo, $objet, $id_objet, $role) {
212
213        include_spip('inc/filtres');
214
215        if ($dimensions = get_dimensions_role($role)) {
216                $image_recadre = charger_filtre('image_recadre');
217                $image_passe_partout = charger_filtre('image_passe_partout');
218                $logo = $image_recadre(
219                        $image_passe_partout($logo, $dimensions['largeur'], $dimensions['hauteur']),
220                        $dimensions['largeur'],
221                        $dimensions['hauteur']
222                );
223        }
224
225        return $logo;
226}
227
228/**
229 * Surcharge du critère `logo`
230 *
231 * @uses lister_objets_avec_logos_roles()
232 *     Pour obtenir les éléments qui ont un logo
233 *
234 * @param string $idb Identifiant de la boucle
235 * @param array $boucles AST du squelette
236 * @param Critere $crit Paramètres du critère dans cette boucle
237 * @return void
238 */
239function critere_logo($idb, &$boucles, $crit) {
240
241        $not = $crit->not;
242        $boucle = &$boucles[$idb];
243
244        $c = "sql_in('" .
245                $boucle->id_table . '.' . $boucle->primary
246                        . "', lister_objets_avec_logos_roles('" . $boucle->primary . "'), '')";
247
248        if ($crit->cond) {
249                $c = "($arg ? $c : 1)";
250        }
251
252        if ($not) {
253                $boucle->where[] = array("'NOT'", $c);
254        } else {
255                $boucle->where[] = $c;
256        }
257}
258
259/**
260 * Retourne pour une clé primaire d'objet donnée les identifiants ayant un logo
261 *
262 * Version pour les logos par rôle de la fonction lister_objets_avec_logos du
263 * core. On utilise l'API chercher_logo au lieu de parcourir le dossier IMG/.
264 *
265 * @param string $type
266 *     Nom de la clé primaire de l'objet
267 * @return string
268 *     Liste des identifiants ayant un logo (séparés par une virgule)
269 **/
270function lister_objets_avec_logos_roles($type) {
271
272        $logos = array();
273        $chercher_logo = charger_fonction('chercher_logo', 'inc/');
274
275        $rows = sql_allfetsel($type, table_objet_sql($type));
276
277        foreach ($rows as $r) {
278                if (! empty($chercher_logo($r[$type], $type))) {
279                        $logos[] = $r[$type];
280                }
281        }
282
283        return join(',', $logos);
284}
Note: See TracBrowser for help on using the repository browser.