Des exemples avaient déjà étés données pour des versions antérieures de SPIP, mais la 1.9 permet de faire ça avec bien plus de facilité : dans le premier exemple ci-dessous, la boucle BOUCLE_articles du squelette rubrique.html a été modifié pour offrir aux visteurs le choix entre un tri par date et un tri par popularité.
[(#REM) Articles de la rubrique ]
<B_articles>
<div class="liste-articles">
<hr />
#ANCRE_PAGINATION
<h2><i><:articles_rubrique:>, [(#CLASSEMENT|=={date}|?{<:classes_par_date:>:</i> (<a href="#URL_RUBRIQUE#pagination_articles"><:classes_par_popularite:></a>),<:classes_par_popularite:>:</i> (<a href="#URL_RUBRIQUE&classement=date#pagination_articles"><:classes_par_date:></a>)})]</h2>
[<p class="pagination">(#PAGINATION)</p>]
<ul>
<BOUCLE_articles(ARTICLES) {id_rubrique} {par (#CLASSEMENT|=={date}|?{date,popularite})}{inverse} {pagination}>
<li>
<h3 class="titre"><a href="#URL_ARTICLE">#TITRE</a></h3>
<small>[(#DATE_REDAC|affdate|sinon{#DATE|affdate})][, <:par_auteur:> (#LESAUTEURS)]</small>
</li>
</BOUCLE_articles>
</ul>
</div>
</B_articles>
Dans cet exemple simple, les articles sont, par défaut, classés par popularité. pour les classer par date, un lien renvoie sur la même page (rubrique.html), avec un paramètre de plus dans l’URL : le paramètre « classement ». Celui-ci sert ensuite de critère de test à la fois pour afficher le classement actuel et pour modifier l’ordre de tri. On passe également dans l’URL l’ancre pagination #ANCRE_PAGINATION pour permettre une navigation agréable.
Pour utiliser ce code tel quel, il vous faut également ajouter à vos squelettes un fichier de langue local_fr.php qui contiendra (en plus des autres chaïnes), les textes correspondant aux ordres de tri utilisés :
...
'classes_par_date' => 'classés par <u>date</u>',
'classes_par_popularite' => 'classés par <u>popularité</u>',
...
Enfin, je précise que ce (petit) changement est compatible avec l’existant, et n’oblige pas à un recalcul complet par vidage du cache.
Tri des résultats d’une recherche
Sur le même principe, voici une page de résultats d’une recherche offrant au visiteur le choix de l’ordre de tri. C’est à peine plus compliqué :
[(#REM) Articles trouves ]
<B_articles>
[<div class="cartouche">
<form id="tri" action="#SELF" method="get" name="tri">
<h1 class="surtitre"><:resultats_recherche:> <b>«(#RECHERCHE)»</b>, <:tries_par:>
<input type="hidden" name="page" value="recherche" />
<input type="hidden" name="recherche" value="#RECHERCHE" />
<select class="" name="tri" onchange="submit(); " class="spip_bouton">
<option value="points"[(#TRI|=={points}|?{' selected="selected" class="selected"'})] /><:pertinence:></option>
<option value="popularite"[(#TRI|=={popularite}|?{' selected="selected" class="selected"'})] /><:popularite:></option>
<option value="visites"[(#TRI|=={visites}|?{' selected="selected" class="selected"'})] /><:nb_de_visites:></option>
<option value="date_redac"[(#TRI|=={date_redac}|?{' selected="selected" class="selected"'})] /><:date_de_redaction:></option>
<option value="date"[(#TRI|=={date}|?{' selected="selected" class="selected"'})] /><:date_de_publication:></option>
</select>
<input type="checkbox" name="ordre" [(#ORDRE|=={on}|?{'checked '})]onchange="submit();">[(#ORDRE|?{↑,↓})] </input>
<noscript>
<input type="submit" value="<:trier:>" class="spip_bouton" />
</noscript>
</h1>
</form>
</div>]
<div class="liste-articles">
#ANCRE_PAGINATION
<h2 class="invisible"><:articles:></h2>
<ul>
<BOUCLE_articles(ARTICLES) {recherche} {par (#TRI|?{#TRI,points})} {inverse (#ORDRE|?{0,1})} {pagination}>
<li>
<h3 class="titre"><a href="#URL_ARTICLE" title="#DESCRIPTION">#TITRE</a></h3>
<small>[<a title="<:pertinence:>: #POINTS - <:visites:>: #VISITES - <:popularite:>: #POPULARITE[ - <:date_de_publication:>: (#DATE|affdate)]">(#DATE_REDAC|affdate|sinon{#DATE|affdate})</a>][, <:par_auteur:> (#LESAUTEURS)]</small>
</li>
</BOUCLE_articles>
</ul>
[<p class="pagination">(#PAGINATION)</p>]
</div>
</B_articles>
</B_articles>
<p><:aucun_article:></p>
<//B_articles>
François Schreuer avait déjà proposé une conribution à ce sujet en 2005, mais il semblait possible, le progrès aidant ( ;-), de faire à la fois plus compact et plus riche fonctionnellement.
On notera que l’astuce utilisée pour gérer l’ordre de tri croissant ou décroissant utilise la nouvelle syntaxe disponible pour {inverse}
:
{inverse (#ORDRE|?{0,1})}
Ce paramètre-là peut s’utiliser aussi bien pour les articles trouvés que pour les brèves, messages de forums, etc. Ce n’est pas le cas pour tous les paramètres : il faut que le champ existe en base de données pour le type d’objet considéré.
Afin de fonctionner même si javascript est désactivé, un bouton « submit » est affiché uniquement dans ce cas, grâce au tag <noscript>.
Enfin, il convient bien entendu d’ajouter les chaînes de caractères adéquates dans les fichiers de langues.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |