Skip to content

Instantly share code, notes, and snippets.

@rseon
Last active December 21, 2021 16:28
Show Gist options
  • Save rseon/7ab819ada6a3c4b57be0ab0d21338e5b to your computer and use it in GitHub Desktop.
Save rseon/7ab819ada6a3c4b57be0ab0d21338e5b to your computer and use it in GitHub Desktop.
Some tips on Prestashop

AdminPatterns

Pour vous aider dans la conception de vos formulaires ou affichage de configuration de module, il existe un controller caché AdminPatterns qui vous donne tous les champs possibles.

Il est accessible dans l'administration à l'adresse https://website.com/admin_xxxxxx/index.php?controller=AdminPatterns et le controller se trouve dans /controllers/admin/AdminPatternsController.php

Astuce PDF

Gagner du temps lors la personnalisation des fichiers pdf ( factures / livraisons … ) 👉 https://www.h-hennes.fr/blog/2020/07/13/prestashop-gagnez-du-temps-lors-la-personnalisation-des-fichiers-pdf-factures-livraisons/ (ce site est une mine d'or au passage)

Bootstrap

Bon à savoir : la version de Boostrap utilisée dans Prestashop est la v4-alpha.5, dont la doc est ici 👉 https://v4-alpha.getbootstrap.com/

Changer les templates des mails

Après moultes recherches et tests, j'ai fini par trouver comment modifier facilement les templates des mails (sans avoir envie de se foutre en l'air donc).

Il suffit de modifier les fichiers présents dans /mails/themes/modern.

Une fois les modifications effectuées, rendez-vous dans l'admin, onglet Apparance > Thème d'email, puis dans l'encart Générer des emails :

  • Choisissez votre thème d'e-mail : modern
  • Choisissez votre langue : Français (French)
  • Sélectionnez le thème que vous voulez écraser : classic (ou le nom de notre thème)
  • Ecraser les templates : Oui Cela génèrera les templates dans le dossier /themes/[your-theme]/mails.

Vous pouvez ensuite les prévisualiser dans la page de l'admin encart Thèmes d'e-mail

CSS et JS globaux

Dans le cas où on souhaite ajouter des CSS et JS à notre thème :

// Fichier /override/classes/controller/FrontController.php
<?php

class FrontController extends FrontControllerCore
{
    public function setMedia()
    {
        parent::setMedia();

        $this->registerStylesheet('slick', '/assets/lib/slick/slick.min.css', ['media' => 'all', 'priority' => 100]);
        $this->registerJavascript('slick', '/assets/lib/slick/slick.min.js', ['position' => 'bottom', 'priority' => 100]);
    
        return true;
    }
}

Resource : https://devdocs.prestashop.com/1.7/themes/getting-started/asset-management/

Détecter le device

Dans un template Smarty il peut être utile de savoir sur quel type de device on se trouve :

  • Mobile : {if Context::getContext()->isMobile() && !Context::getContext()->isTablet()}{/if} ou {if Context::getContext()->getDevice() == 4}{/if}
  • Tablette : {if Context::getContext()->isTablet()}{/if} ou {if Context::getContext()->getDevice() == 2}{/if}
  • Ordinateur : {if !Context::getContext()->isMobile() && !Context::getContext()->isTablet()}{/if} ou {if Context::getContext()->getDevice() == 1}{/if}

Source : https://www.themebooster.com/prestashop-tutorials/prestashop-detect-mobile-devices/

Material Icons

Bon à savoir : le front de Prestashop utilise les icones Material, que vous pouvez utiliser ainsi : <span class="material-icons">done</span>

La doc 👉 https://material.io/resources/icons/?style=baseline

Modifier le thème avec NodeJS

👉 https://www.prestasafe.com/modifier-theme-de-prestashop-1-7-nodejs

Partager des données sur tout le site depuis un module

Le hook actionFrontControllerSetVariables permet d'affecter des variables aux templates ainsi qu'en javascript via l'objet global prestashop à l'aide du namespace modules.mon_module. Donc par exemple :

/**
 * @params array('templateVars' => &(array))
 * @return array
 */
public function hookActionFrontControllerSetVariables($params)
{
    return [
        'hello_text' => 'Hello world',
    ];
}
  • Depuis un template : {$modules.mon_module.hello_text}
  • Depuis du JS : prestashop.modules.mon_module.hello_text

PDF

La doc relative aux PDF dans Prestashop 👉 https://devdocs.prestashop.com/1.7/modules/concepts/pdf/

Prix produits

Plusieurs prix sont disponibles pour les calculs et de l'affichage dans le TPL de la fiche produit.

Valeurs brutes (nombres)

  • price_amount : prix TTC, réduction comprise
  • price_tax_exc : prix HT, réduction comprise
  • price_without_reduction : prix TTC, sans réduction
  • price_without_reduction_without_tax : prix HT, sans réduction
  • reduction : valeur de la réduction TTC
  • reduction_without_tax : valeur de la réduction HT
  • rate : taux de TVA
  • rounded_display_price : à l'air d'être identique à price_amount (avec arrondis ?)
  • regular_price_amount : prix TTC sans réduction

Valeurs formatées (avec le €)

  • price : prix TTC, réduction comprise
  • regular_price : prix TTC, sans réduction
  • discount_to_display : valeur de la réduction TTC

(liste non exhaustive et dépendant sûrement de la version de PS, vous pouvez faire {$product|dump} pour avoir la liste des clés du produit)

Traductions

  • Quand on est dans un template du thème : {l s='Ma chaîne de caractère en français' d='Shop.Nomdutheme'}
  • Quand on est dans un module : {l s='Ma chaîne de caractère en français' mod='mon_module'}

Puis dans l'admin, onglet International > Traductions, on choisit :

  • Traductions de thème > nomdutheme > English
  • Traductions des modules installés > Mon module > English

Trick traductions introuvables

Il faut savoir que seules les traductions des fichiers TPL remontent dans l'outil de traduction de l'admin.

Si on veut en créer une en PHP (exemple : $this->translator->trans('My string', [], 'Shop.Mytheme.Labels')) il faut l'ajouter dans un TPL quelconque (pourvu qu'il soit affiché à l'écran) : {l s='My string' d='Shop.Mytheme.Labels}.

On recharge la page, et si tout va bien, notre string apparait dans le moteur de traduction. Il ne reste plus qu'à traduire et retirer la string du TPL.

Tadaaa !

Source : PrestaShop/PrestaShop#15075 (comment)

Understanding getPriceStatic

La méthode Product::getPriceStatic() est très utile pour récupérer le prix d'un produit, on fonction des paramètres qu'on lui passe :

  • Product::getPriceStatic($id_product, true, null, 6, null, false, true) : prix TTC, réduction comprise (par défaut)
  • Product::getPriceStatic($id_product, false, null, 6, null, false, true) : prix HT, réduction comprise
  • Product::getPriceStatic($id_product, true, null, 6, null, false, false) : prix TTC, sans réduction
  • Product::getPriceStatic($id_product, false, null, 6, null, false, false) : prix HT, sans réduction
  • Product::getPriceStatic($id_product, true, null, 6, null, true, false) : valeur de la réduction TTC
  • Product::getPriceStatic($id_product, false, null, 6, null, true, false) : valeur de la réduction HT

Note : si jamais il y a une erreur à l'appel de cette commande, il faut peut-être initialiser l'employé (me demandez pas pourquoi) en faisant Context::getContext()->employee = 1; avant l'appel à la méthode

Variables Smarty

Il est possible d'utiliser de nombreuses variables globales dans les templates Smarty, en voici une liste :

https://www.team-ever.com/prestashop-1-7-liste-des-variables-smarty/

Widgets

Prestashop 1.7 permet d'utiliser les widgets, utiles afin de placer les modules où on veut dans les templates.

Doc : https://devdocs.prestashop.com/1.7/modules/concepts/widgets/

Pour utiliser le widget d'un module, il faut au préalable vérifier que ce module le permet, et on le sait si la classe du module (fichier qui porte le même nom que son répertoire) implémente la classe WidgetInterface. C'est le cas par exemple du module Panier ps_shoppingcart. On peut l'afficher où on veut dans les TPL grâce au marqueur {widget name='ps_shoppingcart'}.

L'inconvénient est qu'on outrepasse la partie Position de l'admin, puisque la position du module est fixée dans le template.

Dans le cas où le module peut être accroché à plusieurs hooks, on peut le forcer ainsi : {widget name='ps_shoppingcart' mod='displayTop'}

Dans le cas où le module n'a pas de widget, pas de panique ! On peut utiliser l'ancien marqueur de hook de cette façon : {hook h='displayTop' mod='module_sans_widget'}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment