/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2013 *
+ * Copyright (c) 2001-2014 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
*
*/
-include_spip('inc/xcache');
-if (!function_exists('Cache')) {
- function Cache(){return null;}
-}
$config_urls_arbo = isset($GLOBALS['meta']['urls_arbo'])?unserialize($GLOBALS['meta']['urls_arbo']):array();
if (!defined('_debut_urls_arbo')) define('_debut_urls_arbo', '');
if (!defined('_url_arbo_sep_id')) define('_url_arbo_sep_id',isset($config_urls_arbo['url_arbo_sep_id'])?$config_urls_arbo['url_arbo_sep_id']:'-');
// option pour tout passer en minuscules
if (!defined('_url_arbo_minuscules')) define('_url_arbo_minuscules',isset($config_urls_arbo['url_arbo_minuscules'])?$config_urls_arbo['url_arbo_minuscules']:1);
-if (!defined('_URLS_ARBO_MAX')) define('_URLS_ARBO_MAX', isset($config_urls_arbo['URLS_ARBO_MAX'])?$config_urls_arbo['URLS_ARBO_MAX']:35);
+if (!defined('_URLS_ARBO_MAX')) define('_URLS_ARBO_MAX', isset($config_urls_arbo['URLS_ARBO_MAX'])?$config_urls_arbo['URLS_ARBO_MAX']:80);
if (!defined('_URLS_ARBO_MIN')) define('_URLS_ARBO_MIN', isset($config_urls_arbo['URLS_ARBO_MIN'])?$config_urls_arbo['URLS_ARBO_MIN']:3);
if (!defined('_url_sep_id')) define('_url_sep_id',_url_arbo_sep_id);
* precedent, un tableau indiquant le titre de l'objet, son type, son id,
* et doit donner en retour une chaine d'url, sans se soucier de la
* duplication eventuelle, qui sera geree apres
- * http://doc.spip.org/@creer_chaine_url
+ * http://code.spip.net/@creer_chaine_url
*
* @param array $x
* @return array
/**
* Boucler sur le parent pour construire l'url complete a partir des segments
- * http://doc.spip.org/@declarer_url_arbo_rec
+ * http://code.spip.net/@declarer_url_arbo_rec
*
* @param string $url
* @param string $type
/**
* Retrouver/Calculer l'ensemble des segments d'url d'un objet
*
- * http://doc.spip.org/@declarer_url_arbo
+ * http://code.spip.net/@declarer_url_arbo
*
* @param string $type
* @param int $id_objet
*/
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
if ($modifier_url
AND CONFIRMER_MODIFIER_URL
AND $url_propre
- AND $url != preg_replace('/,.*/', '', $url_propre))
+ // on essaye pas de regenerer une url en -xxx (suffixe id anti collision)
+ AND $url != preg_replace('/'.preg_quote(_url_propres_sep_id,'/').'.*/', '', $url_propre))
$confirmer = true;
else
$confirmer = false;
/**
* Generer l'url arbo complete constituee des segments + debut + fin
*
- * http://doc.spip.org/@_generer_url_arbo
+ * http://code.spip.net/@_generer_url_arbo
*
* @param string $type
* @param int $id
* ou decoder cette url si c'est une chaine
* array([contexte],[type],[url_redirect],[fond]) : url decodee
*
- * http://doc.spip.org/@urls_arbo_dist
+ * http://code.spip.net/@urls_arbo_dist
*
* @param string|int $i
* @param string $entite
// d'abord recherche avec prefixe parent, en une requete car aucun risque de colision
$row=sql_fetsel('id_objet, type, url',
'spip_urls',
- is_null($type)?"url=".sql_quote($url_segment):sql_in('url',array("$type/$url_segment",$type)),
+ is_null($type)
+ ? "url=".sql_quote($url_segment, '', 'TEXT')
+ : sql_in('url',array("$type/$url_segment",$type)),
'',
// en priorite celui qui a le bon parent et les deux segments
// puis le bon parent avec 1 segment
}
if (count($url_arbo_new)){
- foreach($url_arbo_new as $k=>$o)
- if ($s = declarer_url_arbo($o['objet'],$o['id_objet']))
- $url_arbo_new[$k] = $s;
- else
- $url_arbo_new[$k] = implode('/',$o['segment']);
- $url_arbo_new = ltrim(implode('/',$url_arbo_new),'/');
-
- if ($url_arbo_new!==$url_propre){
- $url_redirect = $url_arbo_new;
+ $caller = debug_backtrace();
+ $caller = $caller[1]['function'];
+ // si on est appele par un autre module d'url c'est du decodage d'une ancienne URL
+ // ne pas regenerer des segments arbo, mais rediriger vers la nouvelle URL
+ // dans la nouvelle forme
+ if (strncmp($caller,"urls_",5)==0 AND $caller!=="urls_decoder_url"){
// en absolue, car assembler ne gere pas ce cas particulier
include_spip('inc/filtres_mini');
- $url_redirect = url_absolue($url_redirect);
+ $col_id = id_table_objet($entite);
+ $url_new = generer_url_entite($contexte[$col_id],$entite);
+ // securite contre redirection infinie
+ if ($url_new!==$url_propre
+ AND rtrim($url_new,"/")!==rtrim($url_propre,"/"))
+ $url_redirect = url_absolue($url_new);
+ }
+ else {
+ foreach($url_arbo_new as $k=>$o)
+ if ($s = declarer_url_arbo($o['objet'],$o['id_objet']))
+ $url_arbo_new[$k] = $s;
+ else
+ $url_arbo_new[$k] = implode('/',$o['segment']);
+ $url_arbo_new = ltrim(implode('/',$url_arbo_new),'/');
+
+ if ($url_arbo_new!==$url_propre){
+ $url_redirect = $url_arbo_new;
+ // en absolue, car assembler ne gere pas ce cas particulier
+ include_spip('inc/filtres_mini');
+ $url_redirect = url_absolue($url_redirect);
+ }
}
}