Completed
Push — master ( 63e5a2...d827ff )
by cam
09:58 queued 03:23
created

chercher_rubrique.php ➔ sous_menu_rubriques()   B

Complexity

Conditions 10
Paths 17

Size

Total Lines 48

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 10
nc 17
nop 8
dl 0
loc 48
rs 7.2678
c 0
b 0
f 0

How to fix   Complexity    Many Parameters   

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:

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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
 * Gestion du sélecteur de rubrique pour les objets éditoriaux s'insérant
15
 * dans une hiérarchie de rubriques
16
 *
17
 * @package SPIP\Core\Rubriques
18
 **/
19
20
if (!defined('_ECRIRE_INC_VERSION')) {
21
	return;
22
}
23
24
if (!defined('_SPIP_SELECT_RUBRIQUES')) {
25
	/**
26
	 * @var int Nombre de rubriques maximum du sélecteur de rubriques. 
27
	 * Au delà, on bascule sur un sélecteur ajax.
28
	 * mettre 100000 pour desactiver ajax 
29
	 */
30
	define('_SPIP_SELECT_RUBRIQUES', 20); 
31
}
32
33
/**
34
 * Sélecteur de rubriques pour l'espace privé
35
 *
36
 * @uses selecteur_rubrique_html()
37
 * @uses selecteur_rubrique_ajax()
38
 *
39
 * @param int $id_rubrique
40
 *     Identifiant de rubrique courante (0 si NEW)
41
 * @param string $type
42
 *     Type de l'objet à placer.
43
 *
44
 *     Une rubrique peut aller à la racine mais pas dans elle-même,
45
 *     les articles et sites peuvent aller n'importe où (défaut),
46
 *     et les brèves dans les secteurs.
47
 * @param bool $restreint
48
 *     True pour indiquer qu'il faut limiter les rubriques affichées
49
 *     aux rubriques éditables par l'admin restreint
50
 * @param int $idem
51
 *     En mode rubrique, identifiant de soi-même
52
 * @param string $do
53
 *     Type d'action
54
 * @return string
55
 *     Code HTML du sélecteur
56
 **/
57
function inc_chercher_rubrique_dist($id_rubrique, $type, $restreint, $idem = 0, $do = 'aff') {
58
	if (sql_countsel('spip_rubriques') < 1) {
59
		return '';
60
	}
61
62
	// Mode sans Ajax :
63
	// - soit parce que le cookie ajax n'est pas la
64
	// - soit parce qu'il y a peu de rubriques
65
	if (_SPIP_AJAX < 1
66
		or $type == 'breve'
67
		or sql_countsel('spip_rubriques') < _SPIP_SELECT_RUBRIQUES
68
	) {
69
		return selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem);
70
	} else {
71
		return selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem, $do);
72
	}
73
74
}
75
76
// compatibilite pour extensions qui utilisaient l'ancien nom
77
$GLOBALS['selecteur_rubrique'] = 'inc_chercher_rubrique_dist';
78
79
/**
80
 * Styles appliqués sur le texte d'une rubrique pour créer visuellement
81
 * une indentation en fonction de sa profondeur dans le sélecteur
82
 *
83
 * @param int $i
84
 *     Profondeur de la rubrique
85
 * @return array
86
 *     Liste (classe CSS, styles en ligne, Espaces insécables)
87
 **/
88
function style_menu_rubriques($i) {
89
90
	$espace = '';
91
	$style = '';
92
	for ($count = 1; $count <= $i; $count++) {
93
		$espace .= "&nbsp;&nbsp;&nbsp;&nbsp;";
94
	}
95
	if ($i == 1) {
96
		$espace = "";
97
	}
98
	$class = "niveau_$i";
99
100
	return array($class, $style, $espace);
101
}
102
103
/**
104
 * Sélecteur de sous rubriques pour l'espace privé
105
 *
106
 * @uses style_menu_rubriques()
107
 *
108
 * @param int $id_rubrique
109
 *     Identifiant de parente
110
 * @param int $root
111
 * @param int $niv
112
 * @param array $data
113
 * @param array $enfants
114
 * @param int $exclus
115
 * @param bool $restreint
116
 *     True pour indiquer qu'il faut limiter les rubriques affichées
117
 *     aux rubriques éditables par l'admin restreint
118
 * @param string $type
119
 *     Type de l'objet à placer.
120
 * @return string
121
 *     Code HTML du sélecteur
122
 **/
123
function sous_menu_rubriques($id_rubrique, $root, $niv, &$data, &$enfants, $exclus, $restreint, $type) {
124
	static $decalage_secteur;
125
126
	// Si on a demande l'exclusion ne pas descendre dans la rubrique courante
127
	if ($exclus > 0
128
		and $root == $exclus
129
	) {
130
		return '';
131
	}
132
133
	// en fonction du niveau faire un affichage plus ou moins kikoo
134
135
	// selected ?
136
	$selected = ($root == $id_rubrique) ? ' selected="selected"' : '';
137
138
	// le style en fonction de la profondeur
139
	list($class, $style, $espace) = style_menu_rubriques($niv);
140
141
	$class .= " selec_rub";
142
143
	// creer l'<option> pour la rubrique $root
144
145
	if (isset($data[$root])) # pas de racine sauf pour les rubriques
146
	{
147
		$r = "<option$selected value='$root' class='$class' style='$style'>$espace"
148
			. $data[$root]
149
			. '</option>' . "\n";
150
	} else {
151
		$r = '';
152
	}
153
154
	// et le sous-menu pour ses enfants
155
	$sous = '';
156
	if (isset($enfants[$root])) {
157
		foreach ($enfants[$root] as $sousrub) {
158
			$sous .= sous_menu_rubriques($id_rubrique, $sousrub,
159
				$niv + 1, $data, $enfants, $exclus, $restreint, $type);
160
		}
161
	}
162
163
	// si l'objet a deplacer est publie, verifier qu'on a acces aux rubriques
164
	if ($restreint and $root != $id_rubrique and !autoriser('publierdans', 'rubrique', $root)) {
165
		return $sous;
166
	}
167
168
	// et voila le travail
169
	return $r . $sous;
170
}
171
172
/**
173
 * Sélecteur de rubriques pour l'espace privé en mode classique (menu)
174
 *
175
 * @uses sous_menu_rubriques()
176
 *
177
 * @param int $id_rubrique
178
 *     Identifiant de rubrique courante (0 si NEW)
179
 * @param string $type
180
 *     Type de l'objet à placer.
181
 * @param bool $restreint
182
 *     True pour indiquer qu'il faut limiter les rubriques affichées
183
 *     aux rubriques éditables par l'admin restreint
184
 * @param int $idem
185
 *     En mode rubrique, identifiant de soi-même
186
 * @return string
187
 *     Code HTML du sélecteur
188
 **/
189
function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem = 0) {
190
	$data = array();
191
	if ($type == 'rubrique' and autoriser('publierdans', 'rubrique', 0)) {
192
		$data[0] = _T('info_racine_site');
193
	}
194
	# premier choix = neant
195
	# si auteur (rubriques restreintes)
196
	# ou si creation avec id_rubrique=0
197
	elseif ($type == 'auteur' or !$id_rubrique) {
198
		$data[0] = '&nbsp;';
199
	}
200
201
	//
202
	// creer une structure contenant toute l'arborescence
203
	//
204
205
	include_spip('base/abstract_sql');
206
	$q = sql_select("id_rubrique, id_parent, titre, statut, lang, langue_choisie", "spip_rubriques",
207
		($type == 'breve' ? ' id_parent=0 ' : ''), '', "0+titre,titre");
208
	while ($r = sql_fetch($q)) {
209
		if (autoriser('voir', 'rubrique', $r['id_rubrique'])) {
210
			// titre largeur maxi a 50
211
			$titre = couper(supprimer_tags(typo($r['titre'])) . " ", 50);
212
			if ($GLOBALS['meta']['multi_rubriques'] == 'oui'
213
				and ($r['langue_choisie'] == "oui" or $r['id_parent'] == 0)
214
			) {
215
				$titre .= ' [' . traduire_nom_langue($r['lang']) . ']';
216
			}
217
			$data[$r['id_rubrique']] = $titre;
218
			$enfants[$r['id_parent']][] = $r['id_rubrique'];
0 ignored issues
show
Coding Style Comprehensibility introduced by
$enfants was never initialized. Although not strictly required by PHP, it is generally a good practice to add $enfants = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
219
			if ($id_rubrique == $r['id_rubrique']) {
220
				$id_parent = $r['id_parent'];
0 ignored issues
show
Unused Code introduced by
$id_parent is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
221
			}
222
		}
223
	}
224
225
	// si une seule rubrique comme choix possible,
226
	// inutile de mettre le selecteur sur un choix vide par defaut
227
	// sauf si le selecteur s'adresse a une rubrique puisque on peut la mettre a la racine dans ce cas
228
	if (count($data) == 2
229
		and isset($data[0])
230
		and !in_array($type, array('auteur', 'rubrique'))
231
		and !$id_rubrique
232
	) {
233
		unset($data[0]);
234
	}
235
236
237
	$opt = sous_menu_rubriques($id_rubrique, 0, 0, $data, $enfants, $idem, $restreint, $type);
238
	$att = " id='id_parent' name='id_parent'\nclass='selecteur_parent verdana1'";
239
240
	if (preg_match(',^<option[^<>]*value=.(\d*).[^<>]*>([^<]*)</option>$,', $opt, $r)) {
241
		$r = "<input$att type='hidden' value='" . $r[1] . "' />" . $r[2];
242
	} else {
243
		$r = "<select" . $att . " size='1'>\n$opt</select>\n";
244
	}
245
246
	# message pour neuneus (a supprimer ?)
247
#	if ($type != 'auteur' AND $type != 'breve')
248
#		$r .= "\n<br />"._T('texte_rappel_selection_champs');
249
250
	return $r;
251
}
252
253
/**
254
 * Sélecteur de rubrique pour l'espace privé, en mode AJAX
255
 *
256
 * @note
257
 *   `$restreint` indique qu'il faut limiter les rubriques affichées
258
 *   aux rubriques éditables par l'admin restreint... or, ca ne marche pas.
259
 *   Pour la version HTML c'est bon (cf. ci-dessus), mais pour l'ajax...
260
 *   je laisse ça aux spécialistes de l'ajax & des admins restreints
261
 *
262
 *   Toutefois c'est juste un pb d'interface, car question securite
263
 *   la vérification est faite à l'arrivée des données (Fil)
264
 *
265
 * @uses construire_selecteur()
266
 * @see  exec_selectionner_dist() Pour l'obtention du contenu AJAX ensuite
267
 *
268
 * @param int $id_rubrique
269
 *     Identifiant de rubrique courante (0 si NEW)
270
 * @param string $type
271
 *     Type de l'objet à placer.
272
 * @param bool $restreint
273
 *     True pour indiquer qu'il faut limiter les rubriques affichées
274
 *     aux rubriques éditables par l'admin restreint. Ne fonctionne actuellement pas ici.
275
 * @param int $idem
276
 *     En mode rubrique, identifiant de soi-même
277
 * @param string $do
278
 *     Type d'action
279
 * @return string
280
 *     Code HTML du sélecteur
281
 */
282
function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem = 0, $do) {
283
284
	if ($id_rubrique) {
285
		$titre = sql_getfetsel("titre", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
286
	} else {
287
		if ($type == 'auteur') {
288
			$titre = '&nbsp;';
289
		} else {
290
			$titre = _T('info_racine_site');
291
		}
292
	}
293
294
	$titre = str_replace('&amp;', '&', entites_html(textebrut(typo($titre))));
295
	$init = " disabled='disabled' type='text' value=\"" . $titre . "\"\nstyle='width:300px;'";
296
297
	$url = generer_url_ecrire('selectionner', "id=$id_rubrique&type=$type&do=$do"
298
		. (!$idem ? '' : "&exclus=$idem")
299
		. ($restreint ? "" : "&racine=oui")
300
		. (isset($GLOBALS['var_profile']) ? '&var_profile=1' : ''));
301
302
303
	return construire_selecteur($url, '', 'selection_rubrique', 'id_parent', $init, $id_rubrique);
304
}
305
306
/**
307
 * Construit un bloc permettant d'activer le sélecteur de rubrique AJAX
308
 *
309
 * Construit un bloc comportant une icone clicable avec image animée à côté
310
 * pour charger en Ajax du code à mettre sous cette icone.
311
 *
312
 * @note
313
 *   Attention: changer le onclick si on change le code Html.
314
 *   (la fonction JS charger_node ignore l'attribut id qui ne sert en fait pas;
315
 *   getElement en mode Ajax est trop couteux).
316
 *
317
 * @param string $url
318
 *     URL qui retournera le contenu du sélecteur en AJAX
319
 * @param string $js
320
 *     Code javascript ajouté sur onclick
321
 * @param string $idom
322
 *     Identifiant donné à l'image activant l'ajax et au block recevant son contenu
323
 * @param string $name
324
 *     Nom du champ à envoyer par le formulaire
325
 * @param string $init
326
 *     Code HTML à l'intérieur de l'input titreparent
327
 * @param int $id
328
 *     Valeur actuelle du champ
329
 * @return string
330
 *     Code HTML du sélecteur de rubrique AJAX
331
 **/
332
function construire_selecteur($url, $js, $idom, $name, $init = '', $id = 0) {
333
	$icone = (strpos($idom, 'auteur') !== false) ? 'auteur-24.png' : 'rechercher-20.png';
334
335
	return
336
		"<div class='rubrique_actuelle'><a href='#' onclick=\""
337
		. $js
338
		. "return charger_node_url_si_vide('"
339
		. $url
340
		. "', this.parentNode.nextSibling, this.nextSibling,'',event)\" title='" . attribut_html(_T('titre_image_selecteur')) . "'><img src='"
341
		. chemin_image($icone)
342
		. "'\nstyle='vertical-align: middle;' alt='" . attribut_html(_T('titre_image_selecteur')) . "' /></a><img src='"
343
		. chemin_image('searching.gif')
344
		. "' id='img_"
345
		. $idom
346
		. "'\nstyle='visibility: hidden;' alt='*' />"
347
		. "<input id='titreparent' name='titreparent'"
348
		. $init
349
		. " />"
350
		. "<input type='hidden' id='$name' name='$name' value='"
351
		. $id
352
		. "' /><div class='nettoyeur'></div></div><div id='"
353
		. $idom
354
		. "'\nstyle='display: none;'></div>";
355
}
356