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 | */ |
---|
23 | function 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 | */ |
---|
57 | function 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 | */ |
---|
107 | function 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 | */ |
---|
135 | function 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 | */ |
---|
164 | function 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 | */ |
---|
227 | function 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 | */ |
---|
257 | function 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 | */ |
---|
271 | function 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 | */ |
---|
335 | function 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 | */ |
---|
375 | function 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 | */ |
---|
398 | function 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 | } |
---|