2017-10-23 4 views
0

Prestashop 1.6に取り組んでいましたが、購入前にカートの数量をチェックしました。 Prestashop 1.7に関する私の問題は次のとおりです。 顧客が今日カートの中にアイテムを置くと、彼は2日後に戻り、彼はまだログインしています。実際には製品が在庫切れになってもカートは利用可能です。 お客様は注文を行うことができ、在庫の数量は-1です。私はprestashop 1.7にアップグレードして以来、それは災害です、私は-5、-10で数量を持っています...これはチェックされていないシナリオなので。Prestashop 1.7最終注文ステップで在庫を確認します

abstract class PaymentModule extends PaymentModuleCore 
{ 
    public function validateOrder($id_cart, $id_order_state, $amount_paid, $payment_method = 'Unknown', 
     $message = null, $extra_vars = array(), $currency_special = null, $dont_touch_amount = false, 
     $secure_key = false, Shop $shop = null) 
    { 

     if (!isset($this->context)) 
      $this->context = Context::getContext(); 
     $this->context->cart = new Cart($id_cart); 

     if (!$this->context->cart->checkQuantities()){ 
      Tools::redirect(__PS_BASE_URI__.'order.php?step=0'); 
     } 
     return parent::validateOrder($id_cart, $id_order_state, $amount_paid, $payment_method, $message, 
      $extra_vars, $currency_special, $dont_touch_amount, $secure_key, $shop); 
    } 
} 
+0

1.7で数量チェックアウトが間違っているの後に? –

+0

いいえ、私が直面している問題は、カートに何かを追加したときとチェックアウトの間にカートがチェックされていないということです。このため、アイテムがまだ利用できない間は、2日間の保留中のカートを注文することができます。次に、あなたの商品在庫にゼロ以下の金額があります。 – Niko

答えて

1

実際に最善の解決策は、このアドオンを使用することです:https://addons.prestashop.com/en/stock-supplier-management/21707-temporary-product-reservation-lonely-stock.html

PrestaShopのは本当に悪いのカートの在庫を処理します。とにかく

あなたはそれを自分で行うと、利用可能在庫を確認したい場合は、それは非常に簡単です:

<?php 

    $cart = $this->context->cart; 
    $cart_products = $cart->getProducts(); 

    if (!empty($cart_products)) { 

     $db = Db::getInstance(); 

     foreach ($cart_products as $key => $cart_product) { 

      $real_quantity = StockAvailable::getQuantityAvailableByProduct($cart_product['id_product'], $cart_product['id_product_attribute']); 

      if ((int) $real_quantity < (int) $cart_product['quantity']) { 

       // If negative 
       $real_quantity = (int) $real_quantity < 0 ? 0 : $real_quantity; 

       $sql = ' 
         UPDATE `'._DB_PREFIX_.'cart_product` 
         SET quantity = '.(int) $real_quantity.',`date_add` = NOW() 
         WHERE `id_product` = '.(int) $cart_product['id_product']. 
         (!empty($cart_product['id_product_attribute']) ? ' AND `id_product_attribute` = '.(int) $cart_product['id_product_attribute'] : '').' 
         AND `id_cart` = '.(int) $cart->id; 

        $db->execute($sql); 
      } 

     } 

     // Garbage collector 
     $db->execute('DELETE FROM '._DB_PREFIX_.'cart_product WHERE quantity < 1 '); 

    } 
+0

Matt Loyeさん、このコードをありがとうございます。しかし、あなたがチェックアウトをクリックした後で、このコードをカートに入れる必要がある場所を教えてください。私はあなたがあなたのカートの合計を見るときを意味します。 – Niko

+1

モジュールを作成する必要があります(ここではジェネレータを参照してください:https://validator.prestashop.com/generator、最初にアカウントを作成する必要があります)。チェックアウトプロセスには、このコードを実行できるdisplayAfterShoppingCartBlockがあります。 –

+0

完璧、ありがとう。ただもう一つ、実際には顧客をwebisteインデックスにリダイレクトします。コードで、希望する場所にリダイレクトを追加する場所を教えてください。設定オプションとしてCMSページを作成して、CMSページを選択して、顧客にちょうど起こったことを伝えます。 – Niko

関連する問題