更确切地说,如何模拟用户在后端的产品编辑页面中选择“状态:已禁用”时所执行的操作 - 这样它就不会显示,出售,显示在各种列表等中?
根据我的收集,Magento在禁用时将产品的状态设置为2,即Mage_Catalog_Model_Product_Status::STATUS_DISABLED
。
我在Mage_Catalog_Model_Product
中尝试了以下代码,看看它是如何工作的,但它没有:
public function getStatus()
{
return 2;
// return $this->_getData('status');
}
但我认为这还不够,因为我认为Magento使用事件通知听众产品已被禁用。
PS:Magento EE 1.11.0.2
答案 0 :(得分:10)
您可以使用
Mage::getModel('catalog/product_status')->updateProductStatus($product->getId(), $storeId, Mage_Catalog_Model_Product_Status::STATUS_DISABLED);
看起来像这样
Mage_Catalog_Model_Product_Status
/**
* Update status value for product
*
* @param int $productId
* @param int $storeId
* @param int $value
* @return Mage_Catalog_Model_Product_Status
*/
public function updateProductStatus($productId, $storeId, $value)
{
Mage::getSingleton('catalog/product_action')
->updateAttributes(array($productId), array('status' => $value), $storeId);
// add back compatibility event
$status = $this->_getResource()->getProductAttribute('status');
if ($status->isScopeWebsite()) {
$website = Mage::app()->getStore($storeId)->getWebsite();
$stores = $website->getStoreIds();
} else if ($status->isScopeStore()) {
$stores = array($storeId);
} else {
$stores = array_keys(Mage::app()->getStores());
}
foreach ($stores as $storeId) {
Mage::dispatchEvent('catalog_product_status_update', array(
'product_id' => $productId,
'store_id' => $storeId,
'status' => $value
));
}
return $this;
}
调度事件基于
<catalog_product_status_update>
<observers>
<sales_quote>
<class>sales/observer</class>
<method>catalogProductStatusUpdate</method>
</sales_quote>
</observers>
</catalog_product_status_update>
这是方法
Mage_Sales_Model_Observer
/**
* Catalog Mass Status update process
*
* @param Varien_Event_Observer $observer
* @return Mage_Sales_Model_Observer
*/
public function catalogProductStatusUpdate(Varien_Event_Observer $observer)
{
$status = $observer->getEvent()->getStatus();
if ($status == Mage_Catalog_Model_Product_Status::STATUS_ENABLED) {
return $this;
}
$productId = $observer->getEvent()->getProductId();
Mage::getResourceSingleton('sales/quote')->markQuotesRecollect($productId);
return $this;
}
这是资源模型
Mage_Catalog_Model_Resource_Product_Status
/**
* Update product status for store
*
* @param int $productId
* @param int $storId
* @param int $value
* @return Mage_Catalog_Model_Resource_Product_Status
*/
public function updateProductStatus($productId, $storeId, $value)
{
$statusAttributeId = $this->_getProductAttribute('status')->getId();
$statusEntityTypeId = $this->_getProductAttribute('status')->getEntityTypeId();
$statusTable = $this->_getProductAttribute('status')->getBackend()->getTable();
$refreshIndex = true;
$adapter = $this->_getWriteAdapter();
$data = new Varien_Object(array(
'entity_type_id' => $statusEntityTypeId,
'attribute_id' => $statusAttributeId,
'store_id' => $storeId,
'entity_id' => $productId,
'value' => $value
));
$data = $this->_prepareDataForTable($data, $statusTable);
$select = $adapter->select()
->from($statusTable)
->where('attribute_id = :attribute_id')
->where('store_id = :store_id')
->where('entity_id = :product_id');
$binds = array(
'attribute_id' => $statusAttributeId,
'store_id' => $storeId,
'product_id' => $productId
);
$row = $adapter->fetchRow($select);
if ($row) {
if ($row['value'] == $value) {
$refreshIndex = false;
} else {
$condition = array('value_id = ?' => $row['value_id']);
$adapter->update($statusTable, $data, $condition);
}
} else {
$adapter->insert($statusTable, $data);
}
if ($refreshIndex) {
$this->refreshEnabledIndex($productId, $storeId);
}
return $this;
}
没有观察者直接执行此函数,但在Status.php中调度了一个事件。
答案 1 :(得分:0)
也许您还需要修改Mage_Catalog_Model_Product_Status
:
public function getProductStatus($productIds, $storeId = null)
{
//return $this->getResource()->getProductStatus($productIds, $storeId);
return 2;
}
CatalogInventory
模块调用此方法以确定产品是否可用。