Attention : Étant resté sous DotClear 1.2.6, il y a quelques petites différences avec DotClear 1.2.7 et suivants (1.2.7.1 et 1.2.8) mais si vous comprenez le principe sous 1.2.6, c'est très facilement transposable ! - Je fais des approximations dans mes explications, le principal c'est de comprendre ce qui se passe.

Le comportement de DotClear 1.2 ne me satisfaisait pas au niveau de la publication de l'extrait (Chapô) et des flux (RSS et Atom). J'ai donc changé cela, je vous explique...

Le comportement par défaut de DotClear, c'est quoi ?

  • En page d'accueil, si le billet contient un extrait (chapô), on n'affiche que l'extrait
  • A l'intérieur du billet, on affiche l'extrait + le corps du billet

Pour les flux, c'est plus compliqué suivant que les flux sont tronqués ou pas :

  • Flux tronqués, présence d'un chapô : Publication du chapô
  • Flux tronqués, pas de chapô : Publication des 300 premiers caractères du billet
  • Flux non tronqués (Chapô ou pas) : Publication du chapô + intégralité du billet

C'est cette dernière possibilité qui ne me convenait pas. Lorsque le billet n'a pas de chapô, il me parait normal de publier l'intégralité du billet mais pas en présence d'un chapô ! Je voulais donc qu'en présence de chapô, lorsque les flux ne sont pas tronqués, il n'y a publication que du chapô dans les flux. Voyons comment faire cela :

Les modifications sont à effectuer dans le fichier class.xblogspost.php qui se trouve dans layout. Les deux fonctions qui nous intéressent sont getRSSItem et getAtomEntry (les deux dernières). Je vais expliquer sur getRSSItem puisque c'est la même chose pour getAtomEntry.

Un coup d'oeil d'abord sur la fonction d'origine (rappel : de DotClear 1.2.6, hein...) :


function getRSSItem($short=false)
{
	if ($this->f('post_chapo') != '') {
		$desc = strip_tags($this->f('post_chapo'));
	} else {
		$desc = util::cutString(strip_tags($this->f('post_content')),300).'...';
	}
		
	if ($short) {
		$content = $desc;
	} else {
		$content = $this->f('post_chapo').' '.$this->f('post_content');
	}
		
	return...

Je ne recopie pas toute la fonction, c'est la partie avant le "return" qui nous intéresse.


if ($this->f('post_chapo') != '') {
	$desc = strip_tags($this->f('post_chapo'));

=> Si le chapô n'est pas vide, on place dans la variable desc le contenu de ce chapô


} else {
	$desc = util::cutString(strip_tags($this->f('post_content')),300).'...';
}

=> Sinon (pas de chapô donc), on place dans desc les 300 premiers caractères du billet.


if ($short) {
	$content = $desc;

=> Si le flux est tronqué, on place dans la variable content ce qui est dans desc


} else {
	$content = $this->f('post_chapo').' '.$this->f('post_content');
}

=> Sinon (flux non tronqué donc), on place dans la variable content le chapô + le billet.

C'est donc cette dernière partie que je vais adapter. Je vais remplacer ce qu'il y a à l'intérieur du "else" par ceci :


if ($this->f('post_chapo') != '') {
	$content = $this->f('post_chapo').'<p><strong>Pour lire le reste du billet, venez sur le blog</strong></p>';
} else {
	$content = $this->f('post_chapo').' '.$this->f('post_content');
}

=> Si le chapô n'est pas vide, publication du chapô et d'une phrase invitant à venir lire le reste sur le blog. Sinon publication du chapô + billet.

La fonction devient donc :


function getRSSItem($short=false)
{
	if ($this->f('post_chapo') != '') {
		$desc = strip_tags($this->f('post_chapo'));
	} else {
		$desc = util::cutString(strip_tags($this->f('post_content')),300).'...';
	}
		
	if ($short) {
		$content = $desc;
	} else {
	
		if ($this->f('post_chapo') != '') {
			$content = $this->f('post_chapo').'<p><strong>Pour lire le reste du billet, venez sur le blog</strong></p>';
		} else {
			$content = $this->f('post_chapo').' '.$this->f('post_content');
		}
			
	}
		
	return...

Voilà, c'est tout. Un petit test conditionnel supplémentaire et les flux non tronqués ne contiennent plus l'intégralité du billet lorsqu'il y a un chapô.

(J'avais absolument besoin de ce comportement lors de la publication de mon billet des tests des sextoys. Je ne voulais en aucun cas que le billet passe dans le flux afin que des enfants ne puissent le lire par erreur. En venant sur le blog, le tag ICRA fait son office.)

Pour la fonction getAtomEntry, on remplace exactement la même portion de code au même endroit.

Pour DotClear 1.2.7 et suivants, il y a une portion différente :


$content = $this->f('post_chapo').' '.$this->f('post_content');

est remplacé par :


$content = util::relToAbsURL($this->f('post_chapo').' '.$this->f('post_content'));

dans la fonction d'origine. Ce n'est pas la mer à boire à adapter, si ? :evil: