Pagination alphabétique / ordre de tri
On fournit 2 squelettes génériques pour la pagination alphabétique des contacts et organisations : inclure/pagination_alpha_xxx.html
Actuel
Pour obtenir la liste des lettres, on extrait simplement le 1er charactère des noms : {fusion LOWER(SUBSTR(nom,1,1))}
.
Hors certains noms peuvent commencer par une parenthèse, un espace, une apostrophe, un tiret, etc.
Voici ce que j'obtiens sur une base de plusieurs dizaines de milliers de contacts, qui contient quelques entrées un peu pourries j'en conviens :
, ,',(,-,.,1,2,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,_,|,ø,þ,ł,γ,δ,κ,μ,ν,π,σ,е,л,м,н,п,с,т,ح,س,अ,น,,俊,刘,叶,婷,季,常,张,張,徐,李,梁,王,胡,苏,赵,连,金,陈,陳,雷,서,인,한
Évolution
Pour une pagination alphabétique, ce qui nous intéresse ce sont les 1ères "vraies" lettres et non pas nécessairement les 1ers caractères.
On pourrait essayer d'affiner un peu l'extraction des 1ère lettres pour arriver à cela. Je dis bien juste "un peu", sans aller dans des considérations trop compliquées qui dépendent des langues.
Avec une regex qui prend la 1ère lettre du 1er mot trouvé, on a déjà quelque chose de plus correct :
SELECT REGEXP_SUBSTR(LOWER(nom), '\\w') AS premiere_lettre
FROM spip_contacts
GROUP BY premiere_lettre
ORDER BY premiere_lettre ASC
NULL,1,2,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,_,ø,þ,ł,γ,δ,κ,μ,ν,π,σ,е,л,м,н,п,с,т,ح,س,अ,น,俊,刘,叶,婷,季,常,张,張,徐,李,梁,王,胡,苏,赵,连,金,陈,陳,雷,서,인,한
L'intérêt étant surtout que "-Georges" devient classé dans les "G" par exemple, et non plus dans "-", etc.
Pour cela il faut que dans la boucle qui liste les contacts, le tri se fasse également sur la 1ère lettre extraite, c'est pour ça que j'imagine un critère {premiere_lettre}
par exemple qui ajouterait celle-ci en alias dans le select : ensuite on pourrait faire un group by et/ou un order by dessus selon les besoins.
Et le critère pourrait permettre de choisir optionnellement depuis quel champ extraire la lettre : par défaut c'est le nom, mais ça pourrait tout aussi bien être le prénom (dans nextcould c'est ce qu'ils font). Ou alors une concatenation des 2, comme ça si le prenom est vide ça prend le nom : {premiere_lettre prenom} {premiere_lettre nom} {premiere_lettre prenom_nom}
Plus une balise #PREMIERE_LETTRE
pour le squelette de pagination.
Ça serait bien pratique pour les contacts et orgas, mais c'est valable ailleurs aussi, pour les auteurs ou autres. Du coup il atterrirait où ? Ici ? Dans Bonux ? Dans le Core ?