[spip-dev] à propos des urls arborescentes

Bonsoir,

Un mot au sujet du nouveau système d'urls arborescentes proposé dans
SPIP. Il me semble qu'il y a une limitation assez sévère : ce ne sont
pas les urls complètes qui servent à distinguer les pages mais juste le
"basename".

Par exemple, si j'ai un site bilingue fr/nl organisé par secteurs, avec
une rubrique "agenda" dans chaque secteur, il ne sera pas possible
d'avoir les urls suivantes, pourtant naturelles :

  fr/agenda
  nl/agenda

La chaîne "agenda" ne pouvant être attribuée qu'une seule fois.

Bref, il me semble qu'il serait nettement préférable de stocker en base
l'entièreté de la chaîne ("fr/agenda" plutôt que "agenda"), comme le
font, me semble-t-il, DotClear ou Wordpress.

François

franz a écrit :

  fr/agenda
  nl/agenda

La chaîne "agenda" ne pouvant être attribuée qu'une seule fois.

Bref, il me semble qu'il serait nettement préférable de stocker en base
l'entièreté de la chaîne ("fr/agenda" plutôt que "agenda"), comme le
font, me semble-t-il, DotClear ou Wordpress.

effectivement
JL

Voilà l'argument de Cédric pour ce choix, en réponse à la même question que je posais :

« si on renomme une rubrique, cela n'oblige pas à recalculer les url de tous les enfants, ce qui etait un défaut de ta proposition, sous peine de se retrouver avec des urls arbo inconsistantes, ou de devoir recalculer d'un coup toutes les urls du site (exemple : renommage du secteur). »

cf http://article.gmane.org/gmane.comp.web.spip.devel/48105

Je persiste pour ma part à penser que stocker l'arborescence complète serait préférable, notamment parce que cela permettrait de mieux gérer les redirections 301 en cas de changement de nom. Je ne pense pas que les secteurs ou rubriques changent de nom si souvent sur quelque site que ce soit. Il faudrait par contre effacer les url de la branche quand cela arrive, pour garder la cohérence, alors que pour l'instant il n'y a aucune action sur les URL depuis l'espace privé.

Tant qu'on y est, pourquoi ne pas mettre en base l'URL vraiment complète, avec ".html" ou "/" final selon les cas, pour simplifier les traitements ? Qu'est-ce qui a justifié le stockage partiel sans terminaison, dans les URL propres initiales ?

J'ai un site qui utilise déjà ces URL, mais j'avoue ne pas avoir eu le temps de me pencher sur ce nouveau code :
  http://www.jacqueline-oud.com/

La conf est la suivante :

$GLOBALS['type_urls'] = 'arbo';
define('_SET_HTML_BASE', 1);
define('_terminaison_urls_arbo', '.html');
define('_urls_arbo_sans_type', 1);
define('_url_arbo_minuscules', 1);
define('_url_arbo_sep_id', '-');

$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('_URLS_PROPRES_MIN', 2);
define('_URLS_PROPRES_MAX', 500);

-Nicolas

franz a écrit :

Bonsoir,

Un mot au sujet du nouveau système d'urls arborescentes proposé dans
SPIP. Il me semble qu'il y a une limitation assez sévère : ce ne sont
pas les urls complètes qui servent à distinguer les pages mais juste le
"basename".

J'ai le même problème, même si ce n'est pas pour du multilingue. J'ai des rubriques "Réalisations" plusieurs fois, une dans chaque Services qu'on propose. Bon c'est pas hyper méga grave, mais c'est vrai que ça fait pas très propre.
C'est sûr que c'est pas facile de trouver une solution qui benchmark bien :slight_smile:
Cela dit, je ne sais pas si on change super souvent le titre de ses rubriques, kipizé un secteur. Du coup, ça voudrait dire tout recalculer certes, mais quand même très rarement. Donc pas tellement de perte.

Sinon j'ai un autre problème du même ordre.
Je me suis inscrit dans le pipeline des urls propres afin d'en modifier certaines.

J'ai donc ajouter à $x['data'] la date des articles, ici l'année et le mois, quand je suis dans la rubrique du blog.

J'ai donc $x['data'] = $date.'/'.$x['data'].
Et tout s'enregistre bien dans la base !! J'ai ainsi par exemple :
2008/08/machin-chose-truc | article | 10

Sauf qu'aucune des adresses avec la date rajoutée ne marchent. Toutes renvoient vers la rubrique contenant l'article. Pourtant, comme on l'a vu, c'est exactement bien mis dans la base.

Donc je ne comprends pas.
Voilà.

C'est peut-être justement lié au stockage dans la base de l'URL incomplète.

Je soupçonne, sans regarder le code, que la première chose que fait le script avant de chercher en base, est d'extraire ce qui se trouve après le dernier '/' de l'URL. Vu que tu ajoutes un '/' dans ton URL, cela ne marche pas.

C'est un argument de plus pour le stockage complet.

-Nicolas

Nicolas Hoizey a écrit :

C'est peut-être justement lié au stockage dans la base de l'URL incomplète.

Je soupçonne, sans regarder le code, que la première chose que fait le script avant de chercher en base, est d'extraire ce qui se trouve après le dernier '/' de l'URL. Vu que tu ajoutes un '/' dans ton URL, cela ne marche pas.

C'est un argument de plus pour le stockage complet.

Ce doit être quelque chose comme ça oui.
- Dans la partie "Lecture de la base -> création de l'URL", il prend bien le titre, ajoute la date, en enregistre dans la base.
- Mais dans la partie "Lecture de l'url -> correspondance avec la base", il ne doit prendre que "machin-chose-truc" qu'il ne trouve pas dans spip_urls.

Là le système devient vraiment gênant.

J'ai un nouveau problème aussi : lorsque l'on active le fait de mettre le nom du groupe de mot avant un mot (ici "tags/mot.html") et bien l'URL renvoie vers le squelette groupe_mot qui n'existe pas !, et non pas vers le squelette mot. Du coup erreur.

Hello,

Le soucis d'éviter autant que possible les agenda-xx en particulier pour différencier plusieurs elements dont les parents sont différents est légitime.
Le stockage complet est une réponse technique qui verse dans la facilité mais qui est insatisfaisante.

Nous n'avons toujours eu l'habitude de privilégier la qualité des solutions sur leur facilité, et on ne va pas changer de façon de faire maintenant.
Donc, oui il faut améliorer les url arbos pour résoudre les petits défauts constatés, mais non il ne faut pas stocker les url complètes.

La solution réside amha dans le stockage de l'id du parent en plus de l'url propre de l'objet, et d'avoir une clé primaire composée sur (url,id_parent)
- dans les cas des url non arbo, les id_parent restent à zero -> on retrouve le fonctionnement d'origine
- dans le cas des url arbo, on sera capable de distinguer deux objets avec la meme url mais de parents differents
Mais, déjà, par cette implémentation, on créé des problèmes connexes potentiels lors des déplacements d'objet, chose qu'on a voulu éviter dans notre implémentation.

Le cas de RastaPopoulos est un peu plus vicieux, car il ajoute dans l'url propre d'un objet des segments en formatant la date sour la forme 2008/08/truc
Les urls popres arborescentes ont été pensées comme représentatives de l'arborescence des objets, chacun représentés par son url propre. En produisant une url d'objet comportant des / supplémentaires, cela casse le lien entre arborescence de l'url et arborescence des objets Spip, et ne marche effectivement pas.

Il est possible de corriger l'analyseur d'url chargé de retrouver l'objet à partir de l'url et de ses segments, mais je ne suis pas sûr que cela soit pertinent car susceptible de provoquer d'autres bugs, du genre collision d'url d'objet à des profondeurs différentes.

Je pense que la gestion des url arbo ne sera pas modifiée pour la sortie de la 2.0, mais elle pourra évoluer pour être améliorée par la suite.
Cédric

Nicolas Hoizey a écrit :

RastaPopoulos a écrit :

J'ai un nouveau problème aussi : lorsque l'on active le fait de mettre le nom du groupe de mot avant un mot (ici "tags/mot.html") et bien l'URL renvoie vers le squelette groupe_mot qui n'existe pas !, et non pas vers le squelette mot. Du coup erreur.

Ca c'est un bug qu'il faut corriger !
Cédric

Le ticket est déjà là en tout cas :
http://trac.rezo.net/trac/spip/ticket/1479

-Nicolas

Le soucis d'éviter autant que possible les agenda-xx en particulier pour différencier plusieurs elements dont les parents sont différents est légitime.

Ouf... :wink:

Le stockage complet est une réponse technique qui verse dans la facilité mais qui est insatisfaisante.
Nous n'avons toujours eu l'habitude de privilégier la qualité des solutions sur leur facilité, et on ne va pas changer de façon de faire maintenant.
Donc, oui il faut améliorer les url arbos pour résoudre les petits défauts constatés, mais non il ne faut pas stocker les url complètes.

C'est une bonne approche dans l'absolu, certes, mais j'ai l'impression qu'à moins de trouver une solution relativement simple, tu ne sois ici trop puriste.

Le seul soucis -- très relatif -- que j'imagine c'est de provoquer le recalcul des URL d'une branche descendante (et non remontante comme les branches des boucles SPIP) en cas de changement d'une rubrique au niveau de son titre ou de sa rubrique mère.

C'est à mon sens quelque chose qui n'arrive pas très souvent, donc largement acceptable même pour un renommage de secteur sur un gros site, où l'incohérence entre nouvelle arborescence réelle et arborescence vue dans les URL disparaîtra au fur et à mesure des recalculs de cache, sans empêcher la navigation grâce aux redirections 301 automatiques.

Bien sûr, s'il y a des contre exemples à ce que j'avance, je suis tout ouï.

La solution réside amha dans le stockage de l'id du parent en plus de l'url propre de l'objet, et d'avoir une clé primaire composée sur (url,id_parent)
- dans les cas des url non arbo, les id_parent restent à zero -> on retrouve le fonctionnement d'origine
- dans le cas des url arbo, on sera capable de distinguer deux objets avec la meme url mais de parents differents
Mais, déjà, par cette implémentation, on créé des problèmes connexes potentiels lors des déplacements d'objet, chose qu'on a voulu éviter dans notre implémentation.

Cette proposition me semble inutilement compliquée, dans son principe et donc probablement dans son implémentation, par rapport à l'enjeu.

Le cas de RastaPopoulos est un peu plus vicieux, car il ajoute dans l'url propre d'un objet des segments en formatant la date sour la forme 2008/08/truc
Les urls popres arborescentes ont été pensées comme représentatives de l'arborescence des objets, chacun représentés par son url propre. En produisant une url d'objet comportant des / supplémentaires, cela casse le lien entre arborescence de l'url et arborescence des objets Spip, et ne marche effectivement pas.

Ce qui ne serait pas le cas, une fois de plus, avec des URL stockées complètes.

Il est possible de corriger l'analyseur d'url chargé de retrouver l'objet à partir de l'url et de ses segments, mais je ne suis pas sûr que cela soit pertinent car susceptible de provoquer d'autres bugs, du genre collision d'url d'objet à des profondeurs différentes.

Dangereux, effectivement.

Je pense que la gestion des url arbo ne sera pas modifiée pour la sortie de la 2.0

Il n'y a à priori pas de gros risques à la modifier, puisqu'elle n'a jamais été dans une version stable de SPIP, mais c'est sans doute plus un problème de délai, pour ne pas retarder la version stable.

mais elle pourra évoluer pour être améliorée par la suite.

Cool !

-Nicolas

Il faut aussi penser à recalculer l’url d’un élément d’en bas niveau (article, breves …) quand tu le déplaces (mais ça peux être inclus dans la notion de recalcul de branche c’est la 1ere itération à la racine d’un noeud ou sur un point).

a+

C'est tout l'esprit de Spip et du développement Open Source en général : chacun fait les choses comme il en a envie, avec style, pour qu'elles soient belles. Cela nécessite parfois du temps pour que l'idée germe, mûrisse, trouve son chemin, se frotte à la réalité, se polisse ...
Tout le contraire de la démarche qui consiste à livrer une fonctionnalité donnée, avec une deadline, tous les moyens étant alors bons pour cela.

Il est parfois difficile de concilier les deux démarches, et si, en ce qui me concerne, la seconde prévaut quand je suis engagé contractuellement, la première est de rigueur quand je contribue à Spip, et, sur le long terme, c'est elle qui donne les meilleurs résultats.

J'en reste donc à ce que je disais dans mon mail précédent, hors le bug sur les mots clés qu'il faut corriger pour la 2.0

Cédric

cedric.morin@yterium.com a écrit :

Le cas de RastaPopoulos est un peu plus vicieux, car il ajoute dans l'url propre d'un objet des segments en formatant la date sour la forme 2008/08/truc
Les urls popres arborescentes ont été pensées comme représentatives de l'arborescence des objets, chacun représentés par son url propre. En produisant une url d'objet comportant des / supplémentaires, cela casse le lien entre arborescence de l'url et arborescence des objets Spip, et ne marche effectivement pas.

Ce cas de figure était motivé par le fait que l'on avait alors des URLs qui donnaient :
/journal/2008/08/machin-chose.html

On ne prenait donc pas en compte effectivement la logique des objets SPIP (qui reste une logique informatique !) mais une logique mentale, donc une logique utilisateur : il y a la rubrique "journal", et "sous" cette rubrique il y a les articles de 2008, et "dessous" les articles d'août, et "dessous" un article précis.
Ce qui permettait, après mini-ajout dans le htaccess, d'appeler directement /journal/2008 par exemple, qui derrière transformait invisiblement en /journal/?annee=2008

Mais je comprends tout à fait que techniquement parlant il y ait un problème assez conséquent à résoudre. En attendant, nous avons utilisé le _url_arbo_sep_id, ce qui nous donne donc :
/journal/2008-08-machin-chose.html

Au niveau esthétique et sémantique, cela reste correct, en revanche il est beaucoup moins immédiat d'enlever la fin pour aller chercher /journal/2008-08, puisqu'on a plus l'impression d'une arborescence, mais juste d'une info ajoutée.

Mais c'est pas grave.
Juste pour expliquer.

Une solution -- pas optimale certes, mais opérationnelle -- consisterait à créer ces rubriques "2008", "08", etc. et à y déplacer les articles.

A noter que j'utilisais aussi ce genre d'URL auparavant, mais que je suis revenu à des URLs plus simples, personne ne navigant finalement dans les archives par année ou mois, mais essentiellement via la recherche ou les tags. Tu pourrais faire de même, et tes problèmes seraient résolus... :wink:

-Nicolas

Une fois de plus, j'adhère totalement à cette approche dans la théorie, mais dans la pratique, est-ce que proposer une solution complète et viable, même si moins « pure » conceptuellement, n'est pas mieux que proposer une nouvelle fonctionnalité dont la résistance aux lubies des utilisateurs n'est pas totalement éprouvée ?

J'ai peur que certains voient -- à juste titre -- avec bonheur arriver des URL propres arborescentes avec SPIP 2.0, mais se trouvent vite confrontés à des problèmes similaires à ceux déjà soulevés, ce qui sera sans doute contre productif.

Ou alors, peut-être faudrait-il pour l'instant passer sous silence cette nouveauté, le temps de la parfaire, voire même la déplacer en plugin, ce qui faciliterait les contributions.

-Nicolas