# Afficher les x derniers billets de Dotclear en page d'accueil

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

- 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 CONF_ONLY 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.
- 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.
- 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 5 par votre nombre.
- 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.

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.

### Articles peut-être en rapport

- myOpenID propose des solutions intéressantes contre le phishing
- ★ Comment utiliser OpenID, la solution d'identification tant attendue
- ★ Magpie RSS, installation et utilisation(s) en tout genre du parser PHP

### Commentaires

pickupjojo le 01/05/2005 :

Franchement très bien ça, merci ! :-p

David, biologeek le 01/05/2005 :

Heureux d'avoir pu servir :)

Siddartha le 04/05/2005 :

Oula, un peu compliqué tout ca, je te propose un peu plus simple en se servant des fonctions Dotclear .. tant qu'à faire, autant ne pas ré-inventer la roue ;-)
<?php
$rs = $blog->getLastNews(10,0);
while ($rs->fetch()) {
echo '&lt;li>&lt;a href="/index.php/'.$rs->f('postyear').'/'.$rs->f('postmonth').'/'.$rs->f('postday').'/'.$rs->f('post_id').
'-'.$rs->f('post_titre_url').'" title="'.$rs->f('post_titre').'">'.$rs->f('post_titre').'&lt;/a>&lt;/li>';
}
?>
Et en plus, en regardant le fichier functions.php, un tas d'option est présent !!
Super le design du site, bravo !

David, biologeek le 04/05/2005 :

Compliqué ?
Je rappelle que le but est d'afficher les derniers billets en page d'accueil donc on n'a pas accès aux fonctions de Dotclear...
De plus, si tu commences à inclure des fichiers de Dotclear, il y un tas de fonctions dont tu n'as pas besoin pour ce que je veux faire, je pense que ma solution est la plus rapide, mais je peux me tromper, quel fichiers as-tu besoin d'inclure pour que ça marche ?
Merci pour les compliments :)

eClaire le 09/05/2005 :

Il me semble bien qu'en page d'accueil tu aies accès aux fonctions de dotclear grâce au mode home.
Je m'étais inspirée d'un exemple pré fait pour faire la page d'accueil de mon site et je n'ai pas fait d'acces direct à la base de données
En tout cas merci pour ce billet qui tombe plutôt bien étant donné que je voulais faire un rappel des derniers posts en première page.

David, biologeek le 10/05/2005 :

eClaire, il semblerait bien que l'exemple pré-fait était le mien si je ne me trompe pas ;)
cf. biosphere.biologeek.com/2...
Je sais donc un peu de quoi je parle et je suis en train de mettre en place un mode home aussi... mais pas pour la page d'accueil du site, stay tunned =)

eClaire le 10/05/2005 :

mdr, désolée
je dois être un peu à l'ouest alors :'(
pour moi ta page d'accueil était la home de dotclear, m'en vais faire un somme ;)

Aquarius le 28/10/2005 :

J'aurai voulu savoir comment ajouter la date des posts en plus du titre.
Pourriez-vous me donner la marche à suivre ?

David, biologeek le 02/11/2005 :

Il suffit d'utiliser la variable $date[0] qui contient la date à reformater après selon l'affichage désiré.

Aquarius le 09/11/2005 :

Je suis malheureusement très mauvais en php, et j'aurai voulu avoir la date comme ceci par exemple : 09 novembre 2005
Quel est le code à ajouter ?
Merci encore pour votre réponse.

Kelsurf le 24/11/2005 :

Merci ça marche impeccable sauf un seul truc, je sais pas d'ou ca vient
j'ai un probleme d'accent
le é se transforme en Ã©...
si qqun a une idée

David, biologeek le 24/11/2005 :

@Aquarius : bon je t'explique rapidement comment faire, ça doit se trouver détaillé un peu partout. Créer un tableau associatif entre les chiffres des mois et leur nom puis recomposer la date.
@Kelsurf : c'est un problème d'encodage de caractères, probablement au niveau du charset utilisé...

Scalp le 24/11/2005 :

Salut, Pourquoi ca marche chez tout le monde sauf chez moi :,) moi ca m'affiche:
'; for($i = 0 ; $i < $num_results ; $i++) { $row = mysql_fetch_array($result); $date = explode(' ',$row['post_dt']); $date_slash = str_replace('-','/',$date[0]); echo ''.$row['post_titre'].'
'; } echo ''; ?>
d'ou vien l'erreur?

David, biologeek le 24/11/2005 :

Ça sent fortement le point d'interrogation placé au mauvais endroit :
echo '<ul>'; c'est bon par contre
echo '<ul?>'; ça ferme le script php et il considère la suite comme du texte...

AntoineD le 18/12/2005 :

Salut ! Bravo pour le petit script ! C'est désormais mon premier bout de php sur mon site ! ça se fête ;)
Mais j'ai un problème, et comme je suis un novice total en la matière... je ne trouve pas quoi modifier :'(
Ton code me donne un lien comme ça :
www.antoinedoyen.net/boug...
or, moi, il me faut :
www.antoinedoyen.net/boug...
Bref : comment est-ce que je "faire rajouter" le petit point d'interrogation juste après .php ? Merci d'avance !
Et encore bravo pour le code. :)

David, biologeek le 19/12/2005 :

Salut Antoine,
Il suffit de modifier :
echo '<li><a href="/dotclear/index.php/'.$date_slash.'/'
en :
echo '<li><a href="/dotclear/index.php?'.$date_slash.'/'
Bonne continuation :)

Richard le 09/03/2006 :

merci
j'ai essaye de le pofiner pour ajouter les chapos :)
for($i = 0 ; $i < $num_results ; $i++)
{
$row = mysql_fetch_array($result);
$date = explode(' ',$row['post_dt']);
$date_slash = str_replace('-','/',$date[0]);
echo '<tr>
<td colspan="2" align="center"><font color="#000000" size="-2" face="Tahoma, Verdana, Arial, sans-serif"><strong>'.$row['post_titre'].'</strong></font></td>
</tr>
<tr>
<td width="50%"><font color="#000000" size="-2" face="Tahoma, Verdana, Arial, sans-serif">'.$row['post_dt'].'</font></td>
<td width="50%" align="right"><font color="#FF0000" size="-2" face="Tahoma, Verdana, Arial, sans-serif"><em>'.$row['cat_libelle'].'</em></font></td>
</tr>
<tr>
<td colspan="2"><font color="#000000" size="-2" face="Tahoma, Verdana, Arial, sans-serif">';
function resume_xmots($MaChaine,$xmots)
{
$ChaineTab=explode(" ",$MaChaine);
for($n=0;$n<$xmots;$n++)
{
$NouvelleChaine.=" "."$ChaineTab[$n]";
}
return $NouvelleChaine;
}
echo resume_xmots($row['post_chapo'],20) ;
echo' ...</font></td>
</tr>';
}
et j'obtient ca
Fatal error: Cannot redeclare resume_xmots() (previously declared in /homepages/6/d147305526/htdocs/imode/index.php:56) in /homepages/6/d147305526/htdocs/imode/index.php on line 56
:(
ligne 56 = function resume_xmots($MaChaine,$xmots)
aurais tu ZE solution pour un pauvre petit phpien comme moi ?

David, biologeek le 09/03/2006 :

Il me semble que tu as déjà défini une telle fonction avant et c'est la raison pour laquelle il ne veut pas la redéfinir... en fait tu essayes de créer une fonction dans une boucle donc la première fois ça passe et ensuite il aime pas trop. Tu devrais essayer de sortir la définition de la fonction de la boucle.
ps : les tableaux c'est le mal ! Je te conseille de jetter un coup d'œil à openweb.eu.org ;)

veda le 14/04/2006 :

Très pratique ce bout de script.
J'ai par contre un souci à l'identique de Kelsurf avec le é se transformant en Ã©...
Je crois que c'est dû au fait que mon blog est en utf-8 comment faire?
Le truc genant c'est qu'on récupére les derniers posts en fonction du post_id, ce qui fait que dans la liste on a même les billets qui sont offline.
De plus j'ai l'habitude de creer une suite de billet mais de les publier dans un ordre différent.
Il faudrait faire un select en ordonnant sur la date de publication tout en virant les billets qui sont offlines.
Quelqu'un a une idée pour modifier le select?

veda le 14/04/2006 :

J'ai trouvé la solution:
SELECT post_id,post_titre,post_titre_url,post_dt FROM '.'dc_'.'post WHERE post_pub = 1 ORDER BY post_dt DESC LIMIT 5';
Reste de problème lié à l'utf8.
En fait je cherche à afficher ce script dans une page du forum punBB qui je crois est en ansi.
Là par contre je ne sais pas encore palier au pb.

David, biologeek le 14/04/2006 :

Pour le problème de charset, il faut soit que tu convertisse le titre des billets en iso (qui doit être utilisé par punBB) soit que tu utilises punBB en utf-8 (je sais pas si c'est possible !). Le plus simple est évidemment de convertir les titres en iso avec une fonction php.
Tu peux essayer de trouver ton bonheur sur : fr.php.net/htmlentities
Bonne continuation :)

Dorian le 04/06/2006 :

>David disait : "Il suffit d'utiliser la variable $date[0] qui contient la date à reformater après selon l'affichage désiré."
Malgré cette explication, Je ne saisi pas très bien comment formater la date... Où et comment indiquer les paramètres ?
Sinon, le reste fonctionne très bien, merci beaucoup et bonne continuation !

David, biologeek le 06/06/2006 :

Pour rajouter la date en brut (pas testé) :
echo '<li><a href="/dotclear/index.php/'.$date_slash.'/'
.$row['post_id'].'-'.$row['post_titre_url'].'" title="'
.$row['post_titre'].'">'.date[0].' '.$row['post_titre'].'</a></li>';
Après ça dépend comment tu veux l'afficher, généralement un peu de str_replace devrait te suffire, disons que là tu devrais l'afficher sous la forme brute qui est 06-06-06 pour aujourd'hui ;)

Dorian le 06/06/2006 :

Entre deux j'avais trouvé une solution alternative qui consiste à décomposer la date
sscanf($row['post_dt'], "%4s-%2s-%2s", $annee, $mois, $jour);
puis à placer les variables ainsi créées là où je voulais les voir apparaitre.
Ca fonctionne très bien ainsi, mais je vais quand même essayer ta technique ;)
En tout cas, merci pour ton intervention rapide :)

Spy le 08/06/2006 :

et si on désire avoir les commentaires du "dit" billet ?

orientation scolaire le 22/06/2006 :

Bonjour,
J'ai installé ce code, je l'ai adapté pour mon site et c'est ok. Juste deux questions :
- Est-ce possible de n'afficher la liste qu'à partir du 3ème post, c'est à dire en ne tenant pas compte des 2 permiers articles. Si oui c'est super.
Dans ce cas je vais faire un peu plus compliqué, est-ce possible de ne pas tenir compte du premier article de chaque catégorie ?
- N'étant pas très douée en Internet, je ne sais pas comment je peux retirer les petits symbole devant chaque titre (www.e-tud.com/une/).
Merci d'avance et merci pour ce code très pratique.

conseil orientation le 22/06/2006 :

Ah non en fait j'ai trouvé pour ne pas tenir compte des premiers posts écrire: ORDER BY post.post_id DESC LIMIT 2, 10';
2 représentant le nombre de post à ne pas tenir compte.

David, biologeek le 22/06/2006 :

Salut,
> Est-ce possible de n'afficher la liste qu'à partir du 3ème post, c'est à dire en ne tenant pas compte des 2 permiers articles. Si oui c'est super.
Oui, tu as trouvé seul en plus, génial :)
> Dans ce cas je vais faire un peu plus compliqué, est-ce possible de ne pas tenir compte du premier article de chaque catégorie ?
Mmh ça c'est beaucoup plus complexe, pas impossible mais prise de tête en gros la démarche à adopter c'est de faire une requête par catégorie puis d'enlever la première entrée puis de regrouper tous les résultats de toutes les catégories pour les classer par date. C'est pas vraiment léger pour la base de données non plus... à toi de voir mais j'ai pas vraiment le temps (bon d'accord et l'envie ;) de m'y mettre là.
> N'étant pas très douée en Internet, je ne sais pas comment je peux retirer les petits symbole devant chaque titre
C'est dans la css (www.e-tud.com/une//themes...), il faut retirer la ligne :
list-style-image:url('images/ul.gif');
dans le bloc ul{}
Par contre ça t'enlève les images pour toutes les listes de ta page (voire de ton site) et ça les remplace par un point. Si tu souhaites aussi enlever le point, rajoute list-style-type:none; dans le même bloc. Ici aussi, les modifications s'appliquent à toutes les pages contenant la css.
À ce sujet le code html de ton site n'est pas vraiment « propre », de bons conseils à ce sujet sont prodigués sur openweb.eu.org/

conseil orientation le 22/06/2006 :

Merci beaucoup pour toutes ces explications très rapides, très claires donc très efficaces.
J'irai faire un tour sur le site que tu m'indiques et pour ma requete un peu compliquée, c'était juste pour savoir, ce n'est pas grave.
Comme tu as l'air de bien t'y connaitre en Internet, saurais-tu où je peux trouver des exemples de feuille de style pour un nuage de tags ? Car j'ai installer le plugin tag, il fonctionne d'après le peu que j'ai vu, seulement le nuage s'affiche sans tenir compte des occurences des mots. De plus je voudrais limiter le nombre de mots de ce nuage.
Dans tout les cas, merci pour tout.

David, biologeek le 22/06/2006 :

> saurais-tu où je peux trouver des exemples de feuille de style pour un nuage de tags ?
Les nuages de tags avec Dotclear sont généralement conçus pour placer des spans autour des mots-clé ressemblant à : <span class="level-X">mot-clé</span> avec X allant de 1 à 5.
Il suffit ensuite de styler ces spans dans la feuille de style, par exemple :
span.level-1 {font-size:60%}
span.level-2 {font-size:80%}
span.level-3 {font-size:100%}
span.level-4 {font-size:120%}
span.level-5 {font-size:140%}
Pour les autres questions, je ne l'utilise pas donc je ne peux pas trop t'aider.

Polo le 27/06/2006 :

Merci beaucoup, c'est exactement ce que je cherchais :)

Polo le 28/06/2006 :

En fait j'ai la même erreur que Scalp, c'est à dire que ça m'affiche:
'; for($i = 0 ; $i < $num_results ; $i++) { $row = mysql_fetch_array($result); $date = explode(' ',$row['post_dt']); $date_slash = str_replace('-','/',$date[0]); echo ''.$row['post_titre'].'
'; } echo ''; ?>
J'ai pourtant bien vérifier le chemin d'accès au fichier config.php, et j'ai bien '<ul>' et non pas '<ul?>'...
As tu une idée d'où ça pourrait venir?

Amine le 23/07/2006 :

j'ai mieux ;)
<ul>
<?php
$news = $blog->getLastNews(10,0);
while ($news->fetch()) :
?>
<li><a href="<?php dcPostURL(); ?>"><?php dcPostTitle(); ?></a></li>
<?php endwhile; ?>
</ul>
getLastNews peut etre configurée comme vous voulez! 10 pour 10 derniers articles, 0 toutes categorie..

David, biologeek le 23/07/2006 :

Pour cette solution il faut être dans l'environnement du blog sinon tu vas avoir du mal à récupérer l'objet $blog non ? Or, ce n'est pas l'objectif recherché ;)

Rabatjoie-tv le 24/08/2006 :

Bonjour,
J'ai essayé comme vous le proposez au dessus, de coller les lignes dans mon fichier Template.
Les billets récents apparaissent bien SAUF QUE... C'est la pagaille totale : la mise en page est complétement remise à plat... Je vous laisse juger l'impression écran...
img178.imageshack.us/img1...
Si vous allez voir mon site actuellemnt, il n'y a pas de soucis de mise en page en temps normal... Le fond de l'écran doit être noir...
Quel serait la solution ? D'où viendrait le problème ? Sur le Forum DOTCLEAR personne ne me répond...
Merci d'avance

Rabatjoie-tv le 25/08/2006 :

Bonjour
ca y est j'ai résolu le problème !
C'est dans mon fichier template, depuis le fichier qui était original, je ne sais pas pourquoi le fichier est modifié avec des liens directs.
Par ex. quand il y avait 'rss' bien sur mon fichier ca mettait un chemain d'accès complet pour finir en '... ss'. Bizarre
Sinon j'ai remarqué un autre truc peut etre utile à d'autres :
moi le lien ne devait pas être :
href="/journal/index.php/
Mais :
href="/"dossier de mon blog"/index.php/
Et sinon, où dois-je modifier si je veux mettre les 6 derniers articles et non les 5 derniers ?
Dernière question, comment faire pour que ca mette les titres en gras ? Juste les titres, pas les catégories.
Merci

David, biologeek le 25/08/2006 :

Salut Rabatjoie-tv,
> Et sinon, où dois-je modifier si je veux mettre les 6 derniers articles et non les 5 derniers ?
Il suffit de modifier la ligne où il est inscrit LIMIT 5 par LIMIT 6 dans la requête.
> Dernière question, comment faire pour que ca mette les titres en gras ? Juste les titres, pas les catégories.
Modifie :
.$row['post_titre'].'">'.$row['post_titre'].'</a></li>';
en :
.$row['post_titre'].'"><strong>'.$row['post_titre'].'</strong></a></li>';

yhugo le 28/08/2006 :

Salut,
Merci David pour ce script ... je suis en train de m'en servir pour une boutique en ligne sur laquelle je travaille actuellement.
C'est bien pratique, j'utilise DotClear pour écrire et gérer les news pour ensuite les afficher dans l'interface de la boutique ...
Salutations
yhugo

Rabatjoie-tv le 29/08/2006 :

Merci beaucoup David !

Jérémy le 24/09/2006 :

Bonjour,
très chouette mais j'ai un problème de chemin que je n'arrive pas à résoudre. C'est mon coté newbie probablement...
Voilà l'erreur quand on clique sur le lien :
The requested URL /dotclear/index.php/2006/09/18/84-un-rapport-annuel-sur-les-bailleurs-sociaux was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

superseb801 le 25/04/2007 :

Serieux les gars, y a personne qui peut être clair?? Franchement je suis peut-être un nab mais le php orienté objet ça me saoule à mort, il y a vingt fois trop de pages... Donc si quelqu'un pouvait dire dans quelle page exactement il faut rajouter quoi parce que c'est vraiment pas le truc sur le quel je veux passer une heure.
Je suis sur que je suis pas le seul donc si je trouve la solution je la mettrai!

Flavien le 25/04/2007 :

Est-ce que ca marche aussi avec Dotclear 2 ?

David, biologeek le 25/04/2007 :

@superseb801 : lis.
@Flavien : non je ne pense pas, ou alors il faut au moins l'adapter. D'ailleurs si tu y arrives tu peux poster la solution ici.

blog.imprimante.biz le 29/04/2007 :

Bonjour,
Je confirme que le bout de code proposé dans ce billet fonctionne parfaitement !
Le blog étant dans un sous domaine cela me permet d'afficher les titres des derniers billets sur la page d'accueil du domaine principal. Il est ensuite très facile de reconstruire une adresse asbolue pour pointer sur les billets quelque soit le mode d'affichage des url que l'on a choisi pour dotclear. Je n'ai pas installé le code pour afficher la catégorie. Il est à craindre que la jointure entre les tables post et catégorie charge un peu la base de données ...
merci pour le code. :)

Banban le 04/05/2007 :

Bonjour,
J'ai intégré ce script sur mon site et ça a l'air de fonctionner nikel...
Le problème c'est que mon instinct grandissant de geek me pousse à aller plus loin...
En fait je me butte à la configuration de mon blog : j'ai pour des raisons pratiques des billets hors ligne d'une catégorie qui sont utilisés pour faire des pages fixes indépendantes du système de billets... sauf que bien sûr elles apparaissent quand même dans cette liste.
En gros ce que je voudrais c'est limiter cette liste de billets à ceux en ligne... mais au niveau php je me débrouille pour le comprendre, mais l'écrire c'est une autre chose...
Serait-il possible de me donner une ligne qui fixe l'affichage de chaque ligne à une condition, que le billet soit en ligne ?
Merci d'avance
PS : Super blog... je viens de le découvrir par hasard, je l'ai juste survolé, mais vous pouvez être sûr qu'il restera au chand quelque part dans mes marque-pages :)

David, biologeek le 04/05/2007 :

> Serait-il possible de me donner une ligne qui fixe l'affichage de chaque ligne à une condition, que le billet soit en ligne ?
Tiens j'ai oublié de publier la modification que j'avais effectué pour mon cas pour n'afficher que les billets "en ligne". Voici ma requête actuelle :
$query = "
SELECT p.post_titre AS titre, c.cat_libelle AS cat, p.post_titre_url AS url
FROM ".DB_PREFIX."post AS p, ".DB_PREFIX."categorie AS c
WHERE p.cat_id = c.cat_id AND p.post_pub = 1 ".$where."
ORDER BY p.post_dt DESC LIMIT ".$limit;
La partie importante pour la publication est le "p.post_pub = 1". N'hésite pas à demander plus de détails si tu ne t'en sors pas.
PS : merci :-)

Banban le 06/05/2007 :

> N'hésite pas à demander plus de détails
Bon j'avoue là que je suis totalement dépassé...
Le problème c'est déjà que je trouve plein de différences entre le code initial et celui que tu me proposes.
Voilà ce que j'ai (le code présent dans ce billet à quelques détails près :
<?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.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';
$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 '<a href="/dotclear/index.php/?'.$date_slash.'/'
.$row['post_id'].'-'.$row['post_titre_url'].'" title="'
.$row['post_titre'].'">'.$row['post_titre'].'</a><br>';
}
echo '</ul>';
?>
Ce qu'il y a dans le "$query" est assez différent, j'imagine que tu as juste simplifié le code, mais moi je ne m'y retrouve pas.
Je précise que le code ci-dessus marche parfaitement à l'exception des billets hors lignes qui sont affichés au même titre que ceux en ligne.
Encore merci de ton aide !!

David, biologeek le 07/05/2007 :

En effet, donc si on se base sur ce code là, la requête devient :
$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 AND post.post_pub = 1
ORDER BY post.post_id DESC LIMIT 5';

mirovinben le 12/05/2007 :

voici une version personnalisée par mes soins pour DC2. Il est destiné à mon portail qui n'est pas en UTF8 et propose les titres des billets sous forme d'une liste à puces et avec la date au format jj/mm/aaaa
<?php
# version 1.0b
$config = '../dc2/inc/config.php';
$blogid = 'default';
$nbnews = '10';
$title = '<h4>Les billets les plus récents...</h4>';
#--------
define('CONF_ONLY','1');
include($config);
@ $db = mysql_connect(DC_DBHOST,DC_DBUSER,DC_DBPASSWORD);
if(!$db) { return; }
mysql_select_db(DC_DBNAME);
$query =
' SELECT blog_url
FROM dc_blog
WHERE blog_id = "'.$blogid.'"';
$result = mysql_query($query);
$url = mysql_fetch_array($result);
$query =
' SELECT *
FROM dc_post
WHERE blog_id = "'.$blogid.'" AND post_status = "1" AND post_type = "post" AND post_password IS NULL
ORDER BY post_dt DESC LIMIT '.$nbnews;
$result = mysql_query($query);
$num_results = mysql_num_rows($result);
#--------
echo $title;
echo '<ul>';
for($i = 0 ; $i < $num_results ; $i++)
{
$row = mysql_fetch_array($result);
$date = explode('-',$row['post_dt']);
$day = explode(' ',$date[2]);
echo '<li>'.$day[0].'/'.$date[1].'/'.$date[0].' : <a href="'.$url[0].'post/'.$row['post_url'].'">'.$row['post_title'].'</a></li>';
}
echo '</ul>';
?>

David, biologeek le 15/05/2007 :

Merci pour ta contribution mirovinben !

Banban le 04/06/2007 :

Au fait, j'ai oublié de te remercier, le code du commentaire #48 fonctionne parfaitement.
Bonne continuation !

Goudie le 09/08/2007 :

Génial ! C'est dingue comme de vieux billets peuvent servir looongtemps ! Merci :)

Bruno le 27/09/2007 :

Je souhaite mettre le nom de l'auteur du billet, je suppose que l'on procède comme les catégories... mais j'aurais besoin d'un coup de main pour la syntaxe exacte

Thomas Rudolf le 29/10/2007 :

Bonjour,
j'aimerai juste que le 1er billet apparaisse tjs en haut de tous les autres, donc en page d'accueil, mais il ne faut pas que les commentaires soient affichés.
Je suis sous 1.2.7.1
Merci de votre réponse

David, biologeek le 29/10/2007 :

Bonjour Thomas,
Dans ce cas, je trouve qu'il est plus simple de mettre ce premier billet directement dans le template non ?
Bon courage !

kim le 22/11/2007 :

POur répondre à Sidarta...
Il y a un p'tit bug : il manque un ptit ? dans la ligne echo ...
<?php
$rs = $blog->getLastNews(7,0);
while ($rs->fetch())
{
echo '<li><a href="index.php'.'?'.$rs->f('postyear').'/'.$rs->f('postmonth').'/'.$rs->f('postday').'/'.$rs->f('post_id').
'-'.$rs->f('post_titre_url').'" title="'.$rs->f('post_titre').'">'.$rs->f('post_titre').'</a></li>';
}
?>
Autrement 'est super simple à utiliser... trop simple peut-être ?
Moi je l'ai inclure directement dans le template.php du theme comme ceci
<div id="lastposts">
<h2>Derniers billets</h2>
<?php .... ?>
</div>

Tom le 14/12/2007 :

Bonjour,
merci pour ce plugin!
J'avais un petit problème car j'utilise la personalisation des urls pour avoir url plus clean.
Mais un peu de modif et c'etait réglé!
Par contre j'aimerais comprendre comment se passe l'ordre d'affichage des 5 derniers billets car dans mon cas il sont pas dans l'ordre!
Merci d'avance!

Foot-parier le 21/12/2007 :

Je me répond tous seul!
En fait cela est lié au fait que les 5 derniers billets affichés correspondent au 5 dernier crées!
Et donc non au 5 premiers billets visible sur le blog.

inedit le 11/01/2008 :

Dix Mille mercis pour ce code ; ca fait un moment que je cherchais !

Stefano le 08/02/2008 :

Bonjour,
J'ai la version 1.2.7. Je voudrais me compliquer la vie et afficher les derniers post du même rédacteur. voici le bout de code en question :
$sql = 'SELECT * FROM `'.DB_PREFIX.'post` WHERE `cat_id` =3 AND `post_pub` =1 ORDER BY `post_id` DESC LIMIT 10;';
je voudrais donc ajouter aussi la condition 'SELECT * FROM `'.DB_PREFIX.'user` WHERE `user_id` =nom rédacteur
Je ne m'y connait pas beaucoup et alors je vous pose la question comment lier les deux conditions ?
Je vous remercie par avance.

David, biologeek le 08/02/2008 :

@Stefano : tu peux réutiliser la requête du commentaire 48 de cette page, en l'adaptant avec la table user. Tu crées des alias sur les deux tables avec AS et après tu récupères les champs dont tu as besoin.
Si tu trouves la réponse, tu peux la poster ici, sinon je t'aide un peu plus ;-).

michel gook le 12/02/2008 :

vous savez si c'est possible de laisserun seul billet permanent en page d'accueil sur dot clear ????

David, biologeek le 12/02/2008 :

@michel gook : tout est possible :-)
Le plus simple est à mon avis de modifier le template d'index en incluant le html en question dedans. S'il faut récupérer un vrai billet ça demande plus de code mais ça reste possible.

Djoh le 06/06/2008 :

Ce n'est pas exactement le sujet du billet, mais ça s'en rapproche et peut-être sauras-tu m'aider...
En utilisant les functions de doctlear (v1.2.8), saurais-tu afficher les x derniers billets (ça c'est par défaut), suivis des Y derniers titres des billets suivants ?
En gros, comme sur tuxboard, quoi. Lui aussi sur dotclear.

Merci de ton aide

marcolas le 12/11/2008 :

Bonjour
Et si je veux, en prime, ajouter le chapeau s'il existe ou le contenu si le chapeau est inexistant, comment je fais ?

Merci en tout cas pour l'astuce :)

Marc

moon le 26/01/2009 :

Je n'arrive pas a me connecter à ma base de données, pourtant j'ai bien indiqué le chemin :/

jeanmarie le 26/01/2009 :

Salut,

merci pour ce script bien pratique...

Je l'ai adapté pour afficher uniquement le titre, le chapo et le contenu du billet (ce dernier apparaissant avec un effet slide jQuery) du dernier article.

Par contre, j'aimerai n'afficher le dernier billet que d'une catégorie.

jean marie

jeanmarie le 27/01/2009 :

Salut,

bon, un voisin de bureau ma montré la réponse (on ne soupçonne pas toujours les ressources qu'on a à proximité :) ), il suffit d'un WHERE bien placé et ça roule..

Du coup, ca donne ca (dans mon cas, je pioche dans la 2e catégorie):

$query =
' SELECT post_titre,post_titre_url,post_chapo,post_content,cat_id
FROM '.DB_PREFIX.'post
WHERE cat_id = 2
ORDER BY post_id DESC LIMIT 1';

Merci pour ce petit script bien efficace...

Bonne continuation...

jean marie

moon le 02/02/2009 :

Hello,

je n'arrive pas à afficher la date sur l'URL, qlq'un peut-t-il m'expliquer la raison?

merci pour votre reponse.

jeanmarie le 03/02/2009 :

Salut Moon,

recuperes-tu le champ dans la base avec le SELECT?

Si non, il faut rajouter post_dt en plus des champs dont tu as besoin...
Ensuite, tu peux l'afficher comme tu veux.
Ce qui donnera un truc du genre:
SELECT post_titre,post_titre_url,post_chapo,post_content,post_dt

J'espère que ça peut t'aider...