【问题标题】:Disabling a Magento Product via code通过代码禁用 Magento 产品
【发布时间】:2012-04-06 13:56:37
【问题描述】:

更准确地说,如何模拟用户在后端产品编辑页面中选择“状态:已禁用”时所做的操作 - 使其不显示、不出售、不显示在各种列表中等?

根据我收集到的信息,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

【问题讨论】:

    标签: php magento


    【解决方案1】:

    你可以使用

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

    dispatch 事件是基于

            <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中调度了一个事件。

    【讨论】:

      【解决方案2】:

      也许你还需要修改Mage_Catalog_Model_Product_Status

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

      CatalogInventory 模块调用此方法以确定产品是否可用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 2017-11-02
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多