Rudy69 Posted April 6, 2020 Share Posted April 6, 2020 Bonjour, Je sollicite votre aide pour tenter de résoudre un problème. J'utilise Prestashop 1.7. Je me rends dans l'administration du site web > Commandes > Ajouter une commande. Sur le formulaire de création (themes/default/template/controllers/orders/form.tpl), j'ai rajouté une liste déroulante (select) qui me permet de récupérer une donnée. Une fois le formulaire dûment complété, je ne le valide pas à l'aide du bouton submit "Créer une commande" mais grâce au lien "Envoyer un e-mail au client contenant le lien pour effectuer le paiement." Cela envoie un e-mail au client. Dans le corps de l'e-mail qu'il reçoit, il y a une URL qu'il doit cliquer pour régler sa commande. Cet URL contient des paramètres. J'ai réussi à y passer le paramètre souhaité "id_seller=7" où 7 est purement fictif pour l'exemple (id_seller est le "name" de mon champ select). Par contre, là où je rencontre le problème, c'est qu'une fois l'URL cliqué, le client règle sa commande mais la valeur id_seller n'est pas prise en compte. J'ai tenté un override dans le fichier override/controllers/front/OrderConfirmationController.php dont voici le code mais en vain. Merci pour votre éventuelle aide ! <?php class OrderConfirmationController extends OrderConfirmationControllerCore { public $id_seller; public function init() { parent::init(); /* $this->id_seller = (int) (Tools::getValue('id_seller')); $order = new Order((int) $this->id_order); $order = new Order(Order::getIdByCartId((int) ($this->id_cart))); $cart = Cart::getCartByOrderId($this->id_order); $this->id_seller = $order->id_seller; */ $cart = Cart::getCartByOrderId($this->id_order); $order = new Order(Order::getIdByCartId((int) ($this->id_cart))); var_dump( $order, $cart ); die(); } public function initContent() { parent::initContent(); // L'objectif est de récupérer le vrai id_seller, sinon on met un id_seller à 6 (bidon) if(isset($this->id_seller) && !empty($this->id_seller)) { $the_magic = $this->id_seller; } else { $the_magic = "6"; } $db = \Db::getInstance(); $request = 'UPDATE `' . _DB_PREFIX_ . 'orders` SET id_seller = ' . (int) $the_magic . ' WHERE id_order = ' . (int) $this->id_order; $db->execute($request); } } Link to comment Share on other sites More sharing options...
Eolia Posted April 6, 2020 Share Posted April 6, 2020 Euh.... $this->id_seller = (int) (Tools::getValue('id_seller')); puis: $this->id_seller = $order->id_seller; Donc le premier est toujours écrasé par le second et comme le second est vide vous n'obtenez jamais la valeur attendue... CQFD Link to comment Share on other sites More sharing options...
Rudy69 Posted April 7, 2020 Author Share Posted April 7, 2020 Merci @Eolia pour votre réponse. Le code que vous voyez est en commentaire mais je vais revoir cette page et la "re-poster" sans commentaire afin que ce soit plus clair pour l'aide. Link to comment Share on other sites More sharing options...
Rudy69 Posted April 7, 2020 Author Share Posted April 7, 2020 Je viens de revoir le code de ma page mais cela ne change rien. $id_seller vaut bien zéro alors qu'à la création de la commande, côté admin, j'avais sélectionné un id_seller différent de zéro. Ce dont je souhaiterais avoir, c'est la conservation de l'id_seller qui est la valeur numérique d'une liste déroulante (select) depuis la création de la commande jusqu'au paiement de cette commande en front par le client. Vous me suivez ? Voici le code qui, hélas, n'aboutit à rien de plus. <?php class OrderConfirmationController extends OrderConfirmationControllerCore { public $id_seller; public function init() { parent::init(); $id_seller = (int) (Tools::getValue('id_seller')); var_dump( $id_seller ); die(); // Une fois le paiement effectué, s'affiche à l'écran int(0) } public function initContent() { parent::initContent(); // L'objectif est de récupérer le vrai id_seller, sinon on met un id_seller à 6 (bidon) if(isset($this->id_seller) && !empty($this->id_seller)) { $the_magic = $this->id_seller; } else { $the_magic = "6"; } $db = \Db::getInstance(); $request = 'UPDATE `' . _DB_PREFIX_ . 'orders` SET id_seller = ' . (int) $the_magic . ' WHERE id_order = ' . (int) $this->id_order; $db->execute($request); } } Link to comment Share on other sites More sharing options...
Eolia Posted April 7, 2020 Share Posted April 7, 2020 Ben si $id_seller est une publique déclarée il faut l'affecter correctement $this->id_seller = (int) (Tools::getValue('id_seller')); au lieu de $id_seller = (int) (Tools::getValue('id_seller')); Mais votre principal problème c'est que vous faites un override sur orderConfirmation alors que le lien du mail n'envoie pas du tout vers ce controleur mais vers order -> page de paiement et non pas vers la page de confirmation... Link to comment Share on other sites More sharing options...
Rudy69 Posted April 7, 2020 Author Share Posted April 7, 2020 Merci @Eolia J'ai cette impression étrange : être prêt du but tout en ayant l'air de tourner autour du pot. J'ai saisi la notion que vous étayez au niveau du contrôleur. J'ai tenté de parcourir les contrôleurs mais je ne vois pas où je pourrais gérer ce dont je souhaite. Pourriez-vous me guider svp ? 1/ Y a-t-il une méthode (fonction) qui nous permet de récupérer l'état du paiement ? Par exemple, si paiement ok, je mets à jour ma table de données en y insérant id_seller ? 2/ Faut-il plutôt localiser les contrôleurs des différents moyens de paiement (pour le coup, il y aura Paypal et Stripe a minima) et insérer en table de données si paiement ok ? Link to comment Share on other sites More sharing options...
Eolia Posted April 7, 2020 Share Posted April 7, 2020 Vu ce que vous voulez faire je travaillerai autrement. Plutôt que de balader une variable de post en post, placez-la dans le cookie du client et une fois la commande validée/confirmée, utiliser cette variable si elle existe puis la supprimer du cookie. Link to comment Share on other sites More sharing options...
Rudy69 Posted April 7, 2020 Author Share Posted April 7, 2020 C'est une très bonne approche à laquelle je n'avais pas pensé. Je vais donc tenter de faire ainsi et reprendrai contact afin de vous signaler si j'ai finalement résolu ce problème. Merci @Eolia pour votre implication. 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