2017-09-22 2 views

Répondre

0

Disons que vous voulez faire sur le produit ID N ° 1 de la page du produit: premier ajouter deux entrées champs dans votre product.tpl (ou dans votre module.tpl appelé dans le produit. tpl)

<input name="height"><br> 
<input name="width"> 

maintenant vous devez obtenir dans votre module.php changer le prix dynamicly:

$id_product = 1;  
$newPrice = 0; 
$height = Tools::getValue('height'); 
$width = Tools::getValue('width'); 

//Price rules (change with your rules) 
if($height > 10 && $width > 10) $newPrice = 10; 

    $specific_price = new SpecificPrice(); 
    $specific_price->price = $newPrice; 
    $specific_price->id_cart = (int) $this->context->cart->id; 
    $specific_price->id_shop = 0; 
    $specific_price->id_shop_group = 0; 
    $specific_price->id_currency = 0; 
    $specific_price->id_country = 0; 
    $specific_price->id_group = 0; 
    $specific_price->id_customer = (int) $this->context->customer->id; 
    $specific_price->id_product = (int)$id_product; 
    $specific_price->id_product_attribute = 0; 
    $specific_price->from_quantity = 1; 
    $specific_price->reduction = 0; 
    $specific_price->reduction_type = 'amount'; 
    $specific_price->from = '0000-00-00 00:00:00'; 
    $specific_price->to = '0000-00-00 00:00:00'; 
    $specific_price->add(); 

et si vous voulez ajouter au panier

$cart->id_lang = (int)($this->context->cookie->id_lang); 
    $cart->id_currency = (int)($this->context->cookie->id_currency); 
    $cart->updateQty($qte, $id_product); 

et après la commande est fait, vous mettez le prix normal, donc priorité sur le contrôleur orderconfirmation dans override/contrôleurs/avant/OrderConfirmationController.php:

class OrderConfirmationController extends OrderConfirmationControllerCore 
{ 
    public $ssl = true; 
    public $php_self = 'order-confirmation'; 
    public $id_cart; 
    public $id_module; 
    public $id_order; 
    public $reference; 
    public $secure_key; 

    public function getPriceBack($id_product){ 

     $normalPrice = Product::getPriceStatic($id_product); 

     $specific_price = new SpecificPrice(); 
     $specific_price->price = $normalPrice; 
     $specific_price->id_cart = (int) $this->context->cart->id; 
     $specific_price->id_shop = 0; 
     $specific_price->id_shop_group = 0; 
     $specific_price->id_currency = 0; 
     $specific_price->id_country = 0; 
     $specific_price->id_group = 0; 
     $specific_price->id_customer = (int) $this->context->customer->id; 
     $specific_price->id_product = (int)$id_product; 
     $specific_price->id_product_attribute = 0; 
     $specific_price->from_quantity = 1; 
     $specific_price->reduction = 0; 
     $specific_price->reduction_type = 'amount'; 
     $specific_price->from = '0000-00-00 00:00:00'; 
     $specific_price->to = '0000-00-00 00:00:00'; 
     $specific_price->add(); 

    } 

    public function init() 
    { 
     parent::init(); 

     $this->id_cart = (int)(Tools::getValue('id_cart', 0)); 
     $is_guest = false; 

     /* get normal price back */ 
     $id_product = 1; 
     self::getPriceBack($id_product); 

     /* check if the cart has been made by a Guest customer, for redirect link */ 
     if (Cart::isGuestCartByCartId($this->id_cart)) { 
      $is_guest = true; 
      $redirectLink = 'index.php?controller=guest-tracking'; 
     } else { 
      $redirectLink = 'index.php?controller=history'; 
     } 

     $this->id_module = (int)(Tools::getValue('id_module', 0)); 
     $this->id_order = Order::getOrderByCartId((int)($this->id_cart)); 
     $this->secure_key = Tools::getValue('key', false); 
     $order = new Order((int)($this->id_order)); 
     if ($is_guest) { 
      $customer = new Customer((int)$order->id_customer); 
      $redirectLink .= '&id_order='.$order->reference.'&email='.urlencode($customer->email); 
     } 
     if (!$this->id_order || !$this->id_module || !$this->secure_key || empty($this->secure_key)) { 
      Tools::redirect($redirectLink.(Tools::isSubmit('slowvalidation') ? '&slowvalidation' : '')); 
     } 
     $this->reference = $order->reference; 
     if (!Validate::isLoadedObject($order) || $order->id_customer != $this->context->customer->id || $this->secure_key != $order->secure_key) { 
      Tools::redirect($redirectLink); 
     } 
     $module = Module::getInstanceById((int)($this->id_module)); 
     if ($order->module != $module->name) { 
      Tools::redirect($redirectLink); 
     } 
    } 
} 

après l'ordre est fait, vous devez vider le panier avec id_product et supprimer la règle dans DBB:

$this->context->cart->deleteProduct(1); 

    Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'specific_price WHERE id_customer='.(int)$this->context->customer->id); 

il est juste un exemple et ne peut pas utiliser sans tests variables et peut-être mettre votre identifiant constante du produit concerné, espère que cela aide

+0

Afin de changer le prix dynamiquement, devrais-je mettre à jour la fonction updateQty dans cart.php? –

+0

oui c'est un moyen facile de le faire – Melvita

+0

voici le problème que je suis confronté: disons que nous avons un produit avec le prix de base: 100 $ l'utilisateur commande un produit avec la hauteur et la largeur personnalisée, et disons le prix devient 100 $ +20 $ = 120 $ et puisque le nouveau prix est calculé et ajouté avec le prix spécifique, sur la prochaine commande, le prix de base deviendra 120 $, et je ne pouvais pas trouver un moyen de faire revenir le prix à la montant initial –