2016-04-28 13 views
2

Как избежать уменьшения количества продукта, когда он все еще находится в «Процессе» и обновляется, когда заказ был отправлен или доставлен?Избегайте уменьшения количества товара, когда статус заказа по-прежнему «Процесс»

Я отредактировал эту часть кода в orderdetail.php и добавьте это $id_order_state != Configuration::get('PS_OS_PREPARATION') в оператор if. Да, количество не уменьшается при его обработке, но при отправке оно также не уменьшается. помогите, я застрял здесь.

+0

Вот почему я не использую готовые элементы, но ... Причина, по которой это не уменьшается, заключается в том, что запас не проверяется, когда статус изменен на «отправлен» (или что-то еще). Почему? Вам нужно найти код, который изменяет статус и добавляет туда чек, - хотя то, что вы сделали бы, если бы акции были недействительными, немного озадачивает - предположительно предотвратит изменение статуса, но если вы уже отправляете его ... – Mike

ответ

0

Объект OrderDetail создается только один раз для каждого заказа и после него не будет обновляться даже при изменении состояния заказа. Поэтому, когда ваш объект OrderDetail создается, с вашей модификацией он не будет обновлять запас, потому что он не имеет правильного состояния. И когда вы позже измените состояние заказа, метод checkProductStock больше никогда не будет вызван.

Вы можете создать собственный модуль замкнув на actionOrderStatusPostUpdate (ведьма запускается внутри changeIdOrderState() метода класса OrderHistory(). В вашем модуле вы будете копировать метод checkProductStock() и вызвать его с крючка, если состояние «поставляется».


EDIT

Если вы хотите добавить его непосредственно в ядре:

Edit classes/order/OrderHistory.php

В методе changeIdOrderState() изменить последние строки:

// executes hook 
    Hook::exec('actionOrderStatusPostUpdate', array('newOrderStatus' => $new_os, 'id_order' => (int)$order->id,), null, false, true, false, $order->id_shop); 

    // Here change 4 to the desired id_order_state 
    if ($new_order_state == 4) 
    { 
     $virtual_products = $order->getVirtualProducts(); 
     foreach ($virtual_products as $virtual_product) 
     { 
      $this->checkProductStock($virtual_product['product_id'], $new_order_state); 
     } 
    } 

    ShopUrl::resetMainDomainCache(); 
} 

После этого добавить новый метод в этом классе:

protected function checkProductStock($product, $id_order_state) 
{ 
    $update_quantity = true; 
    if (!StockAvailable::dependsOnStock($product['product_id'])) 
    { 
     StockAvailable::updateQuantity($product['product_id'], $product['product_attribute_id'], -(int)$product['product_quantity']); 
    } 

    Product::updateDefaultAttribute($product['product_id']); 
} 

Этот код не был проверен.


Я советую вам сделать это в переопределение:

Создать новый файл в /overrides/classes/order/OrderHistory.php ведьму содержит эти два метода и изменить определение класса к class OrderHistory extends OrderHistoryCore {, вам придется удалить /cache/class_index.php после добавления этого файла ,

+0

Не стесняйтесь спрашивать больше информации, если это не ясно. –

+0

Есть ли способ редактировать его в ядре? потому что я еще не знаю, как создать модуль. Кстати, спасибо! вы единственный, кто отвечает на этот вопрос, я публикую его на другом форуме, но не повезло. Благодарю вас, надеюсь, вы все равно можете мне помочь. – winresh24

+0

Я отредактировал свой ответ. Пожалуйста, учтите мою рекомендацию использовать переопределения вместо редактирования основных файлов. [Как переопределяет работу в Prestashop 1.6] (http: //doc.prestashop.com/display/PS16/Overriding + default + behaviors) –