Ajouter des conditions d'affichage dans PrestaShop

Intégration, PrestaShop
  • Accueil
  • Blog
  • Ajouter des conditions d'affichage dans PrestaShop

Un billet plutôt technique concernant l’intégration sous PrestaShop parce qu’il arrive bien souvent d’être confronté à ce type de problème : afficher ou non un élément en fonction d’une condition.
Pour ce faire, on va faire appel à nos connaissances smarty et plusieurs variables.

Principales variables smarty dans PrestaShop

Pour rappel donc, voici une liste des principales variables de PrestaShop que l’on peut utiliser sur n’importe quelle page :
{$base_dir}
Url de votre site web, racine du site. Utile et indispensable lorsque vous insérez des liens, je déconseille fortement de mettre des liens en dur directement dans votre code mais plutôt d’utilisez cette variable et toute les autres qui suivent, car le jour où vous migrez d’hébergement ou de nom de domaine, cela pourrait vous causer beaucoup de problèmes.
{$base_dir_ssl}
Idem via le protocol https.
{$content_dir}
Url vers votre dossier racine du site, peut changer en fonction des paramètres SSL. A ne pas confondre avec {$basedir}, cette variable vous donne l’Url complète jusqu’au dossier racine.
{$img_ps_dir}
Url vers le dossier img situé à la racine de votre boutique.
{$img_dir}
Url vers le dossier img de votre thème.
{$css_dir}
Url vers le dossier css de votre thème.
{$js_dir}
Url vers le dossier js situé à la racine de votre boutique.
{$tpl_dir}
Url vers votre dossier thème.
{$modules_dir}
Url vers le dossier modules. Utilisée principalement dans le code des modules.
{$mail_dir}
Url vers le dossier mail.
{$lang_iso}
Code ISO du language courant.
{$come_from}
Url absolue de la page précédente.
{$shop_name}
Nom de votre boutique.
{$cart_qties}
Nombre total de produits dans votre panier.
{$cart}
Contenu de votre panier sous forme de tableau.
{$currencies}
Liste des devises disponibles sous forme de tableau, retrouvez la liste via ce code {foreach from=$currencies item=c}{$c.name}{/foreach}
{$id_currency_cookie}
Identifiant de la devise actuelle.
{$languages}
Liste des langages disponibles dans la boutique sous forme de tableau, retrouvez la liste via ce code :{foreach from=$languages item=c}{$c.name}{/foreach}
{$logged}
Permet de vérifier si le client est connecté, utile pour afficher des éléments uniquement aux visiteurs enregistrés. (ex : {if $logged}Vous êtes connecté{/if}
{$page_name}
Nom de la page actuelle (ex: index)
{$customerName}
Nom et prénom du client actuellement connecté.
{$priceDisplay}
Paramètre actuel de l’affichage des prix (identifiant).

Affichage d’un élément soumis à condition

Dans le même principe, on peut utiliser d’autres variables smarty dans PrestaShop pour filtrer l’affichage de certains éléments notamment.
Exemple 1 : afficher un texte seulement sur la catégorie ayant l’identifiant numéro 3

{if $id_category == 3}
{l s='mon texte visible seulement dans la catégorie 2'}
{/if}

Exemple 2 : afficher un texte seulement sur les catégories de niveau 2

{if $category->level_depth == 2}
{l s='mon texte affiché sur une catégorie de niveau 2'}
{/if}

Les possibilités sont énormes d’autant que les variables sont nombreuses et peuvent être affichées en insérant le bout de code {debug} dans le fichier .tpl en question. En effet, par défaut les variables de catégorie présentées ci-dessus ne sont pas utilisables sur le fichier product.tpl etc.
Un petit tour sur la documentation smarty ne sera qu’un plus pour vous perfectionner et aussi combiner les conditions d’application des variables, voir la documentation smarty.
Vous avez toutes les clés en mains pour franchir les questions d’intégrations fréquentes dans PrestaShop.

155 commentaires sur “Ajouter des conditions d'affichage dans PrestaShop

  1. bonjour
    je voudrais afficher un élément pour une catégorie et ses sous catégories seulement.
    ex: j’ai une catégorie 747 avec des sous catégorie 748, 749, 730 etc
    j’aimerais bien que n’afficher un texte que pour le catégorie 747 et ses sous catégories
    avec le code {if $id_category == 747} ça marche mais pas pour les sous catégories, je suis obligé de me taper un truc du genre
    {if $id_category == 747 || $id_category == 748|| $id_category == 749 || $id_category == 730}
    le hic est que j’ai des catégories qui ont 200 voir 300 sous catégories donc le faire à la main un peu tendu.
    auriez-vous une solution?
    merci

  2. Dans ce cas, j’opterai pour une condition avec un champ libre à importer avec les produits (ou à mettre à jour) comme le champ location, par exemple, et ça donnerai : {if $product->location == …}…{/if} 🙂

  3. Bonjour Sylv1, c’est normal que ça ne marche pas car il faut écrire la condition ainsi : {if $product->id == 2915}votre_contenu{/if}
    Bonne journée 🙂

  4. Bonjour,
    Je suis sous PS 1.5.5 et j’essais de mettre une condition d’affichage sur le bloc de publicité: j’aimerais qu’un bloc particulier s’affiche seulement pour une cat. Voilà ce que j’ai mis:
    {if $id_category == 6}

    {/if}
    Mais cela ne marche pas… Avez vous une idée?
    Merci d’avance

    1. @Ewa : Bonjour, dans quel fichier .tpl avez-vous placé votre condition ? Car suivant le fichier .tpl la variable smarty n’est pas chargée. Si c’est ce que je pense, vous l’avez placé dans le module publicité. Si oui, ajouté au de votre page dans sa class la variable suivante : [code]{if $page_name == ‘category’}category-{$id_category}{/if}[/code]
      Avec ça, vous n’aurez qu’à appliquer un peu de CSS de la sorte : [code]
      body#category.category-3 #monblocpub {display:block;}
      body#category #monblocpub {display:none;}
      [/code]
      A bientôt 🙂

    2. Merci beaucoup pour votre réponse rapide. Une petite question quand même: dans quel fichier exactement dois-je ajouter la nouvelle variable?
      Merci 🙂

    3. Ça ne marche toujours pas. 🙁 Rassurez moi, dans le blockadvertising.tpl on garde bien la condition: [code]{if $id_category == 6}
      <div id="monblocpub" class="advertising_block">
      <a href="{$adv_link}" title="{$adv_title}"><img src="{$image}" alt="{$adv_title}" title="{$adv_title}" width="155" height="163" /></a>
      </div>
      {/if}
      [/code] ?
      Merci

      1. @Ewa : Non il faut supprimer votre condition dans le blockadvertising.tpl puisqu’on a fait : 1) ajout d’une class si on est dans la catégorie ciblée 2) on masque via le CSS le block publicité.

  5. @Maxime : Bonjour, dans votre cas l’élément sera affiché dans les catégories autres que niveau 3. Le code est à placer dans le category.tpl 😉

  6. @Corinne : Bonjour, dans votre cas je pencherais plutôt pour pour la variable $combinations, aidez vous d’un

    {$combinations|print_r}

    et tout devrait aller 🙂

  7. Bonjour,
    Merci pour votre réponse. J’y suis presque mais c’est pas encore ça !
    Voici mon attribut (11) et ma valeur (119) :
    j’aimerai que le texte apparaisse uniquement si on choisi la valeur 119 (j’ai trois valeurs dans cet atrtibut )
    j’ai essayé :
    {if $combinations == 119}votre contenu{/if}
    sans succes
    en utilisant la fonction {$combinations|print_r} cela me donne ces infos :
    Array ( [6995] => Array ( [attributes_values] => Array ( [11] => Un coupon de 24cm sur 75cm (demi laize) ) [attributes] => Array ( [0] => 120 ) [price] => 2.916667 [specific_price] => [ecotax] => 0 [weight] => 0 [quantity] => 8 [reference] => [unit_impact] => 0.00 [minimal_quantity] => 1 [available_date] => [id_image] => -1 [list] => ‘120’ ) [6994] => Array ( [attributes_values] => Array ( [11] => Un coupon de 48cm sur 75cm (demi laize) ) [attributes] => Array ( [0] => 121 ) [price] => 4.583333 [specific_price] => [ecotax] => 0 [weight] => 0 [quantity] => 0 [reference] => [unit_impact] => 0.00 [minimal_quantity] => 1 [available_date] => [id_image] => -1 [list] => ‘121’ ) [6993] => Array ( [attributes_values] => Array ( [11] => La laize (150cm) sur une longueur de mon choix (en cm) ) [attributes] => Array ( [0] => 119 ) [price] => 0.27775 [specific_price] => [ecotax] => 0 [weight] => 0 [quantity] => 100 [reference] => [unit_impact] => 19.00 [minimal_quantity] => 20 [available_date] => [id_image] => -1 [list] => ‘119’ ) ) 1
    Merci d’avance de votre aide précieuse,

  8. Bonjour !
    J’aimerais un peu d’aide svp 🙂
    J’affiche un module seulement sur quelques produits, en éditant mon module.tpl comme suit :
    {if $smarty.get.id_product == 2} action
    {/if}
    je voudrais en fait aller un peu plus loin et dire que « Cela ne s’affiche que dans TOUS les produits de la catégorie dont l’id est 2 ou 3 »
    Merci

    1. @Karim : Bonjour, dans votre cas vous pouvez utiliser la variable {$product->id_category_default} ou {$product->category} 😉

    2. Merci beaucoup pour votre réponse.
      Donc ca serait en ajoutant l’id de la catégorie comme ceci ? :
      {$product->id_category_default == 2} par exemple et sans {if] {/if} ?

    3. Merci alors figures toi que j’ai essayé avec les deux ça n’a rien donné. Et la j’ai juste tenté un truc avant de dormir et ça a marché c :
      {If $category->Id == XX} action {/if}
      A mettre dans le tpl de tout module comme condition d’affichage sur la fiche d’un produit

  9. Bonjour, je souhaiterais afficher une div uniquement dans certaines pages cms, j’ai essayé :
    {if $category->id_cms_category == 3}
    txt!
    txt
    01
    txt
    Contactez nous !
    {/if}
    En activant la console j’obtient les erreurs suivantes :
    Notice: Undefined index: category
    Notice: Trying to get property of non-object
    Si quelqu’un a une solution 🙂
    Merci d’avance 🙂

    1. @Pierre : Bonjour, pour vous répondre si on affiche le debug smarty en insérant dans le cms.tpl {debug} on obtient les variables que l’on peut utiliser notamment :
      conditions cms prestashop
      Donc ça devrait donner dans le cms.tpl à l’endroit souhaité :
      [code]
      {if $cms->id == 4}
      mon contenu…
      {/if}
      [/code]
      Au boulot 🙂

  10. Hum … Et si clients du groupe 3 aussi… sinon autant vider mes stock 🙂
    Donc je reprends :
    {if $product->id_category == 2 && $customer->id_group == 3 } ( c’est possible ça ?)
    GRISER et RENDRE IMPOSSIBLE AJOUT
    {/if}
    Merci

  11. @Zoux : Bonjour, vous pouvez utiliser la fonction native de PrestaShop « désactiver le produit à la vente » à gérer par produit ou bien utiliser en class directement sur l’élément à griser : [code]<a class="{if $product->id_category_default}bouton_grise{/if}" href="#">Ajouter au panier</a>[/code]
    Il ne reste plus qu’à appliquer le style adéquat 🙂

  12. @Karim : Bonjour, merci pour votre demande aussi envoyez-moi un mail pour votre demande en me donnant une url et tous les détails.

  13. Merci pour la réponse rapide,
    Permet-moi de poser la question d’une façon differente :
    comment pourrai-je afficher l’attribut des produits dans la page « product-list.tpl »
    Je pense utiliser les attributs comme class CSS et jouer avec le display:none et block pour masquer et afficher les produits en fonction de leur attribut
    Merci de nouveau 🙂

  14. Bonjour, vous pouvez utiliser la condition dans le product.tpl :
    [code]
    {if $product->id_category_default == 13}
    …contenu à afficher…
    {/if}
    [/code]
    A bientôt 🙂

  15. Bonjour
    j’ai un petit probleme a résoudre :
    j’ai 3 modules html avec des informations spécifiques que je ne souhaite afficher que sur leur catégorie respectives :
    module_name=htmlanimaux que sur la catégorie 3
    module_name=htmlbienetre que sur la catégorie 4
    module_name=htmlmaisonjardin que sur la catégorie 13
    Quelle serait la façon la plus simple ?
    Merci pour vos lumières

  16. Bonjour vivient, je viens de tester dans un category.tpl et ça fonctionne bien :
    [php][/php]
    {if $page_name == ‘category’ && $category->id == 2}

    htmlanimaux

    {elseif $page_name == ‘category’ && $category->id == 9}

    htmlbienetre

    {elseif $page_name == ‘category’ && $category->id == 45}

    htmlmaisonjardin

    {/if}
    [php][/php]

  17. Bonsoir Arnaud,
    Je suis sous PS 1.6.1.1 et je souhaiterais faire la chose suivante : je voudrais que les « subcategory-name » présent en haut de chaque page de catégorie ne soit affichées qu’à partir des catégories de niveau 3.
    Est ce que ce code est le bon ?
    {if $category->level_depth == 3}
    {$subcategory.name}{/if}
    Et, où est ce que je peux placer ce code ? Dans le fichier category.tpl ? Et si oui, je peux le placer n’importe où ?
    Merci d’avance de votre aide.
    Bonne soirée

  18. Christophe, je viens de tester dans category.tpl [php]{if $category->level_depth == 2}level2{/if}[/php] et ça marche bien 🙂

  19. Bonjour,
    Sous presta 1.6.0.11, je souhaiterais utiliser un template productX.tpl pour les produits d’une ou plusieurs catégories. En suivant un post (https://www.prestashop.com/forums/topic/392095-how-to-different-producttpl-template-on-a-page-per-product-and-a-per-category-basis/) j’arrive bien à utiliser un autre template quand je sélectionne non pas une catégorie mais un produit (son ID)
    le code ok pour 1 produit = 1 template
    if (Tools::getValue(‘id_product’)==3){
    $this->setTemplate(_PS_THEME_DIR_.’productAlt1.tpl’);
    } else {
    $this->setTemplate(_PS_THEME_DIR_.’product.tpl’);
    }
    Quand je veux travailler sur tous les produits d’une catégorie en utilisant le code ci-dessous ça ne fonctionne pas, la template reste celle par défaut et je ne comprends pas pourquoi.
    if ($this->category->id==11){
    $this->setTemplate(_PS_THEME_DIR_.’productStore.tpl’);
    } else {
    $this->setTemplate(_PS_THEME_DIR_.’product.tpl’);
    }
    Merci de votre aide.
    Ludovic

  20. Bonjour, je depoussiere ce topic 😉
    je cherche a affiche un texte seulement sur la home page
    Le texte en question se trouve lui dans un module ..
    j’ai testé ca :
    {if $page_name == ‘accueil’} coucou {/if}
    et
    {if $category == 2} coucou {/if}
    avec des variante pour tester … rien ne fonction …
    pouvez vous m’aider ?

  21. Bonjour Arnaud,
    Je cherche à afficher un texte selon une déclinaison… j’avais pensez à modifier le code ean mais sans résultat 🙁
    Une solution ?
    Merci 😉

  22. Bonjour Arnaud,
    Sur mon site e-commerce, j’ai 7 niveaux de profondeur du site. Du coup, il me charge tous mes produits sur chaque page et rend donc le temps de chargement très long, ce qui peut faire fuir mon prospect / client.
    Je cherche donc à insérer une condition qui va me masquer les produits si je ne suis pas dans la profondeur de catégorie 6.
    J’ai trouvé l’endroit à modifier, seulement, cela me retire aussi mes produits sur la page d’accueil. J’aimerais faire une condition dans un if en lui disant que si tu es sur la page d’accueil, tu m’affiche les produits et si tu es dans la profondeur de catégorie 6 tu m’affiche aussi les produits.
    Le fichier concerné est le fichier product-list.tpl
    Ma condition sur la profondeur marche parfaitement mais je n’arrive pas à mettre la condition pour que les produits s’affichent également sur la page d’accueil.
    Voici ma condition :
    <
    div class= »product-container » itemscope itemtype= »http://schema.org/Product »>
    {if $page_name != "http://maPageAccueil" && $category->level_depth >= 6 }
    <div class="left-block">
    ...

    Avec maPageAccueil qui est la page d’accueil de mon site web.
    Peux-tu me conseiller ?
    d’avance merci.
    Julien

    1. Sinon j’ai également essayé
      {if $page_name != « http://maPageAccueil » || $id_category == 9 }
      Ma catégorie 9 correspond à ma catégorie « Promotion », c’est elle qui est affiché sur ma page d’accueil …
      Cela ne marche pas non plus.

    2. Hello Julien,
      La condition sur la page d’accueil est du type {if $page_name != ‘index’}…{/if} que tu peux combiner avec les autres conditions 🙂
      ++

  23. Bonjour Arnaud,
    J’ai une autre question. Dans ma boutique en ligne j’ai beaucoup de références produits en ligne et beaucoup qui n’ont pas forcément de photos, dû à notre activité.
    Par conséquent, je cherche à afficher dans un premier temps les produits avec photo. Je pense qu’il faut que je modifie mon fichier product-list.tpl mais je n’arrive pas à trouver la condition qui va me permettre de mettre les produits avec image en premier ($product.id_image)
    Merci d’avance pour ton aide.
    Julien

    1. Julien,
      Utilisez {debug} dans votre .tpl pour afficher les variables que vous pouvez ensuite utiliser pour créer vos conditions 😉