Mode de paiement selon transporteur dans PrestaShop

PrestaShop
  • Accueil
  • Blog
  • Mode de paiement selon transporteur dans PrestaShop

Un billet simple et utile aujourd’hui ou comment restreindre l’affichage d’un mode de paiement selon le transporteur choisi dans PrestaShop ?
Pas simple ?! Et bien si ! Une belle condition smarty placée où il faut et le tour est joué. Cette astuce est pratique et même nécessaire si vous avez plusieurs modes de livraison et que certains ne permettent pas le paiement en ligne par exemple.
Le raisonnement est basique : dans PrestaShop, chaque transporteur dispose d’un id qu’on va reprendre à l’affichage du moyen de paiement pour le montrer ou pas.

Première étape : récupérer l’id du transporteur concerné

Rendez-vous dans le backoffice de PrestaShop puis dans l’onglet Transport > Transporteurs et notez l’identifiant du transporteur voulu (encadré en rouge dans la capture).
paiement_selon_transporteur_prestashop

Seconde étape : appliquer la condition dans le module de paiement

Vous avez à présent l’identifiant de chacun de vos transporteurs aussi vous pouvez donc appliqué la condition d’affichage dans votre/vos module(s) de paiement.
On va prendre l’exemple avec le module de paiement par virement bancaire qui est installé en natif dans PrestaShop. On va lui indiquer de ne s’afficher SEULEMENT SI Colissimo est sélectionné soit le transporteur id = 4.
On ouvre le fichier d’apparence du module www/modules/bankwire/payment.tpl dans la 1.4 ou www/modules/bankwire/views/templates/hook/payment.tpl dans la 1.5 et on ajoute la condition suivante :

<!-- Condition du transporteur -->{if $carrier->id == 4}
<p class="payment_module">
 <a href="{$this_path_ssl}payment.php" title="{l s='Pay by bank wire' mod='bankwire'}">
 <img src="{$this_path}bankwire.jpg" alt="{l s='Pay by bank wire' mod='bankwire'}" width="86" height="49"/>
 {l s='Pay by bank wire (order process will be longer)' mod='bankwire'}
 </a>
</p>
<!-- On ferme la condition du transporteur -->{/if}

Il ne reste alors qu’à simplement tester la condition d’affichage en se connectant et en effectuant une commande factice.

Les variantes

On peut aussi appliquer d’autres variantes / conditions d’affichage sur le même modèle que le précédent à savoir :

  • afficher le paiement si l’id du transporteur est différent de 3 :
    {if $carrier->id != 3}...{/if}
  • afficher le paiement si l’id du transporteur est 3 ou 4 :
    {if $carrier->id == 3 || $carrier->id == 4}...{/if}

Plutôt que d’utiliser un module qui va surcharger votre boutique, un léger bout de code peut tout à fait répondre à un besoin précis comme celui-ci. Simple et efficace 😉
N’hésitez pas à poster si vous avez un autre exemple du type, ah et tiens d’autres conditions smarty pour PrestaShop !
 
[Edit du 23/10/2017] Pour PrestaShop 1.6 avec le module PayPal, éditez le fichier www/modules/paypal/views/templates/hook/express_checkout_payment.tpl en faisant un override de préférence avec ce code à l’intérieur pour la version 3.11.4 de PayPal. Ce qui est intéressant c’est la condition au début du code :

{if $carrier->name == 'Colissimo'}
	{if $smarty.const._PS_VERSION_ >= 1.6}
		<div class="row">
			<div class="col-xs-12 col-md-6">
		        <p class="payment_module paypal">
		        	{if $use_paypal_in_context}
						<a href="javascript:void(0)" onclick="" id="paypal_process_payment" title="{l s='Pay with PayPal' mod='paypal'}">
					{else}
						<a href="javascript:void(0)" onclick="$('#paypal_payment_form_payment').submit();" title="{l s='Pay with PayPal' mod='paypal'}">
					{/if}
						{if isset($use_mobile) && $use_mobile}
							<img src="{$base_dir_ssl|escape:'htmlall':'UTF-8'}modules/paypal/views/img/logos/express_checkout_mobile/CO_{$PayPal_lang_code|escape:'htmlall':'UTF-8'}_orange_295x43.png" />
						{else}
							{if isset($logos.LocalPayPalHorizontalSolutionPP) && $PayPal_payment_method == $PayPal_integral}
								<img src="{$logos.LocalPayPalHorizontalSolutionPP|escape:'htmlall':'UTF-8'}" alt="{l s='Pay with your card or your PayPal account' mod='paypal'}}" height="48px" />
							{else}
								<img src="{$logos.LocalPayPalLogoMedium|escape:'htmlall':'UTF-8'}" alt="{l s='Pay with your card or your PayPal account' mod='paypal'}" />
							{/if}
		                    {if isset($braintreeToken)}
		                    {l s='Pay with PayPal' mod='paypal'}
		                    {else}
							{l s='Pay with your card or your PayPal account' mod='paypal'}
		                    {/if}
						{/if}
						
					</a>
				</p>
		    </div>
		</div>
		<style>
			p.payment_module.paypal a 
			{ldelim}
				padding-left:17px;
			{rdelim}
		</style>
	{else}
		<p class="payment_module">
				<a href="javascript:void(0)" id="paypal_process_payment" title="{l s='Pay with PayPal' mod='paypal'}">
				{if isset($use_mobile) && $use_mobile}
					<img src="{$base_dir_ssl|escape:'htmlall':'UTF-8'}modules/paypal/views/img/logos/express_checkout_mobile/CO_{$PayPal_lang_code|escape:'htmlall':'UTF-8'}_orange_295x43.png" />
				{else}
					{if isset($logos.LocalPayPalHorizontalSolutionPP) && $PayPal_payment_method == $PayPal_integral}
						<img src="{$logos.LocalPayPalHorizontalSolutionPP|escape:'htmlall':'UTF-8'}" alt="{l s='Pay with your card or your PayPal account' mod='paypal'}" height="48px" />
					{else}
						<img src="{$logos.LocalPayPalLogoMedium|escape:'htmlall':'UTF-8'}" alt="{l s='Pay with your card or your PayPal account' mod='paypal'}" />
					{/if}
					{l s='Pay with your card or your PayPal account' mod='paypal'}	
		        {/if}
			</a>
		</p>
	{/if}
	{if $use_paypal_in_context}
		<input type="hidden" id="in_context_checkout_enabled" value="1">
	{else}
		<script>
			$(document).ready(function(){
				$('#paypal_process_payment').click(function(){
					$('#paypal_payment_form_payment').submit();
				})
			});
		</script>
	{/if}
	<form id="paypal_payment_form_payment" class="paypal_payment_form" action="{$base_dir_ssl|escape:'htmlall':'UTF-8'}modules/paypal/express_checkout/payment.php" data-ajax="false" title="{l s='Pay with PayPal' mod='paypal'}" method="post">
		<input type="hidden" name="express_checkout" value="{$PayPal_payment_type|escape:'htmlall':'UTF-8'}"/>
		<input type="hidden" name="current_shop_url" value="{$PayPal_current_page|escape:'htmlall':'UTF-8'}" />
		<input type="hidden" name="bn" value="{$PayPal_tracking_code|escape:'htmlall':'UTF-8'}" />
	</form>
{/if}

32 commentaires sur “Mode de paiement selon transporteur dans PrestaShop

  1. Hello Germain,
    En effet, attention au changement d’ID lorsque l’on modifie le transporteur, mais à part ça tout fonctionne très bien 😉

  2. Bonjour,
    excellent article ça me dépanne bien.
    Cela me donne une autre idée dans le même genre:
    peut on afficher un transporteur (retrait au magasin) QUE si l’adresse du client ou le code postal est proche de celui de la boutique par exemple?

  3. @WEBBAX : d’ailleurs ce changement d’ID est insupportable à pleins de niveau. Je pense le recoder directement dans le core prestashop pour qu’il ne change pas.
    @Arnaud : as-tu une idée d’ailleurs sur la raison de ce changement à chaque UPDT ? Je ne me suis pas penché dessus.

  4. « @Arnaud : as-tu une idée d’ailleurs sur la raison de ce changement à chaque UPDT ? Je ne me suis pas penché dessus. »
    C’est pour conserver un historique et un bon fonctionnement avec les anciennes commandes, simplement. Ainsi, les données générées (factures notamment) seront toujours juste (enfin, si elles l’étaient à la base évidemment !). 😉

  5. j’ai la version prestashop 1.4 sa ne fonctionne pas avec paypal !
    quelqu’un a deja utiliser avec paypal ??
    voici le code :
    {if $carrier->id == 4}

    {/if}

    1. @lebarront : Bonjour, essayez d’afficher les variables en insérant aussi {debug} et vous verrais si vous avez bien ajouter le code dans le bon fichier .tpl car PayPal en propose plusieurs 😉

  6. @Johan : Bonjour, je n’ai pas encore eu l’occasion de tester cette astuce sur un tunnel de commande PrestaShop en One Page Checkout pour une raison simple : le OPC est à mon goût moins performant qu’un tunnel de commande en 3 à 5 étapes classique 😉 Vous avez trouvé la solution par hasard ?

  7. Bonjour!
    je suis sous 1.5.6, cette astuce ne fonctionne pas a 100%, je m’explique :
    Le mode de paiement ne s’affiche effectivement plus après le choix d’un transporteur non pris en charge, cependant en re-sélectionnant le bon transporteur, le mode de paiement ne réapparais pas, je dois obligatoirement rafraîchir la page.
    Auriez-vous un conseil sur ce point ?
    Merci

    1. @Shinini : Bonjour, je viens de regarder sous une version 1.5.6.1 de PrestaShop aussi vous pouvez utiliser par exemple la condition {if $carrier->id_reference == 2}votre_contenu{/if} ou une autre de la liste suivant vos besoins :
      condition carrier prestashop

  8. Bonjour, effectivement avec l’id des transporteurs ça change. On peut alors utiliser le nom ou bien la position aussi 😉

  9. Je pense que le souci vient de l’ID du transporteur : attention car il change à chaque modification du transporteur donc code à adapter ou alors utiliser une condition du style {if $carrier->name != ‘colissimo’} par exemple – il faut vérifier la variable avec {debug} car je ne suis pas sûr de la syntaxe de tête 😉

  10. Merci pour ton message
    Alors j’ai pris les valeurs et avec la 1.6 c’est : $cart->id_carrier
    J’ai fais plusieurs test de valeur :
    {if isset($cart->id_carrier) && $cart->id_carrier == 30}
    {if $cart->id_carrier == 30}
    {if $cart->id_carrier == « 30 »}
    {if $cart->id_carrier == ’30’}
    Mais rien ne change. Je change dans le fichier payment.tpl du module cashondelivery
    C’est assez étrange, je ne vois pas ce qu’il pourrait coincer

  11. Bonjour,
    sur mon site j’ai laissé la possibilité de faire un « retrait en magasin » (Frais de port à 0) en plus d’un mode de livraison par la poste
    Mon problème est le suivant :
    j’aimerai que sur la facture éditée automatiquement soit mentionnée adresse de livraison : Retrait en magasin
    et non l’adresse du client saisie.
    Comment faire pour modifier le formulaire de facturation en fonction du choix de livraison?
    Merci

    1. Bonjour, il est possible d’insérer une condition en fonction du transporteur sur la facture je pense. Vous pouvez me faire un mail dans ce sens via le formulaire de contact 🙂

  12. Merci pour ce petit truc tout simple qui m’a bien aidé 🙂 Dans le même ordre d’idée, penses-tu qu’il existe la même solution pour empêcher l’affichage d’un transporteur dans l’onglet livraison ?
    Ex : Si le transporteur A est affiché, le transporteur B ne doit pas s’afficher (mon problème actuel est que le A et le B sont affichés en même temps)
    Merci !

  13. Ok merci Arnaud je vais m’orienter vers le masquage en CSS car nous travaillons déjà sur les tranches de poids. Bonne continuation 🙂

  14. Dans ce cas, utilisez une condition smarty pour chaque transporteur du type : si le nombre d’itérations pour la boucle des transporteurs est supérieure à 1 et que le tarif du transporteur est supérieur à 0, alors on le masque.

    1. Hi, you have to open the .tpl used for payment and test the {$carrier|print_r} in order to see which condition you could write.

  15. Bonjour, merci pour le travail !
    Je souhaiterai interdire Paypal avec un transporteur (La poste par exemple)
    quel fichier modifier , il y a plusieurs fichiers templates ….
    merci
    nota : je suis ps 1.6.1.17

      1. merci pour le code, mais j’essaye sans sucés , si je met le code a l’intérieur il y a 2 Paypal …
        . si je met {if $carrier->name == ‘mon transporter’} en début de code et {/if} en fin de code … rien ne se passe .. Paypal est toujours dispo (j’ai effacé le cache pour voir) 🙁

        1. Bonjour Jérôme,
          Je n’ai pas parlé du cache / compilation / override etc car ce n’est pas le sujet de l’article mais à vérifier.
          Au besoin, prenez un ticket si vous voulez que je regarde 😉

Laisser un commentaire

Consultez les autres articles