title:      Afficher les x derniers billets de Dotclear en page d&#39;accueil
slug:       afficher-les-x-derniers-billets-de-dotclear-en-page-daccueil
date:       2005-04-30 13:04:32
type:       post
vignette:   images/logos/dotclear.png
contextual_title1:  myOpenID propose des solutions intéressantes contre le phishing
contextual_url1:    20070418-myopenid-propose-des-solutions-interessantes-contre-le-phishing
contextual_title2:  ★ Comment utiliser OpenID, la solution d&#39;identification tant attendue
contextual_url2:    20070104-comment-utiliser-openid-la-solution-d-identification-tant-attendue
contextual_title3:  ★ Magpie RSS, installation et utilisation(s) en tout genre du parser PHP
contextual_url3:    20050209-magpie-rss-installation-et-utilisations-en-tout-genre-du-parser-php

<p>J'ai récemment appris qu'il y avait des personnes encore plus faignantes que moi dans l'informatique. C'est sûr ça fait plaisir (et ça rassure), mais ça aide pas quand on cherche quelque chose qui a déjà été fait&nbsp;! Donc voila, je ne sais pas si ça a déjà été codé et documenté quelque part mais si ça peut servir à quelques uns d'entre vous, c'est déjà ça :-)</p>

<h2>Pour ceux qui sont pressés</h2>


<p>Il suffit de rajouter ce petit bout de code <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> à votre page d'accueil en vérifiant que la troisième ligne contient bien le chemin vers votre fichier de configuration de Dotclear, normalement si tout se passe bien vous pouvez voir ce que ça va donner en consultant la page d'accueil de ce site.</p>


<pre>&lt;?php
define('CONF_ONLY','1');
include('./dotclear/conf/config.php');

@ $db = mysql_pconnect(DB_HOST,DB_USER,DB_PASS);
if(!$db) { echo 'Erreur de connexion'; exit; }

mysql_select_db(DB_DBASE);
$query =
' SELECT post_id,post_titre,post_titre_url,post_dt
  FROM '.DB_PREFIX.'post
  ORDER BY post_id DESC LIMIT 5';
$result = mysql_query($query);
$num_results = mysql_num_rows($result);

echo '&lt;ul&gt;';
for($i = 0 ; $i &lt; $num_results ; $i++)
{
  $row = mysql_fetch_array($result);
  $date = explode(' ',$row['post_dt']);
  $date_slash = str_replace('-','/',$date[0]);
  echo '&lt;li&gt;&lt;a href="http://www.biologeek.com/dotclear/index.php/'.$date_slash.'/'
    .$row['post_id'].'-'.$row['post_titre_url'].'" title="'
    .$row['post_titre'].'"&gt;'.$row['post_titre'].'&lt;/a&gt;&lt;/li&gt;';
}
echo '&lt;/ul&gt;';
?&gt;</pre>


<p>Bug connu, une erreur du type&nbsp;:</p>

<blockquote><p><strong>Warning</strong>: mysql_num_rows(): supplied argument is not a valid MySQL result resource...</p></blockquote>


<p>Si vous avez cette erreur c'est très probablement que vous utilisez depuis quelques temps déjà Dotclear et que votre fichier de configuration contient la variable <strong>DB_BASE</strong> à la place de la variable <strong>DB_DBASE</strong>, il suffit alors de changer la ligne du précédent script <code>mysql_select_db(<strong>DB_DBASE</strong>);</code> en <code>mysql_select_db(<strong>DB_BASE</strong>);</code></p>


<h2>Pour ceux qui veulent comprendre</h2>

<ul>
<li>La première ligne du script est peut-être la plus mystérieuse pour ceux qui n'ont jamais mis le nez dans le code de Dotclear, elle permet juste de définir <strong>CONF_ONLY</strong> pour ne pas que le fichier de configuration que l'on appelle à la ligne suivante aille chercher d'autres fichiers qui nous sont inutiles dans le cas présent.</li>
<li>On essaye ensuite de se connecter à la base en utilisant les informations issues du fichier de configuration en renvoyant un message en cas d'échec, si vous obtenez ce message, c'est probablement dû au fait que vous n'avez pas entré le bon chemin d'accès au fichier de configuration.</li>
<li>On sélectionne la base de donnée de votre blog et on effectue la requête qui va nous permettre d'afficher le titre des liens et de recomposer l'adresse pour accéder au billet qui lui est associé. C'est à cet endroit que vous pouvez spécifier le nombre de billets à afficher, il suffit de remplacer <strong>5</strong> par votre nombre.</li>
<li>La liste des billets va être présentée sous forme de liste, il faut dans un premier temps formater la date pour obtenir un adresse correcte et il suffit ensuite d'appeler les bonnes colonnes du tableau renvoyé par la requête à la base de donnée.</li>
</ul>

<p>Voila pour les bases, vous pouvez maintenant modifier l'affichage à votre convenance en donnant une <strong>id</strong> à <strong>&lt;ul&gt;</strong> ou une <strong>class</strong> aux <strong>&lt;li&gt;</strong>. Si vous êtes sages la prochaine étape consistera à effectuer une petite jointure pour récupérer la catégorie associée à chaque billet :-).</p>


<p><strong>[HS]</strong>&nbsp;: je dois avouer que c'est très déroutant de se replonger dans du <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> après avoir fait du Python, ne serait-ce que pour l'oubli des «&nbsp;<strong>;</strong> » , mais aussi par la nécessité de passer par des variables intermédiaires... par exemple pour la date j'avais commencé par faire&nbsp;: <code>str_replace('-','/',explode(' ',$row['post_dt'])[0]);</code> qui a superbement planté :D.</p>


<p><strong>[ edit du 3 mai ]</strong>&nbsp;: finalement rajouter les catégories c'est pas très compliqué et ça ne mérite pas un nouveau billet :-)</p>


<h2>Associer le nom des catégories aux derniers billets</h2>


<p>Il y a deux lignes à changer, la première concerne la requête qui doit effectuer une jointure entre la table <strong>post</strong> et la table <strong>catégorie</strong>&nbsp;:</p>


<pre>$query =
' SELECT post_id,post_titre,post_titre_url,post_dt
  FROM '.DB_PREFIX.'post
  ORDER BY post_id DESC LIMIT 5';</pre>


<p>devient donc&nbsp;:</p>


<pre>$query =
  ' SELECT post.post_id,post.post_titre,post.post_titre_url,post.post_dt,cat.cat_libelle
  FROM '.DB_PREFIX.'post AS post, '.DB_PREFIX.'categorie AS cat
  WHERE post.cat_id = cat.cat_id
  ORDER BY post.post_id DESC LIMIT 5';</pre>


<p>Vous pouvez remarquer la création d'alias (AS) permettant de générer une requête plus lisible, ici on fait une jointure entre le cat_id de la table post et celui de la table catégorie.</p>


<p>Ensuite, il ne reste plus qu'à afficher le libellé de la catégorie du billet de la façon suivante&nbsp;:</p>


<pre>echo '&lt;li&gt;&lt;a href="http://www.biologeek.com/journal/index.php/'.$date_slash.'/'
  .$row['post_id'].'-'.$row['post_titre_url'].'" title="'
  .$row['post_titre'].'"&gt;['.$row['cat_libelle'].'] '.$row['post_titre'].'&lt;/a&gt;&lt;/li&gt;';</pre>


<p>Et voila, le résultat est toujours consultable en page d'accueil du site.</p>
