title: Afficher les x derniers billets de Dotclear en page d'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'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

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 ! 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 :-)

Pour ceux qui sont pressés

Il suffit de rajouter ce petit bout de code PHP à 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.

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

Bug connu, une erreur du type :

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource...

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 DB_BASE à la place de la variable DB_DBASE, il suffit alors de changer la ligne du précédent script mysql_select_db(DB_DBASE); en mysql_select_db(DB_BASE);

Pour ceux qui veulent comprendre

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

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

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

Associer le nom des catégories aux derniers billets

Il y a deux lignes à changer, la première concerne la requête qui doit effectuer une jointure entre la table post et la table catégorie :

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

devient donc :

$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';

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.

Ensuite, il ne reste plus qu'à afficher le libellé de la catégorie du billet de la façon suivante :

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

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