ac0ac2c97ead2d2130a0e24eeda4793e707c3e4d
[velocampus/web/www.git] / www / ecrire / action / editer_rubrique.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2011 *
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 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 include_spip('inc/rubriques');
16
17 // http://doc.spip.org/@action_editer_rubrique_dist
18 function action_editer_rubrique_dist($arg=null) {
19
20 if (is_null($arg)){
21 $securiser_action = charger_fonction('securiser_action', 'inc');
22 $arg = $securiser_action();
23 }
24
25 if (!$id_rubrique = intval($arg)) {
26 if ($arg != 'oui') {
27 include_spip('inc/headers');
28 redirige_url_ecrire();
29 }
30 $id_rubrique = insert_rubrique(_request('id_parent'));
31 }
32
33 revisions_rubriques($id_rubrique);
34
35 if (_request('redirect')) {
36 $redirect = parametre_url(
37 urldecode(_request('redirect')),
38 'id_rubrique', $id_rubrique, '&');
39
40 include_spip('inc/headers');
41 redirige_par_entete($redirect);
42 }
43 else
44 return array($id_rubrique,'');
45 }
46
47
48 // http://doc.spip.org/@insert_rubrique
49 function insert_rubrique($id_parent) {
50 $champs = array(
51 'titre' => _T('item_nouvelle_rubrique'),
52 'id_parent' => intval($id_parent),
53 'statut' => 'new');
54
55 // Envoyer aux plugins
56 $champs = pipeline('pre_insertion',
57 array(
58 'args' => array(
59 'table' => 'spip_rubriques',
60 ),
61 'data' => $champs
62 )
63 );
64
65 $id_rubrique = sql_insertq("spip_rubriques", $champs);
66 pipeline('post_insertion',
67 array(
68 'args' => array(
69 'table' => 'spip_rubriques',
70 'id_objet' => $id_rubrique
71 ),
72 'data' => $champs
73 )
74 );
75 propager_les_secteurs();
76 calculer_langues_rubriques();
77 return $id_rubrique;
78 }
79
80 // Enregistrer certaines modifications d'une rubrique
81 // $c est un tableau qu'on peut proposer en lieu et place de _request()
82 // http://doc.spip.org/@revisions_rubriques
83 function revisions_rubriques($id_rubrique, $c=false) {
84 include_spip('inc/autoriser');
85 include_spip('inc/filtres');
86
87 // champs normaux
88 if ($c === false) {
89 $c = array();
90 foreach (array(
91 'titre', 'texte', 'descriptif', 'extra',
92 'id_parent', 'confirme_deplace'
93 ) as $champ)
94 if (($a = _request($champ)) !== null)
95 $c[$champ] = $a;
96 }
97
98 include_spip('inc/modifier');
99 modifier_contenu('rubrique', $id_rubrique,
100 array(
101 'nonvide' => array('titre' => _T('info_sans_titre'))
102 ),
103 $c);
104
105 // Deplacer la rubrique
106 if (isset($c['id_parent'])) {
107 $c['confirme_deplace'] = _request('confirme_deplace', $c);
108 instituer_rubrique($id_rubrique, $c);
109 }
110
111 // invalider les caches marques de cette rubrique
112 include_spip('inc/invalideur');
113 suivre_invalideur("id='id_rubrique/$id_rubrique'");
114 // et celui de menu_rubriques
115 effacer_meta("date_calcul_rubriques");
116 }
117
118 // si c'est une rubrique-secteur contenant des breves, ne deplacer
119 // que si $confirme_deplace == 'oui', et changer l'id_rubrique des
120 // breves en question
121
122 // http://doc.spip.org/@editer_rubrique_breves
123 function editer_rubrique_breves($id_rubrique, $id_parent, $c=false)
124 {
125 if (!sql_countsel('spip_breves', "id_rubrique=$id_rubrique"))
126 return true;
127
128 if ($c['confirme_deplace'] != 'oui')
129 return false;
130
131 if ($id_secteur = sql_getfetsel("id_secteur",
132 "spip_rubriques", "id_rubrique=$id_parent"))
133 sql_updateq("spip_breves", array("id_rubrique" => $id_secteur), "id_rubrique=$id_rubrique");
134
135 return true;
136 }
137
138
139 // http://doc.spip.org/@instituer_rubrique
140 function instituer_rubrique($id_rubrique, $c) {
141 // traitement de la rubrique parente
142 // interdiction de deplacer vers ou a partir d'une rubrique
143 // qu'on n'administre pas.
144
145 $statut_ancien = $parent = '';
146 if (NULL !== ($id_parent = $c['id_parent'])) {
147 $id_parent = intval($id_parent);
148 $filles = calcul_branche($id_rubrique);
149 if (strpos(",$id_parent,", ",$filles,") !== false)
150 spip_log("La rubrique $id_rubrique ne peut etre fille de sa descendante $id_parent");
151 else {
152 $s = sql_fetsel("id_parent, statut", "spip_rubriques", "id_rubrique=$id_rubrique");
153 $old_parent = $s['id_parent'];
154
155 if (!($id_parent != $old_parent
156 AND autoriser('publierdans', 'rubrique', $id_parent)
157 AND autoriser('creerrubriquedans', 'rubrique', $id_parent)
158 AND autoriser('publierdans', 'rubrique', $old_parent)
159 )) {
160 if ($s['statut'] != 'new') {
161 spip_log("deplacement de $id_rubrique vers $id_parent refuse a " . $GLOBALS['visiteur_session']['id_auteur'] . ' '. $GLOBALS['visiteur_session']['statut']);
162 }
163 } elseif (editer_rubrique_breves($id_rubrique, $id_parent, $c)) {
164 $statut_ancien = $s['statut'];
165 sql_updateq('spip_rubriques', array('id_parent' => $id_parent), "id_rubrique=$id_rubrique");
166
167
168 propager_les_secteurs();
169
170 // Deplacement d'une rubrique publiee ==> chgt general de leur statut
171 if ($statut_ancien == 'publie')
172 calculer_rubriques_if($old_parent, array('id_rubrique' => $id_parent), $statut_ancien);
173 // Creation ou deplacement d'une rubrique non publiee
174 // invalider le cache de leur menu
175 elseif (!$statut_ancien || $old_parent!=$id_parent)
176 effacer_meta("date_calcul_rubriques");
177
178 calculer_langues_rubriques();
179
180 return true;
181 }
182 }
183 }
184 }