PageRenderTime 67ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 1ms

/spip/ecrire/inc/suivi_versions.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 279 lines | 199 code | 42 blank | 38 comment | 54 complexity | 6fff1ba24578124bdef0921daf2fb7e7 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  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. // http://doc.spip.org/@afficher_para_modifies
  15. function afficher_para_modifies ($texte, $court = false) {
  16. // Limiter la taille de l'affichage
  17. if ($court) $max = 200;
  18. else $max = 2000;
  19. $paras = explode ("\n",$texte);
  20. for ($i = 0; $i < count($paras) AND strlen($texte_ret) < $max; $i++) {
  21. if (strpos($paras[$i], '"diff-')) $texte_ret .= $paras[$i]."\n\n";
  22. # if (strlen($texte_ret) > $max) $texte_ret .= '(...)';
  23. }
  24. $texte = $texte_ret;
  25. return $texte;
  26. }
  27. // Retourne le titre de la rubrique demandee, pour affichage de la chaine
  28. // "deplace de XX vers YY"
  29. // http://doc.spip.org/@titre_rubrique
  30. function titre_rubrique($id_rubrique) {
  31. if (!$id = intval($id_rubrique))
  32. return _T('info_sans_titre');
  33. return typo(sql_getfetsel('titre', 'spip_rubriques', "id_rubrique=$id"));
  34. }
  35. // http://doc.spip.org/@afficher_suivi_versions
  36. function afficher_suivi_versions ($debut = 0, $id_secteur = 0, $uniq_auteur = false, $lang = "", $court = false) {
  37. changer_typo($lang);
  38. $lang_dir = lang_dir($lang);
  39. $nb_aff = 10;
  40. $champs = array('surtitre', 'titre', 'soustitre', 'descriptif', 'nom_site', 'url_site', 'chapo', 'texte', 'ps');
  41. if ($uniq_auteur) {
  42. $req_where = " AND articles.statut IN ('prepa','prop','publie')";
  43. $req_where .= " AND versions.id_auteur = $uniq_auteur";
  44. } else {
  45. $req_where = " AND articles.statut IN ('prop','publie')";
  46. }
  47. if (strlen($lang) > 0)
  48. $req_where .= " AND articles.lang=" . sql_quote($lang);
  49. if ($id_secteur > 0)
  50. $req_where .= " AND articles.id_secteur = ".intval($id_secteur);
  51. $req_where = "versions.id_version > 1 $req_where";
  52. $req_sel = "versions.id_version, versions.id_auteur, versions.date, versions.id_article, articles.statut, articles.titre";
  53. $req_from = 'spip_versions AS versions LEFT JOIN spip_articles AS articles ON versions.id_article = articles.id_article';
  54. $revisions = '';
  55. $items = array();
  56. $result = sql_select($req_sel, $req_from, $req_where, '', 'versions.date DESC', "$debut, $nb_aff");
  57. while ($row = sql_fetch($result)) {
  58. $id_article = $row['id_article'];
  59. if (autoriser('voir','article',$id_article)){
  60. $statut = $row['statut'];
  61. $id_version = $row['id_version'];
  62. $id_auteur = $row['id_auteur'];
  63. $date = $row['date'];
  64. $titre = typo(supprime_img($row['titre'],''));
  65. // l'id_auteur peut etre un numero IP (edition anonyme)
  66. if ($id_auteur == intval($id_auteur)
  67. AND $row_auteur = sql_fetsel('nom,email', 'spip_auteurs', "id_auteur = ".sql_quote($id_auteur))) {
  68. $nom = typo($row_auteur["nom"]);
  69. $email = $row_auteur['email'];
  70. } else {
  71. $nom = $id_auteur;
  72. $email = '';
  73. }
  74. $aff = revisions_bouton($id_article, $id_auteur, $id_version, $titre, $statut, $date, $lang_dir, $nom);
  75. if (!$court) {
  76. $bouton_id = "b$id_version-$id_article-$id_auteur";
  77. $aff = bouton_block_depliable($aff,false,$bouton_id)
  78. . debut_block_depliable(false,$bouton_id)
  79. . safehtml(revisions_diff ($id_article, $id_version, $court))
  80. . fin_block();
  81. }
  82. $revisions .= "\n<div class='tr_liste' style='padding: 5px; border-top: 1px solid #aaaaaa;'>$aff</div>";
  83. }
  84. }
  85. if (!$revisions) return '';
  86. else return
  87. revisions_entete_boite($court, $debut, $id_secteur, $lang, $nb_aff, $req_from, $req_where, $uniq_auteur)
  88. . $revisions
  89. . fin_block()
  90. . fin_cadre();
  91. }
  92. // http://doc.spip.org/@revisions_diff
  93. function revisions_diff ($id_article, $id_version, $court=true)
  94. {
  95. $textes = revision_comparee($id_article, $id_version, 'diff');
  96. if (!is_array($textes)) return $textes;
  97. $rev = '';
  98. $nb = 0;
  99. foreach ($textes as $var => $t) {
  100. if ($n=strlen($t)) {
  101. if ($court)
  102. $nb += $n;
  103. else {
  104. $aff = propre_diff($t);
  105. if ($GLOBALS['les_notes']) {
  106. $aff .= '<p>'.$GLOBALS['les_notes'].'</p>';
  107. $GLOBALS['les_notes'] = '';
  108. }
  109. $rev .= "<blockquote class='serif1'>$aff</blockquote>";
  110. }
  111. }
  112. }
  113. return $court ? _T('taille_octets', array('taille' => $nb)) : $rev;
  114. }
  115. // http://doc.spip.org/@revisions_bouton
  116. function revisions_bouton($id_article, $id_auteur, $id_version, $titre, $statut, $date, $lang_dir, $nom)
  117. {
  118. $titre_bouton = "<span class='arial2'>";
  119. $titre_bouton .= puce_statut($statut);
  120. $titre_bouton .= "\n&nbsp;<a class='$statut' style='font-weight: bold;' href='" . generer_url_ecrire("articles_versions","id_article=$id_article") . "'>$titre</a>";
  121. $titre_bouton .= "<span class='arial1' dir='$lang_dir'>";
  122. $titre_bouton .= "\n".date_relative($date)." "; # laisser un peu de privacy aux redacteurs
  123. $titre_bouton .= "</span>";
  124. if (strlen($nom)>0) $titre_bouton .= "($nom)";
  125. $titre_bouton .= "</span>";
  126. return $titre_bouton;
  127. }
  128. // http://doc.spip.org/@revisions_entete_boite
  129. function revisions_entete_boite($court, $debut, $id_secteur, $lang, $nb_aff, $req_from, $req_where, $uniq_auteur)
  130. {
  131. $titre_table = '<b>' . _T('icone_suivi_revisions').aide('suivimodif') . '</b>';
  132. if ($court)
  133. $titre_table = afficher_plus(generer_url_ecrire("suivi_revisions"))
  134. . $titre_table;
  135. $total = sql_countsel($req_from, $req_where);
  136. if ($total >= 150) $total = 149;
  137. $id_liste = 't'.substr(md5("$req_where 149"),0,8);
  138. $bouton = bouton_block_depliable($titre_table,true,$id_liste);
  139. $revisions = debut_cadre('liste',"historique-24.gif",'',$bouton)
  140. . debut_block_depliable(true,$id_liste);
  141. if ($total > $nb_aff) {
  142. $nb_tranches = ceil($total / $nb_aff);
  143. $revisions .= "\n<div class='arial2' style='background-color: #dddddd; padding: 5px;'>\n";
  144. for ($i = 0; $i < $nb_tranches; $i++) {
  145. if ($i > 0) $revisions .= " | ";
  146. if ($i*$nb_aff == $debut)
  147. $revisions .= "<b>";
  148. else {
  149. $next = ($i * $nb_aff);
  150. $revisions .= "<a href='".generer_url_ecrire('suivi_revisions', "debut=$next&id_secteur=$id_secteur&id_auteur=$uniq_auteur&lang_choisie=$lang")."'>";
  151. }
  152. $revisions .= (($i * $nb_aff) + 1);
  153. if ($i*$nb_aff == $debut) $revisions .= "</b>";
  154. else $revisions .= "</a>";
  155. }
  156. $revisions .= "</div>";
  157. }
  158. return $revisions;
  159. }
  160. // retourne un array() des champs modifies a la version id_version
  161. // le format =
  162. // - diff => seulement les modifs (suivi_revisions)
  163. // - apercu => idem, mais en plus tres cout s'il y en a bcp
  164. // - complet => tout, avec surlignage des modifications (articles_versions)
  165. // http://doc.spip.org/@revision_comparee
  166. function revision_comparee($id_article, $id_version, $format='diff', $id_diff=NULL) {
  167. include_spip('inc/diff');
  168. // chercher le numero de la version precedente
  169. if (!$id_diff) {
  170. $id_diff = sql_getfetsel("id_version", "spip_versions", "id_article=" . intval($id_article) . " AND id_version < " . intval($id_version), "", "id_version DESC", "1");
  171. }
  172. if ($id_version && $id_diff) {
  173. // si l'ordre est inverse, on remet a l'endroit
  174. if ($id_diff > $id_version) {
  175. $t = $id_version;
  176. $id_version = $id_diff;
  177. $id_diff = $t;
  178. }
  179. $old = recuperer_version($id_article, $id_diff);
  180. $new = recuperer_version($id_article, $id_version);
  181. $textes = array();
  182. // Mode "diff": on ne s'interesse qu'aux champs presents dans $new
  183. // Mode "complet": on veut afficher tous les champs
  184. switch ($format) {
  185. case 'complet':
  186. $champs = liste_champs_versionnes('spip_articles');
  187. break;
  188. case 'diff':
  189. case 'apercu':
  190. default:
  191. $champs = array_keys($new);
  192. break;
  193. }
  194. foreach ($champs as $champ) {
  195. // si la version precedente est partielle,
  196. // il faut remonter dans le temps
  197. $id_ref = $id_diff-1;
  198. while (!isset($old[$champ])
  199. AND $id_ref>0) {
  200. $prev = recuperer_version($id_article, $id_ref--);
  201. if (isset($prev[$champ]))
  202. $old[$champ] = $prev[$champ];
  203. }
  204. if (!strlen($new[$champ]) && !strlen($old[$champ])) continue;
  205. // si on n'a que le vieux, ou que le nouveau, on ne
  206. // l'affiche qu'en mode "complet"
  207. if ($format == 'complet')
  208. $textes[$champ] = strlen($new[$champ])
  209. ? $new[$champ] : $old[$champ];
  210. // si on a les deux, le diff nous interesse, plus ou moins court
  211. if (isset($new[$champ])
  212. AND isset($old[$champ])) {
  213. // cas particulier : id_rubrique
  214. if (in_array($champ, array('id_rubrique'))) {
  215. $textes[$champ] = _T('version_deplace_rubrique',
  216. array('from'=> titre_rubrique($old[$champ])
  217. ,'to'=>titre_rubrique($new[$champ]))
  218. );
  219. }
  220. // champs textuels
  221. else {
  222. $diff = new Diff(new DiffTexte);
  223. $n = preparer_diff($new[$champ]);
  224. $o = preparer_diff($old[$champ]);
  225. $textes[$champ] = afficher_diff($diff->comparer($n,$o));
  226. if ($format == 'diff' OR $format == 'apercu')
  227. $textes[$champ] = afficher_para_modifies($textes[$champ], ($format == 'apercu'));
  228. }
  229. }
  230. }
  231. }
  232. // que donner par defaut ? (par exemple si id_version=1)
  233. if (!$textes)
  234. $textes = recuperer_version($id_article, $id_version);
  235. return $textes;
  236. }
  237. ?>