6

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

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

4

2 回答 2

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

于 2012-04-06T19:23:02.543 回答
0

也许您还需要修改Mage_Catalog_Model_Product_Status

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

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

于 2012-04-06T14:28:15.453 回答