/** * Autorisation de voir les revisions ? * * Il faut : * - des revisions définies pour cet objet * - que l'objet existe * - que l'on soit autorisé à voir l'objet * * @param string $faire Action demandée * @param string $type Type d'objet sur lequel appliquer l'action * @param int $id Identifiant de l'objet * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon */ function autoriser_voirrevisions_dist($faire, $type, $id, $qui, $opt) { $table = table_objet_sql($type); $id_table_objet = id_table_objet($type); include_spip('inc/revisions'); if (!liste_champs_versionnes($table)) { return false; } if (!($row = sql_fetsel("*", $table, "{$id_table_objet}=" . intval($id)))) { return false; } return autoriser('voir', $type, $id, $qui, $opt); }
/** * Créer la première révision d'un objet si nécessaire * * À faire notamment si on vient d'activer l'extension et qu'on fait une modif * sur un objet qui était déjà en base, mais non versionné * * La fonction renvoie le numéro de la dernière version de l'objet, * et 0 si pas de version pour cet objet * * @param string $table * @param string $objet * @param int $id_objet * @param array $champs * @param int $id_auteur * @return int */ function verifier_premiere_revision($table, $objet, $id_objet, $champs = null, $id_auteur = 0) { $id_table_objet = id_table_objet($objet); if (!$champs) { $champs = liste_champs_versionnes($table); } if (!$champs) { return false; } if (!($id_version = sql_getfetsel('id_version', 'spip_versions', "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet), '', 'id_version DESC', '0,1'))) { // recuperer toutes les valeurs actuelles des champs // pour l'objet $originaux = sql_fetsel("*", $table, "{$id_table_objet}=" . intval($id_objet)); $premiere = false; foreach ($champs as $v) { if (isset($originaux[$v])) { $champs_originaux[$v] = $originaux[$v]; } else { if (strncmp($v, 'jointure_', 9) == 0) { $champs_originaux[$v] = recuperer_valeur_champ_jointure($objet, $id_objet, substr($v, 9)); } } if (isset($champs_originaux[$v]) and strlen($originaux[$v])) { $premiere = true; } } // Si un champ est non vide, // il faut creer une premiere revision if ($premiere) { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table); // "trouver" une date raisonnable pour la version initiale $date_modif = ""; foreach (array('date_modif', 'maj') as $d) { if (!$date_modif and isset($originaux[$d]) and $t = strtotime($d)) { $date_modif = date("Y-m-d H:i:s", $t); } } if (!$date_modif and isset($desc['date']) and isset($originaux[$desc['date']])) { $date_modif = $originaux[$desc['date']]; } elseif (!$date_modif) { $date_modif = date("Y-m-d H:i:s", time() - 7200); } if ($id_version = ajouter_version($id_objet, $objet, $champs_originaux, _T('revisions:version_initiale'), $id_auteur)) { sql_updateq('spip_versions', array('date' => $date_modif), "id_objet=" . intval($id_objet) . " AND objet=" . sql_quote($objet) . " AND id_version={$id_version}"); } } } return $id_version; }
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; }
/** * 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; }
/** * Après modification en base d'un lien, versionner l'objet si nécessaire * * @param array $x Données du pipeline * @return array $x Données du pipeline */ function revisions_post_edition_lien($x) { /*pipeline('post_edition_lien', array( 'args' => array( 'table_lien' => $table_lien, 'objet_source' => $objet_source, 'id_objet_source' => $l[$primary], 'objet' => $l['objet'], 'id_objet' => $id_o, 'action'=>'delete', ), 'data' => $couples ) */ if (intval($x['args']['id_objet_source']) > 0 and intval($x['args']['id_objet']) > 0) { $table = table_objet_sql($x['args']['objet']); $id_objet = $x['args']['id_objet']; include_spip('inc/revisions'); if (isset($GLOBALS['premiere_revision']["{$table}:" . $id_objet])) { $GLOBALS['premiere_revision']["{$table}:" . $id_objet] = 0; } elseif ($versionnes = liste_champs_versionnes($table) and in_array($j = 'jointure_' . table_objet($x['args']['objet_source']), $versionnes)) { $champs = array($j => recuperer_valeur_champ_jointure($x['args']['objet'], $id_objet, $x['args']['objet_source'])); ajouter_version($id_objet, $x['args']['objet'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']); } $table = table_objet_sql($x['args']['objet_source']); $id_objet = $x['args']['id_objet_source']; if (isset($GLOBALS['premiere_revision']["{$table}:" . $id_objet])) { $GLOBALS['premiere_revision']["{$table}:" . $id_objet] = 0; } elseif ($versionnes = liste_champs_versionnes($table) and in_array($j = 'jointure_' . table_objet($x['args']['objet']), $versionnes)) { $champs = array($j => recuperer_valeur_champ_jointure($x['args']['objet_source'], $id_objet, $x['args']['objet'])); ajouter_version($id_objet, $x['args']['objet_source'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']); } } return $x; }
function enregistrer_nouvelle_revision($x) { if ($GLOBALS['meta']["articles_versions"] != 'oui') return $x; // Regarder si au moins une des modifs est versionnable $champs = array(); foreach (liste_champs_versionnes($x['args']['table']) as $key) if (isset($x['data'][$key])) $champs[$key] = $x['data'][$key]; // A moins qu'il ne s'agisse d'operation (ajout/suppr) sur les mots-cles? if ($x['args']['operation'] == 'editer_mots' AND $x['args']['table'] == 'spip_articles') { include_spip('inc/texte'); $mots = array(); foreach( sql_allfetsel('id_mot', 'spip_mots_articles', 'id_article='.sql_quote($x['args']['id_objet'])) as $mot) $mots[] = "[->mot".$mot['id_mot']."]"; $champs['j_mots'] = join(' ', $mots); } if (count($champs)) ajouter_version($x['args']['id_objet'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']); return $x; }