Completed
Push — master ( 1a3b2f...b50fb4 )
by cam
09:59
created

formulaire_admin.php ➔ admin_preview()   B

Complexity

Conditions 9
Paths 9

Size

Total Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
nc 9
nop 3
dl 0
loc 26
rs 8.0555
c 0
b 0
f 0
1
<?php
2
3
/***************************************************************************\
4
 *  SPIP, Systeme de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright (c) 2001-2018                                                *
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) {
0 ignored issues
show
Unused Code introduced by
The parameter $context_compil is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
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
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 (!@$_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) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $env of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
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 dans le contexte de la page
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 = sql_getfetsel('lang', 'spip_auteurs',
255
		"login=" . sql_quote(preg_replace(',^@,', '', @$_COOKIE['spip_admin'])));
256
	if (!$alang) {
257
		return '';
258
	}
259
260
	$l = lang_select($alang);
261
	$alang = $GLOBALS['spip_lang'];
262
	if ($l) {
263
		lang_select();
264
	}
265
266
	return $alang;
267
}
268
269
/**
270
 * Retourne une URL vers un validateur
271
 *
272
 * @return string
273
 **/
274
function admin_valider() {
275
276
	return ((!isset($GLOBALS['xhtml']) or $GLOBALS['xhtml'] !== 'true') ?
277
		(parametre_url(self(), 'var_mode', 'debug', '&')
278
			. '&var_mode_affiche=validation') :
279
		('http://validator.w3.org/check?uri='
280
			. rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri())));
281
}
282
283
/**
284
 * Retourne une URL vers le mode debug, si l'utilisateur a le droit, et si c'est utile
285
 *
286
 * @return string
0 ignored issues
show
Documentation introduced by
Should the return type not be string|string[]?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
287
 **/
288
function admin_debug() {
289
	return ((
290
			(isset($GLOBALS['forcer_debug']) and $GLOBALS['forcer_debug'])
291
			or (isset($GLOBALS['bouton_admin_debug']) and $GLOBALS['bouton_admin_debug'])
292
			or (
293
				defined('_VAR_MODE') and _VAR_MODE == 'debug'
294
				and isset($_COOKIE['spip_debug']) and $_COOKIE['spip_debug']
295
			)
296
		) and autoriser('debug')
297
	)
298
		? parametre_url(self(), 'var_mode', 'debug', '&') : '';
299
}
300