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

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

Supprime du code inutile

Dans le fichiers qui ne font que déclarer des fonctions, cette ligne de
"sécurité" est encore moins utile que d'habitude…

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