[SPIP] v3.2.1-->v3.2.3
[lhc/web/www.git] / www / plugins-dist / revisions / inc / revisions_pipeline.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
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 * Pipelines utilisés du plugin révisions
15 *
16 * @package SPIP\Revisions\Pipelines
17 **/
18 if (!defined('_ECRIRE_INC_VERSION')) {
19 return;
20 }
21
22
23 /**
24 * Ajoute dans le bloc d'info d'un objet un bouton permettant d'aller voir
25 * l'historique de ses révisions
26 *
27 * @param array $flux Données du pipeline
28 * @return array $flux Données du pipeline
29 */
30 function revisions_boite_infos($flux) {
31 $type = $flux['args']['type'];
32 if ($id = intval($flux['args']['id'])
33 and $tables = unserialize($GLOBALS['meta']['objets_versions'])
34 and in_array(table_objet_sql($type), $tables)
35 and autoriser('voirrevisions', $type, $id)
36 // regarder le numero de revision le plus eleve, et afficher le bouton
37 // si c'est interessant (id_version>1)
38 and sql_countsel('spip_versions', 'id_objet=' . intval($id) . ' AND objet = ' . sql_quote($type)) > 1
39 ) {
40 include_spip('inc/presentation');
41 $flux['data'] .= icone_horizontale(_T('revisions:info_historique_lien'),
42 generer_url_ecrire('revision', "id_objet=$id&objet=$type"), "revision-24.png");
43 }
44
45 return $flux;
46 }
47
48 /**
49 * Afficher les dernières révisions sur l'accueil et le suivi
50 *
51 * Liste les révisions en bas de la page d'accueil de ecrire/
52 * et sur la page de suivi de l'activité du site
53 *
54 * @param array $flux Données du pipeline
55 * @return array $flux Données du pipeline
56 */
57 function revisions_affiche_milieu($flux) {
58 // la bonne page et des objets révisables cochées !
59 if (in_array($flux['args']['exec'], array('accueil', 'suivi_edito'))
60 and unserialize($GLOBALS['meta']['objets_versions'])
61 ) {
62 $contexte = array();
63 if ($GLOBALS['visiteur_session']['statut'] !== '0minirezo') {
64 $contexte['id_auteur'] = $GLOBALS['visiteur_session']['id_auteur'];
65 }
66 $flux['data'] .= recuperer_fond('prive/objets/liste/versions', $contexte, array('ajax' => true));
67 }
68
69 return $flux;
70 }
71
72 /**
73 * Définir les metas de configuration liées aux révisions
74 *
75 * Utilisé par inc/config
76 *
77 * @param array $metas Liste des métas et leurs valeurs par défaut
78 * @return array Liste des métas et leurs valeurs par défaut
79 */
80 function revisions_configurer_liste_metas($metas) {
81 // Dorénavant dans les metas on utilisera un array serialisé de types d'objets
82 // qui correspondront aux objets versionnés
83 $metas['objets_versions'] = '';
84
85 return $metas;
86 }
87
88
89 /**
90 * Charge les données d'une révision donnée dans le formulaire d'édition d'un objet
91 *
92 * @param array $flux Données du pipeline
93 * @return array $flux Données du pipeline
94 */
95 function revisions_formulaire_charger($flux) {
96 if (strncmp($flux['args']['form'], 'editer_', 7) == 0
97 and $id_version = _request('id_version')
98 and $objet = substr($flux['args']['form'], 7)
99 and $id_table_objet = id_table_objet($objet)
100 and isset($flux['data'][$id_table_objet])
101 and $id = intval($flux['data'][$id_table_objet])
102 and !$flux['args']['je_suis_poste']
103 ) {
104 // ajouter un message convival pour indiquer qu'on a restaure la version
105 $flux['data']['message_ok'] = _T('revisions:icone_restaurer_version', array('version' => $id_version));
106 $flux['data']['message_ok'] .= "<br />" . _T('revisions:message_valider_recuperer_version');
107 // recuperer la version
108 include_spip('inc/revisions');
109 $champs = recuperer_version_complete($id, $objet, $id_version);
110 foreach ($champs as $champ => $valeur) {
111 if (!strncmp($champ, 'jointure_', 9) == 0) {
112 if ($champ == 'id_rubrique') {
113 $flux['data']['id_parent'] = $valeur;
114 } else {
115 $flux['data'][$champ] = $valeur;
116 }
117 }
118 }
119 }
120
121 return $flux;
122 }
123
124 /**
125 * Sur une insertion en base, lever un flag pour ne pas creer une premiere révision vide
126 *
127 * @param array $x Données du pipeline
128 * @return array $x Données du pipeline
129 */
130 function revisions_pre_insertion($x) {
131 $table = $x['args']['table'];
132 include_spip('inc/revisions');
133 if ($champs = liste_champs_versionnes($table)) {
134 // on ne connait pas encore l'ID, mais on leve un flag pour ne pas creer de premiere revision pour ce type d'objet
135 // sur une simple jointure (auteur)
136 $GLOBALS['premiere_revision']["$table:0"] = true;
137 }
138
139 return $x;
140 }
141
142
143 /**
144 * Sur une insertion en base, lever un flag pour ne pas creer une premiere révision vide
145 * dans pre_edition mais attendre la post_edition pour cela
146 *
147 * @param array $x Données du pipeline
148 * @return array $x Données du pipeline
149 */
150 function revisions_post_insertion($x) {
151 $table = $x['args']['table'];
152 include_spip('inc/revisions');
153 if ($champs = liste_champs_versionnes($table)) {
154 if (isset($GLOBALS['premiere_revision']["$table:0"])) {
155 unset($GLOBALS['premiere_revision']["$table:0"]);
156 }
157 $GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']] = true;
158 }
159
160 return $x;
161 }
162
163 /**
164 * Avant toute modification en base
165 * vérifier qu'une version initiale existe bien pour cet objet
166 * et la creer sinon avec l'etat actuel de l'objet
167 *
168 * @param array $x Données du pipeline
169 * @return array $x Données du pipeline
170 */
171 function revisions_pre_edition($x) {
172 // ne rien faire quand on passe ici en controle md5
173 if (!isset($x['args']['action'])
174 or $x['args']['action'] !== 'controler'
175 ) {
176 $table = $x['args']['table'];
177 include_spip('inc/revisions');
178 // si flag leve passer son chemin, post_edition le fera (mais baisser le flag en le gardant en memoire tout de meme)
179 if (isset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']])) {
180 $GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']] = 0;
181 } // sinon creer une premiere revision qui date et dont on ne connait pas l'auteur
182 elseif ($versionnes = liste_champs_versionnes($table)) {
183 $objet = isset($x['args']['type']) ? $x['args']['type'] : objet_type($table);
184 verifier_premiere_revision($table, $objet, $x['args']['id_objet'], $versionnes, -1);
185 }
186 }
187
188 return $x;
189 }
190
191 /**
192 * Avant modification en base d'un lien,
193 * enregistrer une première révision de l'objet si nécessaire
194 *
195 * @param array $x Données du pipeline
196 * @return array $x Données du pipeline
197 */
198 function revisions_pre_edition_lien($x) {
199 if (intval($x['args']['id_objet_source']) > 0
200 and intval($x['args']['id_objet']) > 0
201 ) {
202 $table = table_objet_sql($x['args']['objet']);
203 $id_objet = intval($x['args']['id_objet']);
204 include_spip('inc/revisions');
205 // si c'est une creation de lien qui arrive aussitot apres l'insertion on ne cree pas de revision
206 if (isset($GLOBALS['premiere_revision']["$table:0"])) {
207 unset($GLOBALS['premiere_revision']["$table:0"]);
208 $GLOBALS['premiere_revision']["$table:" . $id_objet] = true;
209 }
210 if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
211 $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
212 } // ex : si le champ jointure_mots est versionnable sur les articles
213 elseif ($versionnes = liste_champs_versionnes($table)
214 and in_array($j = 'jointure_' . table_objet($x['args']['objet_source']), $versionnes)
215 ) {
216 verifier_premiere_revision($table, $x['args']['objet'], $id_objet, $versionnes, -1);
217 }
218
219 $table = table_objet_sql($x['args']['objet_source']);
220 $id_objet = $x['args']['id_objet_source'];
221 // si c'est une creation de lien qui arrive aussitot apres l'insertion on ne cree pas de revision
222 if (isset($GLOBALS['premiere_revision']["$table:0"])) {
223 unset($GLOBALS['premiere_revision']["$table:0"]);
224 $GLOBALS['premiere_revision']["$table:" . $id_objet] = true;
225 }
226 if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
227 $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
228 } // ex : si le champ jointure_articles est versionnable sur les mots
229 elseif ($versionnes = liste_champs_versionnes($table)
230 and in_array($j = 'jointure_' . table_objet($x['args']['objet']), $versionnes)
231 ) {
232 verifier_premiere_revision($table, $x['args']['objet_source'], $id_objet, $versionnes, -1);
233 }
234 }
235
236 return $x;
237 }
238
239 /**
240 * Après modification en base, versionner l'objet
241 *
242 * @param array $x Données du pipeline
243 * @return array $x Données du pipeline
244 */
245 function revisions_post_edition($x) {
246 include_spip('inc/revisions');
247 if (isset($x['args']['table']) and $versionnes = liste_champs_versionnes($x['args']['table'])) {
248 // Regarder si au moins une des modifs est versionnable
249 $champs = array();
250 $table = $x['args']['table'];
251 $objet = isset($x['args']['type']) ? $x['args']['type'] : objet_type($table);
252 include_spip('inc/session');
253
254 if (isset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']])) {
255 unset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']]);
256 // verifier la premiere version : sur une version initiale on attend ici pour la creer
257 // plutot que de creer une version vide+un diff
258 verifier_premiere_revision($table, $objet, $x['args']['id_objet'], $versionnes, session_get('id_auteur'));
259 } else {
260 // on versionne les differences
261 foreach ($versionnes as $key) {
262 if (isset($x['data'][$key])) {
263 $champs[$key] = $x['data'][$key];
264 }
265 }
266
267 if (count($champs)) {
268 ajouter_version($x['args']['id_objet'], $objet, $champs, '', session_get('id_auteur'));
269 }
270 }
271 }
272
273 return $x;
274 }
275
276
277 /**
278 * Après modification en base d'un lien, versionner l'objet si nécessaire
279 *
280 * @param array $x Données du pipeline
281 * @return array $x Données du pipeline
282 */
283 function revisions_post_edition_lien($x) {
284 /*pipeline('post_edition_lien',
285 array(
286 'args' => array(
287 'table_lien' => $table_lien,
288 'objet_source' => $objet_source,
289 'id_objet_source' => $l[$primary],
290 'objet' => $l['objet'],
291 'id_objet' => $id_o,
292 'action'=>'delete',
293 ),
294 'data' => $couples
295 )
296 */
297 if (intval($x['args']['id_objet_source']) > 0
298 and intval($x['args']['id_objet']) > 0
299 ) {
300
301 $table = table_objet_sql($x['args']['objet']);
302 $id_objet = $x['args']['id_objet'];
303 include_spip('inc/revisions');
304 // si c'est une creation de lien qui arrive aussitot apres l'insertion on ne cree pas de revision
305 // (au cas ou pre_edition_lien n'aurait pas ete appele ?)
306 if (isset($GLOBALS['premiere_revision']["$table:0"])) {
307 unset($GLOBALS['premiere_revision']["$table:0"]);
308 $GLOBALS['premiere_revision']["$table:" . $id_objet] = true;
309 }
310 if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
311 $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
312 } // ex : si le champ jointure_mots est versionnable sur les articles
313 elseif ($versionnes = liste_champs_versionnes($table)
314 and in_array($j = 'jointure_' . table_objet($x['args']['objet_source']), $versionnes)
315 ) {
316 $champs = array(
317 $j => recuperer_valeur_champ_jointure($x['args']['objet'], $id_objet, $x['args']['objet_source'])
318 );
319 ajouter_version($id_objet, $x['args']['objet'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']);
320 }
321
322 $table = table_objet_sql($x['args']['objet_source']);
323 $id_objet = $x['args']['id_objet_source'];
324 // si c'est une creation de lien qui arrive aussitot apres l'insertion on ne cree pas de revision
325 // (au cas ou pre_edition_lien n'aurait pas ete appele ?)
326 if (isset($GLOBALS['premiere_revision']["$table:0"])) {
327 unset($GLOBALS['premiere_revision']["$table:0"]);
328 $GLOBALS['premiere_revision']["$table:" . $id_objet] = true;
329 }
330 if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
331 $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
332 } // ex : si le champ jointure_articles est versionnable sur les mots
333 elseif ($versionnes = liste_champs_versionnes($table)
334 and in_array($j = 'jointure_' . table_objet($x['args']['objet']), $versionnes)
335 ) {
336 $champs = array(
337 $j => recuperer_valeur_champ_jointure($x['args']['objet_source'], $id_objet, $x['args']['objet'])
338 );
339 ajouter_version($id_objet, $x['args']['objet_source'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']);
340 }
341 }
342
343 return $x;
344 }
345
346 /**
347 * Ajoute la tâche d'optimisation des tables dans la liste des tâches périodiques
348 *
349 * @pipeline taches_generales_cron
350 *
351 * @param array $taches_generales
352 * Tableau des tâches et leur périodicité en seconde
353 * @return array
354 * Tableau des tâches et leur périodicité en seconde
355 */
356 function revisions_taches_generales_cron($taches_generales) {
357 $taches_generales['optimiser_revisions'] = 86400;
358
359 return $taches_generales;
360 }