[SPIP] ~v3.0.17-->v3.0.19
[ptitvelo/web/www.git] / www / plugins-dist / urls_etendues / urls / arbo.php
index 2afb8df..ecd85ea 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  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.     *
@@ -76,10 +76,6 @@ defined('CONFIRMER_MODIFIER_URL') || define('CONFIRMER_MODIFIER_URL', false);
  * 
  */
 
-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', '');
@@ -89,7 +85,7 @@ if (!defined('_terminaison_urls_arbo')) define('_terminaison_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);
@@ -177,7 +173,7 @@ function url_arbo_type($type){
  * 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
@@ -202,7 +198,7 @@ function urls_arbo_creer_chaine_url($x) {
 
 /**
  * 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
@@ -267,7 +263,7 @@ function renseigner_url_arbo($type,$id_objet){
 /**
  * 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
@@ -275,9 +271,7 @@ function renseigner_url_arbo($type,$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
 
@@ -374,7 +368,7 @@ function declarer_url_arbo($type, $id_objet) {
 /**
  * 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
@@ -423,7 +417,7 @@ function _generer_url_arbo($type, $id, $args='', $ancre='') {
  * 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
@@ -538,7 +532,9 @@ function urls_arbo_dist($i, $entite, $args='', $ancre='') {
                        // 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
@@ -596,18 +592,35 @@ function urls_arbo_dist($i, $entite, $args='', $ancre='') {
                }
 
                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);
+                               }
                        }
                }