Ze_Panda Posted August 27, 2023 Share Posted August 27, 2023 Salut à tous, Souhaitant forcer la devise de paiement du client lors de la commande selon son adresse de livraison, j'ai créé un override de /controllers/front/ParentOrderController.php <?php class ParentOrderController extends ParentOrderControllerCore { public function init() { $this->isLogged = $this->context->customer->id && Customer::customerIdExistsStatic((int)$this->context->cookie->id_customer); parent::init(); /* Force Currency in order */ if ($this->context->customer->isLogged(true)){ $customerAddress =new Address($this->context->cart->id_address_delivery); if ((Validate::isLoadedObject($customerAddress)) && isset($customerAddress->id_country)){ $customerCountry = new Country((int)($customerAddress->id_country)); if ((Validate::isLoadedObject($customerCountry)) && isset($customerCountry->id_currency)){ if (($this->context->currency->id != (int)$customerCountry->id_currency) || ($this->context->cart->id_currency != (int)$customerCountry->id_currency) || ($this->context->cookie->id_currency != (int)$customerCountry->id_currency)){ if ((int)$customerCountry->id_currency == 0){ $orderCurrency = Currency::getCurrencyInstance(Configuration::get('PS_CURRENCY_DEFAULT')); } else { $orderCurrency = Currency::getCurrencyInstance((int)($customerCountry->id_currency)); } if (Validate::isLoadedObject($orderCurrency) && !$orderCurrency->deleted && $orderCurrency->isAssociatedToShop()){ $this->context->currency = $orderCurrency; $this->context->cookie->id_currency = (int)$orderCurrency->id; $this->context->cart->id_currency = (int)$orderCurrency->id; $this->context->smarty->assign(array('currency'=> $orderCurrency)); } } } } } ... etc .. Suite de function init() ParentOrderController.php...... Le déroulement est le suivant. Si le client est connecté :- on récupère son adresse de livraison pour obtenir le pays de livraison. - on récupère la devise du pays (si configurée, sinon devise par défaut de la boutique). - on assigne cette devise si celle-ci est différente de la devise actuelle. Pensez-vous que cette méthode est correcte ? Son placement est-il bon (function init() de ParentOrderController),sachant que la devise ne doit être forcée que lors des étapes de commande ( et non lors de la consultation du catalogue, où le visiteur peut changer de devise) ? En vous remerciant pour vos conseils. Link to comment Share on other sites More sharing options...
Eolia Posted August 27, 2023 Share Posted August 27, 2023 Bonjour, On peut se placer là mais ça fait un gros override qui va vous bloquer si futures mises à jour et que cette partie est modifiée. Perso je ferais un override de la petite fonction Cart->update() ou j'utiliserai le hook actionCartSave. Vous avez tous les éléments dont vous avez besoin dans l'objet Cart. (id_address_delivery, id_customer, etc...) Il y a 4 heures, Ze_Panda a dit : Son placement est-il bon (function init() de ParentOrderController),sachant que la devise ne doit être forcée que lors des étapes de commande ( et non lors de la consultation du catalogue, où le visiteur peut changer de devise) ? A partir du moment où vous modifiez sa devise dans son cookie, s'il retourne sur les autres pages de la boutique, il aura cette devise. (Il devra la changer de nouveau manuellement à chaque fois). Quelle est la problématique concernant la devise ? Link to comment Share on other sites More sharing options...
Ze_Panda Posted August 27, 2023 Author Share Posted August 27, 2023 (edited) Bonjour Eolia, Merci pour cette réponse et ces conseils. Déjà, le code d'override que j'ai mentionné est incorrect. Je devrais remplacer Parent::init(); par FrontController::init(); Sinon, la fonction est éxecutée 2 fois ! : init() de ParentOrderController puis init() de l'override, c'est ballot ! L'override peut également être "simplifié", car le code peut tout à fait être placé et éxécuté en fin de fonction. Quote Perso je ferais un override de la petite fonction Cart->update() Oui, c'est pertinent, bonne proposition. Seul bémol avec Cart update() : ce n'est pas suffisamment "restrictif". La devise sera bien forcée en fin de checkout mais les clients pourront quand même changer la devise dans le récapitulatif panier, ce qui - dixit le service-client de la boutique concernée - abouti à cette situation : "Les clients Boomers qui cliquent partout (bloc devise, etc..), font des Next / Prev à gogo dans leur navigateur vont nous appeler pour râler car ils ne comprennent pas pourquoi leur récapitulatif panier est tantôt dans une devise et tantôt dans une autre.. ". Quote A partir du moment où vous modifiez sa devise dans son cookie, s'il retourne sur les autres pages de la boutique, il aura cette devise. (Il devra la changer de nouveau manuellement à chaque fois). Quelle est la problématique concernant la devise ? La problématique de la devise est que certains clients se croient "malins" de changer de devise car le prix leur semble inférieur (cas Franc Suisse vs Euro)... Bilan : soit leur paiement échoue (car leur banque ne leur permet pas un paiement dans une autre devise), soit ils ne gagnent rien (normal) mais surtout perdent (car leur banque leur facture des frais de conversions/transaction). Et les gentilles demoiselles de la Hotline se font incendier . Et en calant la devise sur le pays de livraison, cela facilte aussi dans certains cas les opérations de dédouanement pour les pays hors-UE. Ainsi, "aider" (par un peu de force) le client à consulter et commander dans sa devise améliore le quotidien de tout le monde . En tout cas merci pour ta réponse, je vais encore creuser/tester, et je partagerai. Edited August 27, 2023 by Ze_Panda (see edit history) Link to comment Share on other sites More sharing options...
Eolia Posted August 28, 2023 Share Posted August 28, 2023 alors ajoutez un contrôle dans le module blockcurrency pour qu''il ne s'affiche plus si l'adresse du client matche avec vos critères. Et concernant les boomers... je connais un paquet de sites où la génération Z ne sait que cliquer partout et ouvre 10 onglets en même temps sur le même site, donc cet argument est assez limite^^ Link to comment Share on other sites More sharing options...
Ze_Panda Posted August 28, 2023 Author Share Posted August 28, 2023 (edited) Quote alors ajoutez un contrôle dans le module blockcurrency pour qu''il ne s'affiche plus si l'adresse du client matche avec vos critères. yep, carrément ! Quote Et concernant les boomers... je connais un paquet de sites où la génération Z ne sait que cliquer partout et ouvre 10 onglets en même temps sur le même site, donc cet argument est assez limite^^ Arf, je suis bien d'accord....encore un biais induit par cette mode (que je trouve stupide) de vouloir "désigner/catégoriser" les gens selon des critères bien restrictifs comparé à la réalité...(d'ailleurs, le "nerd" que je suis, va aller embosser et ficeler ses saucissons :D) Edited August 28, 2023 by Ze_Panda (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now