Jump to content
Rudy69

Passer une valeur du formulaire de commande au paiment

Recommended Posts

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);
    }
}

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

 

 

Share this post


Link to post
Share on other sites

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);
    }
}

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 ?

 

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More