source: spip-zone/_core_/plugins/revisions/inc/revisions_pipeline.php @ 93622

Last change on this file since 93622 was 93622, checked in by cedric@…, 4 years ago

Indentation et regles de codage selon http://www.spip.net/fr_article3497.html#regles_codage

File size: 10.8 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2015                                                *
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 **/
18if (!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 */
30function 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 */
57function 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 */
80function 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 */
95function 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($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/**
126 * Sur une insertion en base, lever un flag pour ne pas creer une premiere révision vide
127 * dans pre_edition mais attendre la post_edition pour cela
128 *
129 * @param array $x Données du pipeline
130 * @return array $x  Données du pipeline
131 */
132function revisions_post_insertion($x) {
133        $table = $x['args']['table'];
134        include_spip('inc/revisions');
135        if ($champs = liste_champs_versionnes($table)) {
136                $GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']] = true;
137        }
138
139        return $x;
140}
141
142/**
143 * Avant toute modification en base
144 * vérifier qu'une version initiale existe bien pour cet objet
145 * et la creer sinon avec l'etat actuel de l'objet
146 *
147 * @param array $x Données du pipeline
148 * @return array $x  Données du pipeline
149 */
150function revisions_pre_edition($x) {
151        // ne rien faire quand on passe ici en controle md5
152        if (!isset($x['args']['action'])
153                OR $x['args']['action'] !== 'controler'
154        ) {
155                $table = $x['args']['table'];
156                include_spip('inc/revisions');
157                // si flag leve passer son chemin, post_edition le fera (mais baisser le flag en le gardant en memoire tout de meme)
158                if (isset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']])) {
159                        $GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']] = 0;
160                } // sinon creer une premiere revision qui date et dont on ne connait pas l'auteur
161                elseif ($versionnes = liste_champs_versionnes($table)) {
162                        $objet = isset($x['args']['type']) ? $x['args']['type'] : objet_type($table);
163                        verifier_premiere_revision($table, $objet, $x['args']['id_objet'], $versionnes, -1);
164                }
165        }
166
167        return $x;
168}
169
170/**
171 * Avant modification en base d'un lien,
172 * enregistrer une première révision de l'objet si nécessaire
173 *
174 * @param array $x Données du pipeline
175 * @return array $x  Données du pipeline
176 */
177function revisions_pre_edition_lien($x) {
178        if (intval($x['args']['id_objet_source']) > 0
179                AND intval($x['args']['id_objet']) > 0
180        ) {
181                $table = table_objet_sql($x['args']['objet']);
182                $id_objet = intval($x['args']['id_objet']);
183                include_spip('inc/revisions');
184                if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
185                        $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
186                } // ex : si le champ jointure_mots est versionnable sur les articles
187                elseif ($versionnes = liste_champs_versionnes($table)
188                        AND in_array($j = 'jointure_' . table_objet($x['args']['objet_source']), $versionnes)
189                ) {
190                        verifier_premiere_revision($table, $x['args']['objet'], $id_objet, $versionnes, -1);
191                }
192
193                $table = table_objet_sql($x['args']['objet_source']);
194                $id_objet = $x['args']['id_objet_source'];
195                if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
196                        $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
197                } // ex : si le champ jointure_articles est versionnable sur les mots
198                elseif ($versionnes = liste_champs_versionnes($table)
199                        AND in_array($j = 'jointure_' . table_objet($x['args']['objet']), $versionnes)
200                ) {
201                        verifier_premiere_revision($table, $x['args']['objet_source'], $id_objet, $versionnes, -1);
202                }
203        }
204
205        return $x;
206}
207
208/**
209 * Après modification en base, versionner l'objet
210 *
211 * @param array $x Données du pipeline
212 * @return array $x  Données du pipeline
213 */
214function revisions_post_edition($x) {
215        include_spip('inc/revisions');
216        if (isset($x['args']['table']) and $versionnes = liste_champs_versionnes($x['args']['table'])) {
217                // Regarder si au moins une des modifs est versionnable
218                $champs = array();
219                $table = $x['args']['table'];
220                $objet = isset($x['args']['type']) ? $x['args']['type'] : objet_type($table);
221                include_spip('inc/session');
222
223                if (isset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']])) {
224                        unset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']]);
225                        // verifier la premiere version : sur une version initiale on attend ici pour la creer
226                        // plutot que de creer une version vide+un diff
227                        verifier_premiere_revision($table, $objet, $x['args']['id_objet'], $versionnes, session_get('id_auteur'));
228                } else {
229                        // on versionne les differences
230                        foreach ($versionnes as $key) {
231                                if (isset($x['data'][$key])) {
232                                        $champs[$key] = $x['data'][$key];
233                                }
234                        }
235
236                        if (count($champs)) {
237                                ajouter_version($x['args']['id_objet'], $objet, $champs, '', session_get('id_auteur'));
238                        }
239                }
240        }
241
242        return $x;
243}
244
245
246/**
247 * Après modification en base d'un lien, versionner l'objet si nécessaire
248 *
249 * @param array $x Données du pipeline
250 * @return array $x  Données du pipeline
251 */
252function revisions_post_edition_lien($x) {
253        /*pipeline('post_edition_lien',
254                array(
255                        'args' => array(
256                                'table_lien' => $table_lien,
257                                'objet_source' => $objet_source,
258                                'id_objet_source' => $l[$primary],
259                                'objet' => $l['objet'],
260                                'id_objet' => $id_o,
261                                'action'=>'delete',
262                        ),
263                        'data' => $couples
264                )
265        */
266        if (intval($x['args']['id_objet_source']) > 0
267                AND intval($x['args']['id_objet']) > 0
268        ) {
269
270                $table = table_objet_sql($x['args']['objet']);
271                $id_objet = $x['args']['id_objet'];
272                include_spip('inc/revisions');
273                if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
274                        $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
275                } // ex : si le champ jointure_mots est versionnable sur les articles
276                elseif ($versionnes = liste_champs_versionnes($table)
277                        AND in_array($j = 'jointure_' . table_objet($x['args']['objet_source']), $versionnes)
278                ) {
279                        $champs = array(
280                                $j => recuperer_valeur_champ_jointure($x['args']['objet'], $id_objet, $x['args']['objet_source'])
281                        );
282                        ajouter_version($id_objet, $x['args']['objet'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']);
283                }
284
285                $table = table_objet_sql($x['args']['objet_source']);
286                $id_objet = $x['args']['id_objet_source'];
287                if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
288                        $GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
289                } // ex : si le champ jointure_articles est versionnable sur les mots
290                elseif ($versionnes = liste_champs_versionnes($table)
291                        AND in_array($j = 'jointure_' . table_objet($x['args']['objet']), $versionnes)
292                ) {
293                        $champs = array(
294                                $j => recuperer_valeur_champ_jointure($x['args']['objet_source'], $id_objet, $x['args']['objet'])
295                        );
296                        ajouter_version($id_objet, $x['args']['objet_source'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']);
297                }
298        }
299
300        return $x;
301}
302
303/**
304 * Ajoute la tâche d'optimisation des tables dans la liste des tâches périodiques
305 *
306 * @pipeline taches_generales_cron
307 *
308 * @param array $taches_generales
309 *     Tableau des tâches et leur périodicité en seconde
310 * @return array
311 *     Tableau des tâches et leur périodicité en seconde
312 */
313function revisions_taches_generales_cron($taches_generales) {
314        $taches_generales['optimiser_revisions'] = 86400;
315
316        return $taches_generales;
317}
318
319?>
Note: See TracBrowser for help on using the repository browser.