Jump to content
Serial

Question sémantique développement module PS 1.6

Recommended Posts

Bonjour,

Il y a quelque chose que je ne comprends pas sur le développement de modules sous PS 1.6.

Je suis en train de développer un module. Ce module permet au client de sélectionner un produit, puis de le personnaliser avec différentes options proposées. Chaque options augmentent le prix via un algorithme qui est appelé dans mon javascript front.js.

J'ai donc un fichier .tpl placé dans views/templates/front/montpl.tpl qui affiche toutes les options de personnalisation au client et le front.js qui calcule un prix final.

Ce template s'affiche bien, il est appelé depuis le product.tpl dans un formulaire représenté ci-dessous :

<form action="{$link->getModuleLink('monmodule', 'validation', ['produit'=>$product->id], true)|escape:'html'}" method="post">

Ensuite, s'affiche le template du module et dans mon controleur, dans la méthode postProcess(), je récupère des infos du produit avec :

$produit = new Product($produit_id, false, $id_lang);

J'envoie ces infos sur mon template avec ca pour pouvoir les afficher à l'utilisateur :

$this->context->smarty->assign('produit', $produit);

Le problème qui se pose maintenant est que je souhaite faire un bouton "Ajouter au panier" dans mon template. Par contre, je ne sais pas où écrire les lignes pour pouvoir créer un panier. J'ai vu que l'on doit utiliser ceci :

$cart = new Cart();
$cart->id_customer = (int)($this->context->cookie->id_customer);
$cart->id_address_delivery = (int)  (Address::getFirstCustomerAddressId($cart->id_customer));
$cart->id_address_invoice = $cart->id_address_delivery;
$cart->id_lang = (int)($this->context->cookie->id_lang);
$cart->id_currency = (int)($this->context->cookie->id_currency);
$cart->id_carrier = 1;
$cart->recyclable = 0;
$cart->gift = 0;
$cart->add();
$this->context->cookie->id_cart = (int)($cart->id);    
$cart->update();

Ou écrire ces lignes dans mon cas ?

 

Merci de votre aide :)

Edited by Serial (see edit history)

Share this post


Link to post
Share on other sites

Oui, le code de mon front controller validation est présenté comme ceci (fichier validation.php dans controllers/front) :

<?php

class confectiontduValidationModuleFrontController extends ModuleFrontController
{
    public function postProcess()
    {
        // Mon traitement qui récupère des infos d'un produit et les envoie au tpl...
    }

    public function initContent()
    {
    	$this->display_column_left = false;

        parent::initContent();
        
        // Affiche le template du module confection.tpl
        $this->setTemplate('confection.tpl');
    }
}

?>

 

Share this post


Link to post
Share on other sites

Ton traitement doit être placé dans postProcess comme indiqué dans le commentaire. ^^

Share this post


Link to post
Share on other sites

Le traitement pour ajouter le produit au panier ?

Je ne comprends pas bien comment, lorsque le client va cliquer sur ce bouton Ajouter au panier, le système va comprendre qu'il faut faire la suite de la procédure postProcess...

Edited by Serial (see edit history)

Share this post


Link to post
Share on other sites

En fait tu sais ou placer ton code mais pas comment faire ta fonctionnalité ^^

Tu peux ajouter un produit à ton panier en utilisant la fonction updateQty de la classe Cart.

Cette fonction prend les paramètre suivants :

  • quantité du produits à ajouter ou retirer
  • id du produit
  • id de la déclinaison (si besoin)
  • id de la customisation (si besoin)
  • operator (up ou down) up par défaut
  • l'id de l'adresse (si besoin)
  • l'id de la boutique (si besoin)
  • et enfin un booléan si tu veux que la fonction ajout une règle panier

Généralement tu as accès au panier directement depuis le Context ($this->context->cart). Il ne faut pas créé un panier à chaque fois.

MAIS, tout ça est à faire que si tu veux personnalisé l'ajout au panier. Si ton but est uniquement d'ajouter un bouton d'ajout au panier ailleurs sur le site, il y a des moyens bien plus simple de faire. :)

Bon courage

Share this post


Link to post
Share on other sites

Bonjour,

Il faut que tu interceptes le POST et que tu transmettes son contenu.

Un truc dans ce style devrait faire le taf

<?php

class confectiontduValidationModuleFrontController extends ModuleFrontController
{
    public function postProcess($)
    {
        $product_id = (int)Tools::getValue('product_id'); //name de ton input qui contient l'id produit
        // etc si autres valeurs à recuperer (quantité,...)
        $cart = new Cart((int)$this->context->cart->id); //tu recuperes l'objet Cart du client
        if(!Validate::isLoadedObject($cart))
        {
          //Une exception ou une erreur retournee
        }
        //tu poursuis ton traitement en utilisant la methode updateQty()
        //a la fin tu penses a retourner un truc (true / false dans mon ex)
    }

    public function initContent()
    {
    	$this->display_column_left = false;

        parent::initContent();
      
      	if(Tools::isSubmit('name_de_ton_submit')
        {
             $result = $this->postProcess();
             //Tu peux ajouter 
          	 if($result)
             {
               //Message de confirmation
             }
          	 else{
               //Message d'erreur
             }
        }
           
        // Affiche le template du module confection.tpl
        $this->setTemplate('confection.tpl');
    }
}

?>

 

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