2012-04-06 6 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

あなたはディスパッチイベントはここで

 <catalog_product_status_update> 
      <observers> 
       <sales_quote> 
        <class>sales/observer</class> 
        <method>catalogProductStatusUpdate</method> 
       </sales_quote> 
      </observers> 
     </catalog_product_status_update> 

に基づいています

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; 
} 

次のようになりますどの

Mage::getModel('catalog/product_status')->updateProductStatus($product->getId(), $storeId, Mage_Catalog_Model_Product_Status::STATUS_DISABLED); 

を使用することができます方法

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; 
    } 
です

はここであり、直接この機能を実行全く観察者はありませんが、イベントはStatus.phpに派遣されたリソース・モデル

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; 
    } 

です。

0

はおそらく、あなたが同様にMage_Catalog_Model_Product_Statusを変更する必要があります

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

この方法は、決定するためにCatalogInventoryモジュールによって呼び出されたいずれかの製品が利用可能です。

関連する問題