Filtrer les libellés dans les articles

Filtrer les libellés dans les articles

Dans le gadget libellé, il est possible de sélectionner les libellés que l'on souhaite afficher. Par contre, dans les articles, cette "option" n'existe pas.
Grâce au XML et aux opérateurs Blogger, vous pouvez filtrer vos libellés en choisissant des critères spécifiques.

Trouver le code des libellés

Par défaut, l'option "libellés" s'affiche sous les articles parmi d'autres options. C'est le code de cette section que nous allons retravailler.




Pour trouver le code correspondant à cette option, rendez-vous dans l'éditeur HTML de votre modèle :

  • Tableau de bord
  • Modèle
  • Modifier le code HTML


Recherchez le code de l'option "libellés" qui se situe dans le widget Blog, et localisez le tableau data:post.labels :

XML
<b:loop values='data:post.labels' var='label'>
  <a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='not data:label.isLast'>,</b:if>
</b:loop>

Pour pouvoir filtrer le contenu du tableau data:post.labels, il suffit d'utiliser un opérateur, en particulier un lambda et d'y ajouter un ou plusieurs critères qui n'afficheront que les libellés correspondants aux critères.




Autant dire que le nombre de combinaisons est relativement très élevé...


Filtrer le tableau avec un lambda

...Et de ce fait, vous ne retrouvez ici que quelques syntaxes.
Ces exemples utilisent l'opérateur lambda where qui filtre tous les sets correspondants au critère. Pour filtrer uniquement le premier set correspondant au critère, remplacez where par first.


Uniquement ces libellés
data:post.labels where (l => l.name in ["Frites","Chocolat","Hamburger"])

Sauf ces libellés
data:post.labels where (l => l.name not in ["Frites","Chocolat","Hamburger"])

Uniquement ce libellé
data:post.labels where (l => l.name == "Frites")

Sauf ce libellé
data:post.labels where (l => l.name != "Frites")

Uniquement les libellés contenant cette chaîne de caractères
data:post.labels where (l => l.name contains "Frit")

Sauf les libellés contenant cette chaîne de caractères
data:post.labels where (l => l.name not contains "Frit")

Uniquement les libellés ayant plus de 10 caractères
data:post.labels where (l => l.name.size gt 10)

Uniquement les libellés ayant moins de 10 caractères
data:post.labels where (l => l.name.size lt 10)


Limiter la quantité de libellés

Pour n'afficher qu'un nombre restreint de libellés, il faut employer l'opérateur limit.

La syntaxe
array limit number

Uniquement les 3 premiers libellés
data:post.labels limit 3

Uniquement la première moitié des libellés
data:post.labels limit (data:post.labels.size / 2)

Uniquement les 3 premiers libellés filtrés
(data:post.labels where (l => l.name.size gt 10)) limit 3


De plousse en plousse difficile

A présent, compliquons un peu la tâche. Imaginez que l'on veuille filtrer le même tableau de libellés avec des critères qui varient en fonction d'autres critères.
Par exemple, utiliser un filtre spécifique dans les pages index et un autre filtre dans les autres pages.
Il faut employer un sélecteur ternaire. Dans ce cas, il s'agira d'imbriquer les opérations.


Syntaxe
condition ? array : array

Choix entre 2 filtres
data:blog.pageType == "index" ? data:post.labels where (l => l.name in ["Frites","Chocolat","Hamburger"]) : data:post.labels


Et la virgule ?

Dans le code fourni par défaut, la virgule apparaît derrière chaque libellé, excepté le dernier libellé.
En appliquant un filtre, la condition qui empêche d'afficher cette dernière virgule n'est plus en mesure de fonctionner correctement, parce que la condition utilise le tableau original.




Pour rétablir un sens cohérent à cette condition, il faut lui dire qu'il faut se référer au tableau filtré. Pour cela, il faut déplacer le filtre dans un alias de variable et modifier la donnée contenue dans la condition.


<b:with value='data:post.labels where (l => l.name in ["Frites","Chocolat","Hamburger"])' var='filtreLabel'>
  <b:loop index='i' values='data:filtreLabel' var='label'>
    <a expr:href='data:label.url' rel='tag'><data:label.name/></a><b:if cond='data:filtreLabel.size != data:i + 1'>,</b:if>
  </b:loop>
</b:with>


Après avoir effectué ces modifications, la dernière virgule n'apparaîtra plus.




Spotlight

Populaires cette semaine