Critère {par sinum titre,num titre} pas assez strict
Bonjour,
Suite a l'utilisation des critères suivant pour une boucle article : "{par sinum titre,num titre}{!par date}", je ne m'attendais pas a ce que tout article commençant par un chiffre soit mis en avant comme cela devait être uniquement pour ceux ayant la syntaxe "10. Titre" (chiffre, point, espace, titre). Hors c'est ce qui se passe car la requête SLQ est la suivante :
SELECT CASE (0+articles.titre) WHEN 0 THEN 1 ELSE 0 END AS sinum, 0+articles.titre AS num1,
articles.date, articles.id_article, articles.virtuel, articles.titre, articles.date_modif, articles.descriptif, articles.lang
FROM spip_articles AS `articles`
WHERE (articles.statut = 'publie')
AND (articles.id_rubrique = 90)
AND ((articles.id_article NOT IN (250)))
ORDER BY sinum, num1, articles.date DESC
Est-ce voulu ou une coquille ? Pour ma part, j'ai donc fabriquer un nouveau critère : "parnumstricte" qui ne reconnait que l'écriture "10. Titre" (chiffre, point, espace, titre) et qui donne comme requête :
SELECT CASE WHEN articles.titre regexp '^[0-9]+[.] ' THEN 0 ELSE 1 END AS ap_sinum,
CASE when articles.titre regexp '^[0-9]+[.] ' then 0+articles.titre else 0 end AS ap_num,
articles.date, articles.id_article, articles.virtuel, articles.titre, articles.date_modif, articles.descriptif, articles.lang
FROM spip_articles AS `articles`
WHERE (articles.statut = 'publie')
AND (articles.id_rubrique = 90)
AND ((articles.id_article NOT IN (250)))
ORDER BY ap_sinum, ap_num, articles.date DESC
Je vous donne la fonction simple de ce critère (a mettre dans "mes_options) :
// truc a l'arrache qui marche seul {parnumstricte} comme seul critere qui altere l'ordre
// et uniquement sur la base spip_articles
function critere_parnumstricte($idb,&$boucle,$crit) {
$b=&$boucle[$idb];
if(isset($b->from['articles'])) {
$b->select[]='CASE WHEN articles.titre regexp \'^[0-9]+[.] \' THEN 0 ELSE 1 END AS ap_sinum';
$b->select[]='CASE when articles.titre regexp \'^[0-9]+[.] \' then 0+articles.titre else 0 end AS ap_num';
$b->order[]="'ap_sinum,ap_num,articles.date DESC'";
}
}
Ce critère "{parnumstricte}" fait la même chose que "{par sinum titre,num titre}{!par date}" mais ne propulse en avant que les articles ayant la syntaxe stricte : "10. Titre" (chiffre, point, espace, titre).
Nota : c'est normal que se soit une fonction brouillon et très sale !!, je ne l'utilise qu'une fois et uniquement sur une boucle ARTICLES. Je l'ai citée comme exemple de ce qui pourrait être implanter dans le vrai critère "par sinum titre" n'ayant pas eu le temps d'en finalisé l'analyse.