Completed
Push — spip-2.1 ( b6b097 )
by cam
42:28 queued 30:44
created

formulaire_.php ➔ balise_FORMULAIRE__contexte()   F

Complexity

Conditions 33
Paths > 20000

Size

Total Lines 105
Code Lines 59

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 33
eloc 59
c 0
b 0
f 0
nc 798402
nop 2
dl 0
loc 105
rs 2

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/***************************************************************************\
3
 *  SPIP, Systeme de publication pour l'internet                           *
4
 *                                                                         *
5
 *  Copyright (c) 2001-2016                                                *
6
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
7
 *                                                                         *
8
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
9
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
10
\***************************************************************************/
11
12
if (!defined('_ECRIRE_INC_VERSION')) return;
13
14
include_spip('inc/filtres');
15
16
function protege_champ($texte){
17
	if (is_array($texte))
18
		$texte = array_map('protege_champ',$texte);
19
	else {
20
		// ne pas corrompre une valeur serialize
21
		if ((preg_match(",^[abis]:\d+[:;],", $texte) AND unserialize($texte)!=false) OR is_null($texte))
22
			return $texte;
23
		$texte = entites_html($texte);
24
		$texte = str_replace("'","&#39;",$texte);
25
	}
26
	return $texte;
27
}
28
29
function existe_formulaire($form)
30
{
31
	if (substr($form,0,11)=="FORMULAIRE_")
32
		$form = strtolower(substr($form,11));
33
	else 
34
		$form = strtolower($form);
35
36
	if (!$form) return ''; // on ne sait pas, le nom du formulaire n'est pas fourni ici
37
38
	return find_in_path($form.'.' . _EXTENSION_SQUELETTES, 'formulaires/') ? $form : false;
39
}
40
41
42
/* prendre en charge par defaut les balises formulaires simples */
43
// http://doc.spip.org/@balise_FORMULAIRE__dist
44
function balise_FORMULAIRE__dist($p) {
45
46
	// Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
47
	// mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
48
	if (existe_formulaire($p->nom_champ)===FALSE) {
49
		    $p->code = "''";
50
		    $p->interdire_scripts = false;
51
		    return $p;
52
	}
53
54
	// sinon renvoyer un code php dnamique
55
	return calculer_balise_dynamique($p, $p->nom_champ, array());
56
}
57
58
/* prendre en charge par defaut les balises dynamiques formulaires simples */
59
// http://doc.spip.org/@balise_FORMULAIRE__dyn
60
function balise_FORMULAIRE__dyn($form)
61
{
62
	$form = existe_formulaire($form);
63
	if (!$form) return '';
0 ignored issues
show
Bug Best Practice introduced by
The expression $form of type string|false is loosely compared to false; this is ambiguous if the string can be empty. You might want to explicitly use === false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
64
65
	// deux moyen d'arriver ici : 
66
	// soit #FORMULAIRE_XX reroute avec 'FORMULAIRE_XX' ajoute en premier arg
67
	// soit #FORMULAIRE_{xx}
68
69
	// recuperer les arguments passes a la balise
70
	// on enleve le premier qui est le nom de la balise 
71
	// deja recupere ci-dessus
72
73
	$args = func_get_args();
74
	array_shift($args);
75
	$contexte = balise_FORMULAIRE__contexte($form, $args);
76
	if (!is_array($contexte)) return $contexte;
77
	return array("formulaires/$form", 3600, $contexte);
78
}
79
80
function balise_FORMULAIRE__contexte($form, $args)
81
{
82
	// tester si ce formulaire vient d'etre poste (memes arguments)
83
	// pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
84
	// si poste, on recupere les erreurs
85
86
	$je_suis_poste = false;
87
	if ($post_form = _request('formulaire_action')
88
	 AND $post_form == $form
89
	 AND $p = _request('formulaire_action_args')
90
	 AND is_array($p = decoder_contexte_ajax($p, $post_form))) {
91
		// enlever le faux attribut de langue masque
92
		array_shift($p);
93
		if (formulaire__identifier($form, $args, $p))
94
			$je_suis_poste = true;
95
	}
96
97
	$editable = true;
98
	$erreurs = $post = array();
99
	if ($je_suis_poste) {
100
		$post = traiter_formulaires_dynamiques(true);
101
		$e = "erreurs_$form";
102
		$erreurs = isset($post[$e]) ? $post[$e] : array();
103
		$editable = "editable_$form";
104
		$editable = (!isset($post[$e]))
105
			  || count($erreurs)
106
			  || (isset($post[$editable]) && $post[$editable]);
107
	}
108
109
	$valeurs = formulaire__charger($form, $args, $je_suis_poste);
110
111
	// si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
112
	// C'est plus fort qu'editable qui est gere par le squelette 
113
	// Idealement $valeur doit etre alors un message explicatif.
114
	if (!is_array($valeurs)) return is_string($valeurs) ? $valeurs : '';
115
	
116
	// charger peut passer une action si le formulaire ne tourne pas sur self()
117
	// ou une action vide si elle ne sert pas
118
	$action = (isset($valeurs['action'])) ? $valeurs['action'] : self('&amp;', true);
119
	// bug IEx : si action finit par / 
120
	// IE croit que le <form ... action=../ > est autoferme
121
	if (substr($action,-1)=='/') {
122
		// on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
123
		$action .= '#';
124
	}
125
126
	// recuperer la saisie en cours si erreurs
127
	// seulement si c'est ce formulaire qui est poste
128
	// ou si on le demande explicitement par le parametre _forcer_request = true
129
	$dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
130
	foreach(array_keys($valeurs) as $champ){
131
		if ($champ[0]!=='_' AND !in_array($champ, array('message_ok','message_erreur','editable'))) {
132
			if ($dispo AND (($v = _request($champ))!==NULL))
133
				$valeurs[$champ] = $v;
134
			if ($action)
135
				$action = parametre_url($action,$champ,'');
136
			// nettoyer l'url des champs qui vont etre saisis
137
			// proteger les ' et les " dans les champs que l'on va injecter
138
			$valeurs[$champ] = protege_champ($valeurs[$champ]);
139
		}
140
	}
141
142
	if ($action) {
143
		// nettoyer l'url
144
		$action = parametre_url($action,'formulaire_action','');
145
		$action = parametre_url($action,'formulaire_action_args','');
146
	}
147
148
	if (isset($valeurs['_action'])){
149
		$securiser_action = charger_fonction('securiser_action','inc');
150
		$secu = $securiser_action(reset($valeurs['_action']),end($valeurs['_action']),'',-1);
151
		$valeurs['_hidden'] = (isset($valeurs['_hidden'])?$valeurs['_hidden']:'') .
152
		"<input type='hidden' name='arg' value='".$secu['arg']."' />"
153
		. "<input type='hidden' name='hash' value='".$secu['hash']."' />";
154
	}
155
156
	// empiler la lang en tant que premier argument implicite du CVT
157
	// pour permettre de la restaurer au moment du Verifier et du Traiter
158
	array_unshift($args, $GLOBALS['spip_lang']);
159
160
	$valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
161
	$valeurs['erreurs'] = $erreurs;
162
	$valeurs['action'] = $action;
163
	$valeurs['form'] = $form;
164
165
	if (!isset($valeurs['id'])) $valeurs['id'] = 'new';
166
	// editable peut venir de charger() ou de traiter() sinon
167
	if (!isset($valeurs['editable'])) $valeurs['editable'] = $editable;
168
	// dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
169
	$valeurs['editable'] = ($valeurs['editable']?' ':'');
170
171
	if ($je_suis_poste) {
172
		$valeurs['message_erreur'] = "";
173
		if (isset($erreurs['message_erreur']))
174
			$valeurs['message_erreur'] = $erreurs['message_erreur'];
175
176
		$valeurs['message_ok'] = "";
177
		if (isset($post["message_ok_$form"]))
178
			$valeurs['message_ok'] = $post["message_ok_$form"];
179
		elseif (isset($erreurs['message_ok']))
180
			$valeurs['message_ok'] = $erreurs["message_ok"];
181
	}
182
	
183
	return $valeurs;
184
}
185
186
/**
187
 * Charger les valeurs de saisie du formulaire
188
 *
189
 * @param string $form
190
 * @param array $args
191
 * @param bool $poste
192
 * @return array
193
 */
194
function formulaire__charger($form, $args, $poste)
195
{
196
	if ($charger_valeurs = charger_fonction("charger","formulaires/$form",true))
197
		$valeurs = call_user_func_array($charger_valeurs,$args);
198
	else $valeurs = array();
199
200
	$valeurs = pipeline(
201
		'formulaire_charger',
202
		array(
203
			'args'=>array('form'=>$form,'args'=>$args,'je_suis_poste'=>$poste),
204
			'data'=>$valeurs)
205
	);
206
	return $valeurs;
207
}
208
209
/**
210
 * Verifier que le formulaire en cours est celui qui est poste
211
 * on se base sur la fonction identifier (si elle existe) qui fournit
212
 * une signature identifiant le formulaire a partir de ses arguments
213
 * significatifs
214
 *
215
 * En l'absence de fonction identifier, on se base sur l'egalite des
216
 * arguments, ce qui fonctionne dans les cas simples
217
 *
218
 * @param string $form
219
 * @param array $args
220
 * @param array $p
221
 * @return bool
222
 */
223
function formulaire__identifier($form, $args, $p) {
224
	if ($identifier_args = charger_fonction("identifier","formulaires/$form",true)) {
225
		return call_user_func_array($identifier_args,$args)===call_user_func_array($identifier_args,$p);
226
	}
227
	return $args===$p;
228
}
229
?>
0 ignored issues
show
Best Practice introduced by
It is not recommended to use PHP's closing tag ?> in files other than templates.

Using a closing tag in PHP files that only contain PHP code is not recommended as you might accidentally add whitespace after the closing tag which would then be output by PHP. This can cause severe problems, for example headers cannot be sent anymore.

A simple precaution is to leave off the closing tag as it is not required, and it also has no negative effects whatsoever.

Loading history...
230