库存状态重新索引后,可配置选项从前端消失
-
12-12-2019 - |
题
我有一个自定义导入例程,可以创建可配置的产品并将子项分配给它们。这些显示在前端没有问题,直到我手动运行股票状态重新索引。
我已经制作了重新索引前后的快照,并且有一个表发生了变化,即 cataloginventory_stock_status
哪里的 stock_status
列更改自 1
(当它确实出现时) 0
(现在没有出现)为我的可配置父级。
任何人都可以解释这种行为或知道如何解决它吗?
只是为了澄清,重新同步我的产品,它调用以下代码:
$stockStatus = Mage::getModel('cataloginventory/stock_status');
$stockStatus->assignProduct($product);
$stockStatus->saveProductStatus($product->getId(), 1);
使选项再次出现,直到下一个状态重新索引。
解决方案 2
事实证明,在导入可配置父项时,我跳过了一些将条目放入的代码 cataloginventory_stock_item
这导致了 stock_status
被设置为 0
当重新索引过程运行时。考虑到这一点,我们需要确保可配置的父级有一个项目,即:
$stockItem = Mage::getModel('cataloginventory/stock_item');
$stockItem->assignProduct($product);
$stockItem->setData('stock_id', 1);
$stockItem->setData('qty', $stockLevel);
$stockItem->setData('use_config_min_qty', 1);
$stockItem->setData('use_config_backorders', 1);
$stockItem->setData('min_sale_qty', 1);
$stockItem->setData('use_config_min_sale_qty', 1);
$stockItem->setData('use_config_max_sale_qty', 1);
$stockItem->setData('is_in_stock', ($isInStock) ? 1 : 0);
$stockItem->setData('use_config_notify_stock_qty', 1);
$stockItem->setData('use_config_manage_stock', 0);
$stockItem->setData('manage_stock', ($this->getPropS($kcStockItem, 'STOCK_CONTROLLED') == '-1') ? 1 : 0);
$stockItem->setData('backorders', $backorderVal);
$stockItem->setData('use_config_backorders', "0");
$stockItem->save();
其他提示
我在通过API方法导入库存状态时遇到了这个问题。我要做的就是通过重写核心模块来修补核心。 Mage_Catalog_Model_Resource_Product_Status::getProductStatus()
其中存在错误加载子状态的错误。为了修复这个错误,我将此方法的 else 语句中的 $select 赋值替换为
$select = $adapter->select()
->from(
array('t1' => $attributeTable),
'')
->joinLeft(
array('t2' => $attributeTable),
't1.entity_id = t2.entity_id AND t1.attribute_id = t2.attribute_id AND t2.store_id = ' . (int)$storeId,
array('t1.entity_id')
)
->columns(array('value' => $valueCheckSql))
->where('t1.store_id = ?', Mage_Core_Model_App::ADMIN_STORE_ID)
->where('t1.attribute_id = ?', $attribute->getAttributeId())
->where('t1.entity_id IN(?)', $productIds);
确保您通过覆盖来做到这一点 Mage_Catalog_Model_Resource_Product_Status::getProductStatus()
方法来完成此操作,这样您就不会直接修改核心。