File "suivi_versions.php"
Full path: /home/meharicl/www/ecrire/inc/suivi_versions.php
File
size: 9.37 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) return;
include_spip('inc/revisions');
include_spip('inc/diff');
// http://doc.spip.org/@afficher_para_modifies
function afficher_para_modifies ($texte, $court = false) {
// Limiter la taille de l'affichage
if ($court) $max = 200;
else $max = 2000;
$paras = explode ("\n",$texte);
for ($i = 0; $i < count($paras) AND strlen($texte_ret) < $max; $i++) {
if (strpos($paras[$i], '"diff-')) $texte_ret .= $paras[$i]."\n\n";
# if (strlen($texte_ret) > $max) $texte_ret .= '(...)';
}
$texte = $texte_ret;
return $texte;
}
// Retourne le titre de la rubrique demandee, pour affichage de la chaine
// "deplace de XX vers YY"
// http://doc.spip.org/@titre_rubrique
function titre_rubrique($id_rubrique) {
if (!$id = intval($id_rubrique))
return _T('info_sans_titre');
return typo(sql_getfetsel('titre', 'spip_rubriques', "id_rubrique=$id"));
}
// http://doc.spip.org/@afficher_suivi_versions
function afficher_suivi_versions ($debut = 0, $id_secteur = 0, $uniq_auteur = false, $lang = "", $court = false) {
changer_typo($lang);
$lang_dir = lang_dir($lang);
$nb_aff = 10;
$champs = array('surtitre', 'titre', 'soustitre', 'descriptif', 'nom_site', 'url_site', 'chapo', 'texte', 'ps');
if ($uniq_auteur) {
$req_where = " AND articles.statut IN ('prepa','prop','publie')";
$req_where .= " AND versions.id_auteur = $uniq_auteur";
} else {
$req_where = " AND articles.statut IN ('prop','publie')";
}
if (strlen($lang) > 0)
$req_where .= " AND articles.lang=" . sql_quote($lang);
if ($id_secteur > 0)
$req_where .= " AND articles.id_secteur = ".intval($id_secteur);
$req_where = "versions.id_version > 1 $req_where";
$req_sel = "versions.id_version, versions.id_auteur, versions.date, versions.id_article, articles.statut, articles.titre";
$req_from = 'spip_versions AS versions LEFT JOIN spip_articles AS articles ON versions.id_article = articles.id_article';
$revisions = '';
$items = array();
$result = sql_select($req_sel, $req_from, $req_where, '', 'versions.date DESC', "$debut, $nb_aff");
while ($row = sql_fetch($result)) {
$id_article = $row['id_article'];
if (autoriser('voir','article',$id_article)){
$statut = $row['statut'];
$id_version = $row['id_version'];
$id_auteur = $row['id_auteur'];
$date = $row['date'];
$titre = typo(supprime_img($row['titre'],''));
// l'id_auteur peut etre un numero IP (edition anonyme)
if ($id_auteur == intval($id_auteur)
AND $row_auteur = sql_fetsel('nom,email', 'spip_auteurs', "id_auteur = ".sql_quote($id_auteur))) {
$nom = typo($row_auteur["nom"]);
$email = $row_auteur['email'];
} else {
$nom = $id_auteur;
$email = '';
}
$aff = revisions_bouton($id_article, $id_auteur, $id_version, $titre, $statut, $date, $lang_dir, $nom);
if (!$court) {
$bouton_id = "b$id_version-$id_article-$id_auteur";
$aff = bouton_block_depliable($aff,false,$bouton_id)
. debut_block_depliable(false,$bouton_id)
. safehtml(revisions_diff ($id_article, $id_version, $court))
. fin_block();
}
$revisions .= "\n<div class='tr_liste' style='padding: 5px; border-top: 1px solid #aaaaaa;'>$aff</div>";
}
}
if (!$revisions) return '';
else return
revisions_entete_boite($court, $debut, $id_secteur, $lang, $nb_aff, $req_from, $req_where, $uniq_auteur)
. $revisions
. fin_block()
. fin_cadre();
}
// http://doc.spip.org/@revisions_diff
function revisions_diff ($id_article, $id_version, $court=true)
{
$textes = revision_comparee($id_article, $id_version, 'diff');
if (!is_array($textes)) return $textes;
$rev = '';
$nb = 0;
foreach ($textes as $var => $t) {
if ($n=strlen($t)) {
if ($court)
$nb += $n;
else {
$aff = propre_diff($t);
if ($GLOBALS['les_notes']) {
$aff .= '<p>'.$GLOBALS['les_notes'].'</p>';
$GLOBALS['les_notes'] = '';
}
$rev .= "<blockquote class='serif1'>$aff</blockquote>";
}
}
}
return $court ? _T('taille_octets', array('taille' => $nb)) : $rev;
}
// http://doc.spip.org/@revisions_bouton
function revisions_bouton($id_article, $id_auteur, $id_version, $titre, $statut, $date, $lang_dir, $nom)
{
$titre_bouton = "<span class='arial2'>";
$titre_bouton .= puce_statut($statut);
$titre_bouton .= "\n <a class='$statut' style='font-weight: bold;' href='" . generer_url_ecrire("articles_versions","id_article=$id_article") . "'>$titre</a>";
$titre_bouton .= "<span class='arial1' dir='$lang_dir'>";
$titre_bouton .= "\n".date_relative($date)." "; # laisser un peu de privacy aux redacteurs
$titre_bouton .= "</span>";
if (strlen($nom)>0) $titre_bouton .= "($nom)";
$titre_bouton .= "</span>";
return $titre_bouton;
}
// http://doc.spip.org/@revisions_entete_boite
function revisions_entete_boite($court, $debut, $id_secteur, $lang, $nb_aff, $req_from, $req_where, $uniq_auteur)
{
$titre_table = '<b>' . _T('icone_suivi_revisions').aide('suivimodif') . '</b>';
if ($court)
$titre_table = afficher_plus(generer_url_ecrire("suivi_revisions"))
. $titre_table;
$total = sql_countsel($req_from, $req_where);
if ($total >= 150) $total = 149;
$id_liste = 't'.substr(md5("$req_where 149"),0,8);
$bouton = bouton_block_depliable($titre_table,true,$id_liste);
$revisions = debut_cadre('liste',"historique-24.gif",'',$bouton)
. debut_block_depliable(true,$id_liste);
if ($total > $nb_aff) {
$nb_tranches = ceil($total / $nb_aff);
$revisions .= "\n<div class='arial2' style='background-color: #dddddd; padding: 5px;'>\n";
for ($i = 0; $i < $nb_tranches; $i++) {
if ($i > 0) $revisions .= " | ";
if ($i*$nb_aff == $debut)
$revisions .= "<b>";
else {
$next = ($i * $nb_aff);
$revisions .= "<a href='".generer_url_ecrire('suivi_revisions', "debut=$next&id_secteur=$id_secteur&id_auteur=$uniq_auteur&lang_choisie=$lang")."'>";
}
$revisions .= (($i * $nb_aff) + 1);
if ($i*$nb_aff == $debut) $revisions .= "</b>";
else $revisions .= "</a>";
}
$revisions .= "</div>";
}
return $revisions;
}
// retourne un array() des champs modifies a la version id_version
// le format =
// - diff => seulement les modifs (suivi_revisions)
// - apercu => idem, mais en plus tres cout s'il y en a bcp
// - complet => tout, avec surlignage des modifications (articles_versions)
// http://doc.spip.org/@revision_comparee
function revision_comparee($id_article, $id_version, $format='diff', $id_diff=NULL) {
include_spip('inc/diff');
// chercher le numero de la version precedente
if (!$id_diff) {
$id_diff = sql_getfetsel("id_version", "spip_versions", "id_article=" . intval($id_article) . " AND id_version < " . intval($id_version), "", "id_version DESC", "1");
}
if ($id_version && $id_diff) {
// si l'ordre est inverse, on remet a l'endroit
if ($id_diff > $id_version) {
$t = $id_version;
$id_version = $id_diff;
$id_diff = $t;
}
$old = recuperer_version($id_article, $id_diff);
$new = recuperer_version($id_article, $id_version);
$textes = array();
// Mode "diff": on ne s'interesse qu'aux champs presents dans $new
// Mode "complet": on veut afficher tous les champs
switch ($format) {
case 'complet':
$champs = liste_champs_versionnes('spip_articles');
break;
case 'diff':
case 'apercu':
default:
$champs = array_keys($new);
break;
}
foreach ($champs as $champ) {
// si la version precedente est partielle,
// il faut remonter dans le temps
$id_ref = $id_diff-1;
while (!isset($old[$champ])
AND $id_ref>0) {
$prev = recuperer_version($id_article, $id_ref--);
if (isset($prev[$champ]))
$old[$champ] = $prev[$champ];
}
if (!strlen($new[$champ]) && !strlen($old[$champ])) continue;
// si on n'a que le vieux, ou que le nouveau, on ne
// l'affiche qu'en mode "complet"
if ($format == 'complet')
$textes[$champ] = strlen($new[$champ])
? $new[$champ] : $old[$champ];
// si on a les deux, le diff nous interesse, plus ou moins court
if (isset($new[$champ])
AND isset($old[$champ])) {
// cas particulier : id_rubrique
if (in_array($champ, array('id_rubrique'))) {
$textes[$champ] = _T('version_deplace_rubrique',
array('from'=> titre_rubrique($old[$champ])
,'to'=>titre_rubrique($new[$champ]))
);
}
// champs textuels
else {
$diff = new Diff(new DiffTexte);
$n = preparer_diff($new[$champ]);
$o = preparer_diff($old[$champ]);
$textes[$champ] = afficher_diff($diff->comparer($n,$o));
if ($format == 'diff' OR $format == 'apercu')
$textes[$champ] = afficher_para_modifies($textes[$champ], ($format == 'apercu'));
}
}
}
}
// que donner par defaut ? (par exemple si id_version=1)
if (!$textes)
$textes = recuperer_version($id_article, $id_version);
return $textes;
}
?>