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

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

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

File size: 6.4 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 * Fonctions de suivi de versions
15 *
16 * @package SPIP\Revisions\Versions
17 **/
18if (!defined("_ECRIRE_INC_VERSION")) {
19        return;
20}
21
22include_spip('inc/revisions');
23include_spip('inc/diff');
24
25/**
26 * Afficher un diff correspondant à une révision d'un objet
27 *
28 * @param int $id_objet Identifiant de l'objet
29 * @param string $objet Objet
30 * @param int $id_version Identifiant de la version
31 * @param bool $court
32 *     - false : affiche le diff complet
33 *     - true  : indique juste la taille en octets des changements
34 * @return string
35 *     Texte HTML du diff.
36 */
37function revisions_diff($id_objet, $objet, $id_version, $court = false) {
38        $textes = revision_comparee($id_objet, $objet, $id_version, 'diff');
39        if (!is_array($textes)) {
40                return $textes;
41        }
42        $rev = '';
43        $nb = 0;
44        foreach ($textes as $var => $t) {
45                if ($n = strlen($t)) {
46                        if ($court) {
47                                $nb += $n;
48                        } else {
49                                $aff = propre_diff($t);
50                                if ($GLOBALS['les_notes']) {
51                                        $aff .= '<p>' . $GLOBALS['les_notes'] . '</p>';
52                                        $GLOBALS['les_notes'] = '';
53                                }
54                                $rev .= "<blockquote>$aff</blockquote>";
55                        }
56                }
57        }
58
59        return $court ? _T('taille_octets', array('taille' => $nb)) : $rev;
60}
61
62/**
63 * Retrouver le champ d'un objet, pour une version demandée
64 *
65 * Si le champ n'est pas déjà présent dans la liste des champs ($champs),
66 * on remonte les versions à partir du id_version donné, jusqu'à
67 * récupérer une version qui contient ce champ. On complète alors la liste
68 * des champs avec la version du champ trouvée.
69 *
70 * @param string $objet Objet
71 * @param int $id_objet Identifiant de l'objet
72 * @param int $id_version Identifiant de la version
73 * @param string $champ Le nom du champ à retrouver
74 * @param array $champs Liste des champs déjà connus
75 * @return void
76 */
77function retrouver_champ_version_objet($objet, $id_objet, $id_version, $champ, &$champs) {
78        if (isset($champs[$champ])) {
79                return;
80        }
81
82        // Remonter dans le temps pour trouver le champ en question
83        // pour la version demandee
84        $id_ref = $id_version-1;
85        $prev = array();
86        while (!isset($prev[$champ]) AND $id_ref > 0) {
87                $prev = recuperer_version($id_objet, $objet, $id_ref--);
88        }
89        if (isset($prev[$champ])) {
90                $champs[$champ] = $prev[$champ];
91        } else {
92                // le champ n'a jamais ete versionne :
93                // il etait initialement vide
94                $champs[$champ] = '';
95        }
96}
97
98/**
99 * Liste les champs modifiés par une version de révision donnée
100 *
101 * Pour un couple objet/id_objet et id_version donné, calcule les champs
102 * qui ont été modifiés depuis une version précédente et la version
103 * d'id_version, et les retourne.
104 *
105 * La version précédente est par défaut la version juste
106 * avant id_version, mais peut être définie via le paramètre id_diff.
107 *
108 * Le retour est plus ou moins locace en fonction du paramètre format.
109 *
110 * @param int $id_objet Identifiant de l'objet
111 * @param string $objet Objet
112 * @param int $id_version Identifiant de la version
113 * @param string $format
114 *     Type de retour
115 *     - diff => seulement les modifs (page revisions)
116 *     - apercu => idem, mais en plus tres cout s'il y en a bcp
117 *     - complet => tout, avec surlignage des modifications (page revision)
118 * @param null $id_diff
119 *     Identifiant de la version de base du diff, par défaut l'id_version
120 *     juste précédent
121 * @return array
122 *     Couples (champ => texte)
123 */
124function revision_comparee($id_objet, $objet, $id_version, $format = 'diff', $id_diff = null) {
125        include_spip('inc/diff');
126
127        // chercher le numero de la version precedente
128        if (!$id_diff) {
129                $id_diff = sql_getfetsel("id_version", "spip_versions",
130                        "id_objet=" . intval($id_objet) . " AND id_version < " . intval($id_version) . " AND objet=" . sql_quote($objet),
131                        "", "id_version DESC", "1");
132        }
133
134        if ($id_version && $id_diff) {
135
136                // si l'ordre est inverse, on remet a l'endroit
137                if ($id_diff > $id_version) {
138                        $t = $id_version;
139                        $id_version = $id_diff;
140                        $id_diff = $t;
141                }
142
143                $old = recuperer_version($id_objet, $objet, $id_diff);
144                $new = recuperer_version($id_objet, $objet, $id_version);
145
146                $textes = array();
147
148                // Mode "diff": on ne s'interesse qu'aux champs presents dans $new
149                // Mode "complet": on veut afficher tous les champs
150                switch ($format) {
151                        case 'complet':
152                                $champs = liste_champs_versionnes(table_objet_sql($objet));
153                                break;
154                        case 'diff':
155                        case 'apercu':
156                        default:
157                                $champs = array_keys($new);
158                                break;
159                }
160
161                // memoriser les cas les plus courant
162                $afficher_diff_champ = charger_fonction('champ', 'afficher_diff');
163                $afficher_diff_jointure = charger_fonction('jointure', 'afficher_diff');
164                foreach ($champs as $champ) {
165                        // Remonter dans le temps pour trouver le champ en question
166                        // pour chaque version
167                        retrouver_champ_version_objet($objet, $id_objet, $id_version, $champ, $new);
168                        retrouver_champ_version_objet($objet, $id_objet, $id_diff, $champ, $old);
169
170                        if (!strlen($new[$champ]) && !strlen($old[$champ])) {
171                                continue;
172                        }
173
174                        // si on n'a que le vieux, ou que le nouveau, on ne
175                        // l'affiche qu'en mode "complet"
176                        if ($format == 'complet') {
177                                $textes[$champ] = strlen($new[$champ])
178                                        ? $new[$champ] : $old[$champ];
179                        }
180
181                        // si on a les deux, le diff nous interesse, plus ou moins court
182                        if (isset($new[$champ]) AND isset($old[$champ])) {
183                                if (!$afficher_diff = charger_fonction($objet . "_" . $champ, 'afficher_diff', true)
184                                        AND !$afficher_diff = charger_fonction($champ, 'afficher_diff', true)
185                                ) {
186                                        $afficher_diff = (strncmp($champ, 'jointure_', 9) == 0 ? $afficher_diff_jointure : $afficher_diff_champ);
187                                }
188
189                                $textes[$champ] = $afficher_diff($champ, $old[$champ], $new[$champ], $format);
190                        }
191                }
192        }
193
194        // que donner par defaut ? (par exemple si id_version=1)
195        if (!$textes) {
196                $textes = recuperer_version($id_objet, $objet, $id_version);
197        }
198
199        return $textes;
200}
201
202?>
Note: See TracBrowser for help on using the repository browser.