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>&nbsp;</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