/**
 * 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);
}
예제 #2
0
/**
 * 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;
}
예제 #3
0
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;
}
예제 #4
0
/**
 * 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;
}
예제 #6
0
파일: revisions.php 프로젝트: rhertzog/lcs
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;
}