Как избежать уменьшения количества товара, когда оно все еще находится в «Обработке», и обновления, когда заказ был отправлен или доставлен?
Я редактировал эту часть кода в orderdetail.php
и добавь это $id_order_state != Configuration::get('PS_OS_PREPARATION')
в заявлении if. Да, количество не уменьшается при обработке, но при отправке оно также не уменьшается. Пожалуйста, помогите, я застрял здесь.
protected function checkProductStock($product, $id_order_state)
{
if ($id_order_state != Configuration::get('PS_OS_CANCELED') && $id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_PREPARATION')) {
$update_quantity = true;
if (!StockAvailable::dependsOnStock($product['id_product'])) {
$update_quantity = StockAvailable::updateQuantity($product['id_product'], $product['id_product_attribute'], -(int)$product['cart_quantity']);
}
if ($update_quantity) {
$product['stock_quantity'] -= $product['cart_quantity'];
}
if ($product['stock_quantity'] < 0 && Configuration::get('PS_STOCK_MANAGEMENT')) {
$this->outOfStock = true;
}
Product::updateDefaultAttribute($product['id_product']);
}
}
Объект OrderDetail создается только один раз для каждого Заказа и не будет обновляться после этого даже при изменении состояния Заказа. Поэтому, когда ваш объект OrderDetail создан, с вашей модификацией он не будет обновлять запас, потому что у него нет нужного состояния. И когда вы позже измените состояние заказа метод checkProductStock
больше никогда не будет звонить
Вы можете создать собственный модуль, подключенный actionOrderStatusPostUpdate
(ведьма срабатывает внутри changeIdOrderState()
метод класса OrderHistory()
, В вашем модуле вы скопируете checkProductStock()
метод и вызовите его из ловушки, если состояние «отправлено».
РЕДАКТИРОВАТЬ
Если вы хотите добавить его непосредственно в ядро:
редактировать 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
после добавления этого файла.
Других решений пока нет …