THELIA Forum

Welcome to the THELIA support and discusssion forum

Offline

#1 Url ajout produit au panier

(14-02-2017 15:58:04)


Bonjour,

On a un produit que l'on ne souhaite pas voir apparaitre sur le site mais que l'on souhaite pouvoir néanmoins ajouter au panier (pour encaisser des paiements sur un produit pas achetable directement en ligne). J'ai essayé plusieurs fois de faire marcher le plugin qui permet de faire des commandes depuis le back-office mais il ne marche vraiment pas pour moi (j'ai posté 2 retours de bugs sur Github sans jamais une réponse) donc j'essaye une autre solution.

https://github.com/thelia-modules/Order … n/issues/6

Mon idée est de cacher quelque part dans le site un simple lien (sur un point ou sur une virgule) qui amènerai à la page panier en ajoutant au panier ce produit avec une quantité de 1 (j'ai préparé un produit à un euro que l'admin du site pourra acheter dans la quantité souhaitée, s'il a reçu un paiement de 28€ il en prendra 28 ...).

Après quelques recherches je me rends compte que toutes les mises au panier se font avec un form, je me demandais s'il était possible de concocter un simple lien qui irait à la page panier en ajoutant un produit dont on a l'id au départ ?

Mci d'avance,
Pierre

Online


Pour ton issue, personne n'a sans doute eu le temps de s'y pencher, dommage.

Tu peux tout à faut fabriquer un petit module, avec un controleur qui accepte les URLs contenant reference et quantite (le fameux "simple lien"), pas exemple quelque chose de la forme http://domain.tld/ajout-panier/REFERENCE/QANTITE.

Tu définis dans le module une route qui appelle la méthode suivante de ton contrôleur:

class Cart extends BaseFrontController
{
    public function add($ref, $qty)
    {
        if (null !== $this->getSession()->getCustomerUser()) {
            try {
                if (null !== $product = ProductQuery::create()->findOneByRef($ref)) {
                    $cartEvent = new CartEvent($this->getSession()->getSessionCart($this->getDispatcher()));
            
                    $cartEvent
                        ->setQuantity(intval($qty))
                        ->setAppend(true)
                        ->setProduct($product->getId())
                        ->setProductSaleElementsId($product->getDefaultSaleElements()->getId());
            
                    $this->getDispatcher()->dispatch(TheliaEvents::CART_ADDITEM, $cartEvent);
            
                    return new Response('OK', 200);
                } else {
                    return new Response('Product not found', 404);
                }
            } catch (\Exception $e) {
                return new Response($e->getMessage(), 500);
            }
        } else {
            return new Response('Please login', 403);
        }
    }
}

Et pour la route, tu aurais par exemple :

    <route id="tonmodule.add-to-cart" path="/ajout-panier/{ref}/{qty}" methods="get">
        <default key="_controller">TonModule\Controller\Cart::add</default>
        <requirement key="ref">.*</requirement>
        <requirement key="qty">\d+</requirement>
    </route>

En fonction de ce que tu veux afficher comme réponse, tu retravailleras peut-être ce que retourne la méthode add().


CQFDev | Sites, boutiques, modules, développement et intégration pour Thelia 1 et 2

Offline


Bjr,

Grrr j'avais pas vu la réponse désolé, j'ai l'impression que les messages du forum ont une propension à passer en spam chez moi. Merci, je regarde.

Pierre.