Le .htacces est donc simplifié et mérite d'être recopié à partir du htaccess.txt fourni. Le titre général du seul paramètre page qui y figure encore est désormais '''type_urls''' pour avoir un message d'erreur plus clair lorsque la variable homonyme n'a pas été affectée dans mes_options.
Enfin, le couteux '''charger_generer_url''' qui cherche d'abord les anciens fichiers '''.php3''' n'est plus appelé dans ce cadre qu'en dernier recours, les différentes définitions de '''recuperer_parametre_url''' étant remplacées par la famille '''urls_propres_dist urls_html_dist urls_page_dist''' etc, avec le '''charger_fonction''' usuel. Pour ceux qui ont leur '''type_urls''' personnels, la compatibilité est normalement assurée, mais renommer leur '''recuperer_parametre_url''' leur fera bénéficier de cette amélioration.
Comme auparavant, une URL propre d'un objet publié est créée le plus souvent lorsque qu'une page qui la référence est visualisée dans l'espace public. Comme auparavant, il est nécessaire qu'un administrateur clique sur "voir en ligne" ou "prévisualiser" pour provoquer un nouveau calcul. En revanche, ce nouveau calcul interviendra systématiquement (plus besoin de dépublier puis republier), et s'il fournit une URL différente, elle n'écrasera pas l'ancienne, mais viendra s'ajouter comme URL la plus récemment introduite. Lors des appels ultérieurs de la fonction de génération d'URL associée, elle sera donc choisi prioritairement. Au cas où une nouvelle modification produit un calcul d'URL retombant sur une ancienne URL propre, la date d'introduction de celle-ci est actualisée afin qu'elle redevienne prioritaire, ce qui permet de respecter la contrainte d'unicité et d'éviter aux indécis de remplir cette table par leurs begaiements.
Ces nouvelles URL profitent du travail pionnier entamé par Toggg sur spip_zonesous le nom d'[http://zone.spip.org/trac/spip-zone/browser/_plugins_/_dev_/urls_libres URLS libres]. L'implémentation en est toutefois différente, afin de satisafaire aux besoins de PostGres. Aussi, elles sont gérées par une table ayant ces valeurs comme clé primaire, ce qui devrait accélérer leur recherche, et permet d'évacuer le dernier verrou spécifique à MySQL.
Remarque: au moment de la mise à jour avec cette nouvelle implémentation, les URLs propre courament dans la base seront recopiées dans la nouvelle table, sans aucune perte.
En conséquence, l'annonce de [9852] est modifiée: '''spip_fetch_array''' est remplacée par '''sql_fetch'''. Rien de modifié en revanche en ce qui concerne le fait que spip_fetch_array avec un deuxième argument égal à SPIP_NUM n'a pas d'équivalent et doit être réécrit si on éviter le recours à vieilles_def.php.
Dépot obtenu par le script suivant:
{{{
grep -v '// http://doc.spip.org/@spip_abstract_' base/abstract_sql.php > b
mv b base/abstract_sql.php
for i in $(grep -l "spip_abstract_" */*p|grep -v vieilles_def)
do
sed "s/spip_abstract_/sql_/g" $i > x; mv x $i
done
}}}
et intervention manuelle sur vieilles_def.php.
Ce dépot résulte donc du retrait des deux définitions de '''spip_fetch_array''' présentes dans source:spip/ecrire/base/db_mysql.php et source:spip/ecrire/base/db_pg.php (qui peuvent donc être chargés simultanément à présent si nécessaire) et de l'application du script suivant dans le répertoire '''ecrire''':
{{{
for i in $(grep -l spip_fetch_array */*p|grep -v vieilles_def)
do
sed s/spip_fetch_array/spip_abstract_fetch/g $i > x
mv x $i
done
}}}
Ces fonctions n'admettaient auparavant qu'un seul argument, index de la clé primaire dans la table correspondante. En conséquence, il n'était pas possible d'exploiter à fond les possibilités des raccourcis données par la RegExp:
define('_RACCOURCI_URL', ',^\s*(\w*?)\s*(\d+)(\?(.*?))?(#([^\s]*))?$,S');
qui autorise explicitement paramètres supplémentaires et ancre, lesquels étaient
raoutés ultérieurement, et mal à propos en cas de redirection.
A présent, les fonctions generer_url_*objet sont appelées avec les 2 arguments supplémentaires trouvés dans le raccourci, le premier étant censé etre une suite n1=v1&n2=v2 et le deuxième une ancre. Les définitions standards de ces jeux de
fonctions (urls/page urls/html urls/propres et inc/urls) admettent ces nouveaux arguments et les injectent dans les URL construites. Dans le cas où les URLs sont en fait des scripts qui provoqueront une redirection, l'ancre est fourni sous la forme "ancre=nom", le script de redirection synthétisant "#$ancre" dans l'URL finale.
Compatibilité:
- totale pour les sites sans mes_options.php personnelle;
- vraisemblablement assurée pour ceux définissant un jeu de fonctions generer_url_$objet car:
-- PHP ne dit rien en présence d'arguments excédentaires
-- les variantes generer_url_ecrire_$objet admettaient certes déjà un 2e argument, mais son utilisation comportait un bug suggérant qu'il n'avait jamais utilisé en dehors du noyau de Spip où il était transparent (cet argument est donc maintenant en 4e position, et permet de forcer le statut de l'objet)
-- le 2e argument generer_url_forum n'avait jamais été utilisé;
-- ce sont à présent ces fonctions qui doivent rajouter la suite d'arguments supplémentaires et l'ancre, mais il est douteux que certaines comptaient dessus sinon la faute de conception motivant ce dépot aurait été signalée depuis longtemps;
- pour le sous-jeu de fonctions calculer_url_$objet, il reçoit à présent en 3e argument ce qu'a calculé le generer_url_$objet correspondant, ce qui leur facilite le travail. A noter une curieuse dissymétrie pour le raccourci des sites, qui dans ce cas retoune l'URL du site et non du script (conservée telle quelle).
A signaler également que la RegExp des raccourcis était assez laxiste, cherchanten vain des fonctions generer_url_$objet avec $objet n'étant pas nécessairement un \w+.
et exclusivement pour cela.
La transformation des fichiers a été obtenue par le script suivant:
#!/bin/sh
a=$(grep -l "'\" *\\. *addslashes([^)]*) *\\. *\"'" */*p)
for i in $a
do
sed -e "s/'\"[[:space:]]*\.[[:space:]]*addslashes\(([^)]*)\)[[:space:]]*\.[[:space:]]*\"'/\" . spip_abstract_quote\1 . \"/g;" -e 's/ *\. *""//' $i > x.php
mv x.php $i
done
plus quelques interventions manuelles, en particulier, le FIND_IN_SET du critere IN a ete remplacé par un FIELD, plus facile a produire dans ce contexte. Il y avait aussi un peu d'incoherence entites_html / addslashes ici ou là. Enfin, le Having, actuellement toujours inutilisé par le compilateur, est a nouveau bon pour le service.
ajout de tables de relations entre les documents et les sites/articles syndiqués, de manière à pouvoir lire les fichiers RSS de "podcasting", et plus généralement d'échanger des fichiers entre sites.
ajout d'un chmap 'distant' dans la table spip_documents, de manière à pouvoir a terme référencer des documents ailleurs qu'en local (interface à développer)
Avec en plus :
- correction deux trois bugs (hiérarchie, et mauvaise création
de tables dans inc-base)
- optimisation des boucles hiérarchie (en observant les
requêtes générées par les squelettes par défaut)