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

Last change on this file since 93092 was 93092, checked in by gilles.vincent@…, 6 years ago

Mise en forme plus homegene et plus lisible, pour les declarations des fonctions
Regles :

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