不要在magento中使用“flat”数据

时间:2014-02-11 11:51:52

标签: magento

阅读了Alan Storm的Fixing Magento Flat Collections with Chaos并找到了类似的SO问题here我试图返回属于某个类别但不使用Magento“平面”数据的产品。

以下是我最初使用的代码:

        $category_model = Mage::getModel('catalog/category')->load($cid);
        $collection = Mage::getModel('catalog/product_collection');
        $collection->addCategoryFilter($category_model);
        $collection->addAttributeToSort('entity_id','DESC'); 
        $collection->addAttributeToSelect('*');

        $collection->printLogQuery(true);

当通过AJAX触发此代码时,我得到的结果与从观察者运行时得到的结果不同,原因在于平面数据。所以我编写了自己的类,用于使用EAV模型:

app/code/local/Mynamespace/Mymodule/Model/Category.php:

class Mynamespace_Mymodule_Model_Category extends Mage_Catalog_Model_Category
{
    protected function _construct()
    {

        $this->_init('catalog/category');

    }

}

app/code/local/Mynamespace/Mymodule/Model/Productcollection.php:

class Mynamespace_Mymodule_Model_Productcollection 
extends Mage_Catalog_Model_Resource_Product_Collection
{
    protected function _construct()
    {

        $this->_init('catalog/product');
        $this->_initTables();
    }

}

然后更改我的查询代码:

        $category_model = Mage::getModel('mymodule/category')->load($cid);
        $collection = Mage::getModel('mymodule/productcollection');
        $collection->addCategoryFilter($category_model);
        $collection->addAttributeToSort('entity_id','DESC'); 
        $collection->addAttributeToSelect('*');

        $collection->printLogQuery(true);

但是上面的代码仍在查询平面数据表。我可能做错了什么?

2 个答案:

答案 0 :(得分:3)

因为你已经重新编写了Mage_Catalog_Model_Resource_Product_Collection简单重写

public function isEnabledFlat()
{
    if (Mage::app()->getStore()->isAdmin()) {
        return false;
    }
    if (!isset($this->_flatEnabled[$this->getStoreId()])) {
        $this->_flatEnabled[$this->getStoreId()] = $this->getFlatHelper()
            ->isEnabled($this->getStoreId());
    }
    return $this->_flatEnabled[$this->getStoreId()];
}

public function isEnabledFlat()
{
    return false;
}

应该解决它:)

答案 1 :(得分:1)

要为当前请求禁用平面索引,您还可以临时设置配置而不保存它as described here

isEnabledFlat()

在初始化产品系列之前完成此操作非常重要,因为检查配置的位置(通过{{1}}。