Сетка не появляется в пользовательском модуле администратора в Magento - PullRequest
5 голосов
/ 09 апреля 2011

Я пытаюсь создать пользовательский модуль в администраторе magento.Я достиг точки, когда в меню была добавлена ​​новая ссылка, и, щелкнув по ней, я могу перейти к индексу действия контроллера модуля.Но здесь я не вижу сетки, отображаются только текст заголовка и кнопка, которая была добавлена ​​в конструкцию блока.

Я вижу, что, поскольку этот блок расширяет класс Mage_Adminhtml_Block_Widget_Grid_Container, он сам добавитблок сетки внутри этого модуля как его дочерний элемент.

И включен Grid.php, который я подтвердил, распечатав что-то в переопределенном методе _prepareColumns.

Что мне здесь не хватает?

Это содержимое файла Grid.php

class Book_Brands_Block_Adminhtml_Brands_Grid extends Mage_Adminhtml_Block_Widget_Grid {

    public function __construct() {
        parent::__construct();
        $this->setId('brandsGrid');
        $this->setDefaultSort('brands_id');
        $this->setDefaultDir('ASC');
        $this->setSaveParametersInSession(true);
    }

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

    protected function _prepareColumns() {

        $this->addColumn('brands_id', array(
            'header' => Mage::helper('brands')->__('ID'),
            'align'  =>'right',
            'width'  => '50px',
            'index'  => 'brands_id',
        ));
        $this->addColumn('title', array(
            'header'=> Mage::helper('brands')->__('Title'),
            'align' =>'left',
            'index' => 'title',
        ));
        $this->addColumn('status', array(
            'header'=> Mage::helper('brands')->__('Status'),
            'align' => 'left',
            'width' => '80px',
            'index' => 'status',
            'type'  => 'options',
            'options' => array(
                1 => 'Enabled',
                2 => 'Disabled',
            ),
        ));
        $this->addColumn('action', array(
            'header' => Mage::helper('brands')->__('Action'),
            'width'  => '100',
            'type'   => 'action',
            'getter' => 'getId',
            'actions' => array(
                array(
                    'caption'  => Mage::helper('brands')->__('Edit'),
                    'url'  => array('base'=> '*/*/edit'),
                    'field' => 'id'
                )
            ),
            'filter'  => false,
            'sortable' => false,
            'index' => 'stores',
            'is_system' => true,
        ));
        return parent::_prepareColumns();
    }

    public function getRowUrl($row) {
        return $this->getUrl('*/*/edit', array('id' => $row->getId()));
    }
}

Спасибо

PS.Я попытался очистить кэш, но не повезло

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

Похоже, у вас правильно настроены блоки сетки.Однако вам все равно нужно загрузить сетку в макет и отобразить ее.Это можно сделать либо в макете adminhtml xml, либо в контроллере.

В вашем /app/design/adminhtml/../layout/brands.xml:

<?xml version="1.0"?>    
<layout>
        <brands_index_index>
            <reference name="content">
                <block type="brands/brands_grid" name="brands_grid"></block>
            </reference>
        </brands_index_index>
</layout>

В вашемконтроллер:

public function indexAction()
{
    $this->loadLayout();
    $this->_addContent(
        $this->getLayout()->createBlock('brands/brands_grid','brands')
    );
    $this->renderLayout();
}

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

1 голос
/ 09 апреля 2011

По памяти, я думаю, _prepareColumns() вызывается раньше _prepareCollection(), поэтому, если в коллекции будет ошибка, сетка не будет отображаться, даже если вы подтвердили метод столбцов.

Часть parent::_prepareCollection() пытается подсчитать количество страниц из методов getSize() и getSelectCountSql() коллекции, я часто забываю проверить, что они дают вменяемые результаты, что меня подводит.Убедитесь, что все журналы включены, и добавьте в ваш файл .htaccess следующее:

php_flag display_errors on
SetEnv MAGE_IS_DEVELOPER_MODE true

Попробуйте посмотреть, какой запрос генерируется с помощью этих команд:

Mage::log((string)$collection->getSelect());
Mage::log((string)$collection->getSelectCountSql());
0 голосов
/ 10 апреля 2011

Только что был быстрый просмотр, и единственное, что я вижу в вашем коде:

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

//Try to use it like this:
protected function _prepareCollection() {       
        $collection = Mage::getModel('brands/brands')->getCollection();
        $this->setCollection($collection);
        parent::_prepareCollection();
        return $this;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...