2012-04-06 96 views
6
禁用Magento的产品

更准确地说,如何模拟当用户选择“状态:已停用”提出的行动后端的产品编辑页面 - 因此,它不是表示,出售各种列表等表现?通过代码

从我收集的信息来看,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

回答

9

你可以使用

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调度。

0

也许你需要修改Mage_Catalog_Model_Product_Status还有:

public function getProductStatus($productIds, $storeId = null) 
{ 
    //return $this->getResource()->getProductStatus($productIds, $storeId); 
    return 2; 
} 

此方法由CatalogInventory模块调用,以确定任何一个产品是可用的。