Valider 4f107d91 rédigé par Fil's avatar Fil
Parcourir les fichiers

amelioration de l'API d'URLs (tout en conservant la compat ascendante), de...

amelioration de l'API d'URLs (tout en conservant la compat ascendante), de facon a pouvoir dire que telle URL correspond a tel objet sans necessairement etre sur cette URL, ni se voir rediriger lorsqu'il s'agit d'une vieille URL. Pratique pour analyser des lots d'URLs pointant vers soi (ex: plugin Yagloo, analyse des liens entrants, trackbacks)
Desormais pour etre moderne une fonction urls_xxxx() retourne un array(contexte, fond, redirect)
parent 6f6e1047
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+5 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -746,9 +746,10 @@ function autoriser_sans_cookie($nom)
// $entite = surnom de la table SQL (donne acces au nom de cle primaire)
// $args = query_string a placer apres cle=$id&....
// $ancre = ancre a mettre a la fin de l'URL a produire
// $prive = vrai s'il faut produire l'URL d'edition, celle de lecture sinon
// $public = produire l'URL publique ou privee (par defaut: selon espace)
// $type = fichier dans le repertoire ecrire/urls determinant l'apparence

// @return string : url codee
// @return string : fonction de decodage
// http://doc.spip.org/@generer_url_entite
function generer_url_entite($id='', $entite='', $args='', $ancre='', $public=NULL, $type=NULL)
{
@@ -775,11 +776,12 @@ function generer_url_entite($id='', $entite='', $args='', $ancre='', $public=NUL
				?  $GLOBALS['meta']['type_urls']
				:  $GLOBALS['type_urls']; // pour SPIP <2
			}

			$f = charger_fonction($type, 'urls', true); 
		// si $entite='', on veut la fonction de passage URL ==> id
			if (!$entite) return $f; 
		// sinon on veut effectuer le passage id ==> URL
			$res = !$f ? '' : $f($id, $entite, $args, $ancre);
			$res = !$f ? '' : $f(intval($id), $entite, $args, $ancre);
		}
	}
	if ($res) return $res;
+22 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -75,15 +75,32 @@ function assembler($fond, $connect='') {
			$contexte = $page['contexte'];
		}
		// ATTENTION, gestion des URLs transformee par le htaccess
		// $renommer = 'urls_propres_dist';
		// renvoie array($contexte, $fond, $url_redirect)
		// Compat ascendante si le retour est null:
		// 1. $contexte est global car cette fonction le modifie.
		// 2. $fond est passe par reference, pour la meme raison
		// Bref,  les URL dites propres ont une implementation sale.
		// Interdit de nettoyer, faut assumer l'histoire.
		// et calculer la page
		else {
			$renommer = generer_url_entite();
			if ($renommer)
				$renommer(nettoyer_uri(), $fond);
			if ($renommer) {
				$url = nettoyer_uri();
				$a = $renommer($url, $fond);
				if (is_array($a)) {
					list($ncontexte, $nfond, $url_redirect) = $a;
					if (isset($url_redirect)
					AND $url !== $url_redirect) {
						spip_log("Redirige $url vers $url_redirect");
						include_spip('inc/headers');
						http_status(301);
						redirige_par_entete($url_redirect);
					}
					if (isset($nfond))
						$fond = $nfond;
					if (isset($ncontexte))
						$contexte = $ncontexte;
				}
			}
			elseif (function_exists('recuperer_parametres_url'))
				// compatibilite <= 1.9.2
				recuperer_parametres_url($fond, nettoyer_uri());
+27 −43
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -403,10 +403,9 @@ function _generer_url_arbo($type, $id, $args='', $ancre='') {
}


// @return array([contexte],[fond],[url_redirect]) : url decodee
// http://doc.spip.org/@urls_arbo_dist
function urls_arbo_dist($i, &$entite, $args='', $ancre='') {
	global $contexte;

function urls_arbo_dist($i, $entite, $args='', $ancre='') {
	if (is_numeric($i))
		return _generer_url_arbo($entite, $i, $args, $ancre);

@@ -415,41 +414,33 @@ function urls_arbo_dist($i, &$entite, $args='', $ancre='') {
		$entite = 'type_urls';
	}

	$contexte = $GLOBALS['contexte']; // recuperer aussi les &debut_xx
	$url = $i;
	$id_objet = $type = 0;
	$url_redirect = null;

	// Migration depuis anciennes URLs ?
	if (
		// traiter les injections du type domaine.org/spip.php/cestnimportequoi/ou/encore/plus/rubrique23
	  $GLOBALS['profondeur_url']<=0
	// traiter les injections domain.tld/spip.php/n/importe/quoi/rubrique23
	if ($GLOBALS['profondeur_url']<=0
	AND $_SERVER['REQUEST_METHOD'] != 'POST') {
		// Decoder l'url html, page ou standard
		if (preg_match(
		',(^|/)(article|breve|rubrique|mot|auteur|site)(\.php3?|[0-9]+(\.html)?)'
		.'([?&].*)?$,', $url, $regs)
		) {
			$type = $regs[2];
			$id_table_objet = id_table_objet($type);
			$id_objet = intval(_request($id_table_objet));
		}

		/* Compatibilite urls-page */
		else if (preg_match(
		',[?/&](article|breve|rubrique|mot|auteur|site)[=]?([0-9]+),',
		',(^|id_|[?])(article|breve|rubrique|mot|auteur|site|syndic)=?(\d+),iS',
		$url, $regs)) {
			$type = $regs[1];
			$id_objet = $regs[2];
			$type = preg_replace(',s$,', '', table_objet($regs[2]));
			$_id = id_table_objet($regs[2]);
			$id_objet = $regs[3];
		}
	}
	if ($id_objet) {
		$url_propre = generer_url_entite($id_objet, $type, $args, $ancre);
		$contexte = array($_id => $id_objet);
		if (strlen($url_propre)
		AND !strstr($url,$url_propre)) {
			include_spip('inc/headers');
			http_status(301);
			// recuperer les arguments supplementaires (&debut_xxx=...)
			$reste = preg_replace('/^&/','?',
				preg_replace("/[?&]$id_table_objet=$id_objet/",'',$regs[5]));
			redirige_par_entete("$url_propre$reste");
			$url_redirect = "$url_propre$reste";
			return array($contexte, $type, $url_redirect);
		}
	}
	/* Fin compatibilite anciennes urls */
@@ -508,17 +499,10 @@ function urls_arbo_dist($i, &$entite, $args='', $ancre='') {
			}
			if ($row) {
				$type = $row['type'];
		
				// Redirection 301 si l'url est vieux
				/*if ($recent = sql_fetsel('url, date', 'spip_urls',
				'type='.sql_quote($row['type']).' AND id_objet='.sql_quote($row['id_objet'])
				.' AND date>'.sql_quote($row['date']), '', 'date DESC', 1)) {
					spip_log('Redirige '.$url_propre.' vers '.$recent['url']);
					include_spip('inc/headers');
					redirige_par_entete($recent['url']);
				}*/
		
				$col_id = id_table_objet($type);
				$contexte[$col_id] = $row['id_objet'];
				$entite = $row['type'];

				if (!isset($contexte[$col_id])) // n'affecter que la premiere fois un parent de type id_rubrique
					$contexte[$col_id] = $row['id_objet'];
				if (!$entite
@@ -532,18 +516,16 @@ function urls_arbo_dist($i, &$entite, $args='', $ancre='') {
				// un segment est inconnu
				if ($entite=='type_urls') {
					// on genere une 404 comme il faut si on ne sait pas ou aller
					include_spip('inc/headers');
					http_status('404');
					$entite = '404';
					return array(array(),'404');
				}
				return;
				return; // ?
			}
		}

		// gerer le retour depuis des urls propres
		if ($entite=='type_urls' AND $GLOBALS['profondeur_url']<=0){
			$urls_anciennes = charger_fonction('propres','urls');
			$urls_anciennes($url_propre,$entite);
			return $urls_anciennes($url_propre,$entite);
		}
	}
	if ($entite=='type_urls') {
@@ -555,6 +537,8 @@ function urls_arbo_dist($i, &$entite, $args='', $ancre='') {
		}
	}
	define('_SET_HTML_BASE',1);

	return array($contexte, $entite);
}

?>
+23 −10
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -51,18 +51,28 @@ function _generer_url_html($type, $id, $args='', $ancre='') {

// retrouver les parametres d'une URL dite "html"
// http://doc.spip.org/@urls_html_dist
function urls_html_dist($i, &$entite, $args='', $ancre='') {
	global $contexte;
function urls_html_dist($i, $entite, $args='', $ancre='') {
	$contexte = $GLOBALS['contexte']; // recuperer aussi les &debut_xx

	if (is_numeric($i))
		return _generer_url_html($entite, $i, $args, $ancre);

	// traiter les injections du type domaine.org/spip.php/cestnimportequoi/ou/encore/plus/rubrique23
	if ($GLOBALS['profondeur_url']>0 AND $entite=='sommaire'){
		$entite = '404';
		return array(array(),'404');
	}
	$url = $i;

	// Decoder l'url html, page ou standard
	if (preg_match(
	',(^|id_|[?])(article|breve|rubrique|mot|auteur|site|syndic)=?(\d+),iS',
	$url, $regs)) {
		$type = preg_replace(',s$,', '', table_objet($regs[2]));
		$_id = id_table_objet($regs[2]);
		$contexte[$_id] = $id = $regs[3];
		return array($contexte, $type);
	}

	/*
	 * Le bloc qui suit sert a faciliter les transitions depuis
	 * le mode 'urls-propres' vers les modes 'urls-standard' et 'url-html'
@@ -71,17 +81,20 @@ function urls_html_dist($i, &$entite, $args='', $ancre='') {
	 */
	// Si on est revenu en mode html, mais c'est une ancienne url_propre
	// on ne redirige pas, on assume le nouveau contexte (si possible)
	$url_propre = isset($_SERVER['REDIRECT_url_propre']) ?
		$_SERVER['REDIRECT_url_propre'] :
		(isset($_ENV['url_propre']) ?
			$_ENV['url_propre'] :
			'');
	if ($url_propre AND preg_match(',^(article|breve|rubrique|mot|auteur|site|type_urls|404)$,', $entite)) {
	$url_propre = isset($url)
		? $url
		: (isset($_SERVER['REDIRECT_url_propre'])
			? $_SERVER['REDIRECT_url_propre']
			: (isset($_ENV['url_propre'])
				? $_ENV['url_propre']
				: ''
				));
	if ($url_propre) {
		if ($GLOBALS['profondeur_url']<=0)
			$urls_anciennes = charger_fonction('propres','urls');
		else
			$urls_anciennes = charger_fonction('arbo','urls');
		$urls_anciennes($url_propre,$entite);
		return $urls_anciennes($url_propre,$entite);
	}
	/* Fin du bloc compatibilite url-propres */
}
+24 −42
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -47,69 +47,51 @@ function _generer_url_page($type,$id, $args='', $ancre='') {
// http://doc.spip.org/@urls_page_dist
function urls_page_dist($i, &$entite, $args='', $ancre='')
{
	global $contexte;
	$contexte = $GLOBALS['contexte']; // recuperer aussi les &debut_xx

	if (is_numeric($i))
		return _generer_url_page($entite, $i, $args, $ancre);

	$url = $i;
	// traiter les injections du type domaine.org/spip.php/cestnimportequoi/ou/encore/plus/rubrique23
	if ($GLOBALS['profondeur_url']>0 AND $entite=='sommaire'){
		$entite = '404';
		return array(array(),'404');
	}
	$url = $i;

	// Ce bloc gere les urls page et la compatibilite avec les "urls standard"
	if ($entite=='sommaire'){
	// Decoder l'url html, page ou standard
	if (preg_match(
		',^[^?]*[?/](article|rubrique|breve|mot|site|auteur)(?:\.php3?)?.*?([0-9]+),',
		$url, $regs)) {
			$entite = $regs[1];
			if ($regs[1] == 'site') {
				if (!isset($contexte['id_syndic']))
					$contexte['id_syndic'] = $regs[2];
			} else {
				if (!isset($contexte['id_'.$entite]))
					$contexte['id_'.$entite] = $regs[2];
			}
	
			return;
		}
		/* Compatibilite urls-page avec formulaire en get !!! */
		else if (preg_match(
			',[?/&](article|breve|rubrique|mot|auteur|site)[=]?([0-9]+),',
	',(^|id_|[?])(article|breve|rubrique|mot|auteur|site|syndic)=?(\d+),iS',
	$url, $regs)) {
			$entite = $regs[1];
			if ($regs[1] == 'site') {
				if (!isset($contexte['id_syndic']))
					$contexte['id_syndic'] = $regs[2];
			} else {
				if (!isset($contexte['id_'.$entite]))
					$contexte['id_'.$entite] = $regs[2];
			}
			return;
		}
		/* Fin compatibilite urls-page */
		$type = preg_replace(',s$,', '', table_objet($regs[2]));
		$_id = id_table_objet($regs[2]);
		$contexte[$_id] = $id = $regs[3];
		return array($contexte, $type);
	}


	/*
	 * Le bloc qui suit sert a faciliter les transitions depuis
	 * le mode 'urls-propres' vers les modes 'urls-standard/page' et 'url-html'
	 * le mode 'urls-propres' vers les modes 'urls-standard' et 'url-html'
	 * Il est inutile de le recopier si vous personnalisez vos URLs
	 * et votre .htaccess
	 */
	// Si on est revenu en mode page, mais c'est une ancienne url_propre
	// Si on est revenu en mode html, mais c'est une ancienne url_propre
	// on ne redirige pas, on assume le nouveau contexte (si possible)
	if (
		 (isset($_SERVER['REDIRECT_url_propre']) AND $url_propre = $_SERVER['REDIRECT_url_propre'])
	OR (isset($_ENV['url_propre']) AND $url_propre = $_ENV['url_propre'])
	AND preg_match(',^(article|breve|rubrique|mot|auteur|site|type_urls|404)$,', $entite)) {
	$url_propre = isset($url)
		? $url
		: (isset($_SERVER['REDIRECT_url_propre'])
			? $_SERVER['REDIRECT_url_propre']
			: (isset($_ENV['url_propre'])
				? $_ENV['url_propre']
				: ''
				));
	if ($url_propre) {
		if ($GLOBALS['profondeur_url']<=0)
			$urls_anciennes = charger_fonction('propres','urls');
		else
			$urls_anciennes = charger_fonction('arbo','urls');
		$urls_anciennes($url_propre,$entite);
		return $urls_anciennes($url_propre,$entite);
	}
	/* Fin du bloc compatibilite url-propres */
}

?>
Chargement en cours