[SPIP] ~v3.2.4-->v3.2.5
[lhc/web/www.git] / www / ecrire / balise / formulaire_admin.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 * Ce fichier gère la balise dynamique `#FORMULAIRE_ADMIN`
15 *
16 * @package SPIP\Core\Formulaires
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 /**
24 * Compile la balise dynamique `#FORMULAIRE_ADMIN` qui des boutons
25 * d'administration dans l'espace public
26 *
27 * Cette balise permet de placer les boutons d'administrations dans un
28 * endroit spécifique du site. Si cette balise n'est pas présente, les boutons
29 * seront automatiquement ajoutés par SPIP si l'auteur a activé le
30 * cookie de correspondance.
31 *
32 * @balise
33 * @see f_admin()
34 * @example
35 * ```
36 * #FORMULAIRE_ADMIN
37 * ```
38 *
39 * @param Champ $p
40 * Pile au niveau de la balise
41 * @return Champ
42 * Pile complétée du code compilé
43 **/
44 function balise_FORMULAIRE_ADMIN($p) {
45 return calculer_balise_dynamique($p, 'FORMULAIRE_ADMIN', array());
46 }
47
48 /**
49 * Calculs de paramètres de contexte automatiques pour la balise FORMULAIRE_ADMIN
50 *
51 * On ne peut rien dire au moment de l'execution du squelette
52 *
53 * @param array $args
54 * - Classe CSS éventuelle
55 * @param array $context_compil
56 * Tableau d'informations sur la compilation
57 * @return array|string
58 * - Liste (statut, id) si un mode d'inscription est possible
59 * - chaîne vide sinon.
60 */
61 function balise_FORMULAIRE_ADMIN_stat($args, $context_compil) {
62 return $args;
63 }
64
65
66 /**
67 * Retourne le squelette d'affichage et le contexte de la balise FORMULAIRE_ADMIN
68 *
69 * @note
70 * Les boutons admin sont mis d'autorité si absents
71 * donc une variable statique contrôle si FORMULAIRE_ADMIN a été vu.
72 *
73 * Toutefois, si c'est le debuger qui appelle, il peut avoir recopié
74 * le code dans ses données et il faut le lui refournir.
75 * Pas question de recompiler: ca fait boucler !
76 * Le debuger transmet donc ses données, et cette balise y retrouve son petit.
77 *
78 * @param string $float
79 * Classe CSS éventuelle
80 * @param string|array $debug
81 * Informations sur la page contenant une erreur de compilation
82 * @return array|string
83 * Liste : Chemin du squelette, durée du cache, contexte
84 **/
85 function balise_FORMULAIRE_ADMIN_dyn($float = '', $debug = '') {
86
87 static $dejafait = false;
88
89 if (empty($_COOKIE['spip_admin'])) {
90 return '';
91 }
92
93 if (!is_array($debug)) {
94 if ($dejafait) {
95 return '';
96 }
97 } else {
98 if ($dejafait) {
99 if (empty($debug['sourcefile'])) {
100 return '';
101 }
102 foreach ($debug['sourcefile'] as $k => $v) {
103 if (strpos($v, 'administration.') !== false) {
104 if (isset($debug['resultat'][$k . 'tout'])) {
105 return $debug['resultat'][$k . 'tout'];
106 }
107 }
108 }
109
110 return '';
111 }
112 }
113
114 include_spip('inc/autoriser');
115 include_spip('base/abstract_sql');
116
117
118 $dejafait = true;
119
120 // Preparer le #ENV des boutons
121
122 $env = admin_objet();
123
124 // Pas de "modifier ce..." ? -> donner "acces a l'espace prive"
125 if (!$env) {
126 $env['ecrire'] = _DIR_RESTREINT_ABS;
127 }
128
129 $env['divclass'] = $float;
130 $env['lang'] = admin_lang();
131 $env['calcul'] = (_request('var_mode') ? 'recalcul' : 'calcul');
132 $env['debug'] = ((defined('_VAR_PREVIEW') and _VAR_PREVIEW) ? "" : admin_debug());
133 $env['analyser'] = (!$env['debug'] and !$GLOBALS['xhtml']) ? '' : admin_valider();
134 $env['inclure'] = ((defined('_VAR_INCLURE') and _VAR_INCLURE) ? 'inclure' : '');
135
136 if (!$GLOBALS['use_cache']) {
137 $env['use_cache'] = ' *';
138 }
139
140 if (isset($debug['validation'])) {
141 $env['xhtml_error'] = $debug['validation'];
142 }
143
144 $env['_pipelines']['formulaire_admin'] = array();
145
146 return array('formulaires/administration', 0, $env);
147 }
148
149
150 /**
151 * Préparer le contexte d'environnement pour les boutons
152 *
153 * Permettra d'afficher le bouton 'Modifier ce...' s'il y a un
154 * `$id_XXX` défini globalement par `spip_register_globals`
155 *
156 * @note
157 * Attention à l'ordre dans la boucle:
158 * on ne veut pas la rubrique si un autre bouton est possible
159 *
160 * @return array
161 * Tableau de l'environnement calculé
162 **/
163 function admin_objet() {
164 include_spip('inc/urls');
165 $env = array();
166
167 $trouver_table = charger_fonction('trouver_table', 'base');
168 $objets = urls_liste_objets(false);
169 $objets = array_diff($objets, array('rubrique'));
170 $objets = array_reverse($objets);
171 array_unshift($objets, 'rubrique');
172 foreach ($objets as $obj) {
173 $type = $obj;
174 if ($type == objet_type($type, false)
175 and $_id_type = id_table_objet($type)
176 and isset($GLOBALS['contexte'][$_id_type])
177 and $id = $GLOBALS['contexte'][$_id_type]
178 and !is_array($id)
179 and $id = intval($id)
180 ) {
181 $id = sql_getfetsel($_id_type, table_objet_sql($type), "$_id_type=" . intval($id));
182 if ($id) {
183 $env[$_id_type] = $id;
184 $env['objet'] = $type;
185 $env['id_objet'] = $id;
186 $env['voir_' . $obj] =
187 str_replace('&amp;', '&', generer_url_entite($id, $obj, '', '', false));
188 if ($desc = $trouver_table(table_objet_sql($type))
189 and isset($desc['field']['id_rubrique'])
190 and $type != 'rubrique'
191 ) {
192 unset($env['id_rubrique']);
193 unset($env['voir_rubrique']);
194 if (admin_preview($type, $id, $desc)) {
195 $env['preview'] = parametre_url(self(), 'var_mode', 'preview', '&');
196 }
197 }
198 }
199 }
200 }
201
202 return $env;
203 }
204
205
206 /**
207 * Détermine si l'élément est previsualisable
208 *
209 * @param string $type
210 * Type d'objet
211 * @param int $id
212 * Identifinant de l'objet
213 * @param array|null $desc
214 * Description de la table
215 * @return string|array
216 * - Chaine vide si on est déjà en prévisu ou si pas de previsualisation possible
217 * - Tableau d'un élément sinon.
218 **/
219 function admin_preview($type, $id, $desc = null) {
220 if (defined('_VAR_PREVIEW') and _VAR_PREVIEW) {
221 return '';
222 }
223
224 if (!$desc) {
225 $trouver_table = charger_fonction('trouver_table', 'base');
226 $desc = $trouver_table(table_objet_sql($type));
227 }
228 if (!$desc or !isset($desc['field']['statut'])) {
229 return '';
230 }
231
232 include_spip('inc/autoriser');
233 if (!autoriser('previsualiser')) {
234 return '';
235 }
236
237 $notpub = sql_in("statut", array('prop', 'prive'));
238
239 if ($type == 'article' and $GLOBALS['meta']['post_dates'] != 'oui') {
240 $notpub .= " OR (statut='publie' AND date>" . sql_quote(date('Y-m-d H:i:s')) . ")";
241 }
242
243 return sql_fetsel('1', table_objet_sql($type), id_table_objet($type) . "=" . $id . " AND ($notpub)");
244 }
245
246
247 /**
248 * Régler les boutons dans la langue de l'admin (sinon tant pis)
249 *
250 * @return string
251 * Code de langue
252 **/
253 function admin_lang() {
254 $alang = '';
255 if (!empty($_COOKIE['spip_admin'])) {
256 $email_or_login = preg_replace(',^@,', '', $_COOKIE['spip_admin']);
257 $alang = sql_getfetsel('lang', 'spip_auteurs', "email=" . sql_quote($email_or_login));
258 if (!$alang) {
259 $alang = sql_getfetsel('lang', 'spip_auteurs', "login=" . sql_quote($email_or_login));
260 }
261 }
262 if (!$alang) {
263 return '';
264 }
265
266 $l = lang_select($alang);
267 $alang = $GLOBALS['spip_lang'];
268 if ($l) {
269 lang_select();
270 }
271
272 return $alang;
273 }
274
275 /**
276 * Retourne une URL vers un validateur
277 *
278 * @return string
279 **/
280 function admin_valider() {
281
282 return ((!isset($GLOBALS['xhtml']) or $GLOBALS['xhtml'] !== 'true') ?
283 (parametre_url(self(), 'var_mode', 'debug', '&')
284 . '&var_mode_affiche=validation') :
285 ('http://validator.w3.org/check?uri='
286 . rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri())));
287 }
288
289 /**
290 * Retourne une URL vers le mode debug, si l'utilisateur a le droit, et si c'est utile
291 *
292 * @return string
293 **/
294 function admin_debug() {
295 return ((
296 (isset($GLOBALS['forcer_debug']) and $GLOBALS['forcer_debug'])
297 or (isset($GLOBALS['bouton_admin_debug']) and $GLOBALS['bouton_admin_debug'])
298 or (
299 defined('_VAR_MODE') and _VAR_MODE == 'debug'
300 and isset($_COOKIE['spip_debug']) and $_COOKIE['spip_debug']
301 )
302 ) and autoriser('debug')
303 )
304 ? parametre_url(self(), 'var_mode', 'debug', '&') : '';
305 }