3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return;
15 include_spip('inc/revisions');
16 include_spip('inc/diff');
19 * Afficher un diff correspondant a une revision d'un objet
21 * @param int $id_objet
22 * @param string $objet
23 * @param int $id_version
27 function revisions_diff ($id_objet,$objet, $id_version, $court=false){
28 $textes = revision_comparee($id_objet,$objet, $id_version, 'diff');
29 if (!is_array($textes)) return $textes;
32 foreach ($textes as $var => $t) {
37 $aff = propre_diff($t);
38 if ($GLOBALS['les_notes']) {
39 $aff .= '<p>'.$GLOBALS['les_notes'].'</p>';
40 $GLOBALS['les_notes'] = '';
42 $rev .= "<blockquote>$aff</blockquote>";
46 return $court ?
_T('taille_octets', array('taille' => $nb)) : $rev;
50 * Retrouver le champ d'un objet, pour une version demandee
51 * @param string $objet
52 * @param int $id_objet
53 * @param int $id_version
54 * @param string $champ
55 * @param array $champs
57 function retrouver_champ_version_objet($objet,$id_objet,$id_version,$champ,&$champs){
58 if (isset($champs[$champ]))
61 // Remonter dans le temps pour trouver le champ en question
62 // pour la version demandee
63 $id_ref = $id_version-1;
65 while (!isset($prev[$champ]) AND $id_ref>0) {
66 $prev = recuperer_version($id_objet,$objet, $id_ref--);
68 if (isset($prev[$champ]))
69 $champs[$champ] = $prev[$champ];
71 // le champ n'a jamais ete versionne :
72 // il etait initialement vide
73 if (strncmp($champ,'jointure_',9)==0)
81 * retourne un array() des champs modifies a la version id_version
83 * - diff => seulement les modifs (page revisions)
84 * - apercu => idem, mais en plus tres cout s'il y en a bcp
85 * - complet => tout, avec surlignage des modifications (page revision)
87 * http://code.spip.net/@revision_comparee
89 * @param int $id_objet
90 * @param string $objet
91 * @param int $id_version
92 * @param string $format
93 * @param null $id_diff
96 function revision_comparee($id_objet, $objet, $id_version, $format='diff', $id_diff=NULL) {
97 include_spip('inc/diff');
99 // chercher le numero de la version precedente
101 $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");
104 if ($id_version && $id_diff) {
106 // si l'ordre est inverse, on remet a l'endroit
107 if ($id_diff > $id_version) {
109 $id_version = $id_diff;
113 $old = recuperer_version($id_objet,$objet, $id_diff);
114 $new = recuperer_version($id_objet,$objet, $id_version);
118 // Mode "diff": on ne s'interesse qu'aux champs presents dans $new
119 // Mode "complet": on veut afficher tous les champs
122 $champs = liste_champs_versionnes(table_objet_sql($objet));
127 $champs = array_keys($new);
131 // memoriser les cas les plus courant
132 $afficher_diff_champ = charger_fonction('champ','afficher_diff');
133 $afficher_diff_jointure = charger_fonction('jointure','afficher_diff');
134 foreach ($champs as $champ) {
135 // Remonter dans le temps pour trouver le champ en question
136 // pour chaque version
137 retrouver_champ_version_objet($objet,$id_objet,$id_version,$champ,$new);
138 retrouver_champ_version_objet($objet,$id_objet,$id_diff,$champ,$old);
140 if (!strlen($new[$champ]) && !strlen($old[$champ])) continue;
142 // si on n'a que le vieux, ou que le nouveau, on ne
143 // l'affiche qu'en mode "complet"
144 if ($format == 'complet')
145 $textes[$champ] = strlen($new[$champ])
146 ?
$new[$champ] : $old[$champ];
148 // si on a les deux, le diff nous interesse, plus ou moins court
149 if (isset($new[$champ]) AND isset($old[$champ])) {
150 if (!$afficher_diff = charger_fonction($objet."_".$champ,'afficher_diff',true)
151 AND !$afficher_diff = charger_fonction($champ,'afficher_diff',true))
152 $afficher_diff = (strncmp($champ,'jointure_',9)==0?
$afficher_diff_jointure:$afficher_diff_champ);
154 $textes[$champ] = $afficher_diff($champ,$old[$champ],$new[$champ],$format);
159 // que donner par defaut ? (par exemple si id_version=1)
161 $textes = recuperer_version($id_objet,$objet, $id_version);