[SPIP] v3.2.7-->v3.2.9
[lhc/web/www.git] / www / prive / formulaires / editer_logo.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Gestion du formulaire d'édition de logo
15 *
16 * Ce formulaire ajoute, modifie ou supprime des logos sur les objets de SPIP.
17 *
18 * - En dehors d'une boucle, ce formulaire modifie le logo du site.
19 * - Dans une boucle, il modifie le logo de la table selectionnée.
20 *
21 * Pensez juste que l'appel de `#LOGO_{TYPE}` s'appuie sur le nom de la clé primaire et non sur le
22 * nom de l'objet réel. Par exemple on ecrira `#LOGO_GROUPE` (et non `#LOGO_GROUPEMOTS`) pour afficher
23 * un logo issu du formulaire mis dans une boucle `GROUPES_MOTS`
24 *
25 * - il est possible de lui passer les paramètres objet et id : `#FORMULAIRE_EDITER_LOGO{article,1}`
26 * - il est possible de spécifier une URL de redirection apres traitement :
27 * `#FORMULAIRE_EDITER_LOGO{article,1,#URL_ARTICLE}`
28 *
29 * @package SPIP\Core\Formulaires
30 **/
31
32 if (!defined('_ECRIRE_INC_VERSION')) {
33 return;
34 }
35
36 global $logo_libelles;
37 // utilise pour le logo du site, donc doit rester ici
38 $logo_libelles['site'] = _T('logo_site');
39 $logo_libelles['racine'] = _T('logo_standard_rubrique');
40
41
42 /**
43 * Chargement du formulaire d'édition de logo
44 *
45 * @param string $objet Objet SPIP auquel sera lie le document (ex. article)
46 * @param int $id_objet Identifiant de l'objet
47 * @param string $retour Url de redirection apres traitement
48 * @param array $options Tableau d'option (exemple : image_reduire => 50)
49 * @return array Variables d'environnement pour le fond
50 */
51 function formulaires_editer_logo_charger_dist($objet, $id_objet, $retour = '', $options = array()) {
52 // pas dans une boucle ? formulaire pour le logo du site
53 // dans ce cas, il faut chercher un 'siteon0.ext'
54 if (!$objet) {
55 $objet = 'site';
56 }
57
58 $objet = objet_type($objet);
59 $_id_objet = id_table_objet($objet);
60
61 if (!is_array($options)) {
62 $options = unserialize($options);
63 }
64 $options = spip_sanitize_from_request($options, '*');
65
66 if (!isset($options['titre'])) {
67 $balise_img = chercher_filtre('balise_img');
68 $img = $balise_img(chemin_image('image-24.png'),'', 'cadre-icone');
69 $libelles = pipeline('libeller_logo', $GLOBALS['logo_libelles']);
70 $libelle = (($id_objet or $objet != 'rubrique') ? $objet : 'racine');
71 if (isset($libelles[$libelle])) {
72 $libelle = $libelles[$libelle];
73 } elseif ($libelle = objet_info($objet, 'texte_logo_objet')) {
74 $libelle = _T($libelle);
75 } else {
76 $libelle = _L('Logo');
77 }
78 switch ($objet) {
79 case 'article':
80 $libelle .= ' ' . aider('logoart');
81 break;
82 case 'breve':
83 $libelle .= ' ' . aider('breveslogo');
84 break;
85 case 'rubrique':
86 $libelle .= ' ' . aider('rublogo');
87 break;
88 default:
89 break;
90 }
91
92 $options['titre'] = $img . $libelle;
93 }
94 if (!isset($options['editable'])) {
95 include_spip('inc/autoriser');
96 $options['editable'] = autoriser('iconifier', $objet, $id_objet);
97 }
98
99 $res = array(
100 'editable' => ($GLOBALS['meta']['activer_logos'] == 'oui' ? ' ' : '') && (!isset($options['editable']) or $options['editable']),
101 'logo_survol' => ($GLOBALS['meta']['activer_logos_survol'] == 'oui' ? ' ' : ''),
102 'objet' => $objet,
103 'id_objet' => $id_objet,
104 '_options' => $options,
105 '_show_upload_off' => '',
106 );
107
108 // rechercher le logo de l'objet
109 // la fonction prend un parametre '_id_objet' etrange :
110 // le nom de la cle primaire (et non le nom de la table)
111 // ou directement le nom du raccourcis a chercher
112 $chercher_logo = charger_fonction('chercher_logo', 'inc');
113 $etats = $res['logo_survol'] ? array('on', 'off') : array('on');
114 foreach ($etats as $etat) {
115 $logo = $chercher_logo($id_objet, $_id_objet, $etat);
116 if ($logo) {
117 $res['logo_' . $etat] = $logo[0];
118 }
119 }
120 // pas de logo_on -> pas de formulaire pour le survol
121 if (!isset($res['logo_on'])) {
122 $res['logo_survol'] = '';
123 } elseif (!isset($res['logo_off']) and _request('logo_up')) {
124 $res['_show_upload_off'] = ' ';
125 }
126
127 // si le logo n'est pas editable et qu'il n'y en a pas, on affiche pas du tout le formulaire
128 if (!$res['editable']
129 and !isset($res['logo_off'])
130 and !isset($res['logo_on'])
131 ) {
132 return false;
133 }
134
135 return $res;
136 }
137
138 /**
139 * Identifier le formulaire en faisant abstraction des parametres qui
140 * ne representent pas l'objet edite
141 *
142 * @param string $objet Objet SPIP auquel sera lie le document (ex. article)
143 * @param int $id_objet Identifiant de l'objet
144 * @param string $retour Url de redirection apres traitement
145 * @param array $options Tableau d'option (exemple : image_reduire => 50)
146 * @return string Hash du formulaire
147 */
148 function formulaires_editer_logo_identifier_dist($objet, $id_objet, $retour = '', $options = array()) {
149 return serialize(array($objet, $id_objet));
150 }
151
152 /**
153 * Verification avant traitement du formulaire d'édition de logo
154 *
155 * On verifie que l'upload s'est bien passe et
156 * que le document recu est une image (d'apres son extension)
157 *
158 * @param string $objet Objet SPIP auquel sera lie le document (ex. article)
159 * @param int $id_objet Identifiant de l'objet
160 * @param string $retour Url de redirection apres traitement
161 * @param array $options Tableau d'option (exemple : image_reduire => 50)
162 * @return array Erreurs du formulaire
163 */
164 function formulaires_editer_logo_verifier_dist($objet, $id_objet, $retour = '', $options = array()) {
165 $erreurs = array();
166 // verifier les extensions
167 $sources = formulaire_editer_logo_get_sources();
168 foreach ($sources as $etat => $file) {
169 // seulement si une reception correcte a eu lieu
170 if ($file and $file['error'] == 0) {
171 if (!in_array(
172 strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)),
173 array('jpg', 'png', 'gif', 'jpeg')
174 )) {
175 $erreurs['logo_' . $etat] = _L('Extension non reconnue');
176 }
177 }
178 }
179
180 return $erreurs;
181 }
182
183 /**
184 * Traitement de l'upload d'un logo
185 *
186 * Il est affecte au site si la balise n'est pas dans une boucle,
187 * sinon a l'objet concerne par la boucle ou indiquee par les parametres d'appel
188 *
189 * @param string $objet Objet SPIP auquel sera lie le document (ex. article)
190 * @param int $id_objet Identifiant de l'objet
191 * @param string $retour Url de redirection apres traitement
192 * @param array $options Tableau d'option (exemple : image_reduire => 50)
193 * @return array Retour des traitements
194 */
195 function formulaires_editer_logo_traiter_dist($objet, $id_objet, $retour = '', $options = array()) {
196 $res = array('editable' => ' ');
197
198 // pas dans une boucle ? formulaire pour le logo du site
199 // dans ce cas, il faut chercher un 'siteon0.ext'
200 if (!$objet) {
201 $objet = 'site';
202 }
203
204 include_spip('action/editer_logo');
205
206 // effectuer la suppression si demandee d'un logo
207 $on = _request('supprimer_logo_on');
208 if ($on or _request('supprimer_logo_off')) {
209 logo_supprimer($objet, $id_objet, $on ? 'on' : 'off');
210 $res['message_ok'] = ''; // pas besoin de message : la validation est visuelle
211 set_request('logo_up', ' ');
212 } // sinon supprimer ancien logo puis copier le nouveau
213 else {
214 $sources = formulaire_editer_logo_get_sources();
215 foreach ($sources as $etat => $file) {
216 if ($file and $file['error'] == 0) {
217 if ($err = logo_modifier($objet, $id_objet, $etat, $file)) {
218 $res['message_erreur'] = $err;
219 } else {
220 $res['message_ok'] = '';
221 } // pas besoin de message : la validation est visuelle
222 set_request('logo_up', ' ');
223 }
224 }
225 }
226
227 // Invalider les caches de l'objet
228 include_spip('inc/invalideur');
229 suivre_invalideur("id='$objet/$id_objet'");
230
231
232 if ($retour) {
233 $res['redirect'] = $retour;
234 }
235
236 return $res;
237 }
238
239
240 /**
241 * Extraction des sources des fichiers uploadés correspondant aux 2 logos (normal + survol)
242 * si leur upload s'est bien passé
243 *
244 * @return array
245 * Sources des fichiers dans les clés `on` ou `off`
246 */
247 function formulaire_editer_logo_get_sources() {
248 if (!$_FILES) {
249 $_FILES = isset($GLOBALS['HTTP_POST_FILES']) ? $GLOBALS['HTTP_POST_FILES'] : array();
250 }
251 if (!is_array($_FILES)) {
252 return array();
253 }
254
255 $sources = array();
256 foreach (array('on', 'off') as $etat) {
257 if (isset($_FILES['logo_' . $etat]) and $_FILES['logo_' . $etat]['error'] == 0) {
258 $sources[$etat] = $_FILES['logo_' . $etat];
259 }
260 }
261
262 return $sources;
263 }