source: spip-zone/_plugins_/massicot/trunk/massicot_fonctions.php @ 96870

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

conserver les attributs alt et class des logos

File size: 11.3 KB
Line 
1<?php
2/**
3 * Fonctions utiles au plugin Massicot
4 *
5 * @plugin         Massicot
6 * @copyright  2015
7 * @author         Michel @ Vertige ASBL
8 * @licence        GNU/GPL
9 * @package        SPIP\Massicot\Fonctions
10 */
11
12/**
13 * Retrouver le chemin d'une image donnée par un couple objet, id_objet
14 *
15 * Si le type d'objet est un document, on retourne le chemin du
16 * fichier, sinon on cherche un éventuel logo pour l'objet
17 *
18 * @param string $objet : Le type d'objet
19 * @param integer $id_objet : L'identifiant de l'objet
20 *
21 * @return string : le chemin vers l'image, un string vide sinon
22 */
23function massicot_chemin_image($objet, $id_objet) {
24
25        include_spip('base/abstract_sql');
26        include_spip('base/objets');
27
28        if (objet_type($objet) === 'document') {
29
30                $fichier = sql_getfetsel(
31                        'fichier',
32                        'spip_documents',
33                        'id_document='.intval($id_objet)
34                );
35                return $fichier ?
36                        find_in_path(_NOM_PERMANENTS_ACCESSIBLES . $fichier) : '';
37
38        } else {
39
40                $chercher_logo = charger_fonction('chercher_logo', 'inc');
41                $logo = $chercher_logo($id_objet, id_table_objet($objet), 'on');
42                if (is_array($logo)) {
43                        return array_shift($logo);
44                }
45        }
46}
47
48/**
49 * Enregistre un massicotage dans la base de données
50 *
51 * @param string $objet : le type d'objet
52 * @param integer $id_objet : l'identifiant de l'objet
53 * @param array parametres : Un tableau de parametres pour le
54 *                                                       massicotage, doit contenir les clés
55 *                                                       'zoom', 'x1', 'x2', 'y1', et 'y2'
56 *
57 * @return mixed   Rien si tout s'est bien passé, un message d'erreur
58 *                                 sinon
59 */
60function massicot_enregistrer($objet, $id_objet, $parametres) {
61
62        include_spip('action/editer_objet');
63        include_spip('action/editer_liens');
64
65        /* Tester l'existence des parametres nécessaires */
66        if (! isset($parametres['zoom'])) {
67                return _T('massicot:erreur_parametre_manquant', array('parametre' => 'zoom'));
68        } elseif (! isset($parametres['x1'])) {
69                return _T('massicot:erreur_parametre_manquant', array('parametre' => 'x1'));
70        } elseif (! isset($parametres['x2'])) {
71                return _T('massicot:erreur_parametre_manquant', array('parametre' => 'x2'));
72        } elseif (! isset($parametres['y1'])) {
73                return _T('massicot:erreur_parametre_manquant', array('parametre' => 'y1'));
74        } elseif (! isset($parametres['y2'])) {
75                return _T('massicot:erreur_parametre_manquant', array('parametre' => 'y2'));
76        }
77
78        $chemin_image = massicot_chemin_image($objet, $id_objet);
79        list($width, $height) = getimagesize($chemin_image);
80
81        $id_massicotage = sql_getfetsel(
82                'id_massicotage',
83                'spip_massicotages_liens',
84                array(
85                        'objet='.sql_quote($objet),
86                        'id_objet='.intval($id_objet),
87                )
88        );
89
90        if (! $id_massicotage) {
91                $id_massicotage = objet_inserer('massicotage');
92                objet_associer(
93                        array('massicotage' => $id_massicotage),
94                        array($objet => $id_objet)
95                );
96        }
97
98        if ($err = objet_modifier(
99                'massicotage',
100                $id_massicotage,
101                array('traitements' => serialize($parametres))
102        )) {
103                return $err;
104        }
105}
106
107/**
108 * Retourne les paramètres de massicotage d'une image
109 *
110 * S'il n'y a pas de massicotage défini pour cet objet, on retourne
111 * un tableau vide.
112 *
113 * @param string $objet : le type d'objet
114 * @param integer $id_objet : l'identifiant de l'objet
115 *
116 * @return array : Un tableau avec les paramètres de massicotage
117 */
118function massicot_get_parametres($objet, $id_objet) {
119
120        include_spip('base/abstract_sql');
121
122        $traitements = sql_getfetsel(
123                'traitements',
124                'spip_massicotages as M '
125                . 'INNER JOIN spip_massicotages_liens as L ON M.id_massicotage=L.id_massicotage',
126                array(
127                        'L.objet='.sql_quote($objet),
128                        'L.id_objet='.intval($id_objet)
129                )
130        );
131
132        if ($traitements) {
133                return unserialize($traitements);
134        } else {
135                return array();
136        }
137}
138
139/**
140 * Trouver l'objet associé à un logo donné par son fichier
141 *
142 * Retourne un tableau avec des clés 'objet' et 'id_objet'
143 *
144 * @param String $fichier : Le fichier de logo
145 *
146 * @return mixed : Un tableau représentant l'objet, rien si on n'a pas
147 *                                 réussi à deviner
148 */
149function massicot_trouver_objet_logo($fichier) {
150
151        $fichier = basename($fichier);
152
153        /* on retire l'extension */
154        $fichier = substr($fichier, 0, strpos($fichier, '.'));
155
156        $row = explode('on', $fichier);
157
158        if (is_array($row) and (count($row) === 2)) {
159
160                return array(
161                        'objet' => objet_type(
162                                array_search($row[0], $GLOBALS['table_logos'])
163                        ),
164                        'id_objet' => $row[1],
165                );
166        }
167}
168
169/**
170 * Massicoter un fichier image
171 *
172 * La fonction générale qui d'occupe du recadrage des images
173 *
174 * @param string $fichier : Le fichier
175 * @param array $parametres : le tableau des paramètres de massicotage
176 *
177 * @return string : Un fichier massicoté
178 */
179function massicoter_fichier($fichier, $parametres) {
180
181        include_spip('inc/filtres');
182        include_spip('inc/filtres_images_mini');
183        include_spip('filtres/images_transforme');
184
185        $fichier_original = $fichier;
186
187        /* on vire un éventuel query string */
188        $fichier = parse_url($fichier);
189        $fichier = $fichier['path'];
190
191        /* la balise #FICHIER sur les boucles documents donne un chemin
192           relatif au dossier IMG qu'on ne peut pas retourner tel quel,
193           sous peine de de casser le portfolio de la dist.
194           (constaté sur SPIP 3.1 RC1) */
195        if (! file_exists($fichier)) {
196                $fichier = _DIR_IMG . $fichier;
197                // Si on n'a toujours rien, c'est probablement un fichier distant
198                if (! file_exists($fichier)) {
199                        return $fichier_original;
200                }
201        }
202
203        /* ne rien faire s'il n'y a pas de massicotage défini */
204        if (! $parametres) {
205                return $fichier;
206        }
207
208        list($width, $height) = getimagesize($fichier);
209
210        $fichier = extraire_attribut(
211                image_reduire(
212                        $fichier,
213                        $parametres['zoom'] * $width,
214                        $parametres['zoom'] * $height
215                ),
216                'src'
217        );
218
219        /* on vire un éventuel query string */
220        $fichier = parse_url($fichier);
221        $fichier = $fichier['path'];
222
223        list($width, $height) = getimagesize($fichier);
224
225        $fichier = extraire_attribut(
226                image_recadre(
227                        $fichier,
228                        $width  - $parametres['x1'],
229                        $height - $parametres['y1'],
230                        'bottom right'
231                ),
232                'src'
233        );
234
235        $fichier = extraire_attribut(
236                image_recadre(
237                        $fichier,
238                        $parametres['x2'] - $parametres['x1'],
239                        $parametres['y2'] - $parametres['y1'],
240                        'top left'
241                ),
242                'src'
243        );
244
245        return $fichier;
246}
247
248/**
249 * Massicoter un document
250 *
251 * À utiliser comme filtre sur les balises #FICHIER ou #URL_DOCUMENT
252 *
253 * @param string $fichier : Le fichier du document
254 *
255 * @return string : Un fichier massicoté
256 */
257function massicoter_document($fichier = false) {
258
259        if (! $fichier) {
260                return;
261        }
262
263        include_spip('base/abstract_sql');
264        include_spip('inc/documents');
265
266        $parametres = sql_getfetsel(
267                'traitements',
268                'spip_massicotages as M' .
269                ' INNER JOIN spip_massicotages_liens as L ON L.id_massicotage = M.id_massicotage' .
270                ' INNER JOIN spip_documents as D ON (D.id_document = L.id_objet AND L.objet="document")',
271                'D.fichier='.sql_quote(set_spip_doc($fichier))
272        );
273
274        return massicoter_fichier($fichier, unserialize($parametres));
275}
276
277/**
278 * Massicoter un objet
279 *
280 * À utiliser comme filtre sur les balises #LOGO_*. Pour les balises
281 * #LOGO_DOCUMENT, il faut utiliser la fonction
282 * massicoter_logo_document
283 *
284 * @param string $fichier : Le fichier à massicoter
285 * @param string $objet : Le type d'objet
286 * @param string $id_obejt : L'identifiant de l'objet
287 *
288 * @return string : Un fichier massicoté
289 */
290function massicoter_objet($fichier, $objet, $id_objet) {
291
292        return massicoter_fichier($fichier, massicot_get_parametres($objet, $id_objet));
293}
294
295/**
296 * Massicoter un logo document
297 *
298 * Traitement automatique sur les balises #LOGO_DOCUMENT
299 *
300 * @param string $fichier : Le logo
301 *
302 * @return string : Un logo massicoté
303 */
304function massicoter_logo_document($logo, $connect = null, $doc = array()) {
305
306        include_spip('inc/filtres');
307        include_spip('inc/filtres_images_mini');
308
309        /* S'il n'y a pas de fichier dans la pile, on va le chercher dans
310           la table documents */
311        if (! isset($doc['fichier'])) {
312                include_spip('base/abstract_sql');
313                $rows = sql_allfetsel(
314                        'fichier, extension',
315                        'spip_documents',
316                        'id_document='.intval($doc['id_document'])
317                );
318
319                $doc['fichier']   = $rows[0]['fichier'];
320                $doc['extension'] = $rows[0]['extension'];
321        }
322
323        /* Si le document en question n'est pas une image, on ne fait rien */
324        if ((! $logo)
325                or (preg_match('/^(jpe?g|png|gif)$/i', $doc['extension']) === 0)) {
326
327                return $logo;
328        }
329
330        /* S'il y a un lien sur le logo, on le met de côté pour le
331           remettre après massicotage */
332        if (preg_match('#(<a.*?>)<img.*$#', $logo) === 1) {
333                $lien = preg_replace('#(<a.*?>)<img.*$#', '$1', $logo);
334        }
335
336        $fichier = extraire_attribut($logo, 'src');
337        /* On se débarasse d'un éventuel query string */
338        $fichier = preg_replace('#\?[0-9]+#', '', $fichier);
339
340        list($largeur_logo, $hauteur_logo) =
341                getimagesize($fichier);
342
343        $balise_img = charger_filtre('balise_img');
344
345        $fichier_massicote = massicoter_document(get_spip_doc($doc['fichier']));
346
347        /* Comme le logo reçu en paramètre peut avoir été réduit grâce aux
348           paramètres de la balise LOGO_, il faut s'assurer que l'image
349           qu'on renvoie fait bien la même taille que le logo qu'on a
350           reçu. */
351        $balise = image_reduire(
352                $balise_img(
353                        $fichier_massicote,
354                        extraire_attribut($logo, 'alt'),
355                        extraire_attribut($logo, 'class')
356                ),
357                $largeur_logo,
358                $hauteur_logo
359        );
360
361        if (isset($lien)) {
362                $balise = $lien . $balise . '</a>';
363        }
364
365        return $balise;
366}
367
368/**
369 * Massicoter un logo
370 *
371 * Traitement automatique sur les balises #LOGO_*
372 *
373 * @param string $fichier : Le logo
374 *
375 * @return string : Un logo massicoté
376 */
377function massicoter_logo($logo, $connect = null, $objet_type = null, $id_objet = null) {
378
379        include_spip('inc/filtres');
380
381        if (! $logo) {
382                return $logo;
383        }
384
385        $fichier = extraire_attribut($logo, 'src');
386        $alt     = extraire_attribut($logo, 'alt');
387        $classes = extraire_attribut($logo, 'class');
388
389        /* S'il n'y a pas d'id_objet, on essaie de le deviner avec le nom du
390           fichier, c'est toujours mieux que rien. Sinon on abandonne… */
391        if (is_null($id_objet)) {
392
393                $objet = massicot_trouver_objet_logo($fichier);
394
395                if (is_null($objet)) {
396                        return $logo;
397                }
398
399                $objet_type = $objet['objet'];
400                $id_objet       = $objet['id_objet'];
401        }
402
403        $parametres = massicot_get_parametres($objet_type, $id_objet);
404
405        $fichier = massicoter_fichier($fichier, $parametres);
406
407        $balise_img = charger_filtre('balise_img');
408
409        return $balise_img($fichier, $alt, $classes);
410}
411
412/**
413 * Traitement auto sur les balises #LARGEUR
414 *
415 * @param string $largeur : La largeur renvoyée par la balise
416 *
417 * @return string : La largeur de l'image après massicotage
418 */
419function massicoter_largeur($largeur, $connect = null, $doc = array()) {
420
421        if ((! $largeur) or (! isset($doc['id_document']))) {
422                return $largeur;
423        }
424
425        $parametres = massicot_get_parametres('document', $doc['id_document']);
426
427        // Si les paramètre de l'image sont vide, on renvoie la largeur directement
428        if (empty($parametres)) {
429                return $largeur;
430        }
431
432        return (string) round(($parametres['x2'] - $parametres['x1']));
433}
434
435/**
436 * Traitement auto sur les balises #HAUTEUR
437 *
438 * @param string $hauteur : La hauteur renvoyée par la balise
439 *
440 * @return string : La hauteur de l'image après massicotage
441 */
442function massicoter_hauteur($hauteur, $connect = null, $doc = array()) {
443
444        if ((! $hauteur) or (! isset($doc['id_document']))) {
445                return $hauteur;
446        }
447
448        $parametres = massicot_get_parametres('document', $doc['id_document']);
449
450        // Si les paramètre de l'image sont vide, on renvoie la hauteur directement
451        if (empty($parametres)) {
452                return $hauteur;
453        }
454
455        return (string) round(($parametres['y2'] - $parametres['y1']));
456}
Note: See TracBrowser for help on using the repository browser.