Astuce dotclear 1 : billet suivant – précédent de la catégorie

La possibilité d’afficher les billets suivants et précédents, soit de la catégorie courante, soit du blog, existe depuis très longtemps et ne nécessite que l’ajout de quelques lignes de code dans les fichiers prepend.php et post.php de votre template sans être obligé de passer par un plugin.

Toutefois, la fonction ne me convenait pas totalement en l’état, alors j’ai décidé d’y apporter quelque modifications pour répondre à mes besoins, principalement avoir un aperçu du contenu des billets.

Code avancé pour gérer les billets suivant/précédents au sein d’une catégorie :

Je me suis basé sur l’astuce suivante fournie dans le site le petit dotclear illustré : Billet précédent, billet suivant du blog/de la catégorie.

Et voici nouveau code que je vous propose pour le fichier prepend.php :

  /** * Naviguer d'un billet a l'autre dans la meme categorie
  * @function dcPostNextInCat
  */
  function myGetNextID($ts,$dir=1,$cat=0) {
  	global $blog;
  	$ts = (integer) $ts;
  	$reqPlus = ''; 	if($dir > 0) {
  		$sign = '>';
  		$order = 'ASC';
  	} else {
  		$sign = '<';
  		$order = 'DESC';
  	}
  	if ($blog->pub_mode !== NULL) {
  		$reqPlus .= 'AND post_pub = '.$blog->pub_mode.' ';
  	}
  	if ($blog->lang !== NULL) {
  		$reqPlus .= 'AND post_lang = \''.$blog->con->escapeStr($blog->lang).'\' ';
  	}
  	if ($cat !== 0) {
  	   $reqPlus .= 'AND cat_id = '.$cat.' ';
  	}
  	$strReq = 'SELECT post_id, post_titre, post_dt, post_chapo, post_content '.
  			'FROM '.$blog->t_post.' '.
  			'WHERE UNIX_TIMESTAMP(post_dt) '.$sign.' \''.$ts.'\' '.
  			$reqPlus.
  			'ORDER BY post_dt '.$blog->con->escapeStr($order).' '.
  			'LIMIT 0,1 '; 	if (($rs = $blog->con->select($strReq)) !== false) {
  		return $rs;
  	} else {
  		$blog->setError('MySQL : '.$blog->con->error(),2000);
  		return false;
  	}
  }
  function dcPostNextInCat($dir,$s='%1$s %2$s %3$s') {
  	global $blog;
  	global $news;
  	$rs = myGetNextID($news->getTS(), $dir, $news->f('cat_id'));
  	if (!$rs->isEmpty())
  	{
  		$id = $rs->f('post_id');
  		$titre = $rs->f('post_titre');
  		$date = $rs->f('post_dt');
  		$ts = strtotime($date);
  		$url = sprintf($blog->front_url['post'],date('Y',$ts),
  		date('m',$ts),date('d',$ts),$id,$blog->str2url($titre));
  		
  		if ($rs->f('post_chapo') != '') {
  			$desc = strip_tags($rs->f('post_chapo'));
  		} else {
  			$desc = util::cutString(strip_tags($rs->f('post_content')),150).'...';
  		}
  		printf($s,$id,$titre,$url,$desc);
  	}
  	else {
  	printf('< h5 >Vous êtes sur le dernier article de la rubrique< /h5 >< p >Le prochain article est, probablement, en cours de rédaction.< /p >< p >Cordialement,< br / >Aymeric Jacquet< /p >');
  	}
  }

A insérer avant le ?> fermant du fichier prepend.php de votre thème.

Important : pour la partie <h5>… en bas du code, il s’agit d’un message personnalisé à afficher si on est sur le dernier article de la catégorie, pensez à créer votre propre texte et si vous utilisez des balises html retirez les espaces après les > et avant les >, ils ne sont là que pour éviter le formatage hrml dans mon bilet dotclear. ;)

Ensuite, dans votre fichier post.php, insérez les lignes suivantes, en fonction de l’endroit ou vous voulez afficher ces éléments :

<div id="avantapres">
<h3>Autres articles de la rubrique : <a href="<?php dcPostCatURL(); ?>/" title="Rubrique <?php dcPostCatTitle(); ?>"><?php dcPostCatTitle(); ?></a></h3>
	<div class="artprecedent">
	<h4>Billet précédent :</h4>
	<?php dcPostNextInCat(-1,'<h5><a href="%3$s">%2$s</a></h5><p>%4$s</p>'); ?>
	</div>
	<div class="artsuivant">
	<h4>Billet suivant :</h4>
	<?php dcPostNextInCat(1,'<h5><a href="%3$s">%2$s</a></h5><p>%4$s</p>'); ?>
	</div>
</div>

Pour ma part, j’ai choisi de l’insérer juste avant le <div id= »comments »>.

Attention : ce code est parfaitement adaptable à vos besoins, pour ma part, j’ai privilégié un balisage avancé pour faire un habillage en deux colonnes géré via la feuille de style CSS, au besoin, n’hésitez pas à demander si vous avez des problèmes de mise en forme.

L’habillage CSS correspondant sur l’AJblog est le suivant :

#avantapres {background:#F5F5F5;padding:10px;}
#avantapres h3 {color:#5D5D5D;padding:0 0 5px 0;margin:0 0 5px 0;border-bottom:1px solid #A4A4A4;}
.artsuivant, .artprecedent {width:230px;text-align:justify;font-size:0.9em;}
.artsuivant {float:right;}
.artprecedent {float:left;}

A vous de le personnaliser en fonction de vos besoins.

Pour le rendu, c’est simple, c’est juste en dessous de cet article.

Ps : pour les coins arrondis, je triche, j’utilise jQuery.

Edit : si vous utilisez des urls personnalisées ne correspondant pas forcément au titre du billet, vous trouverez la solution sur ce billet : Solution au problème des URLs dans la fonction Billet suivant/précédent de Dotclear

Cordialement,
Aymeric Jacquet

Tags : , , ,

Be Sociable, Share!

10 Commentaires pour Astuce dotclear 1 : billet suivant – précédent de la catégorie

  • Salut Aymeric,

    J’aimerais signaler un bug sur cette astuce, et demander ton aide pour le résoudre. Si l’URL d’un article a été changée après sa publication, alors le lien s’affiche bien mais ne renvoit pas vers l’article.($3s correspondant alors à l’ancienne url).

    Tu saurais fixer ça sans te prendre la tête ?

    Le 23 juin 2008 à 22 h 48 min

  • Djoh : je crois que j’ai eu le même problème, mais ça vient de la fonction initiale en elle même, pas de mon code. Je vais essayer de voir d’où vient le problème.

    Le 24 juin 2008 à 10 h 12 min

  • Merci, ça me serait vraiment utile !
    Google a perdu plein de pages à cause de ça. J’essaye de trouver une solution, que ce soit au niveau de la fonction initiale dont tu parles ou de la base de données directement…

    Merci de me tenir au courant !

    Le 25 juin 2008 à 19 h 08 min

  • Bon je fais mon gros malin, mais pour mes petites mains ce n’est pas si simple.

    En gros, le problème vient de là :

    $url = sprintf($blog->front_url’post’,date(‘Y’,$ts),
    date(‘m’,$ts),date(‘d’,$ts),$id,$blog->str2url($titre));

    Cette partie du code reprend le titre du billet en fin d’url, pas l’url effective. J’y travaille.

    Le 3 juillet 2008 à 17 h 29 min

  • A vrai dire, tu as toujours le même problème, Aymeric. Je viens de cliquer sur http://www.ajblog.fr/la-blague-web-du-jour, dans le lien « article précédent ». Mais l’url a changé depuis.

    Le 3 juillet 2008 à 16 h 54 min

  • Voui, pas encore pris le temps d’analyser ou se situaient les urls cherchées par cette satanée fonction.

    Le 3 juillet 2008 à 16 h 59 min

  • Ok je viens de comprendre, laissez moi le temps de compiler l’info et j’explique.

    Le 3 juillet 2008 à 17 h 02 min

  • Pour l’instant j’ai appliqué ton code mais j’ai toujours le meme probleme :
    au lieu du billet précédent de la catégorie j’obtiens le billet courant…

    Une aide ?

    Le 21 janvier 2009 à 16 h 44 min

  • 5047 : normalement la solution au problèmes des urls personnalisées se trouve en bas de l’article dans un EDIT.

    Le 21 janvier 2009 à 16 h 46 min

  • Merci beaucoup, je n’avais plus touché à dotclear depuis longtemps, ce code me facilite les choses!

    Le 4 mars 2009 à 11 h 33 min