Un sommaire pour chaque machine

Les amateurs de jeux vidéo possèdent généralement une seule machine (deux pour les accros, trois pour les collectionneurs...). Une page de sommaire général, si elle se justifie à l’arrivée sur le site (le visiteur indique l’URL du site, on ne sait donc pas à priori ce qu’il utilise comme machine), contient trop d’informations superflues pour le propriétaire d’une seule machine : le possesseur d’une Playstation 2 n’est pas concerné par le dernier jeu sorti sur Dreamcast.

Donc, il faut pouvoir présenter un sommaire différent pour chaque machine. Un sommaire qui n’affiche que les jeux de cette machine.

Nous allons donc créer un squelette dont le contenu change en fonction de la machine. Nous nommerons ces fichiers : « sommaire_machine.php3 » et « sommaire_machine.html ». La machine étant indiquée, dans notre structure, par un mot-clé, ces pages dépendront donc d’un « id_mot ». Chaque machine différente sera donc appelée par une URL du type :
-  sommaire_machine.php3 ?id_mot=23 (23 étant le numéro du mot-clé de la machine).

Revenons à notre sommaire général : nous allons y inclure les liens vers ces sommaires spécialisés ; la création automatique de ces liens (avec les « id_mot » correspondants) nous évitera de devoir effectuer les tests en cherchant les numéros (id_mot) de chaque machine. Dans « sommaire.html », insérons la boucle suivante :

<table cellpadding=5><tr>
<BOUCLE_somm_mac(MOTS){type=Machines}{par titre}>
<td><a href="sommaire_machine.php3?id_mot=#ID_MOT">#LOGO_MOT</a></td>
</BOUCLE_somm_mac>
</tr></table>

Attention : si l’on a réalisé des logos avec survol, le lien ne fonctionnera pas correctement, car SPIP ajoutera une commande javascript. Le code ci-dessus ne fonctionne qu’à la condition que le logo de chaque mot ne soit constitué que d’un unique fichier (pas d’image de survol).

Le moyen le plus simple et le plus efficace d’éviter un tel désagrément consiste à ne pas utiliser directement #LOGO_MOT, qui construit l’intégralité de la balise HTML de l’image, éventuellement avec un petit code javascript pour gérer le survol, mais à la place l’appel d’une image dont le fichier est : [(#LOGO_MOT|fichier)] (ce qui retourne uniquement le nom du fichier de l’image).

La boucle devient :

<table cellpadding=5><tr>
<BOUCLE_somm_mac(MOTS){type=Machines}{par titre}>
<td><a href="sommaire_machine.php3?id_mot=#ID_MOT"><img src='IMG/[(#LOGO_MOT|fichier)]' border=0></a>
</td>
</BOUCLE_somm_mac>
</tr></table>

Le fichier « sommaire_machine.php3 »

Comme toujours :

<?php
$fond = "sommaire_machine";
$delais = 24 * 3600;

include ("inc-public.php3");
?>

Le squelette du sommaire par machine

Inutile de nous compliquer la vie : dupliquons le fichier « sommaire.html », et renommons-le « sommaire_machine.html ».

Puisque cette page dépend d’un « id_mot », nous commençons par ajouter une BOUCLE_principale qui va contenir l’intégralité des autres boucles. Il suffit donc d’ajouter l’appel de cette boucle juste après <body> et de la refermer juste avant </body> (tout en fin de fichier) :

<body>
<BOUCLE_principale(MOTS){id_mot}>

     ...

</BOUCLE_principale>
</body>

Le titre de la page, qui jusqu’à présent ne contenait que : <h1>#NOM_SITE_SPIP</h1, est modifié pour afficher le nom et le logo de la machine (c’est-à-dire du mot-clé correspondant à « id_mot ») :

<h1>#NOM_SITE_SPIP / #LOGO_MOT #TITRE</h1>

La BOUCLE_somm_mac, qui affiche tous les logos des machines pour créer les liens vers les sommaires spécifiques, ne doit plus contenir le logo de la machine principale (nous sommes déjà sur cette page, inutile donc de créer un lien vers elle-même). Il suffit d’insérer le critère {exclus} dans la définition de cette boucle :

<BOUCLE_somm_mac(MOTS){type=Machines}{exclus}{par titre}>
...
</BOUCLE_somm_mac>

La BOUCLE_tests, qui affiche les derniers tests publiés, ne doit désormais afficher que les tests qui concernent des jeux sur la machine sélectionnée. Pour cela, nous allons ajouter à l’intérieur de cette boucle une BOUCLE_verif_test, qui va vérifier pour chaque article qu’il concerne bien la machine choisie.

Inconvénient désormais : la BOUCLE_tests affichait les cinq derniers tests. Désormais, sur ces cinq articles, nous ne sélectionnons que ceux qui concernent notre machine. Il est fort probable que cela donne moins de cinq articles, et dans certains cas extrêmes, cela n’affichera plus aucun article. Modifions le critère, et décidons d’afficher non pas les cinq derniers tests ({0,5}), mais tous les tests publiés depuis moins de trois mois ({age<90}) ; on pourra modifier cette valeur en fonction de l’activité réelle du site (si le site est très actif, on réduira le délai de cette boucle, si le site publie peu d’articles, on pourra le rallonger).

Au passage, supprimons la petite boucle qui affichait le logo des machines concernées : cela devient inutile, puisque cette page n’affiche que les informations d’une unique machine.

La boucle devient :

<BOUCLE_tests(ARTICLES){titre_mot=test}{par date}{inverse}{age < 90}>
<BOUCLE_verif_test(ARTICLES){id_article}{id_mot}>
	<p><div style="border:1px solid black">
		
	[(#LOGO_ARTICLE_RUBRIQUE|left|#URL_ARTICLE)]

	<BOUCLE_rub_tests(RUBRIQUES){id_rubrique}>
	<h3>#TITRE</h3>
	</BOUCLE_rub_tests>

	<h4>#TITRE</h4>
	
	<BOUCLE_note_tests(MOTS){id_article}{type=Note}>
	<b>NOTE : #TITRE/10</b><p>
	</BOUCLE_note_tests>
			
	[(#DESCRIPTIF)]
	<p align="right"><a href="#URL_ARTICLE">Lire ce test...</a>
	</div>
</BOUCLE_verif_test>
</BOUCLE_tests>

Le principe est identique pour les previews, soluces, astuces, news : on ajoute une boucle de vérification, et on supprime la boucle qui affiche la liste des machines concernées :

<B_previews>
<p><b>Previews :</b>
<ul>
<BOUCLE_previews(ARTICLES){titre_mot=preview}{par date}{inverse}{age < 90}><BOUCLE_verif_previews(ARTICLES){id_article}{id_mot}>	
	<BOUCLE_rub_previews(RUBRIQUES){id_rubrique}>
	<li><b>#TITRE</b> /
	</BOUCLE_rub_previews>
	<a href="#URL_ARTICLE">#TITRE</a>
</BOUCLE_verif_previews></BOUCLE_previews>
</ul>
</B_previews>

<B_soluces>
<p><b>Soluces :</b>
<ul>
<BOUCLE_soluces(ARTICLES){titre_mot=soluce}{par date}{inverse}{age < 90}><BOUCLE_verif_soluces(ARTICLES){id_article}{id_mot}>
	<BOUCLE_rub_soluces(RUBRIQUES){id_rubrique}>
	<li><b><a href="#URL_ARTICLE">#TITRE</a></b>
	</BOUCLE_rub_soluces>
</BOUCLE_verif_soluces></BOUCLE_soluces>
</ul>
</B_soluces>

<B_astuces>
<p><b>Astuces :</b>
<ul>
<BOUCLE_astuces(ARTICLES){titre_mot=astuces}{par date}{inverse}{0,5}><BOUCLE_verif_astuces(ARTICLES){id_article}{id_mot}>	
	<BOUCLE_rub_astuces(RUBRIQUES){id_rubrique}>
	<li><b><a href="#URL_ARTICLE">#TITRE</a></b>
	</BOUCLE_rub_astuces>
</BOUCLE_verif_astuces></BOUCLE_astuces>
</ul>
</B_astuces>

<B_news>
<p><b>News :</b>
<ul>
<BOUCLE_news(ARTICLES){titre_mot=news}{par date}{inverse}{0,5}><BOUCLE_verif_news(ARTICLES){id_article}{id_mot}>	
	<BOUCLE_rub_news(RUBRIQUES){id_rubrique}>
	<li><b><a href="news_jeu.php3?id_rubrique=#ID_RUBRIQUE">#TITRE</a>:</b>
	</BOUCLE_rub_news>
	#TITRE
</BOUCLE_verif_news></BOUCLE_news>
</ul>
</B_news>

Important. Vous noterez ci-dessus que la boucle de vérification est « collée » à la première boucle (par exemple, entre <BOUCLE_previews(ARTICLE)...> et <BOUCLE_verif_previews(ARTICLE)...>, il n’y a ni espace ni retour à la ligne). En effet, le texte conditionnel avant de la première boucle (ici, la mention « Previews ») est activé si la boucle contient au moins un caractère. S’il y a un espace ou un retour chariot avant l’appel de la boucle de vérification, alors même si la boucle n’affiche aucun article (car, depuis trois mois, on n’a publié aucun article de ce type pour cette machine), cet espace parasite activerait l’affichage du code conditionnel.

Voyons maintenant l’affichage des prochaines sorties. On peut décider de créer une nouvelle page des sorties, concernant uniquement la machine sélectionnée, mais nous préférerons ici afficher directement ces sorties sur notre sommaire spécifique (les sorties n’étant pas si nombreuses par machines). En appliquant les mêmes méthodes que précédemment, on remplace le lien « Les prochains sorties » par :

<B_sorties>
<b>Les sorties #TITRE du prochain mois:</b>
<ul>
<BOUCLE_sorties(ARTICLES){titre_mot=Date_sortie}{par date}{age < 0}><BOUCLE_sorties_verif(ARTICLES){id_article}{id_mot}>
	<li>[(#DATE|affdate)]:
	
	<BOUCLE_rub_sorties(RUBRIQUES){id_rubrique}>
	#TITRE
	</BOUCLE_rub_sorties>
	
</BOUCLE_sorties_verif></BOUCLE_sorties>
</ul>
</B_sorties>

Sur le même principe, affichons la liste des jeux préférés pour cette machine depuis six mois :

<B_notes>
<b>Nos jeux préférés depuis 6 mois:</b>
<ul>
<BOUCLE_notes(ARTICLES){type_mot=note}{par titre_mot}{inverse}{age<180}><BOUCLE_notes_verif(ARTICLES){id_article}{id_mot}>
	<BOUCLE_rub_notes(RUBRIQUES){id_rubrique}>
	<li> #TITRE
	</BOUCLE_rub_notes>
	<BOUCLE_lanote(MOTS){id_article}{type=note}>
	(#TITRE/10)
	</BOUCLE_lanote>
	
</BOUCLE_notes_verif></BOUCLE_notes>
</ul>
</B_notes>

La seule subtilité pour l’instant est le classement des articles associés aux mots-clés de type « note » selon le critère {par titre_mot}{inverse} (fonction apparue dans le version 1.3 de SPIP). En effet, les mots de type « note » sont de la forme « 01 », « 02 »..., « 10 » ; on peut donc demander à les classer de 10 à 1.

Cependant, cette présentation ne nous convient pas encore : nous prétendons afficher nos « jeux préférés », alors qu’il s’agit seulement d’un classement par note. Si un jeu est sorti depuis moins de six mois et s’est ramassé une note catastrophique, il sera dans les « jeux préférés » (en bas de liste, mais présent tout de même) !

Nous devons donc trouver un moyen d’afficher uniquement les jeux ayant eu une note supérieure à « 07 » (choix arbitraire). Si vous pensez utiliser pour cela la BOUCLE_notes, en y ajoutant simplement la mention {titre_mot>07}, cela ne fonctionnera pas : SPIP n’accepte qu’un seul critère basé sur les mots-clés dans les boucles autres que les boucles de type (MOTS).

Nous allons utiliser la BOUCLE_lanote (qui affiche la note), et lui demander de ne sélectionner que les notes supérieures à 7 (puisqu’il s’agit ici d’une boucle de type (MOTS), on peut lui fournir plusieurs contraites sur les mots-clés). La BOUCLE_rub_notes, qui affiche le titre du jeu, est alors placé en texte optionnel après de la BOUCLE_lanote :
-  si la note est supérieure à 7, la BOUCLE_rub_notes est effectuée ;
-  sinon rien n’est affiché.

Attention : il est toujours délicat de placer une boucle dans le texte optionnel d’une autre boucle (SPIP peut se mélanger facilement les pinceaux). Pour une raison étrange, cela est possible dans le texte optionnel après, mais pas dans le texte optionnel avant.

Sachant que nous ne récupérerons que les articles notés « 08 », « 09 », « 10 », classés du meilleur au moins bon, nous considérons désormais inutile de rappeler la note elle-même. La BOUCLE_lanote est donc vide, elle ne sert plus qu’à activer ou désactiver la BOUCLE_rub_notes.

Enfin, puisque la BOUCLE_lanote devient un nouveau « filtre » appliqué à la sélection d’articles, il faut supprimer les blancs et les retours chariot autour de cette boucle, de façon à ne réellement activer l’expression « Nos jeux préférés » que si au moins un article est vraiment affiché.

Cela nous donne :

<B_notes>
<b>Nos jeux préférés depuis 6 mois:</b>
<ul>
<BOUCLE_notes(ARTICLES){type_mot=note}{par titre_mot}{inverse}{age<180}><BOUCLE_notes_verif(ARTICLES){id_article}{id_mot}><BOUCLE_lanote(MOTS){id_article}{titre>07}{type=note}>
	</BOUCLE_lanote>
	<BOUCLE_rub_notes(RUBRIQUES){id_rubrique}>
	<li> <a href="#URL_RUBRIQUE">#TITRE</a>
	</BOUCLE_rub_notes>
	</B_lanote></BOUCLE_notes_verif></BOUCLE_notes>
</ul>
</B_notes>

Tout cela peut sembler un peu indigeste, mais le tout est que cela fonctionne, et toujours sans la moindre fonction PHP !

Maintenant que nos pages de sommaires spécifiques sont presque terminées, nous constatons, en passant de l’une à l’autre, que certaines pages sont vides. En effet, nous n’affichons ici que des informations de moins de trois mois (pour les tests, les news...). Si une machine n’a été concernée par aucun article depuis trois mois, ou même si une machine n’a encore aucun article du tout (même si cela est prévu par un mot-clé, il est très possible que personne sur votre site n’ait encore écrit au sujet des jeux Linux).

Il faut donc modifier la BOUCLE_somm_mac (celle qui affiche les logos des différentes machines) pour que seules les machines ayant réellement des articles publiés depuis trois mois soient affichés. Il suffit pour cela d’ajouter une boucle vérifiant la présence d’article datés de moins de trois mois associés à ce mot-clé. Ce qui nous donne :

<BOUCLE_somm_mac(MOTS){type=Machines}{exclus}{par titre}>
<BOUCLE_verif_somm(ARTICLES){id_mot}{0,1}{age < 90}>
	<td>
	<a href="sommaire_machine.php3?id_mot=#ID_MOT"><img src='IMG/[(#LOGO_MOT|fichier)]' border=0></a>
	</td>
</BOUCLE_verif_somm>
</BOUCLE_somm_mac>

On pensera à effectuer le même remplacement dans la page « sommaire.html » du sommaire général (penser à supprimer le critère {exclus} dans ce cas).

Auteur L’équipe de SPIP Publié le : Mis à jour : 26/10/12

Traductions : عربي, català, français, italiano