Plutot qu'un code specifique, on utilise la fonction generique calcul_hierarchie_in() que l'on modifie pour tenir compte de ce cas limite. Pour etre homogene, on inverse l'ordre des rubriques qu'elle renvoie.
En complement : la condition where est generee au calcul par la fonction quete_condition_where_statut (homogene a quete_condition_postdates) en lieu et place de calculer_where_statut
Refonte du code de generation des composants de la requete. En particulier la clause static qui existait sur chaque composante separee a ete remplacee par un (!isset()) puisque c'est maintenant le tableau $command qui est static. On factorise donc la clause (!isset()) pour ne l'evaluer qu'une fois, et on peut restreindre le cas static a la presence de variable reperees par un $ dans la clause calculee.
Corrolairement, et pour n'evaluer qu'une fois le where de la plupart des boucles, on remplace la globale $var_preview par une constante _VAR_PREVIEW, celle-ci n'etant pas supposee changer au cours d'un hit. Le meme travail serait a faire sur ses homologues $var_xxx pour plus de lisibilite du code
Je profite de cette écriture massive pour normaliser quelque chose de trompeur lorsqu'on compare deux versions, savoir l'usage de " ou ' dans le premier argument de define et defined. Comme les chaînes entre apostrophes sont plus rapidement analysées que celles entre guillemets, je choisis l'apostrophe.
Dépot obtenu avec le script Shell:
{{{
a=$(find . -name "*.php" |grep -v extensions/ | grep -v /config/ | grep -v index.php | grep -v public.php | grep -v prive.php )
echo -n "Fichiers: "
echo $a|wc -w
for i in $a
do
sed -f ~/Sites/spip/spip.sed $i > /tmp/f.php
if diff -q $i /tmp/f.php
then
:
else
diff $i /tmp/f.php
# echo $i; php /tmp/f.php
# mv /tmp/f.php $i
fi
done
}}}
et le script Sed:
{{{
s/Copyright (c) 2001-20../Copyright (c) 2001-2011/
s,\(if [(]!*\)*\(defined* *[(]\)"\([^"]*\)"\(.*\);[[:space:]]*[#/]*.*$,\1\2'\3'\4;,
}}}
via la globale table_statut :
$table_statut[nom_table][] = array(
'champ'=>'statut', // champ de la table sur lequel porte le filtrage par le statut
'publie'=>'publie', // valeur ou liste de valeurs, qui definissent l'objet comme publie.
'previsu'=>'publie,prop', // valeur ou liste de valeurs qui sont visibles en previsu
'post_date'=>'date', // un champ de date pour la prise en compte des post_dates, ou rien sinon
'exception'=>'statut', // liste des modificateurs qui annulent le filtrage par statut
// si plusieurs valeurs : array('statut','tout','lien')
);
Pour 'publier' ou 'previsu', si la chaine commence par un "!" on exclu au lieu de filtrer sur les valeurs donnees
si la chaine est vide, on ne garde rien si elle est seulement "!" on n'exclu rien
Si le statut repose sur une jointure, 'champ' est alors un tableau du format suivant :
'champ'=>array(
array(table1, cle1),
...
array(tablen, clen),
champstatut
)
champstatut est alors le champ statut sur la 'tablen'
dans les jointures, 'clen' peut etre un tableau pour une jointure complexe : array('id_objet','id_article','objet','article')
On evacue le codes des boucles sur les tables articles, auteurs, et rubriques.
La table documents est en sursis, son cas est deja regle dans le plugin mediatheque
et permettra aussi de gerer les liens auteur sur n'importe quel objet. On a en plus un champ vu sur la table de liaison, qui est utilise dans la messagerie.
On pourra avoir plus tard un champ role permettant de distinguer les roles des auteurs.
Ce premier commit met a jour toutes les requetes SQL, et prend en charge l'upgrade de la base.
Mais il n'est pas encore totalement fonctionnel.
debug a suivre.
qui prend en entree le champ date a comparer,
et produit en sortie la condition complete ou 1=1 (elimine ensuite par le compilateur) si pas d'article dans le futur
En conséquence, retour du champ {((mode}}} en rétablissant les fichiers pre[14588]. La MAJ pour les installations ayant chargé cette version restaurera ce nom de champ, les autres auront une mise à jour qui se réduira à changer le numéro de version installée, pas la peine de faire et défaire.
A noter que la fonction {{{inc_joindre}}} continue à attendre un tableau dont un des index est {{{mode}}}: c'est sans doute étrange mais ça fait du travail en moins. Si on y tient absolument, on pourra aussi le changer: c'est le ''travailler plus pour nommer plus''.
ce qui la rend extensible et utilisable par les plugins pour tout type d'objet
l'upgrade devrait se faire a partir de la table spip_documents_liens precedente ou des anciennes tables spip_documents_xxx selon le point de depart
En fait le problème se pose pour la centaine d'appel aux fonctions {{{quete_*}}}, il faudra faire une revue générale Je corrige juste la boucle en question en expansant {{{calculer_hierarchie}}} dans le code produit pour éviter d'agraver la situation ailleurs (i.e. {{{EXPOSE}}}). Du reste, ca rapproche syntaxiquement toutes les requêtes faites pour cette boucle, il y a surement meilleure implémentation.
une fonction dans inc/documents permet de lister les documents orphelins, une autre permet de les supprimer en base et physiquement dans IMG/ ; mais elles ne sont pas indispensables pour resoudre le probleme : c'est dans la boucle DOCUMENTS qu'on ajoute des jointures marrantes ; je laisse donc provisoirement en option, le temps qu'on en discute
ces jointures demontrent, a mon avis, qu'il n'est pas souhaitable de multiplier les tables spip_documents_(objets), et qu'il faudrait plutot en faire une seule avec un champ type d'objet