Le fichier _public.php

Enfin le fichier _public.php, celui dans lequel vous mettrez le code des fonctions des behaviors que vous utiliserez.

if (!defined('DC_RC_PATH')) { return; }

if ($core->tplPlugin_Params['Ok'])
	{
	# Déclaration des behaviors
	}
?>

Bon là, il n'y a rien car notre plugin ne faisant rien, on ne fait rien ... LOL

Maintenant que l'on a tout le cadre pour créer un plugin, autant illustrer par l'exemple son utilisation, en fait la mienne, à vous de trouver votre méthode ;-)


Reprenons chaque point (en général chaque fichier)

L'identité

Pour l'auteur et le nom du plugin inscrit en dur dans chaque entête il ne faudra pas oublier de les changer. Pour l'identité visuelle, l'aide, etc ... on va faire simple on va laisser tel quel.

Le fichier _define.php

On touche à rien, mais sinon il faudrait reprendre l'auteur, le nom, le numéro de version, la description.

Le fichier __params.php

En fait on ne va avoir besoin que d'un seul nouveau paramètre le contenu de l'Edito au format xHtml, donc on ajoute dans notre tableau de paramètre l'entrée 'Text' et le contenu voulu (à votre convenance).

$newParams = array(
	'Ok' => false,
	'DashBoardFavs' => false,
	'InfoVersion' => false,
	'Text' => '
<script>
function Toggle(id) {
	if(document.getElementById(id).style.visibility=="hidden") {
		document.getElementById(id).style.visibility="visible";
		document.getElementById("Toggle_"+id).innerHTML="Cacher les Editos précédents";
		}
	else {
		document.getElementById(id).style.visibility="hidden";
		document.getElementById("Toggle_"+id).innerHTML="Afficher les Editos précédents";
		}
	return true;
}
</script>
<div id="hEdito" class="post" lang="fr" xml:lang="fr">
	<div class="day-date">
		<span class="day">29</span>
		<span class="month">nov.</span>
		<span class="year">2011</span>
	</div>
	<h2 class="post-title">
		<a href="#">Edito !</a>
	</h2>
	<p class="post-info">Par Akh le mardi, 25 novembre 2011, 20:30</p>
	<div class="post-content">
		<p>
			Edito du jour, Bonjour !
		</p>
		<a id="Toggle_Edito99" href="#" onclick=Toggle("Edito99");>
				Afficher les Editos précédents</a>
		<p id="Edito99" style="visibility:hidden;">
			Edito de la veille, Bonsoir !
		</p>
	</div>
</div>
	'
	);
?>

Le fichier _install.php

Rien à faire !

Le fichier _prepend.php

Rien à faire non plus ! D'où l'intérêt du fichier __params.php :-)

Le fichier _admin.php

Rien à faire, puisqu'on n'interagit que par la page d’administration du plugin.

Le fichier index.php

Là par contre il va falloir permettre à l'utilisateur de modifier le texte de l'Edito Donc au moment de la sauvegarde on ajoute la dernière ligne :

		$core->tplPlugin_Params['Ok'] = (empty($_POST['tplPlugin_Ok']))?false:true;
		$core->tplPlugin_Params['DashBoardFavs'] =
			(empty($_POST['tplPlugin_DashBoardFavs']))?false:true;
		$core->tplPlugin_Params['Text'] = $_POST['tplPlugin_Text'];

Et particularité d'un Edito de ce type il faut forcer la mise-à-jour du cache à la sauvegarde par cette dernière ligne :

		$core->blog->triggerBlog();
		$core->emptyTemplatesCache();

Et dans le formulaire on ajoute les deux paragraphes concernant la textarea :

		<fieldset>
			<legend><?php echo $ico16.'&nbsp;'.'Paramètres généraux :'; ?></legend>
				<div class="two-cols">
				<div class="col">
				<p class="field">
					<?php echo form::checkbox('tplPlugin_Ok', 1,
						html::escapeHTML($core->tplPlugin_Params['Ok'])); ?>
					<label class=" classic" for="tplPlugin_Ok"> 
						<?php echo __('Activation');?></label>
				</p>
				<p class="field">Contenu de l'Edito en xHtml :</p>
				<p class="field">
					<?php echo form::textarea('tplPlugin_Text', 100, 20,
						html::escapeHTML($core->tplPlugin_Params['Text'])); ?>
				</p>
				</div>
				<div class="col">
				<p><?php echo __("A suivre ...");?> 
					<a href="http://akhthot.free.fr/blog/pages/tplPlugin">
						<?php echo $ico16;?>&nbsp;tplPlugin</a></p>
				</div>
				</div>
		</fieldset>

Le fichier _public.php

Du coup ce fichier maintenant va nous permettre de déclarer le behavior qui va nous servir à afficher l'Edito

if (!defined('DC_RC_PATH')) { return; }

if ($core->tplPlugin_Params['Ok'])
	{
	$core->addBehavior('templateBeforeBlock',
		array('tplPluginBehaviors','templateBeforeBlock'));
		
	$core->tplPlugin_Params['Off'] = true;
	}
	
class tplPluginBehaviors
	{
	public static function templateBeforeBlock($core,$b,$attr)
		{
		global $_ctx;
		if ($core->tplPlugin_Params['Off']
			and $_ctx->current_tpl == 'home.html'
			and $b == 'Entries'
			and !isset($attr['no_content'])
			)
			{
			$core->tplPlugin_Params['Off'] = false;
			return "<?php echo \$core->tplPlugin_Params['Text'];?>";
			}
		}
	}
?>

Pour s'affranchir du thème, j'utilise le behavior templateBeforeBlock, appelé avant chaque blocs de template donc avant la boucle Entries (entre autres) d'affichage des billets.

Pour éviter que l'Edito ne s'affiche plusieurs fois si plusieurs blocs Entries existent dans la page j'utilise une variable 'Off' qui est vrai tant que l'Edito n'a pas été inséré (je l'ai rattaché au tableau de paramètres du plugin comme ça elle est bien rangée ;-) )

Les tests avant l'insertion vérifie que la page en cours est bien home.html et que le bloc Entries ne contient pas d'attribut no_content (gage normalement d'être bien dans le body de la page).

Voilà maintenant un plugin opérationnel, vous trouverez une archive sans la partie Edito en pièce-jointe de ce billet.

Epilogue - hEdito

Le plugin hEdito que je propose sur ce site présente toutefois quelques différences : Etant herbergé chez free, l'effacement du cache ne peut se faire que par ftp (la destruction de dossier étant impossible autrement), aussi j'ai ajouté une fonction récursive qui détruit les fichiers et uniquement les fichiers du cache :

function hEditoEmptyCache($f) {
	if (is_dir($f)) {
		$hf = opendir($f);
		while(false !== ($sf = readdir($hf))) {
			if ($sf != '.' and $sf != '..') {
				if (is_dir($f.'/'.$sf)) {
					hEditoEmptyCache($f.'/'.$sf);
					}
				else {
					unlink($f.'/'.$sf);
					}
				}
			}
		closedir($hf);
		}
//		rmdir($f);
	}

fonction que j'appelle juste après la commande qui marche chez les autres hébergeur :

		$core->blog->triggerBlog();
		$core->emptyTemplatesCache();
		hEditoEmptyCache(DC_TPL_CACHE.'/cbtpl');

De plus j'ai ajouté un bouton ré-initialiser le contenu de l'Edito par ce qui est défini par défaut dans __params.php

if (!empty($_POST['resetText']))
	{
	require '__params.php';
	$core->hEdito_Params['Text'] = $newParams['Text'];
	}

Avec :

		<fieldset>
			<input type="submit" name="resetText"
				value="<?php echo __('Réinitialiser l\'Edito'); ?>" />
			&nbsp;&nbsp;-&nbsp;&nbsp;
			<input type="submit" name="saveconfig"
				value="<?php echo __('Sauver cette configuration'); ?>" />
			<input type="hidden" name="p"
				value="hEdito" /><?php echo $core->formNonce(); ?>
		</fieldset>

Explication VersionInfo

De plus comme j'utilise un suivi des versions par information il y a un paramètre de plus déclaré dans __params.php et géré dans index.php, pour l'activation ou non de VersionInfo et son implémentation. Ce qui donne dans __params.php :

	'InfoVersion' => false,

Et dans index.php

		$core->hEdito_Params['InfoVersion'] = (empty($_POST['hEdito_InfoVersion']))?false:true;

Puis

$urlVersionInfo = "http://akhthot.free.fr/blog/VersionInfo";

et enfin

				<p class="field">
					<?php echo form::checkbox('hEdito_InfoVersion', 1,
						html::escapeHTML($core->hEdito_Params['InfoVersion'])); ?>
					<label class=" classic" for="hEdito_InfoVersion"> 
						<?php echo __('Activation VersionInfo');?></label>
				</p>

Et

				<p>
					<?php if ($core->hEdito_Params['InfoVersion'])
						echo '<a href="'.$urlVersionInfo.'/Son/hEdito/hEdito.'.$vplug.'">
						<img src="'.$urlVersionInfo.'/Img/hEdito/hEdito.'.$vplug.'"
						alt="VersionInfo '.__('Indisponible !').'" title="VersionInfo" /></a>';?>
				</p>

Voilà je reviendrai peut-être sur ces sujets suivant mes envies et le temps que je pourrai y consacrer ... et vos commentaires ;-)