Completed
Push — master ( 117d82...bd6ae7 )
by cam
04:12
created

editer_rubrique.php ➔ revisions_rubriques()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 2
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
/***************************************************************************\
4
 *  SPIP, Système de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright © avec tendresse depuis 2001                                 *
7
 *  Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James  *
8
 *                                                                         *
9
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
10
 *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
11
\***************************************************************************/
12
13
/**
14
 * Gestion de l'action editer_rubrique et de l'API d'édition des rubriques
15
 *
16
 * @package SPIP\Core\Rubriques\Edition
17
 */
18
if (!defined('_ECRIRE_INC_VERSION')) {
19
	return;
20
}
21
22
include_spip('inc/rubriques');
23
24
/**
25
 * Action d'édition d'une rubrique
26
 *
27
 * Crée la rubrique si elle n'existe pas encore
28
 * Redirige après l'action sur _request('redirect') si présent
29
 *
30
 * @param null|int $arg
31
 *     - null : vérifie la sécurité de l'action.
32
 *              Si ok, obtient l'identifiant de rubrique à éditer
33
 *              (oui 'oui' pour une nouvelle rubrique)
34
 *     - int  : identifiant de rubrique dont on demande l'édition
35
 * @return array
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use array<boolean|string|integer>.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
36
 *     Liste : identifiant de la rubrique, message d'erreur éventuel.
37
 *
38
 */
39
function action_editer_rubrique_dist($arg = null) {
40
41
	if (is_null($arg)) {
42
		$securiser_action = charger_fonction('securiser_action', 'inc');
43
		$arg = $securiser_action();
44
	}
45
46
	if (!$id_rubrique = intval($arg)) {
47
		if ($arg != 'oui') {
48
			include_spip('inc/headers');
49
			redirige_url_ecrire();
50
		}
51
		$id_rubrique = rubrique_inserer(_request('id_parent'));
52
	}
53
54
	$err = rubrique_modifier($id_rubrique);
55
56
	if (_request('redirect')) {
57
		$redirect = parametre_url(
58
			urldecode(_request('redirect')),
59
			'id_rubrique', $id_rubrique, '&');
60
61
		include_spip('inc/headers');
62
		redirige_par_entete($redirect);
0 ignored issues
show
Bug introduced by
It seems like $redirect defined by parametre_url(urldecode(...ue', $id_rubrique, '&') on line 57 can also be of type array<integer,string> or null; however, redirige_par_entete() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
63
	}
64
65
	return array($id_rubrique, $err);
66
}
67
68
69
/**
70
 * Insérer une rubrique en base
71
 *
72
 * @param int $id_parent
73
 *     Identifiant de la rubrique parente.
74
 *     0 pour la racine.
75
 * @param array|null $set
76
 * @return int
0 ignored issues
show
Documentation introduced by
Should the return type not be boolean|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...
77
 *     Identifiant de la rubrique crée
78
 */
79
function rubrique_inserer($id_parent, $set = null) {
80
	$champs = array(
81
		'titre' => _T('item_nouvelle_rubrique'),
82
		'id_parent' => intval($id_parent),
83
		'statut' => 'prepa'
84
	);
85
86
	if ($set) {
87
		$champs = array_merge($champs, $set);
88
	}
89
90
	// Envoyer aux plugins
91
	$champs = pipeline('pre_insertion',
92
		array(
93
			'args' => array(
94
				'table' => 'spip_rubriques',
95
			),
96
			'data' => $champs
97
		)
98
	);
99
100
	$id_rubrique = sql_insertq("spip_rubriques", $champs);
101
	pipeline('post_insertion',
102
		array(
103
			'args' => array(
104
				'table' => 'spip_rubriques',
105
				'id_objet' => $id_rubrique
106
			),
107
			'data' => $champs
108
		)
109
	);
110
	propager_les_secteurs();
111
	calculer_langues_rubriques();
112
113
	return $id_rubrique;
114
}
115
116
/**
117
 * Modifier une rubrique en base
118
 *
119
 * @param int $id_rubrique
120
 *     Identifiant de la rubrique modifiée
121
 * @param array|null $set
122
 *     Tableau qu'on peut proposer en lieu et place de _request()
123
 * @return bool|string
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use string|false.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
124
 *     - false  : Aucune modification, aucun champ n'est à modifier
125
 *     - chaîne vide : Vide si tout s'est bien passé
126
 *     - chaîne : Texte d'un message d'erreur
127
 */
128
function rubrique_modifier($id_rubrique, $set = null) {
129
	include_spip('inc/autoriser');
130
	include_spip('inc/filtres');
131
132
	include_spip('inc/modifier');
133
	$c = collecter_requests(
134
	// white list
135
		objet_info('rubrique', 'champs_editables'),
0 ignored issues
show
Bug introduced by
It seems like objet_info('rubrique', 'champs_editables') targeting objet_info() can also be of type string; however, collecter_requests() does only seem to accept array, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
136
		// black list
137
		array('id_parent', 'confirme_deplace'),
138
		// donnees eventuellement fournies
139
		$set
140
	);
141
142
	if ($err = objet_modifier_champs('rubrique', $id_rubrique,
143
		array(
144
			'data' => $set,
145
			'nonvide' => array('titre' => _T('titre_nouvelle_rubrique') . " " . _T('info_numero_abbreviation') . $id_rubrique)
146
		),
147
		$c)
148
	) {
149
		return $err;
150
	}
151
152
	$c = collecter_requests(array('id_parent', 'confirme_deplace'), array(), $set);
153
	// Deplacer la rubrique
154
	if (isset($c['id_parent'])) {
155
		$err = rubrique_instituer($id_rubrique, $c);
156
	}
157
158
	// invalider les caches marques de cette rubrique
159
	include_spip('inc/invalideur');
160
	suivre_invalideur("id='rubrique/$id_rubrique'");
161
	// et celui de menu_rubriques 
162
	effacer_meta("date_calcul_rubriques");
163
164
	return $err;
165
}
166
167
/**
168
 * Déplace les brèves d'une rubrique dans le secteur d'un nouveau parent
169
 *
170
 * Si c'est une rubrique-secteur contenant des brèves, on ne deplace
171
 * que si $confirme_deplace == 'oui', et change alors l'id_rubrique des
172
 * brèves en question
173
 *
174
 * @todo À déporter dans le plugin brèves via un pipeline ?
175
 *
176
 * @param int $id_rubrique
177
 *     Identifiant de la rubrique déplacée
178
 * @param int $id_parent
179
 *     Identifiant du nouveau parent de la rubrique
180
 * @param array $c
181
 *     Informations pour l'institution (id_rubrique, confirme_deplace)
182
 * @return bool
183
 *     true si le déplacement est fait ou s'il n'y a rien à faire
184
 *     false si la confirmation du déplacement n'est pas présente
185
 */
186
function editer_rubrique_breves($id_rubrique, $id_parent, $c = array()) {
187
	if (!sql_countsel('spip_breves', "id_rubrique=$id_rubrique")) {
188
		return true;
189
	}
190
191
	if (empty($c['confirme_deplace']) or $c['confirme_deplace'] != 'oui') {
192
		return false;
193
	}
194
195
	if ($id_secteur = sql_getfetsel("id_secteur",
196
		"spip_rubriques", "id_rubrique=$id_parent")
197
	) {
198
		sql_updateq("spip_breves", array("id_rubrique" => $id_secteur), "id_rubrique=$id_rubrique");
199
	}
200
201
	return true;
202
}
203
204
205
/**
206
 * Instituer une rubrique (changer son parent)
207
 *
208
 * Change le parent d'une rubrique, si les autorisations sont correctes,
209
 * mais n'accèpte pas de déplacer une rubrique dans une de ses filles, tout de même !
210
 *
211
 * Recalcule les secteurs, les langues et déplace les brèves au passage.
212
 *
213
 * @param int $id_rubrique
214
 *     Identifiant de la rubrique à instituer
215
 * @param array $c
216
 *     Informations pour l'institution (id_rubrique, confirme_deplace)
217
 * @global array $GLOBALS ['visiteur_session']
218
 * @return string
219
 *     Chaîne vide : aucune erreur
220
 *     Chaîne : Texte du message d'erreur
221
 */
222
function rubrique_instituer($id_rubrique, $c) {
223
	// traitement de la rubrique parente
224
	// interdiction de deplacer vers ou a partir d'une rubrique
225
	// qu'on n'administre pas.
226
227
	if (null !== ($id_parent = $c['id_parent'])) {
228
		$id_parent = intval($id_parent);
229
		$filles = calcul_branche_in($id_rubrique);
230
		if (strpos(",$id_parent,", ",$filles,") !== false) {
231
			spip_log("La rubrique $id_rubrique ne peut etre fille de sa descendante $id_parent");
232
		} else {
233
			$s = sql_fetsel("id_parent, statut", "spip_rubriques", "id_rubrique=$id_rubrique");
234
			$old_parent = $s['id_parent'];
235
236
			if (!($id_parent != $old_parent
237
				and autoriser('publierdans', 'rubrique', $id_parent)
238
				and autoriser('creerrubriquedans', 'rubrique', $id_parent)
239
				and autoriser('publierdans', 'rubrique', $old_parent)
240
			)
241
			) {
242
				if ($s['statut'] != 'new') {
243
					spip_log("deplacement de $id_rubrique vers $id_parent refuse a " . $GLOBALS['visiteur_session']['id_auteur'] . ' ' . $GLOBALS['visiteur_session']['statut']);
244
				}
245
			} elseif (editer_rubrique_breves($id_rubrique, $id_parent, $c)) {
246
				$statut_ancien = $s['statut'];
247
				sql_updateq('spip_rubriques', array('id_parent' => $id_parent), "id_rubrique=$id_rubrique");
248
249
250
				propager_les_secteurs();
251
252
				// Deplacement d'une rubrique publiee ==> chgt general de leur statut
253
				if ($statut_ancien == 'publie') {
254
					calculer_rubriques_if($old_parent, array('id_rubrique' => $id_parent), $statut_ancien);
255
				}
256
				// Creation ou deplacement d'une rubrique non publiee
257
				// invalider le cache de leur menu
258
				elseif (!$statut_ancien || $old_parent != $id_parent) {
259
					effacer_meta("date_calcul_rubriques");
260
				}
261
262
				calculer_langues_rubriques();
263
			}
264
		}
265
	}
266
267
	return ''; // pas d'erreur
268
}
269