Jump to content

Afficher les frais de livraison sur la fiche produit


Recommended Posts

Bonjour,

 

J'ai besoin d'afficher les frais de port pour chaque produit sur sa fiche de description.

Ces frais correspondent à l'un de mes transporteurs ( considéré transporteur par défaut).

Ma configuration des transporteurs est définie par tranches de poids.

J'utilise prestashop 1.5.4.1

 

Merci

Link to comment
Share on other sites

  • 2 weeks later...

Je vais répondre à ma question si jamais quelqu'un aurait besoin de la solution:
 Dans le fichier product.php, j'ai crée une nouvelle fonction pour calculer les frais de port du transporteur et de la zone définis par défaut

public function getShippingCosts()
    {
          
          $id_carrier = Configuration::get('PS_CARRIER_DEFAULT');
          $carrier = new Carrier((int)($id_carrier), Configuration::get('PS_LANG_DEFAULT'));
          $carrierTax = Tax::getCarrierTaxRate((int)$carrier->id, (int)$this->{Configuration::get('PS_TAX_ADDRESS_TYPE')});
          $defaultCountry = new Country(Configuration::get('PS_COUNTRY_DEFAULT'), Configuration::get('PS_LANG_DEFAULT'));
          $id_zone = (int)$defaultCountry->id_zone;
          $shipping = $carrier->getDeliveryPriceByWeight($this->weight, $id_zone)*1;
          $shipping = $shipping *(1+ $carrierTax/100);
          return $shipping;
        
    }

Les frais de port sont donc enregistrés dans la variable $shipping

Puis, dans le fichier ProductController.php, j'ai inséré le code suivant sous la fonction : protected function assignPriceAndTax()

$shipping = $this->product->getShippingCosts();
$this->context->smarty->assign('shipping', $shipping);

dans le fichier product.tpl (de votre thème sous le répertoire "themes"), il suffit d'insérer le bloc affichant cette variable là on l'on veut sur la fiche produit:

<p class="shipping">{l s='Shipping fees: '}
<span id="shipping_costs">{convertPrice price=$shipping}</span>
</p>
Edited by hajarhh (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 2 months later...
  • 3 months later...

Bon, j'me suis bien cassé la tête pendant une heure et demi, mais il y avait pas mal de détails à modifier & à comprendre.

 

Alors premièrement, cette modification n'est valable que pour PS 1.5x.

 

Secondairement, j'ai préféré mettre les modifications dans des overrides pour récupérer les modifications en cas de changement de versions (toujours penser à ça :) )

 

Création d'un controller dans override\controllers\front appelé : ProductController.php

<?php

class ProductController extends ProductControllerCore
{
	protected function assignPriceAndTax() {
		parent :: assignPriceAndTax();
		$shipping = $this->product->getShippingCosts();
		$this->context->smarty->assign('shipping', $shipping);
	}
}

Création d'une classe dans override\classes appelée : Product.php

<?php

class Product extends ProductCore
{
	public function getShippingCosts()
    {
          
          $id_carrier = Configuration::get('PS_CARRIER_DEFAULT');
          $carrier = new Carrier((int)($id_carrier), Configuration::get('PS_LANG_DEFAULT'));
	$context = Context::getContext();
	$id_delivery = (int)$context->cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')};
          $carrierTax = Tax::getCarrierTaxRate((int)$carrier->id, $id_delivery);
          $defaultCountry = new Country(Configuration::get('PS_COUNTRY_DEFAULT'), Configuration::get('PS_LANG_DEFAULT'));
          $id_zone = (int)$defaultCountry->id_zone;
          $shipping = $carrier->getDeliveryPriceByWeight($this->weight, $id_zone)*1;
          $shipping = $shipping *(1+ $carrierTax/100);
          return $shipping;
    }
}

Ajout du code dans le product.tpl de votre thème 

<p class="shipping">{l s='Shipping fees: '}
<span id="shipping_costs">{convertPrice price=$shipping}</span>
</p>
Edited by SleT (see edit history)
Link to comment
Share on other sites

J'ai modifié le fichier config.ing.php pour activer l'affichage des erreurs, voici l'ereur de la page blanche (page produit) :

 

Fatal error: Call to undefined method Product::getShippingCosts() in /home/mondomaine/public_html/override/controllers/front/ProductController.php on line 7

 

Une idée de ce qui bloque siouplé ?

 

EDIT : Bon en fait ca fonctionne. J'étais trop impatient mais il faut bien faire les 3 modifs avant d'essayer de rafraichir la page produit ^^

 

Par contre ca ne fonctionne pas chez moi comme je le voudrais. Tout s'affiche à 0€, je ne comprend pas réellement la raison. Surement à cause de mon fonctionnement :

Plusieurs transporteurs mais un seul transporteur sélectionné dans la liste "Transport" des fiches produits. Après, fonctionnement au poids pour choix de la tranche dans ce transporteur.

Du coup, la fonction de la modif doit uniquement affiché le prix d'un seul transporteur par défaut. Etant hors tranche puisque non configuré, ca affiche 0€.

Bref, bien dommage car ca fonctionne. Un grand merci pour le temps passé à SleT  :)

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

Chez moi ça marche nickel.

 

Vérifie bien que tu as bien un poids sur ton article, que les tranches de prix / poids soient configurées correctement sur ton transporteur. 

 

Que ton transporteur par défaut soit bien le bon.

 

De plus, j'ai la sensation que  " $id_carrier = Configuration::get('PS_CARRIER_DEFAULT'); " peut renvoyer un transporteur avec un flag delete (qui n'est donc plus actif).

 

Chez moi : " Shipping fees: 41,86 € "

Link to comment
Share on other sites

Effectivement ca fonctionne bien, j'avais oublié de sélectionner un transporteur par défaut :rolleyes: .

 

Le souci chez moi est que le transporteur par défaut n'est pas disponible pour certains produits . Ca représente 15% de mes produits mais ca pose quand meme un souci puisque ca affiche un prix lié au transporteur par défaut, qui n'est pas le bon, loin de là  :(

 

Encore une fois cela vient de mon probleme de fonctionnement, je ne sélectionne qu'un seul transporteur dans la liste de l'onglet transport dans la création des fiches produits.

Du coup, même si le transporteur par défaut n'est pas sélectionné pour certains produits, le prix du transport avec ce dernier s'affiche quand même sur la fiche du produit, se base sur les tranches de poids et est complètement faux.

 

Doit y'avoir moyen de pouvoir masquer le montant du transport pour les produits qui n'utilisent pas le transporteur par défaut, ou même se baser sur la meme fonction que lors de l'ajout au panier pour afficher les bons frais de port peu importe le transporteur utilisé, mais bon je m'arrête la pour les questions je vais plutot faire appel à un dev ^^

 

merci en tout cas pour ton travail car sur le fond, avec un seul transporteur, ca fonctionne au poil  ;)

Link to comment
Share on other sites

  • 3 weeks later...

Ouha ! Ce post m'a permis de comprendre les crontroler et class, c'est génial !

 

Je relance pour voir si on peux me guider sur la récupération de id produit...

 

Je pense que ça se passe pas ici :

class ProductController extends ProductControllerCore
{
	protected function assignPriceAndTax($id_product) {
		parent::assignPriceAndTax();
		$shipping = $this->product->getShippingCosts($id_product);
		$this->context->smarty->assign('shipping', $shipping);
	}
}

Il faut envoyer l'id_produit à la fonction getShippingCosts

 

Dans le debug je vois que ça s'appelle $id_product

 

Mais si je met simplement cet élément ça ne fonctionne pas !

 

Comment récupérer la variable existante à cet endroit ?

 

Merci pour votre aide !!!

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

Bonjour,

 

après modifications faites, je confirme que ça fonctionne parfaitement sur PS 1.6 :)

Un grand Merci à hajarhh pour avoir partagé ces modifications et à SleT pour les améliorations apportées à celles-ci.

Link to comment
Share on other sites

  • 3 weeks later...

Bonjour à tous

 

Deja merci pour ce travail de qualité et fonctionnel.

 

Votre solution fonctionne chez moi uniquement si j'affecte un transporteur par default, mon parametrage transporteur par default été sur "le meilleur prix" cela me renvoyé la valeur "0", en affectant un transport les prix s'affiche bien. Ces dommage ne pas pourvoir laissé prestashop choisir le meilleur transport par default avec votre superbe code.

 

J'aimerai que vote astuce puisse affichez les port gratuit des x€ que j'ai parametre dans les reglage et dans les regle de panier.

 

J'ai essayer de comprend comment focntionne le module "frais de livraison" qui lui arrive à gere les regle de panier et l'option frais de port. Mais malheusement je suis novice et la je bug....

 

Je m'explique, actuellement j'offre les frais de port des 69€, mais les produit ayant une valeur egal ou superieur n'affiche pas "livraison gratuit" à la place du prix avec vous solution. Le montant des frait de port reste affiche quelque soit mais recherche ou modification.

 

Quelqu'un aurait un idée pour que cette superbe astuce puisse prendre en compte les regle de panier et le parametrage "livraison gratui" s'il vous plait.

 

 

Merci d'avance pour les retour.

 

Version Prestashop 1.6.0.6

  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...

Bravo et merci pour ce code offert.

Une remarque : le prix de la livraison peut changer une fois le compte créé ou le client connecté, donc les frais de port affichés sur la fiche produit peuvent ne pas égaux au prix final.

Ne serait-il pas préférable d'afficher un tableau récap sur la fiche produit à lire avec le client (cf http://www.prestashop.com/blog/fr/loi-hamon-les-questions-les-plus-recurrentes-de-nos-e-commercants-au-cabinet-davocats-haas-expert-en-e-commerce/)

 

Merci

Link to comment
Share on other sites

Bonjour,

 

Suite à la rectification de la portion de code ci-dessous,

 

Mauvaise piste, voila comment le mettre : (int)Tools::getValue('id_product');

ça fonctionne !

 

Ou faut il l'insérer ou le greffer dans le code ?

 

Ouha ! Ce post m'a permis de comprendre les crontroler et class, c'est génial !

 

Je relance pour voir si on peux me guider sur la récupération de id produit...

 

Je pense que ça se passe pas ici :

class ProductController extends ProductControllerCore
{
	protected function assignPriceAndTax($id_product) {
		parent::assignPriceAndTax();
		$shipping = $this->product->getShippingCosts($id_product);
		$this->context->smarty->assign('shipping', $shipping);
	}
}

Il faut envoyer l'id_produit à la fonction getShippingCosts

 

Dans le debug je vois que ça s'appelle $id_product

 

Mais si je met simplement cet élément ça ne fonctionne pas !

 

Comment récupérer la variable existante à cet endroit ?

 

Merci pour votre aide !!!

 

 

merci de vos lumières...

 

Olivier

Link to comment
Share on other sites

Bonjour,

J'ai toujours le même la même estimation de prix quel que soit la fiche produit et son poids.

Il va chercher le transporteur par défaut et la 1ère tranche seulement où il navigue suivant les tranches ?

Dans quel fichier se trouve la fonction getDeliveryPriceByWeight d'ailleurs ?

 

Merci

Link to comment
Share on other sites

  • 11 months later...
  • 4 years later...

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...