Le critère {collecte}
, permet de forcer la requête sql, générée par la boucle à laquelle il est passé, à utiliser un interclassement spécifique pour la clause « ORDER BY » (critère {par ...}
).
Exemple
Supposons une base en utf-8 avec ses tables en utf8 (DEFAULT CHARSET = utf8)
dans ce jeu de caractère (CHARACTER_SET_NAME)
il est possible d’utiliser 21 collations (interclassements) différentes [1] :
COLLATION_NAME | CHARACTER_SET_NAME |
---|---|
utf8_bin | utf8 |
utf8_czech_ci | utf8 |
utf8_danish_ci | utf8 |
utf8_esperanto_ci | utf8 |
utf8_estonian_ci | utf8 |
utf8_general_ci | utf8 |
utf8_hungarian_ci | utf8 |
utf8_icelandic_ci | utf8 |
utf8_latvian_ci | utf8 |
utf8_lithuanian_ci | utf8 |
utf8_persian_ci | utf8 |
utf8_polish_ci | utf8 |
utf8_roman_ci | utf8 |
utf8_romanian_ci | utf8 |
utf8_slovak_ci | utf8 |
utf8_slovenian_ci | utf8 |
utf8_spanish2_ci | utf8 |
utf8_spanish_ci | utf8 |
utf8_swedish_ci | utf8 |
utf8_turkish_ci | utf8 |
utf8_unicode_ci | utf8 |
À partir de là, imaginons que dans la table « spip_articles »
de cette base, table par défaut en interclassement utf8_general_ci,
se trouvent les articles titrés :
NananinaNinaNiñaÑiñañinaÑinaNonoNunu
La boucle :
<BOUCLE_a(ARTICLES) {par titre} {"<br />"}>
#TITRE
</BOUCLE_a>
retournera ces articles dans l’ordre alphabétique correspondant à l’interclassement par défaut de la table :
NananinaÑinaNinaNiñaÑiñañinaNonoNunu
La boucle :
#SET{collation, utf8_spanish_ci}
<BOUCLE_a(ARTICLES) {par titre} {collecte #GET{collation}} {"<br />"}>
#TITRE
</BOUCLE_a>
retournera, elle, ces articles dans l’ordre alphabétique correspondant à l’interclassement demandé :
NananinaNinaNiñaNonoNunuÑinañinaÑiña
Ainsi les ñ (n à tilde) seront classés après les n (n nus).
Cela correspond en effet à l’ordre alphabétique castillan :
- « Le ñ est la quinzième lettre de version castillane de l’alphabet latin,
entre le N et le O dans l’ordre alphabétique. » http://fr.wikipedia.org/wiki/%C3%91
La requête MySQL produite est alors :
SELECT articles.titre, articles.lang
FROM spip_articles AS `articles`
WHERE articles.statut = 'publie'
AND articles.date < '9999-12-31'
ORDER BY articles.titre COLLATE utf8_spanish2_ci
Limite
Il n’est pas possible de faire fonctionner le critère {collecte}
en lui affectant « directement » sa valeur dans la liste des arguments
de boucle : les {collecte utf8_spanish_ci}
, {collecte 'utf8_spanish_ci'}
, {collecte{utf8_spanish_ci}}
... ne fonctionneront pas et afficheront une erreur php.
Il n’est possible de l’utiliser que par #GET{}
après l’avoir
préalablement déclaré en #SET{}