Prestashop : Récupérer une configuration directement depuis un template

Ce tutoriel est compatible avec les versions de Prestashop suivantes :
1.5 1.6 1.7 +

J’ai récemment rencontré la problématique de devoir utiliser des variables de configuration dans plusieurs templates non liés d’un site prestashop.
Plutôt que de surcharger l’ensemble des controllers impacté , je suis passé par la solution d’ajouter une nouvelle fonctionnalité directement dans Smarty.
Tout ça sans surcharge et via un module qui fonctionne sur PS 1.6 et 1.7

Edit 2021-08-31 :
A compter de la version 1.7 de prestashop, utiliser plutôt le hook actionDispatcher , car sur les pages ajax le hook header n’est pas appelé.
Merci à Guillaume Batier / PrestaSafe pour l’info ! 🙂

Le code est relativement simple :

class HhConfigTemplate extends Module
{
    public function __construct()
    {
        $this->author    = 'hhennes';
        $this->name      = 'hhconfigtemplate';
        $this->tab       = 'front_office_features';
        $this->version   = '0.1.0';
        $this->bootstrap = true;
        parent::__construct();
 
        $this->displayName = $this->l('HH Config Template');
        $this->description = $this->l('HH Config Template');
    }
 
    public function install()
    {
        if (!parent::install()
            || ! $this->registerHook('displayHeader')
           ) {
            return false;
        }
 
        return true;
    }
 
    public function uninstall()
    {
        return parent::uninstall();
    }
 
    /**
     * Hook Header Ajout d'une fonction dans smarty
     * @param $params
     */
    public function hookDisplayHeader($params)
    {
        //Enregistrement de la fonction "Configuration" dans Smarty qui appelle la fonction "getConfiguration" de cette classe
        smartyRegisterFunction($this->context->smarty, 'function', 'Configuration', array($this, 'getConfiguration'));
    }
 
    /**
     * Récupération d'une configuration
     * @param array $params
     * @return string
     */
    public static function getConfiguration($params)
    {
        if ( isset($params['key'])) {
            return Configuration::get($params['key'],
                isset($params['id_lang']) ? $params['id_lang'] : null,
                isset($params['id_shop_group']) ? $params['id_shop_group'] : null,
                isset($params['id_shop']) ? $params['id_shop'] : null
            );
        } else {
            return '';
        }
    }
}

Dans le template il suffit ensuite de mettre le code suivant par exemple pour récupérer la valeur :

{Configuration key="PS_PRODUCT_PICTURE_WIDTH"}

Vous pouvez également définir l’identifiant de la langue, du groupe de boutique, ou de la boutique, comme vous pouvez le voir dans la fonction getConfiguration() 😉

5 réflexions sur “Prestashop : Récupérer une configuration directement depuis un template”

  1. La troisième c’est la bonne!
    Toutefois j’ai 1 soucis avec le format retourné. Je suis sur la 1.7.2.4.
    Dans mon module, grace à la fonction « getContent » j’ai créer un champ Textarea que je mets à jour avec la fonction configuration du module.
    Dans ce champ je fais un peu de mis en forme (avec ‘tinymce’ => true, dans mon displayForm) avec des <strong> et des puces <li> et un petit peu de couleur <span style="color:#47ff00;"> (c’est toujours mieux avec!).
    Les valeurs et la mise en forme sont bien enregistrées dans la table configuration et configuration_lang.
    Lorque j’affiche mon template où je fais appelle à cette fonction {Configuration key="MA_CLE"}, je récupère le code stocké en table mais il n’est pas interprété en HTML.
    Donc, je n’ai pas ma mise en forme (comme je pouvais la voir sous tinymce).
    Toutes des données s’affichent comme du simple texte.
    Si je prends ce texte et que je le colle dans mon template, il est bien interprété dans ma page.

    Avez-vous une idée de ce qu’il faudrait faire pour retrouver la mise en forme dans mon template.

    Le code enregistré dans la table configuration_lang (pour le commentaire j’ai remis les caractères HTML htmlspecialchars) :
    <p>C'est comme ça qu'il faut l'utiliser.</p>
    <ul><li>le <span style="color:#47ff00;">premie</span>r</li>
    <li>le <span style="color:#ef1b1b;">deuxième</span></li>
    <li>le troisième</li>
    </ul><p>Et puis c'est <strong>tout</strong>.</p>

    Qui devrait donner à peu près ceci en disposition :

    C’est comme �a qu’il faut l’utiliser.

    le premier
    le deuxi�me
    le troisi�me

    Et puis c’est tout.

    1. Bonjour,
      J’ai supprimé vos 2 précédents messages qui était les mêmes 😉
      Dans prestashop 1.7 les variables smarty sont échappées par défaut essayez de rajouter l’attribut « nofilter »
      ( Je n’ai pas testé )
      {Configuration key="PS_PRODUCT_PICTURE_WIDTH" nofilter}

  2. Bonjour,
    Merci pour le tuyau.
    Après quelques essais, j’ai bien ma mise en forme avec la syntaxe :
    {{Configuration key=&quotMA_CLE&quot id_lang=1}|unescape:&quothtml&quot nofilter}

    Avec \’nofilter\’ dans la même accolade, Smarty voit rouge en criant « too many shorthand attributes ». Donc, double accolade.

  3. Bonjour
    Comment installe t-on votre module permettant cela svp ?
    Le code présent sur cette page suffit à lui seul ?
    Merci d’avance pour votre retour
    Pierre

Laisser un commentaire

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