使用Grid和_prepareCollection的Magento管理模块:循环遍历集合使排序失败

时间:2012-11-13 12:52:32

标签: php magento-1.7 magento

我制作了一个反映CMS-> Page的小型管理模块。我的管理页面的块使用app\code\core\Mage\Adminhtml\Block\Catalog\Product\Grid.php中的代码,该代码为我提供了一个网格,我可以在原始的CMS->页面部分对其进行排序和过滤。

这是我的管理页面块中的代码:

protected function _prepareCollection()
    {
        $collection = Mage::getModel('cms/page')->getCollection();
        $collection->setFirstStoreFlag(true);
        $this->setCollection($collection);
        return parent::_prepareCollection();
    }

正如我所提到的那样显示并允许正确排序。

但是,当我尝试通过修改上述内容来修改行中的数据时使用:

protected function _prepareCollection()
    {
        $collection = Mage::getModel('cms/page')->getCollection();
        $collection->setFirstStoreFlag(true);

        foreach ($collection as $order) {
            $order->setData( 'title', 'Hello world' );    
        } 

        $this->setCollection($collection);
        return parent::_prepareCollection();
    }

我无法再排序或过滤。任何人都可以了解发生的事情,如果我有正确的方法来改变行数据?感谢

1 个答案:

答案 0 :(得分:2)

发生了什么:正在加载您的收藏。 foreach语言构造触发了集合的load方法,它从数据库中提取数据并填充items

为什么你的排序不起作用?因为已经加载后将排序应用于集合。这意味着这些项目已经存在于您的集合中,并具有默认排序顺序。

你应该怎么做?现在我不知道你想用每个集合项的setData方法完成什么。如果您要在创建列时使用它,只需在列中添加字符串值。

...->addColumn('title', array('default' => 'Hello world'))

如果您想要提取集合中存在的更多数据,您也不需要加载它,只需使用类似的集合方法 addAttributeToSelect(如果是EAV实体)或addFieldToFilter