~maj v3.0.19-->v3.0.21
[ptitvelo/web/www.git] / www / plugins-dist / urls_etendues / urls / propres.php
index b108d1d..3ce5d55 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.     *
@@ -53,7 +53,7 @@ $config_urls_propres = isset($GLOBALS['meta']['urls_propres'])?unserialize($GLOB
 if (!defined('_url_propres_sep_id')) define('_url_propres_sep_id',isset($config_urls_propres['url_propres_sep_id'])?$config_urls_propres['url_propres_sep_id']:'-');
 // option pour tout passer en minuscules
 if (!defined('_url_minuscules')) define('_url_minuscules',isset($config_urls_propres['url_minuscules'])?$config_urls_propres['url_minuscules']:0);
-if (!defined('_URLS_PROPRES_MAX')) define('_URLS_PROPRES_MAX', isset($config_urls_propres['URLS_PROPRES_MAX'])?$config_urls_propres['URLS_PROPRES_MAX']:35);
+if (!defined('_URLS_PROPRES_MAX')) define('_URLS_PROPRES_MAX', isset($config_urls_propres['URLS_PROPRES_MAX'])?$config_urls_propres['URLS_PROPRES_MAX']:80);
 if (!defined('_URLS_PROPRES_MIN')) define('_URLS_PROPRES_MIN', isset($config_urls_propres['URLS_PROPRES_MIN'])?$config_urls_propres['URLS_PROPRES_MIN']:3);
 
 if (!defined('_url_sep_id')) define('_url_sep_id',_url_propres_sep_id);
@@ -68,7 +68,7 @@ if (!defined('_MARQUEUR_URL')) define('_MARQUEUR_URL', serialize(array('rubrique
 
 // Retire les marqueurs de type dans une URL propre ancienne maniere
 
-// http://doc.spip.org/@retirer_marqueurs_url_propre
+// http://code.spip.net/@retirer_marqueurs_url_propre
 function retirer_marqueurs_url_propre($url_propre) {
        if (preg_match(',^[+][-](.*?)[-][+]$,', $url_propre, $regs)) {
                return $regs[1];
@@ -85,7 +85,7 @@ function retirer_marqueurs_url_propre($url_propre) {
 // 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
 function urls_propres_creer_chaine_url($x) {
        // NB: ici url_old ne sert pas, mais un plugin qui ajouterait une date
        // pourrait l'utiliser pour juste ajouter la 
@@ -104,7 +104,7 @@ function urls_propres_creer_chaine_url($x) {
 
 // Trouver l'URL associee a la n-ieme cle primaire d'une table SQL
 
-// http://doc.spip.org/@declarer_url_propre
+// http://code.spip.net/@declarer_url_propre
 function declarer_url_propre($type, $id_objet) {
        $trouver_table = charger_fonction('trouver_table', 'base');
        $desc = $trouver_table(table_objet($type));
@@ -118,20 +118,33 @@ function declarer_url_propre($type, $id_objet) {
 
        // Recuperer une URL propre correspondant a l'objet.
        // mais urls a 1 segment uniquement (pas d'urls /)
-       $row = sql_fetsel("U.url, U.date, U.perma, $champ_titre",
+       // de preference avec id_parent=0, puis perma, puis par date desc
+       $row = sql_fetsel("U.url, U.date, U.id_parent, U.perma, $champ_titre",
                          "$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 AND (U.segments IS NULL OR U.segments=1)", '', 'U.date DESC', 1);
+                         "O.$col_id=$id_objet AND (U.segments IS NULL OR U.segments=1)", '', 'U.id_parent=0 DESC, U.perma DESC, U.date DESC', 1);
 
        // en SQLite le left join retourne du vide si il y a une url mais qui ne correspond pas pour la condition sur le segment
        // on verifie donc que l'objet existe bien avant de sortir ou de creer une url pour cet objet
        if (!$row)
-               $row = sql_fetsel("'' as url, '' as date, 0 as perma, $champ_titre",
+               $row = sql_fetsel("'' as url, '' as date, 0 as id_parent, 0 as perma, $champ_titre",
                                  "$table AS O",
                                  "O.$col_id=$id_objet");
+
        if (!$row) return ""; # Quand $id_objet n'est pas un numero connu
 
        $url_propre = $row['url'];
 
+       // si url_propre connue mais avec id_parent non nul, essayer de reinserer tel quel avec id_parent=0
+       if ($url_propre AND $row['id_parent']){
+               include_spip('action/editer_url');
+               $set = array('url' => $url_propre, 'type' => $type, 'id_objet' => $id_objet, 'perma' => $row['perma']);
+               // si on arrive pas a reinserer tel quel, on annule url_propre pour forcer un recalcul d'url
+               if (!url_insert($set,false,_url_propres_sep_id))
+                       $url_propre = "";
+               else
+                       $url_propre = $row['url'] = $set['url'];
+       }
+
        // Se contenter de cette URL si elle existe ;
        // sauf si on invoque par "voir en ligne" avec droit de modifier l'url
 
@@ -191,7 +204,7 @@ function declarer_url_propre($type, $id_objet) {
        return $set['url'];
 }
 
-// http://doc.spip.org/@_generer_url_propre
+// http://code.spip.net/@_generer_url_propre
 function _generer_url_propre($type, $id, $args='', $ancre='') {
 
        if ($generer_url_externe = charger_fonction("generer_url_$type",'urls',true)) {
@@ -247,7 +260,7 @@ function _generer_url_propre($type, $id, $args='', $ancre='') {
 // retrouve le fond et les parametres d'une URL propre
 // ou produit une URL propre si on donne un parametre
 // @return array([contexte],[type],[url_redirect],[fond]) : url decodee
-// http://doc.spip.org/@urls_propres_dist
+// http://code.spip.net/@urls_propres_dist
 function urls_propres_dist($i, $entite, $args='', $ancre='') {
 
        if (is_numeric($i))
@@ -334,11 +347,11 @@ function urls_propres_dist($i, $entite, $args='', $ancre='') {
 
        // Compatibilite avec les anciens marqueurs d'URL propres
        // Tester l'entree telle quelle (avec 'url_libre' des sites ont pu avoir des entrees avec marqueurs dans la table spip_urls)
-       if (!$row = sql_fetsel('id_objet, type, date, url', 'spip_urls', 'url='.sql_quote($url_propre))) {
+       if (!$row = sql_fetsel('id_objet, type, date, url', 'spip_urls', 'url='.sql_quote($url_propre, '', 'TEXT'))) {
                // Sinon enlever les marqueurs eventuels
                $url_propre2 = retirer_marqueurs_url_propre($url_propre);
 
-               $row = sql_fetsel('id_objet, type, date, url', 'spip_urls', 'url='.sql_quote($url_propre2));
+               $row = sql_fetsel('id_objet, type, date, url', 'spip_urls', 'url='.sql_quote($url_propre2, '', 'TEXT'));
        }
 
        if ($row) {
@@ -349,9 +362,9 @@ function urls_propres_dist($i, $entite, $args='', $ancre='') {
 
                // Si l'url est vieux, donner le nouveau
                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'])
-               .' AND url<>'.sql_quote($row['url']), '', 'date DESC', 1)) {
+               'type='.sql_quote($row['type'], '', 'TEXT').' AND id_objet='.sql_quote($row['id_objet'])
+               .' AND date>'.sql_quote($row['date'], '', 'TEXT')
+               .' AND url<>'.sql_quote($row['url'], '', 'TEXT'), '', 'date DESC', 1)) {
                        // Mode compatibilite pour conserver la distinction -Rubrique-
                        if (_MARQUEUR_URL) {
                                $marqueur = unserialize(_MARQUEUR_URL);
@@ -369,7 +382,7 @@ function urls_propres_dist($i, $entite, $args='', $ancre='') {
                } else {
                        // Si ca ressemble a une URL d'objet, ce n'est pas la home
                        // et on provoque un 404
-                       if (preg_match(',^.*/[^\.]+(\.html)?$,', $url)) {
+                       if (preg_match(',^[^\.]+(\.html)?$,', $url)) {
                                $entite = '404';
                                $contexte['erreur'] = '';