Modification du plugin SmartyFilter
Dans le fichier de config du module (config/xml), je rajoute un "service" :
<service id="smartyfilter.filter.shortcode" class="SmartyFilter\Filter\ShortcodeFilter" >
<tag name="thelia.parser.register_output_filter"/>
</service>
Dans le fichier smarty-filter.xml, je rajoute la description de mon filtre :
<smartyfilter code="smartyfilter.filter.shortcode">
<descriptive locale="fr_FR">
<title>ShortCode</title>
<description>Créer des shortcode dans le texte</description>
<type>output</type>
</descriptive>
<descriptive locale="en_US">
<title>ShortCode</title>
<description>Create shortcode</description>
<type>output</type>
</descriptive>
</smartyfilter>
Lorsque le plugin est activé dans le backoffice du site, il vous reste encore à activer le ou les filtres que vous voulez utiliser. (Outils > Filtre Smarty)
Et je viens créer un fichier ShortcodeFilter.php , que je place dans le dossier \SmartyFilter\Filter
Dans ce fichier ShortcodeFilter.php, j'écris en php, avec la fonction preg_replace(), de rechercher les expressions [blockquote], [/blockquote], etc., et de les remplacer par <div class="blockquote">, </div>, etc
La fonction preg_replace() peut avoir un argument unique, ou un tableau d'arguments. C'est mon cas : je définis chaque Shortcode, et le code html par lequel je souhaite que le moteur de template le remplace.
Voici le code de mon fichier Shortcodefilter.php :
<?php
// namespace SmartyFilter\Filter;
/**
* Class ShortcodeFilter
*/
class ShortcodeFilter
{
public function filter($tpl_output, $smarty)
{
$tpl_output =
preg_replace(array('/\[ctalivre\]/','/\[\/ctalivre\]/','/\[blockquote\]/','/\[\/blockquote\]/'),
array('<div class="ctalivre">','<p> </p></div>','<div class="blockquote">','</div>'),
$tpl_output);
return $tpl_output;
}
}
Chose étrange, il n'y a pas de balise fermante pour le php..
Attention aux [ et aux / : il faut un \ pour qu'ils soient bien pris en compte dans preg_replace()
Et ça marche : c'est à dire que j'écris dans mon article [blockquote]mon super texte à formater en citation[/blockquote] et lorsque j'enregistre mon article, le moteur transforme le Shortcode en balise html <div class="blockquote">mon super texte à formater en citation</div>
Bien évidemment, la class .blockquote aura été définie au préalable dans votre fichier css.
Dans mon fichier, j'ai actuellement défini 2 shortcodes. Si je veux en définir d'autres, il suffit de préciser dans mon array le shortcode et ce par quoi il doit être remplacé.
Dernière mise à jour