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