示例#1
0
文件: arbo.php 项目: loorenzooo/aslfc
/**
 * Retrouver/Calculer l'ensemble des segments d'url d'un objet
 *
 * http://doc.spip.org/@declarer_url_arbo
 *
 * @param string $type
 * @param int $id_objet
 * @return string
 */
function declarer_url_arbo($type, $id_objet)
{
    static $urls = array();
    // utiliser un cache memoire pour aller plus vite
    if (!is_null($C = Cache())) {
        return $C;
    }
    // Se contenter de cette URL si elle existe ;
    // sauf si on invoque par "voir en ligne" avec droit de modifier l'url
    // l'autorisation est verifiee apres avoir calcule la nouvelle url propre
    // car si elle ne change pas, cela ne sert a rien de verifier les autorisations
    // qui requetent en base
    $modifier_url = (defined('_VAR_URLS') and _VAR_URLS);
    if (!isset($urls[$type][$id_objet]) or $modifier_url) {
        $r = renseigner_url_arbo($type, $id_objet);
        // Quand $type ne reference pas une table
        if ($r === false) {
            return false;
        }
        if (!is_null($r)) {
            $urls[$type][$id_objet] = $r;
        }
    }
    if (!isset($urls[$type][$id_objet])) {
        return "";
    }
    # objet inexistant
    $url_propre = $urls[$type][$id_objet]['url'];
    // si on a trouve l'url
    // et que le parent est bon
    // et (permanente ou pas de demande de modif)
    if (!is_null($url_propre) and $urls[$type][$id_objet]['id_parent'] == $urls[$type][$id_objet]['parent'] and ($urls[$type][$id_objet]['perma'] or !$modifier_url)) {
        return declarer_url_arbo_rec($url_propre, $type, isset($urls[$type][$id_objet]['parent']) ? $urls[$type][$id_objet]['parent'] : 0, isset($urls[$type][$id_objet]['type_parent']) ? $urls[$type][$id_objet]['type_parent'] : null);
    }
    // Si URL inconnue ou maj forcee sur une url non permanente, recreer une url
    $url = $url_propre;
    if (is_null($url_propre) or $modifier_url and !$urls[$type][$id_objet]['perma']) {
        $url = pipeline('arbo_creer_chaine_url', array('data' => $url_propre, 'objet' => array_merge($urls[$type][$id_objet], array('type' => $type, 'id_objet' => $id_objet))));
        // Eviter de tamponner les URLs a l'ancienne (cas d'un article
        // intitule "auteur2")
        include_spip('inc/urls');
        $objets = urls_liste_objets();
        if (preg_match(',^(' . $objets . ')[0-9]*$,', $url, $r) and $r[1] != $type) {
            $url = $url . _url_arbo_sep_id . $id_objet;
        }
    }
    // Pas de changement d'url ni de parent
    if ($url == $url_propre and $urls[$type][$id_objet]['id_parent'] == $urls[$type][$id_objet]['parent']) {
        return declarer_url_arbo_rec($url_propre, $type, $urls[$type][$id_objet]['parent'], $urls[$type][$id_objet]['type_parent']);
    }
    // verifier l'autorisation, maintenant qu'on est sur qu'on va agir
    if ($modifier_url) {
        include_spip('inc/autoriser');
        $modifier_url = autoriser('modifierurl', $type, $id_objet);
    }
    // Verifier si l'utilisateur veut effectivement changer l'URL
    if ($modifier_url and CONFIRMER_MODIFIER_URL and $url_propre and $url != preg_replace('/' . preg_quote(_url_propres_sep_id, '/') . '.*/', '', $url_propre)) {
        $confirmer = true;
    } else {
        $confirmer = false;
    }
    if ($confirmer and !_request('ok')) {
        die("vous changez d'url ? {$url_propre} -> {$url}");
    }
    $set = array('url' => $url, 'type' => $type, 'id_objet' => $id_objet, 'id_parent' => $urls[$type][$id_objet]['parent'], 'perma' => intval($urls[$type][$id_objet]['perma']));
    include_spip('action/editer_url');
    if (url_insert($set, $confirmer, _url_arbo_sep_id)) {
        $urls[$type][$id_objet]['url'] = $set['url'];
        $urls[$type][$id_objet]['id_parent'] = $set['id_parent'];
    } else {
        // l'insertion a echoue,
        //serveur out ? retourner au mieux
        $urls[$type][$id_objet]['url'] = $url_propre;
    }
    return declarer_url_arbo_rec($urls[$type][$id_objet]['url'], $type, $urls[$type][$id_objet]['parent'], $urls[$type][$id_objet]['type_parent']);
}
示例#2
0
文件: arbo.php 项目: rhertzog/lcs
function declarer_url_arbo($type, $id_objet) {
	static $urls=array();
	
	// Se contenter de cette URL si elle existe ;
	// sauf si on invoque par "voir en ligne" avec droit de modifier l'url

	// l'autorisation est verifiee apres avoir calcule la nouvelle url propre
	// car si elle ne change pas, cela ne sert a rien de verifier les autorisations
	// qui requetent en base
	$modifier_url = $GLOBALS['var_urls'];
	
	if (!isset($urls[$type][$id_objet]) OR $modifier_url) {
		$trouver_table = charger_fonction('trouver_table', 'base');
		$desc = $trouver_table(table_objet($type));
		$champ_titre = $desc['titre'];
		$col_id =  @$desc['key']["PRIMARY KEY"];
		//  $type doit designer une table, avec champ indiquant un titre
		if (!$col_id OR !$champ_titre) return false; 

		$table = $desc['table'];
		$id_objet = intval($id_objet);
	

		// parent
		$champ_parent = url_arbo_parent($type);
		$sel_parent = ($champ_parent)?", O.".reset($champ_parent).' as parent':'';
	
		//  Recuperer une URL propre correspondant a l'objet.
		$row = sql_fetsel("U.url, U.date, O.$champ_titre $sel_parent", "$table AS O LEFT JOIN spip_urls AS U ON (U.type='$type' AND U.id_objet=O.$col_id)", "O.$col_id=$id_objet", '', 'U.date DESC', 1);
		if ($row){
			$urls[$type][$id_objet] = $row;
			$urls[$type][$id_objet]['type_parent'] = $champ_parent?end($champ_parent):'';
		}
	}

	if (!isset($urls[$type][$id_objet])) return ""; # objet inexistant

	$url_propre = $urls[$type][$id_objet]['url'];

	if (!is_null($url_propre) AND !$modifier_url)
		return declarer_url_arbo_rec($url_propre,$type,
		  isset($urls[$type][$id_objet]['parent'])?$urls[$type][$id_objet]['parent']:null,
		  isset($urls[$type][$id_objet]['type_parent'])?$urls[$type][$id_objet]['type_parent']:null);

	// Sinon, creer une URL
	$url = pipeline('arbo_creer_chaine_url',
		array(
			'data' => $url_propre,  // le vieux url_propre
			'objet' => array_merge($urls[$type][$id_objet],
				array('type' => $type, 'id_objet' => $id_objet)
			)
		)
	);

	// Eviter de tamponner les URLs a l'ancienne (cas d'un article
	// intitule "auteur2")
	include_spip('inc/urls');
	$objets = urls_liste_objets();
	if (preg_match(',^('.$objets.')[0-9]*$,', $url, $r)
	AND $r[1] != $type)
		$url = $url._url_arbo_sep_id.$id_objet;

	// Pas de changement d'url
	if ($url == $url_propre)
		return declarer_url_arbo_rec($url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
	
	// verifier l'autorisation, maintenant qu'on est sur qu'on va agir
	if ($modifier_url) {
		include_spip('inc/autoriser');
		$modifier_url = autoriser('modifierurl', $type, $id_objet);
	}
	// Verifier si l'utilisateur veut effectivement changer l'URL
	if ($modifier_url
		AND CONFIRMER_MODIFIER_URL
		AND $url_propre
		AND $url != preg_replace('/,.*/', '', $url_propre))
		$confirmer = true;
	else
		$confirmer = false;

	if ($confirmer AND !_request('ok')) {
		die ("vous changez d'url ? $url_propre -> $url");
	}

	$set = array('url' => $url, 'type' => $type, 'id_objet' => $id_objet);
	include_spip('action/editer_url');
	if (url_insert($set,$confirmer,_url_arbo_sep_id)){
		$urls[$type][$id_objet]['url'] = $set['url'];
	}
	else {
		// l'insertion a echoue,
		//serveur out ? retourner au mieux
		$urls[$type][$id_objet]['url']=$url_propre;
	}

	return declarer_url_arbo_rec($urls[$type][$id_objet]['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
}