Административный модуль Magento с использованием Grid и _prepareCollection: перебор коллекции приводит к сбою сортировки

Я сделал небольшой модуль администратора, который отражает 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();
    }

Я больше не могу сортировать или фильтровать. Может ли кто-нибудь пролить свет на то, что происходит, и есть ли у меня правильный способ изменения данных строки? Спасибо


person Gga    schedule 13.11.2012    source источник


Ответы (1)


Что происходит: ваша коллекция загружается. Языковая конструкция foreach запускает метод load вашей коллекции, извлекает данные из БД и заполняет items.

Почему у вас не работает сортировка? Потому что сортировка применяется к коллекции уже после того, как вы ее загрузили. Это означает, что элементы уже присутствуют в вашей коллекции с порядком сортировки по умолчанию.

Как вы должны делать свое дело? Прямо сейчас я не знаю, чего вы хотите добиться с помощью этого метода setData для каждого из элементов коллекции. Если вы собираетесь использовать его при создании столбцов, просто добавьте строковое значение в столбец.

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

Если вы хотите получить больше данных, присутствующих в коллекции, вам также не нужно загружать их, просто используйте методы сбора, такие как addAttributeToSelect (если это сущности EAV) или addFieldToFilter.

person Slayer Birden    schedule 13.11.2012
comment
Я вижу, что вы сейчас говорите. Итак, как мне добавить/отредактировать коллекцию без ее повторной инициализации? то есть, возможно, получить и изменить данные на уровне ->getCollection()? В основном я пытаюсь взять исходные данные, добавить свой собственный столбец, а затем добавить данные в свой столбец из моего собственного класса/метода и т.д. - person Gga; 13.11.2012
comment
Вы можете добавить данные в свой столбец, напрямую опуская коллекцию, если они одинаковы для всех элементов (как в приведенном выше примере). Просто используйте ключ по умолчанию, как я показал в ответе. - person Slayer Birden; 13.11.2012
comment
упс, я написал значение, хотя оно должно быть default. я обновил ответ - person Slayer Birden; 13.11.2012
comment
Будет ли добавление его в ...->addColumn(... который находится в _prepareColumns()) не просто дать каждой строке одно и то же значение? - person Gga; 13.11.2012
comment
Извините, неправильно прочитал ваш комментарий. Я хочу дать разные значения для каждой строки, какие-нибудь мысли? ваше здоровье - person Gga; 13.11.2012
comment
хорошо, тогда вам нужно использовать свою логику в методе _afterLoadCollection блока Grid - person Slayer Birden; 13.11.2012