Jump to content

Mettre en place une condition 'si au moins un des articles'


Recommended Posts

[RESOLU] je trouve pas comment éditer le titre, désolé... : /

Bonjour,

 

Je souhaite filtrer les modes de paiement en fonction de la catégorie rattachée à un (des) produit(s).

 

Pour ce faire, j'applique une condition qui indique que si un produit est rattachée à telle catégorie alors tel mode de paiement ne s'affiche pas (dans l'étape 5 de validation du panier (paiement).

 

Exemple du code que j'utilise pour le module chèque (modules/cheque/views/templates/hook/payment.tpl) :

 

{foreach from=$cart->getProducts() item=product name=productLoop}
{if $smarty.foreach.productLoop.last}
 {if $product.id_category_default != 18}
  <p class="payment_module">
   <a title="{l s='Pay by check.' mod='cheque'}" href="{$link->getModuleLink('cheque', 'payment', [], true)}">
 <img alt="{l s='Pay by check.' mod='cheque'}" src="{$this_path}cheque.jpg" width="86" height="49">
 {l s='Pay by check (order processing will take more time).' mod='cheque'}
   </a>
  </p>
 {/if}
{/if}
{/foreach}

 

Ceci fonctionne très bien, à condition qu'il n'y ait qu'un seul produit dans mon panier, OU que ce soit le dernier produit de la liste du panier qui soit rattaché à la catégorie 18. Je pense que ceci est lié au code : {if $smarty.foreach.productLoop.last}.

 

Ce que je cherche à faire c'est qu'à partir du moment où un des produits est rattaché à la catégorie 18, on ne propose pas le paiement par chèque (pour l'ensemble du panier).

 

J'ai bien trouvé l'alternative : {if $smarty.foreach.productLoop.first}, qui prendra alors en compte le premier produit listé, mais rien concernant 'n'importe lequel des produits". J'ai testé : {if $smarty.foreach.productLoop}, mais sans succès...

 

Je précise que j'utilise PS 1.5.4.1

 

Merci!

Edited by Nicks (see edit history)
Link to comment
Share on other sites

Bonjour,

 

Il faut faire une boucle intermédiaire pour détecter si oui ou non on accepte le paiement par chèque :

 


{$flag = false}
{foreach from=$cart->getProducts() item=product name=productLoop}
  {if $product.id_category_default != 18}
          {$flag = true}
      {/if}
{/foreach}

 

Et ensuite :


{if !$flag}
   <p class="payment_module">
          <a href="{$link->getModuleLink('cheque', 'payment', [], true)}" title="{l s='Pay by check.' mod='cheque'}">
         <img src="{$this_path}cheque.jpg" alt="{l s='Pay by check.' mod='cheque'}" height="49" width="86">
         {l s='Pay by check (order processing will take more time).' mod='cheque'}
          </a>
   </p>
{/if}

 

Mais le mieux reste de passer par le côté PHP, en overridant ce controller. C'est plus complexe.

Edited by Vincent Decaux (see edit history)
Link to comment
Share on other sites

Bonjour Vincent,

 

Merci pour cette réponse rapide! :)

 

J'ai modifié votre code de la manière suivante (remplacé !=18 par ==18) et ca fonctionne (j'ai un peu de mal à me l'expliquer pour le coup, je pense que mon cerveau sature après une matinée à faire des if, elseif, ==, != ;) )

 

{$flag = false}
{foreach from=$cart->getProducts() item=product name=productLoop}
{if $product.id_category_default == 18}
 {$flag = true}
{/if}
{/foreach}
{if !$flag}
<p class="payment_module">
 <a href="{$link->getModuleLink('cheque', 'payment', [], true)}" title="{l s='Pay by check.' mod='cheque'}">
  <img src="{$this_path}cheque.jpg" alt="{l s='Pay by check.' mod='cheque'}" height="49" width="86">
  {l s='Pay by check (order processing will take more time).' mod='cheque'}
 </a>
</p>
{/if}

 

Ceci étant dit, je ne doute pas un seul instant qu'il ya une méthode plus propre, mais c'est définitivement au-delà de mes compétences, alors ca fera très bien l'affaire comme ca!

 

Encore merci donc! :)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...