Я новичок в prestashop и пытаюсь создать модуль оплаты, где мне нужно продублировать заказ по статистическим вопросам. Моя проблема заключается в том, что дублирующийся заказ также вычитает из запаса продукта, и мне нужно знать, где после проверки заказа предварительно обновляет запас запаса, чтобы избежать вызова соответствующей функции. В двух словах, я вызываю validateOrder () дважды, но мне нужно, чтобы StockAvailable обновлялся один раз.
Кстати, я проверил всю функцию validateOrder () в поисках раздела / функции обновления, но не смог найти его.
Единственный связанный код, который мне удалось найти, был такой:
// updates stock in shops
if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT'))
{
$product_list = $order->getProducts();
foreach ($product_list as $product)
{
// if the available quantities depends on the physical stock
if (StockAvailable::dependsOnStock($product['product_id']))
{
// synchronizes
StockAvailable::synchronize($product['product_id'], $order->id_shop);
}
}
}
но это работает только тогда, когда включено расширенное управление запасами.
Благодарю.
Код, который вы ищете, находится в OrderDetail::create
метод, который использует OrderDetail::checkProductStock
который в свою очередь вызывает StockAvailable::updateQuantity
$update_quantity = StockAvailable::updateQuantity(...
Что интересно, перед обновлением количества есть это условие
if (!StockAvailable::dependsOnStock($product['id_product']))
Я предлагаю вам переопределить этот метод и верните истину, когда вам нужно.
Вы можете установить глобальный флаг, прежде чем дублировать заказ, а затем проверить этот флаг и, если он истинный, вернуть true, чтобы предотвратить обновление запаса.
код переопределения в override/classes/stock/StockAvailable.php
class StockAvailable extends StockAvailableCore
{
public static function dependsOnStock($id_product, $id_shop = null)
{
$no_quantity_update = isset($GLOBALS['no_quantity_update']) && $GLOBALS['no_quantity_update'];
if ($no_quantity_update)
return true;
else return parent::dependsOnStock($id_product, $id_shop = null);
}
}
Чтобы сделать это переопределение эффективным, удалите файл cache/class_index.php
обновить список переопределений
Код вашего модуля:
//set to false just to be sure
$GLOBALS['no_quantity_update'] = false;
$this->module->validateOrder($cart->id, Configuration...
//set to true to prevent quantity update
$GLOBALS['no_quantity_update'] = true;
$this->module->validateOrder($cart->id, Configuration...
Вы можете изменить непосредственно код ядра, но это не рекомендуется
Других решений пока нет …