Mise en route du suivi.
[aidenligne_francais_universite.git] / ecrire / inc / modifier.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2007 *
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
16 // Une fonction generique pour l'API de modification de contenu
17 // $options est un array() avec toutes les options
18 //
19 // Pour l'instant fonctionne pour les types :
20 // article, auteur, document, forum
21 // renvoie false si rien n'a ete modifie, true sinon
22 //
23 // http://doc.spip.org/@modifier_contenu
24 function modifier_contenu($type, $id, $options, $c=false) {
25 include_spip('inc/filtres');
26
27 $table_objet = table_objet($type);
28 $id_table_objet = id_table_objet($type);
29
30 // Gerer les champs non vides
31 if (is_array($options['nonvide']))
32 foreach ($options['nonvide'] as $champ => $sinon) {
33 if (_request($champ, $c) === '') {
34 $c = set_request($champ, $sinon, $c);
35 }
36 }
37
38 $champs = array();
39 if (is_array($options['champs']))
40 foreach ($options['champs'] as $champ) {
41 $val = _request($champ, $c);
42 if ($val !== NULL)
43 $champs[$champ] = corriger_caracteres($val);
44 }
45
46 // recuperer les extras
47 if ($GLOBALS['champs_extra']) {
48 include_spip('inc/extra');
49 if ($extra = extra_update($table_objet, $id, $c))
50 $champs['extra'] = $extra;
51 }
52
53 // Envoyer aux plugins
54 $champs = pipeline('pre_edition',
55 array(
56 'args' => array(
57 'table' => 'spip_'.$table_objet,
58 'id_objet' => $id,
59 'champs' => $options['champs']
60 ),
61 'data' => $champs
62 )
63 );
64
65 $update = array();
66 foreach ($champs as $champ => $val)
67 $update[] = $champ . '=' . _q($val);
68
69 if (!count($update))
70 return false;
71
72 spip_query($q = "UPDATE spip_$table_objet SET ".join(', ',$update)." WHERE $id_table_objet=$id");
73 //spip_log($q);
74
75 // marquer le fait que l'objet est travaille par toto a telle date
76 if ($GLOBALS['meta']['articles_modif'] != 'non') {
77 include_spip('inc/drapeau_edition');
78 signale_edition ($id, $GLOBALS['auteur_session'], $type);
79 }
80
81 // Invalider les caches
82 if ($options['invalideur']) {
83 include_spip('inc/invalideur');
84 suivre_invalideur($options['invalideur']);
85 }
86
87 // Demander une reindexation ?
88 if (!isset($options['indexation']))
89 $options['indexation'] = ($GLOBALS['meta']['activer_moteur'] == 'oui');
90 if ($options['indexation']) {
91 include_spip('inc/indexation');
92 marquer_indexer('spip_'.$table_objet, $id);
93 }
94
95 // Notifications, gestion des revisions...
96 pipeline('post_edition',
97 array(
98 'args' => array(
99 'table' => 'spip_'.$table_objet,
100 'id_objet' => $id,
101 'champs' => $options['champs']
102 ),
103 'data' => $champs
104 )
105 );
106
107 return true;
108 }
109
110 // http://doc.spip.org/@revision_document
111 function revision_document($id_document, $c=false) {
112
113 return modifier_contenu('document', $id_document,
114 array(
115 'champs' => array('titre', 'descriptif')
116 //,'nonvide' => array('titre' => _T('info_sans_titre'))
117 ),
118 $c);
119 }
120
121 // http://doc.spip.org/@revision_signature
122 function revision_signature($id_signature, $c=false) {
123
124 return modifier_contenu('signature', $id_signature,
125 array(
126 'champs' => array('nom_email', 'ad_email', 'nom_site', 'url_site', 'message'),
127 'nonvide' => array('nom_email' => _T('info_sans_titre'))
128 ),
129 $c);
130 }
131
132
133 // http://doc.spip.org/@revision_auteur
134 function revision_auteur($id_auteur, $c=false) {
135
136 modifier_contenu('auteur', $id_auteur,
137 array(
138 'champs' => array('nom', 'bio', 'pgp', 'nom_site', 'url_site', 'email', 'url_propre'),
139 'nonvide' => array('nom' => _T('ecrire:item_nouvel_auteur'))
140 ),
141 $c);
142 }
143
144
145 // http://doc.spip.org/@revision_mot
146 function revision_mot($id_mot, $c=false) {
147
148 // regler le groupe
149 if (NULL !== ($id_groupe = _request('id_groupe',$c))
150 OR NULL !== ($type = _request('type',$c))) {
151 $result = spip_query("SELECT titre FROM spip_groupes_mots WHERE id_groupe="._q($id_groupe));
152 if ($row = spip_fetch_array($result))
153 $type = $row['titre'];
154 else
155 $type = NULL;
156 $c = set_request('type', $type, $c);
157 }
158
159 modifier_contenu('mot', $id_mot,
160 array(
161 'champs' => array('titre', 'descriptif', 'texte', 'id_groupe', 'type', 'url_propre'),
162 'nonvide' => array('titre' => _T('info_sans_titre'))
163 ),
164 $c);
165 }
166
167 // Nota: quand on edite un forum existant, il est de bon ton d'appeler
168 // au prealable conserver_original($id_forum)
169 // http://doc.spip.org/@revision_forum
170 function revision_forum($id_forum, $c=false) {
171
172 $s = spip_query("SELECT * FROM spip_forum WHERE id_forum="._q($id_forum));
173 if (!$t = spip_fetch_array($s)) {
174 spip_log("erreur forum $id_forum inexistant");
175 return;
176 }
177
178 // Calculer l'invalideur des caches lies a ce forum
179 if ($t['statut'] == 'publie') {
180 include_spip('inc/invalideur');
181 $invalideur = "id='id_forum/"
182 . calcul_index_forum(
183 $t['id_article'],
184 $t['id_breve'],
185 $t['id_rubrique'],
186 $t['id_syndic']
187 )
188 . "'";
189 } else
190 $invalideur = '';
191
192 // Supprimer 'http://' tout seul
193 $u = _request('url_site', $c);
194 if ($u !== NULL) {
195 include_spip('inc/filtres');
196 $c = set_request('url_site', vider_url($u, false), $c);
197 }
198
199 $r = modifier_contenu('forum', $id_forum,
200 array(
201 'champs' => array('titre', 'texte', 'auteur', 'email_auteur', 'nom_site', 'url_site'),
202 'nonvide' => array('titre' => _T('info_sans_titre')),
203 'invalideur' => $invalideur
204 ),
205 $c);
206
207
208 // Modification des id_article etc: ce n'est pas autorise en standard
209 // mais ca peut servir pour des crayons ; du coup on teste ici que
210 // la donnee provient bien de $c, pour eviter tout hack lors d'un envoi
211 // normal de forum.
212 if (is_array($c)
213 AND count($cles = array_intersect(array_keys($c),
214 array('id_article', 'id_rubrique', 'id_syndic', 'id_breve')))
215 ) {
216 foreach ($cles as $k)
217 spip_query("UPDATE spip_forum SET $k="._q($c[$k])." WHERE id_forum=$id_forum");
218 }
219
220 // s'il y a vraiment eu une modif, on stocke le numero IP courant
221 // ainsi que le nouvel id_auteur dans le message modifie ;
222 if ($r) {
223 spip_query("UPDATE spip_forum SET ip="._q($GLOBALS['ip']).", id_auteur="._q($GLOBALS['auteur_session']['id_auteur'])." WHERE id_forum="._q($id_forum));
224 }
225 }
226
227
228 // pipeline appelant la fonction de sauvegarde de la premiere revision
229 // d'un article avant chaque modification de contenu
230 // http://doc.spip.org/@premiere_revision
231 function premiere_revision($x) {
232 // Stockage des versions : creer une premiere version si non-existante
233 if ($GLOBALS['flag_revisions']
234 AND $GLOBALS['meta']["articles_versions"]=='oui') {
235 include_spip('inc/revisions');
236 $x = enregistrer_premiere_revision($x);
237 }
238 return $x;
239 }
240
241 // pipeline appelant la fonction de sauvegarde de la nouvelle revision
242 // d'un article apres chaque modification de contenu
243 // http://doc.spip.org/@nouvelle_revision
244 function nouvelle_revision($x) {
245 // Stockage des versions : creer une premiere version si non-existante
246 if ($GLOBALS['flag_revisions']
247 AND $GLOBALS['meta']["articles_versions"]=='oui') {
248 include_spip('inc/revisions');
249 $x = enregistrer_nouvelle_revision($x);
250 }
251 return $x;
252 }
253
254 ?>