/** * Charge les données d'une révision donnée dans le formulaire d'édition d'un objet * * @param array $flux Données du pipeline * @return array $flux Données du pipeline */ function revisions_formulaire_charger($flux) { if (strncmp($flux['args']['form'], 'editer_', 7) == 0 and $id_version = _request('id_version') and $objet = substr($flux['args']['form'], 7) and $id_table_objet = id_table_objet($objet) and isset($flux['data'][$id_table_objet]) and $id = intval($flux['data'][$id_table_objet]) and !$flux['args']['je_suis_poste']) { // ajouter un message convival pour indiquer qu'on a restaure la version $flux['data']['message_ok'] = _T('revisions:icone_restaurer_version', array('version' => $id_version)); $flux['data']['message_ok'] .= "<br />" . _T('revisions:message_valider_recuperer_version'); // recuperer la version include_spip('inc/revisions'); $champs = recuperer_version($id, $objet, $id_version); foreach ($champs as $champ => $valeur) { if (!strncmp($champ, 'jointure_', 9) == 0) { if ($champ == 'id_rubrique') { $flux['data']['id_parent'] = $valeur; } else { $flux['data'][$champ] = $valeur; } } } } return $flux; }
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; }
function inc_article_select_dist($id_article, $id_rubrique=0, $lier_trad=0, $id_version=0) { global $connect_id_rubrique, $spip_lang; if (is_numeric($id_article)) { // marquer le fait que l'article est ouvert en edition par toto a telle date // une alerte sera donnee aux autres redacteurs sur exec=articles if ($GLOBALS['meta']['articles_modif'] != 'non') { include_spip('inc/drapeau_edition'); signale_edition ($id_article, $GLOBALS['visiteur_session'], 'article'); } $row = sql_fetsel("*", "spip_articles", "id_article=$id_article"); // si une ancienne revision est demandee, la charger // en lieu et place de l'actuelle ; attention les champs // qui etaient vides ne sont pas vide's. Ca permet de conserver // des complements ajoutes "orthogonalement", et ca fait un code // plus generique. if ($id_version) { include_spip('inc/revisions'); if ($textes = recuperer_version($id_article, $id_version)) { foreach ($textes as $champ => $contenu) $row[$champ] = $contenu; } } return $row; } // id_article non numerique, c'est une demande de creation. // Si c'est une demande de nouvelle traduction, init specifique if ($lier_trad){ $row = article_select_trad($lier_trad, $id_rubrique); $row['statut'] = ''; // le nouvel article n'a pas encore de statut ! } else { $row['titre'] = '';//filtrer_entites(_T('info_nouvel_article')); //$row['onfocus'] = " onfocus=\"if(!antifocus){this.value='';antifocus=true;}\""; $row['id_rubrique'] = $id_rubrique; } // appel du script a la racine, faut choisir // admin restreint ==> sa premiere rubrique // autre ==> la derniere rubrique cree if (!$row['id_rubrique']) { if ($connect_id_rubrique) $row['id_rubrique'] = $id_rubrique = $connect_id_rubrique[0]; else { $row_rub = sql_fetsel("id_rubrique", "spip_rubriques", "", "", "id_rubrique DESC", 1); $row['id_rubrique'] = $id_rubrique = $row_rub['id_rubrique']; } if (!autoriser('creerarticledans','rubrique',$row['id_rubrique'] )){ // manque de chance, la rubrique n'est pas autorisee, on cherche un des secteurs autorises $res = sql_select("id_rubrique", "spip_rubriques", "id_parent=0"); while (!autoriser('creerarticledans','rubrique',$row['id_rubrique'] ) && $row_rub = sql_fetch($res)){ $row['id_rubrique'] = $row_rub['id_rubrique']; } } } // recuperer le secteur, pour affecter les bons champs extras if (!$row['id_secteur']) { $row_rub = sql_getfetsel("id_secteur", "spip_rubriques", "id_rubrique=" . sql_quote($id_rubrique)); $row['id_secteur'] = $row_rub; } return $row; }
/** * retourne un array() des champs modifies a la version id_version * le format = * - diff => seulement les modifs (page revisions) * - apercu => idem, mais en plus tres cout s'il y en a bcp * - complet => tout, avec surlignage des modifications (page revision) * * http://code.spip.net/@revision_comparee * * @param int $id_objet * @param string $objet * @param int $id_version * @param string $format * @param null $id_diff * @return array */ function revision_comparee($id_objet, $objet, $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_objet=" . intval($id_objet) . " AND id_version < " . intval($id_version) . " AND objet=" . sql_quote($objet), "", "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_objet, $objet, $id_diff); $new = recuperer_version($id_objet, $objet, $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(table_objet_sql($objet)); break; case 'diff': case 'apercu': default: $champs = array_keys($new); break; } // memoriser les cas les plus courant $afficher_diff_champ = charger_fonction('champ', 'afficher_diff'); $afficher_diff_jointure = charger_fonction('jointure', 'afficher_diff'); foreach ($champs as $champ) { // Remonter dans le temps pour trouver le champ en question // pour chaque version retrouver_champ_version_objet($objet, $id_objet, $id_version, $champ, $new); retrouver_champ_version_objet($objet, $id_objet, $id_diff, $champ, $old); 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])) { if (!($afficher_diff = charger_fonction($objet . "_" . $champ, 'afficher_diff', true)) and !($afficher_diff = charger_fonction($champ, 'afficher_diff', true))) { $afficher_diff = strncmp($champ, 'jointure_', 9) == 0 ? $afficher_diff_jointure : $afficher_diff_champ; } $textes[$champ] = $afficher_diff($champ, $old[$champ], $new[$champ], $format); } } } // que donner par defaut ? (par exemple si id_version=1) if (!$textes) { $textes = recuperer_version($id_objet, $objet, $id_version); } return $textes; }