/**
 * 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;
}
示例#2
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;
}
示例#3
0
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;
}
示例#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;
}