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

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

corrige une regression

le commit précédent fait disparaître les logos en 3.0.21…

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