You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
359 lines
12 KiB
PHP
359 lines
12 KiB
PHP
<?php
|
|
|
|
/***************************************************************************\
|
|
* SPIP, Système de publication pour l'internet *
|
|
* *
|
|
* Copyright © avec tendresse depuis 2001 *
|
|
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
|
|
* *
|
|
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. *
|
|
\***************************************************************************/
|
|
|
|
/**
|
|
* Pipelines utilisés du plugin révisions
|
|
*
|
|
* @package SPIP\Revisions\Pipelines
|
|
**/
|
|
if (!defined('_ECRIRE_INC_VERSION')) {
|
|
return;
|
|
}
|
|
|
|
|
|
/**
|
|
* Ajoute dans le bloc d'info d'un objet un bouton permettant d'aller voir
|
|
* l'historique de ses révisions
|
|
*
|
|
* @param array $flux Données du pipeline
|
|
* @return array $flux Données du pipeline
|
|
*/
|
|
function revisions_boite_infos($flux) {
|
|
$type = $flux['args']['type'];
|
|
if (
|
|
$id = intval($flux['args']['id'])
|
|
and include_spip('inc/config')
|
|
and $tables = lire_config('objets_versions/', [])
|
|
and in_array(table_objet_sql($type), $tables)
|
|
and autoriser('voirrevisions', $type, $id)
|
|
// regarder le numero de revision le plus eleve, et afficher le bouton
|
|
// si c'est interessant (id_version>1)
|
|
and sql_countsel('spip_versions', 'id_objet=' . intval($id) . ' AND objet = ' . sql_quote($type)) > 1
|
|
) {
|
|
include_spip('inc/presentation');
|
|
$flux['data'] .= icone_horizontale(
|
|
_T('revisions:info_historique_lien'),
|
|
generer_url_ecrire('revision', "id_objet=$id&objet=$type"),
|
|
'revision-24.png'
|
|
);
|
|
}
|
|
|
|
return $flux;
|
|
}
|
|
|
|
/**
|
|
* Afficher les dernières révisions sur l'accueil et le suivi
|
|
*
|
|
* Liste les révisions en bas de la page d'accueil de ecrire/
|
|
* et sur la page de suivi de l'activité du site
|
|
*
|
|
* @param array $flux Données du pipeline
|
|
* @return array $flux Données du pipeline
|
|
*/
|
|
function revisions_affiche_milieu($flux) {
|
|
// la bonne page et des objets révisables cochées !
|
|
if (
|
|
in_array($flux['args']['exec'], ['accueil', 'suivi_edito'])
|
|
and include_spip('inc/config')
|
|
and lire_config('objets_versions/')
|
|
) {
|
|
$contexte = [];
|
|
if ($GLOBALS['visiteur_session']['statut'] !== '0minirezo') {
|
|
$contexte['id_auteur'] = $GLOBALS['visiteur_session']['id_auteur'];
|
|
}
|
|
$flux['data'] .= recuperer_fond('prive/objets/liste/versions', $contexte, ['ajax' => true]);
|
|
}
|
|
|
|
return $flux;
|
|
}
|
|
|
|
/**
|
|
* Définir les metas de configuration liées aux révisions
|
|
*
|
|
* Utilisé par inc/config
|
|
*
|
|
* @param array $metas Liste des métas et leurs valeurs par défaut
|
|
* @return array Liste des métas et leurs valeurs par défaut
|
|
*/
|
|
function revisions_configurer_liste_metas($metas) {
|
|
// Dorénavant dans les metas on utilisera un array serialisé de types d'objets
|
|
// qui correspondront aux objets versionnés
|
|
$metas['objets_versions'] = '';
|
|
|
|
return $metas;
|
|
}
|
|
|
|
|
|
/**
|
|
* 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', ['version' => $id_version]);
|
|
$flux['data']['message_ok'] .= '<br />' . _T('revisions:message_valider_recuperer_version');
|
|
// recuperer la version
|
|
include_spip('inc/revisions');
|
|
$champs = recuperer_version_complete($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;
|
|
}
|
|
|
|
/**
|
|
* Sur une insertion en base, lever un flag pour ne pas creer une premiere révision vide
|
|
*
|
|
* @param array $x Données du pipeline
|
|
* @return array $x Données du pipeline
|
|
*/
|
|
function revisions_pre_insertion($x) {
|
|
$table = $x['args']['table'];
|
|
include_spip('inc/revisions');
|
|
if ($champs = liste_champs_versionnes($table)) {
|
|
// on ne connait pas encore l'ID, mais on leve un flag pour ne pas creer de premiere revision pour ce type d'objet
|
|
// sur une simple jointure (auteur)
|
|
$GLOBALS['premiere_revision']["$table:0"] = true;
|
|
}
|
|
|
|
return $x;
|
|
}
|
|
|
|
|
|
/**
|
|
* Sur une insertion en base, lever un flag pour ne pas creer une premiere révision vide
|
|
* dans pre_edition mais attendre la post_edition pour cela
|
|
*
|
|
* @param array $x Données du pipeline
|
|
* @return array $x Données du pipeline
|
|
*/
|
|
function revisions_post_insertion($x) {
|
|
$table = $x['args']['table'];
|
|
include_spip('inc/revisions');
|
|
if ($champs = liste_champs_versionnes($table)) {
|
|
if (isset($GLOBALS['premiere_revision']["$table:0"])) {
|
|
unset($GLOBALS['premiere_revision']["$table:0"]);
|
|
}
|
|
$GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']] = true;
|
|
}
|
|
|
|
return $x;
|
|
}
|
|
|
|
/**
|
|
* Avant toute modification en base
|
|
* vérifier qu'une version initiale existe bien pour cet objet
|
|
* et la creer sinon avec l'etat actuel de l'objet
|
|
*
|
|
* @param array $x Données du pipeline
|
|
* @return array $x Données du pipeline
|
|
*/
|
|
function revisions_pre_edition($x) {
|
|
// ne rien faire quand on passe ici en controle md5
|
|
if (
|
|
!isset($x['args']['action'])
|
|
or $x['args']['action'] !== 'controler'
|
|
) {
|
|
$table = $x['args']['table'];
|
|
include_spip('inc/revisions');
|
|
// si flag leve passer son chemin, post_edition le fera (mais baisser le flag en le gardant en memoire tout de meme)
|
|
if (isset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']])) {
|
|
$GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']] = 0;
|
|
} // sinon creer une premiere revision qui date et dont on ne connait pas l'auteur
|
|
elseif ($versionnes = liste_champs_versionnes($table)) {
|
|
$objet = $x['args']['type'] ?? objet_type($table);
|
|
verifier_premiere_revision($table, $objet, $x['args']['id_objet'], $versionnes, -1);
|
|
}
|
|
}
|
|
|
|
return $x;
|
|
}
|
|
|
|
/**
|
|
* Avant modification en base d'un lien,
|
|
* enregistrer une première révision de l'objet si nécessaire
|
|
*
|
|
* @param array $x Données du pipeline
|
|
* @return array $x Données du pipeline
|
|
*/
|
|
function revisions_pre_edition_lien($x) {
|
|
if (
|
|
intval($x['args']['id_objet_source']) > 0
|
|
and intval($x['args']['id_objet']) > 0
|
|
) {
|
|
$table = table_objet_sql($x['args']['objet']);
|
|
$id_objet = intval($x['args']['id_objet']);
|
|
include_spip('inc/revisions');
|
|
// si c'est une creation de lien qui arrive aussitot apres l'insertion on ne cree pas de revision
|
|
if (isset($GLOBALS['premiere_revision']["$table:0"])) {
|
|
unset($GLOBALS['premiere_revision']["$table:0"]);
|
|
$GLOBALS['premiere_revision']["$table:" . $id_objet] = true;
|
|
}
|
|
if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
|
|
$GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
|
|
} // ex : si le champ jointure_mots est versionnable sur les articles
|
|
elseif (
|
|
$versionnes = liste_champs_versionnes($table)
|
|
and in_array($j = 'jointure_' . table_objet($x['args']['objet_source']), $versionnes)
|
|
) {
|
|
verifier_premiere_revision($table, $x['args']['objet'], $id_objet, $versionnes, -1);
|
|
}
|
|
|
|
$table = table_objet_sql($x['args']['objet_source']);
|
|
$id_objet = $x['args']['id_objet_source'];
|
|
// si c'est une creation de lien qui arrive aussitot apres l'insertion on ne cree pas de revision
|
|
if (isset($GLOBALS['premiere_revision']["$table:0"])) {
|
|
unset($GLOBALS['premiere_revision']["$table:0"]);
|
|
$GLOBALS['premiere_revision']["$table:" . $id_objet] = true;
|
|
}
|
|
if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
|
|
$GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
|
|
} // ex : si le champ jointure_articles est versionnable sur les mots
|
|
elseif (
|
|
$versionnes = liste_champs_versionnes($table)
|
|
and in_array($j = 'jointure_' . table_objet($x['args']['objet']), $versionnes)
|
|
) {
|
|
verifier_premiere_revision($table, $x['args']['objet_source'], $id_objet, $versionnes, -1);
|
|
}
|
|
}
|
|
|
|
return $x;
|
|
}
|
|
|
|
/**
|
|
* Après modification en base, versionner l'objet
|
|
*
|
|
* @param array $x Données du pipeline
|
|
* @return array $x Données du pipeline
|
|
*/
|
|
function revisions_post_edition($x) {
|
|
include_spip('inc/revisions');
|
|
if (isset($x['args']['table']) and $versionnes = liste_champs_versionnes($x['args']['table'])) {
|
|
// Regarder si au moins une des modifs est versionnable
|
|
$champs = [];
|
|
$table = $x['args']['table'];
|
|
$objet = $x['args']['type'] ?? objet_type($table);
|
|
include_spip('inc/session');
|
|
|
|
if (isset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']])) {
|
|
unset($GLOBALS['premiere_revision']["$table:" . $x['args']['id_objet']]);
|
|
// verifier la premiere version : sur une version initiale on attend ici pour la creer
|
|
// plutot que de creer une version vide+un diff
|
|
verifier_premiere_revision($table, $objet, $x['args']['id_objet'], $versionnes, session_get('id_auteur'));
|
|
} else {
|
|
// on versionne les differences
|
|
foreach ($versionnes as $key) {
|
|
if (isset($x['data'][$key])) {
|
|
$champs[$key] = $x['data'][$key];
|
|
}
|
|
}
|
|
|
|
if (count($champs)) {
|
|
ajouter_version($x['args']['id_objet'], $objet, $champs, '', session_get('id_auteur'));
|
|
}
|
|
}
|
|
}
|
|
|
|
return $x;
|
|
}
|
|
|
|
|
|
/**
|
|
* 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');
|
|
include_spip('inc/session');
|
|
// si c'est une creation de lien qui arrive aussitot apres l'insertion on ne cree pas de revision
|
|
// (au cas ou pre_edition_lien n'aurait pas ete appele ?)
|
|
if (isset($GLOBALS['premiere_revision']["$table:0"])) {
|
|
unset($GLOBALS['premiere_revision']["$table:0"]);
|
|
$GLOBALS['premiere_revision']["$table:" . $id_objet] = true;
|
|
}
|
|
if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
|
|
$GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
|
|
} // ex : si le champ jointure_mots est versionnable sur les articles
|
|
elseif (
|
|
$versionnes = liste_champs_versionnes($table)
|
|
and in_array($j = 'jointure_' . table_objet($x['args']['objet_source']), $versionnes)
|
|
) {
|
|
$champs = [
|
|
$j => recuperer_valeur_champ_jointure($x['args']['objet'], $id_objet, $x['args']['objet_source'])
|
|
];
|
|
ajouter_version($id_objet, $x['args']['objet'], $champs, '', session_get('id_auteur'));
|
|
}
|
|
|
|
$table = table_objet_sql($x['args']['objet_source']);
|
|
$id_objet = $x['args']['id_objet_source'];
|
|
// si c'est une creation de lien qui arrive aussitot apres l'insertion on ne cree pas de revision
|
|
// (au cas ou pre_edition_lien n'aurait pas ete appele ?)
|
|
if (isset($GLOBALS['premiere_revision']["$table:0"])) {
|
|
unset($GLOBALS['premiere_revision']["$table:0"]);
|
|
$GLOBALS['premiere_revision']["$table:" . $id_objet] = true;
|
|
}
|
|
if (isset($GLOBALS['premiere_revision']["$table:" . $id_objet])) {
|
|
$GLOBALS['premiere_revision']["$table:" . $id_objet] = 0;
|
|
} // ex : si le champ jointure_articles est versionnable sur les mots
|
|
elseif (
|
|
$versionnes = liste_champs_versionnes($table)
|
|
and in_array($j = 'jointure_' . table_objet($x['args']['objet']), $versionnes)
|
|
) {
|
|
$champs = [
|
|
$j => recuperer_valeur_champ_jointure($x['args']['objet_source'], $id_objet, $x['args']['objet'])
|
|
];
|
|
ajouter_version($id_objet, $x['args']['objet_source'], $champs, '', session_get('id_auteur'));
|
|
}
|
|
}
|
|
|
|
return $x;
|
|
}
|