TuTo tplPlugin (04)
Par Akh le dimanche, 11 décembre 2011, 14:23 - Lien permanent
Rappel : Cette série de quatre billets n'a pas la prétention de vous présenter "la meilleure façon" de faire un plugin, mon seul souhait : que vous trouviez des réponses à vos interrogations, voir que vous appréhendiez mieux certaines particularités. La documentation officielle reste "la bible" en la matière, "le forum" regorge d'adeptes toujours prompts à vous aider.
Je vous propose de détailler le plugin hEdito (renommé pour l'occasion pour éviter les plantages) qui me permet sur ce blog d'avoir un Edito indépendant de toute intervention sur le thème.
Le dénouement ...
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 ...
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.' '.'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;?> 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'); ?>" /> - <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