更确切地说,如何模拟用户在后端的产品编辑页面中选择"状态:已禁用"时所执行的操作 - 这样它就不会显示,出售,显示在各种列表等中?
根据我的收集,Magento将产品的状态设置为2,当被禁用时,即存在Mage_Catalog_Model_Product_Status::STATUS_DISABLED.
我已经尝试了下面的代码Mage_Catalog_Model_Product,看看它是如何工作的,但它没有:
public function getStatus()
{
return 2;
// return $this->_getData('status');
}
Run Code Online (Sandbox Code Playgroud)
但我认为这还不够,因为我认为Magento使用事件通知听众产品已被禁用.
PS:Magento EE 1.11.0.2
Ver*_*ton 10
你可以用
Mage::getModel('catalog/product_status')->updateProductStatus($product->getId(), $storeId, Mage_Catalog_Model_Product_Status::STATUS_DISABLED);
Run Code Online (Sandbox Code Playgroud)
看起来像这样
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;
}
Run Code Online (Sandbox Code Playgroud)
调度事件基于
<catalog_product_status_update>
<observers>
<sales_quote>
<class>sales/observer</class>
<method>catalogProductStatusUpdate</method>
</sales_quote>
</observers>
</catalog_product_status_update>
Run Code Online (Sandbox Code Playgroud)
这是方法
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;
}
Run Code Online (Sandbox Code Playgroud)
这是资源模型
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;
}
Run Code Online (Sandbox Code Playgroud)
没有观察者直接执行此函数,但在Status.php中调度了一个事件.
| 归档时间: |
|
| 查看次数: |
8197 次 |
| 最近记录: |