Prestashop 1.7 : Dynamisez vos contenus wysiwyg

Ce tutoriel est compatible avec les versions de Prestashop suivantes :
1.7 +
Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

La problématique n’est pas nouvelle sur Prestashop, et c’est un point qui me frustre assez souvent et pour lequel j’avais déjà fait un module en 2014 ( cf. https://www.h-hennes.fr/blog/2014/01/18/prestashop-liens-dynamiques-vers-les-pages-cms-dans-lediteur-tinymce/ )
Ce module n’est malheureusement plus fonctionnel sur Prestashop 1.7.

Dans les éditeurs de contenus, il n’est pas possible  des mettre des liens ou des contenus dynamiques.
La bonne nouvelle cependant c’est que la version 1.7 de Prestashop apporte de nouveaux hooks qui vont permettre de modifier ces contenus avant l’affichage des éléments, et donc sans surcharge  🙂

Les éléments dont les contenus sont modifiables sont les suivants :

  • Pages cms
  • Catégories cms
  • Contenu produit
  • Contenu catégorie
  • Contenu Fabriquants
  • Contenu fournisseurs

Pour l’exemple on va partir sur le besoin suivant :

Je souhaite afficher un élément de configuration  dans l’ensemble des contenus noté ci-dessous.
Ce sera la configuration PS_SHOP_EMAIL , qui correspond à l’émail par défaut de la boutique.

Pour afficher cette variable il faudra intégrer dans les zones de contenus le code suivant :

{{configuration name=PS_SHOP_EMAIL}}

Le but du module sera donc de remplacer cet élément par sa valeur de configuration.

Voici le contenu qui sera saisi dans l’admin :

Cms placeholder

Et le résultat :

Cms placeholder result

Vous trouverez ci-dessous le code complet du module qui permets de gérer cela

<?php
class HhContentVars extends Module {
 
    public function __construct() {
        $this->name = 'hhcontentvars';
        $this->tab = 'others';
        $this->author = 'hhennes';
        $this->version = '1.0.0';
        $this->need_instance = 0;
        $this->bootstrap = true;
 
        parent::__construct();
 
        $this->displayName = $this->l('Hh content var');
        $this->description = $this->l('Add content var in wysiwyg editors');
    }
 
    public function install() {
        if (!parent::install() 
                //Hooks Fronts d'affichage
                || !$this->registerHook('filterCmsContent') 
                || !$this->registerHook('filterCmsCategoryContent') 
                || !$this->registerHook('filterProductContent') 
                || !$this->registerHook('filterCategoryContent') 
                || !$this->registerHook('filterManufacturerContent') 
                || !$this->registerHook('filterSupplierContent')
        )
            return false;
 
        return true;
    }
 
 
    /**
     * Filtre des contenus Cms
     * @param $params
     * @return array
     */
    public function hookFilterCmsContent($params) {
 
        $params['object']['content'] = $this->_updateContentVars($params['object']['content']);
 
        return [
            'object' => $params['object']
        ];
    }
 
    /**
     * Filtre des contenus des catégories cms
     * @param $params
     * @return array
     */
    public function hookFilterCmsCategoryContent($params) {
 
        $params['object']['description'] = $this->_updateContentVars($params['object']['description']);
 
        return [
            'object' => $params['object']
        ];
    }
 
    /**
     * Filtre des contenu des produits
     * @param $params
     */
    public function hookFilterProductContent($params) {
        $params['object']['description'] = $this->_updateContentVars($params['object']['description']);
        return [
            'object' => $params['object']
        ];
    }
 
    /**
     * Filtre des contenus des catégories produits
     * @param $params
     * @return array
     */
    public function hookFilterCategoryContent($params) {
 
        $params['object']['description'] = $this->_updateContentVars($params['object']['description']);
 
        return [
            'object' => $params['object']
        ];
    }
 
    /**
     * Filtre des contenus des Marques
     * @param $params
     * @return mixed
     */
    public function hookFilterManufacturerContent($params) {
 
        return $this->_updateContentVars($params['filtered_content']);
    }
 
    /**
     * Filtre des contenus des fournisseurs
     * @param $params
     * @return array
     */
    public function hookFilterSupplierContent($params) {
        $params['object']['description'] = $this->_updateContentVars($params['object']['description']);
 
        return [
            'object' => $params['object']
        ];
    }
 
    /**
     * Mise à jour du contenu
     * @param string : contenu ou il faut remplacer les variables
     * @return string : contenu avec les variables remplacées
     */
    protected function _updateContentVars($content) {
 
        $content = urldecode($content);
 
        //Récupération des éléments de configuration
        preg_match_all('#{{configuration name=(.*)}}#i', $content, $configurations);
        if (isset($configurations[1]) && sizeof($configurations[1])) {
            foreach ($configurations[1] as $conf) {
                if ( $value = Configuration::get($conf) ) {
                    $content = preg_replace('#{{configuration name=' . $conf . '}}#',$value, $content);
                }
            }
        }
 
        return $content;
    }
}

Ceci n’est qu’un exemple, il donc possible de mettre en place autant de tags que souhaités.
Si j’ai le temps durant les prochaines semaines je verrais peu être pour mettre à jour mon module précédent uniquement PS 1.7

4 réflexions sur “Prestashop 1.7 : Dynamisez vos contenus wysiwyg”

  1. Bonjour,
    Je ne connais pas très bien les cms et je voudrais savoir les différences entre ce module et le module natif Prestashop « Liste des liens » qui se traduit par l’ajout du lien ‘Link Widget’ dans le menu « Personnaliser\Apparence » ?
    Ce Link Widget est un peu confus pour moi sans documentation.
    Merci par avance pour toute information.

    1. Bonjour Boby,
      Les 2 modules n’ont absolument rien à voir.
      Celui-ci permet d’enrichir les contenus existants de objets.
      Le module que vous citez permets de créer des blocs de listes de liens, que vous pouvez placer sur les différents hooks de votre thème.
      Si vous prenez la démo de prestashop 1.7.3 par exemple : http://demo.prestashop.com/fr/?view=front
      Dans le pied de page, les listes de liens « Produits » et « Notre société » sont gérés via ce module.

      Cordialement,
      Hervé

  2. Bonjour superbe tuto
    mais qui ne répond pas en tout à ma recherche alors peut être pouvez m’éclaircir?

    1°) est il possible de mettre un formulaire dans les pages CMS

    2°) est il possible d’inclure {block name=’social_sharing’} dans les pages cms,

    merci

    1. Bonjour,
      Cet article est un poc ( proof of concept ) et ne peut bien évidemment pas répondre à l’ensemble des besoins.
      Il pose juste des bases pour développer des contenus dynamiques et nécessite encore l’écriture de code.

      Vous pouvez tout à fait imaginer insérer des formulaires dans les contenus cms en mettant en place une balise sous la forme {{ form id= » »}} et ensuite implémenter votre propre logique
      En revanche l’insertion du bloc {block name=’social_sharing’} en tant que telle ne sera pas fonctionnelle, mais vous pouvez également l’implémenter via une balise perso {{block id= » »}}

      Cordialement,
      Hervé

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *