suivi_versions.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined("_ECRIRE_INC_VERSION")) return;
  12. include_spip('inc/revisions');
  13. include_spip('inc/diff');
  14. /**
  15. * Afficher un diff correspondant a une revision d'un objet
  16. *
  17. * @param int $id_objet
  18. * @param string $objet
  19. * @param int $id_version
  20. * @param bool $court
  21. * @return string
  22. */
  23. function revisions_diff ($id_objet,$objet, $id_version, $court=false){
  24. $textes = revision_comparee($id_objet,$objet, $id_version, 'diff');
  25. if (!is_array($textes)) return $textes;
  26. $rev = '';
  27. $nb = 0;
  28. foreach ($textes as $var => $t) {
  29. if ($n=strlen($t)) {
  30. if ($court)
  31. $nb += $n;
  32. else {
  33. $aff = propre_diff($t);
  34. if ($GLOBALS['les_notes']) {
  35. $aff .= '<p>'.$GLOBALS['les_notes'].'</p>';
  36. $GLOBALS['les_notes'] = '';
  37. }
  38. $rev .= "<blockquote>$aff</blockquote>";
  39. }
  40. }
  41. }
  42. return $court ? _T('taille_octets', array('taille' => $nb)) : $rev;
  43. }
  44. /**
  45. * Retrouver le champ d'un objet, pour une version demandee
  46. * @param string $objet
  47. * @param int $id_objet
  48. * @param int $id_version
  49. * @param string $champ
  50. * @param array $champs
  51. */
  52. function retrouver_champ_version_objet($objet,$id_objet,$id_version,$champ,&$champs){
  53. if (isset($champs[$champ]))
  54. return;
  55. // Remonter dans le temps pour trouver le champ en question
  56. // pour la version demandee
  57. $id_ref = $id_version-1;
  58. $prev = array();
  59. while (!isset($prev[$champ]) AND $id_ref>0) {
  60. $prev = recuperer_version($id_objet,$objet, $id_ref--);
  61. }
  62. if (isset($prev[$champ]))
  63. $champs[$champ] = $prev[$champ];
  64. else {
  65. // le champ n'a jamais ete versionne :
  66. // il etait initialement vide
  67. if (strncmp($champ,'jointure_',9)==0)
  68. $champs[$champ] = '';
  69. else
  70. $champs[$champ] = '';
  71. }
  72. }
  73. /**
  74. * retourne un array() des champs modifies a la version id_version
  75. * le format =
  76. * - diff => seulement les modifs (page revisions)
  77. * - apercu => idem, mais en plus tres cout s'il y en a bcp
  78. * - complet => tout, avec surlignage des modifications (page revision)
  79. *
  80. * http://code.spip.net/@revision_comparee
  81. *
  82. * @param int $id_objet
  83. * @param string $objet
  84. * @param int $id_version
  85. * @param string $format
  86. * @param null $id_diff
  87. * @return array
  88. */
  89. function revision_comparee($id_objet, $objet, $id_version, $format='diff', $id_diff=NULL) {
  90. include_spip('inc/diff');
  91. // chercher le numero de la version precedente
  92. if (!$id_diff) {
  93. $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");
  94. }
  95. if ($id_version && $id_diff) {
  96. // si l'ordre est inverse, on remet a l'endroit
  97. if ($id_diff > $id_version) {
  98. $t = $id_version;
  99. $id_version = $id_diff;
  100. $id_diff = $t;
  101. }
  102. $old = recuperer_version($id_objet,$objet, $id_diff);
  103. $new = recuperer_version($id_objet,$objet, $id_version);
  104. $textes = array();
  105. // Mode "diff": on ne s'interesse qu'aux champs presents dans $new
  106. // Mode "complet": on veut afficher tous les champs
  107. switch ($format) {
  108. case 'complet':
  109. $champs = liste_champs_versionnes(table_objet_sql($objet));
  110. break;
  111. case 'diff':
  112. case 'apercu':
  113. default:
  114. $champs = array_keys($new);
  115. break;
  116. }
  117. // memoriser les cas les plus courant
  118. $afficher_diff_champ = charger_fonction('champ','afficher_diff');
  119. $afficher_diff_jointure = charger_fonction('jointure','afficher_diff');
  120. foreach ($champs as $champ) {
  121. // Remonter dans le temps pour trouver le champ en question
  122. // pour chaque version
  123. retrouver_champ_version_objet($objet,$id_objet,$id_version,$champ,$new);
  124. retrouver_champ_version_objet($objet,$id_objet,$id_diff,$champ,$old);
  125. if (!strlen($new[$champ]) && !strlen($old[$champ])) continue;
  126. // si on n'a que le vieux, ou que le nouveau, on ne
  127. // l'affiche qu'en mode "complet"
  128. if ($format == 'complet')
  129. $textes[$champ] = strlen($new[$champ])
  130. ? $new[$champ] : $old[$champ];
  131. // si on a les deux, le diff nous interesse, plus ou moins court
  132. if (isset($new[$champ]) AND isset($old[$champ])) {
  133. if (!$afficher_diff = charger_fonction($objet."_".$champ,'afficher_diff',true)
  134. AND !$afficher_diff = charger_fonction($champ,'afficher_diff',true))
  135. $afficher_diff = (strncmp($champ,'jointure_',9)==0?$afficher_diff_jointure:$afficher_diff_champ);
  136. $textes[$champ] = $afficher_diff($champ,$old[$champ],$new[$champ],$format);
  137. }
  138. }
  139. }
  140. // que donner par defaut ? (par exemple si id_version=1)
  141. if (!$textes)
  142. $textes = recuperer_version($id_objet,$objet, $id_version);
  143. return $textes;
  144. }
  145. ?>