diff --git a/ecrire/urls/arbo.php b/ecrire/urls/arbo.php index 4b2321281532449bbe9359a102a0508fb0adf680..58df902d46fad20c9ed944d8ba10be9cc6c15704 100644 --- a/ecrire/urls/arbo.php +++ b/ecrire/urls/arbo.php @@ -20,33 +20,52 @@ define('CONFIRMER_MODIFIER_URL', false); include_spip('base/abstract_sql'); -/* - -- Comment utiliser ce jeu d'URLs ? - -Recopiez le fichier "htaccess.txt" du repertoire de base du site SPIP sous -le sous le nom ".htaccess" (attention a ne pas ecraser d'autres reglages -que vous pourriez avoir mis dans ce fichier) ; si votre site est en -"sous-repertoire", vous devrez aussi editer la ligne "RewriteBase" ce fichier. -Les URLs definies seront alors redirigees vers les fichiers de SPIP. - -Definissez ensuite dans ecrire/mes_options.php : - < ?php $type_urls = 'propres'; ? > -SPIP calculera alors ses liens sous la forme "Mon-titre-d-article". - -Variante 'propres2' : - < ?php $type_urls = 'propres2'; ? > -ajoutera '.html' aux adresses generees : "Mon-titre-d-article.html" - -Variante 'qs' (experimentale) : ce systeme fonctionne en "Query-String", -c'est-a-dire sans utilisation de .htaccess ; les adresses sont de la forme -"/?Mon-titre-d-article" - < ?php $type_urls = 'qs'; ? > -*/ - -define ('_terminaison_urls_propres', ''); -define ('_debut_urls_propres', ''); +/** + * - Comment utiliser ce jeu d'URLs ? + * Recopiez le fichier "htaccess.txt" du repertoire de base du site SPIP sous + * le sous le nom ".htaccess" (attention a ne pas ecraser d'autres reglages + * que vous pourriez avoir mis dans ce fichier) ; si votre site est en + * "sous-repertoire", vous devrez aussi editer la ligne "RewriteBase" ce fichier. + * Les URLs definies seront alors redirigees vers les fichiers de SPIP. + * + * Definissez ensuite dans ecrire/mes_options.php : + * < ?php $type_urls = 'arbo'; ? > + * SPIP calculera alors ses liens sous la forme "Mon-titre-d-article". + * Variantes : + * pour avoir des url terminant par html + * define ('_terminaison_urls_arbo', '.html'); + * + * pour avoir des url numeriques (id) du type 12/5/4/article/23 + * define ('_URLS_ARBO_MIN',255); + * + * pour avoir des url sans les types + * define ('_urls_arbo_sans_type',1); + * + * pour conserver la casse des titres dans les url + * define ('_url_arbo_minuscules',0); + * + * pour choisir le caractere de separation titre-id en cas de doublon + * (ne pas utiliser '/') + * define ('_url_arbo_sep_id','-'); + * + * pour modifier la hierarchie apparente dans la constitution des urls + * ex pour que les mots soient classes par groupes + * $GLOBALS['url_arbo_parents']=array( + * 'article'=>array('id_rubrique','rubrique'), + * 'rubrique'=>array('id_parent','rubrique'), + * 'breve'=>array('id_rubrique','rubrique'), + * 'site'=>array('id_rubrique','rubrique'), + * 'mot'=>array('id_groupe','groupes_mot')); + * + * + */ + + +define ('_debut_urls_arbo', ''); +define ('_terminaison_urls_arbo', ''); define ('_url_arbo_sep_id','-'); +define ('_urls_arbo_sans_type',0); +define ('_url_arbo_minuscules',1); // Ces chaines servaient de marqueurs a l'epoque ou les URL propres devaient // indiquer la table ou les chercher (articles, auteurs etc), @@ -82,10 +101,12 @@ function creer_chaine_url($x) { $url_old = $x['data']; $objet = $x['objet']; include_spip('inc/filtres'); - @define('_URLS_PROPRES_MAX', 35); - @define('_URLS_PROPRES_MIN', 3); + @define('_URLS_ARBO_MAX', 35); + @define('_URLS_ARBO_MIN', 3); $titre = supprimer_tags(supprimer_numero(extraire_multi($objet['titre']))); $url = translitteration(corriger_caracteres($titre)); + if (_url_arbo_minuscules) + $url = strtolower($url); $url = @preg_replace(',([^[:cntrl:][:alnum:]_]|[[:space:]])+,u', ' ', $url); // S'il reste trop de caracteres non latins, les gerer comme wikipedia // avec rawurlencode : @@ -97,7 +118,7 @@ function creer_chaine_url($x) { } // S'il reste trop peu, on retombe sur article/12 - if (strlen($url) < _URLS_PROPRES_MIN) { + if (strlen($url) < _URLS_ARBO_MIN) { $url = $objet['id_objet']; } @@ -109,10 +130,10 @@ function creer_chaine_url($x) { if (!$mot) continue; $url2 = $url.'-'.$mot; - // Si on depasse _URLS_PROPRES_MAX caracteres, s'arreter + // Si on depasse _URLS_ARBO_MAX caracteres, s'arreter // ne pas compter 3 caracteres pour %E9 mais un seul $long = preg_replace(',%.,', '', $url2); - if (strlen($long) > _URLS_PROPRES_MAX) { + if (strlen($long) > _URLS_ARBO_MAX) { break; } @@ -123,27 +144,29 @@ function creer_chaine_url($x) { // On enregistre en utf-8 dans la base $url = rawurldecode($url); - if (strlen($url) < _URLS_PROPRES_MIN) + if (strlen($url) < _URLS_ARBO_MIN) $url = $objet['id_objet']; // '12' } - $x['data'] = ($objet['type']=='rubrique'?'':$objet['type'].'/').$url; + $x['data'] = ((_urls_arbo_sans_type OR $objet['type']=='rubrique')?'':$objet['type'].'/').$url; return $x; } // http://doc.spip.org/@_generer_url_arbo -function _generer_url_arbo($url,$type,$parent){ +function _generer_url_arbo($url,$type,$parent,$type_parent){ if (is_null($parent)){ return $url; } - elseif($type!='rubrique') - return _generer_url_propre('rubrique',$parent).$url; + elseif($type!='rubrique') { + $url_parent = _generer_url_propre($type_parent?$type_parent:'rubrique',$parent); + return $url_parent . (substr($url_parent,-1)=='/'?'':'/') .$url; + } else{ if($parent==0) return $url.'/'; else - return _generer_url_propre('rubrique',$parent). $url.'/'; + return _generer_url_propre($type_parent?$type_parent:'rubrique',$parent). $url.'/'; } } @@ -172,14 +195,20 @@ function _generer_url_propre($type, $id_objet) { $champ_titre = 'titre'; // parent - $champ_parent = array('article'=>'id_rubrique','rubrique'=>'id_parent','breve'=>'id_rubrique','site'=>'id_rubrique'); - $sel_parent = isset($champ_parent[$type])?", O.".$champ_parent[$type].' as parent':''; - + $champ_parent = tester_variable('url_arbo_parents', + array( + 'article'=>array('id_rubrique','rubrique'), + 'rubrique'=>array('id_parent','rubrique'), + 'breve'=>array('id_rubrique','rubrique'), + 'site'=>array('id_rubrique','rubrique'))); + $sel_parent = isset($champ_parent[$type])?", O.".reset($champ_parent[$type]).' 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) + if ($row){ $urls[$type][$id_objet] = $row; + $urls[$type][$id_objet]['type_parent'] = isset($champ_parent[$type])?end($champ_parent[$type]):''; + } } if (!isset($urls[$type][$id_objet])) return ""; # objet inexistant @@ -187,7 +216,7 @@ function _generer_url_propre($type, $id_objet) { $url_propre = $urls[$type][$id_objet]['url']; if (!is_null($url_propre) AND !$modifier_url) - return _generer_url_arbo($url_propre,$type,$urls[$type][$id_objet]['parent']); + return _generer_url_arbo($url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']); // Sinon, creer une URL $url = pipeline('creer_chaine_url', @@ -207,7 +236,7 @@ function _generer_url_propre($type, $id_objet) { // Pas de changement d'url if ($url == $url_propre) - return _generer_url_arbo($url_propre,$type,$urls[$type][$id_objet]['parent']); + return _generer_url_arbo($url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']); // Verifier si l'utilisateur veut effectivement changer l'URL if ($modifier_url @@ -258,16 +287,16 @@ function _generer_url_propre($type, $id_objet) { if (sql_countsel('spip_urls AS U', $where .sql_quote($set['url']))) { sql_update('spip_urls AS U', array('date' => 'NOW()'), $where .sql_quote($set['url'])); spip_log("reordonne $type $id_objet"); - return _generer_url_arbo($urls[$type][$id_objet]['url']=$set['url'],$type,$urls[$type][$id_objet]['parent']); + return _generer_url_arbo($urls[$type][$id_objet]['url']=$set['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']); } else { $set['url'] .= _url_arbo_sep_id.$id_objet; if (strlen($set['url']) > 200) //serveur out ? retourner au mieux - return _generer_url_arbo($urls[$type][$id_objet]['url']=$url_propre,$type,$urls[$type][$id_objet]['parent']); + return _generer_url_arbo($urls[$type][$id_objet]['url']=$url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']); elseif (sql_countsel('spip_urls AS U', $where . sql_quote($set['url']))) { sql_update('spip_urls', array('date' => 'NOW()'), 'url='.sql_quote($set['url'])); - return _generer_url_arbo($urls[$type][$id_objet]['url']=$set['url'],$type,$urls[$type][$id_objet]['parent']); + return _generer_url_arbo($urls[$type][$id_objet]['url']=$set['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']); } } } while (@sql_insertq('spip_urls', $set) <= 0); @@ -277,7 +306,7 @@ function _generer_url_propre($type, $id_objet) { spip_log("Creation de l'url propre '" . $set['url'] . "' pour $col_id=$id_objet"); $urls[$type][$id_objet]['url'] = $set['url']; - return _generer_url_arbo($urls[$type][$id_objet]['url'],$type,$urls[$type][$id_objet]['parent']); + return _generer_url_arbo($urls[$type][$id_objet]['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']); } // http://doc.spip.org/@_generer_url_complete @@ -285,9 +314,9 @@ function _generer_url_complete($type, $id, $args='', $ancre='') { // Mode propre if ($propre = _generer_url_propre($type, $id)) { - $url = _debut_urls_propres + $url = _debut_urls_arbo . $propre - . _terminaison_urls_propres; + . (substr($propre,-1)=='/'?'':_terminaison_urls_arbo); } diff --git a/htaccess.txt b/htaccess.txt index 06f9f2f713a869d3b431ac86d44f0b4667659a41..f5283e0ef62f72c72fd3206c292a63974ee03f21 100644 --- a/htaccess.txt +++ b/htaccess.txt @@ -92,7 +92,7 @@ RewriteRule ^[^/\.]+(\.html)?$ spip.php?page=type_urls [QSA,E=url_propre:$0,L] # dans ecrire/mes_options.php # (fichier associe : ecrire/urls/arbo.php) -RewriteRule ^[^\.]+$ spip.php?page=type_urls [QSA,E=url_propre:$0,L] +RewriteRule ^[^\.]+(\.html)?$ spip.php?page=type_urls [QSA,E=url_propre:$0,L] # Fin URLs "arbo" ###