Сетка не появляется в пользовательском модуле администратора в Magento
Я пытаюсь создать пользовательский модуль в администраторе 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 ответа
По памяти я думаю _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());
Похоже, вы правильно настроили блоки сетки. Однако вам все равно нужно загрузить сетку в макет и отобразить ее. Это можно сделать либо в XML-макете adminhtml, либо в контроллере.
В вашем /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 поначалу сложнее понять, чем программная реализация в контроллере, однако, в конечном счете, это приводит к меньшему раздутию кода.
Просто был быстрый просмотр, и единственное, что я вижу в вашем коде:
защищенная функция _prepareCollection() { $collection = Mage::getModel('бренды / бренды')->getCollection(); $ This->setCollection($ сбор); return parent::_prepareCollection(); } // Попробуем использовать его следующим образом: protected function _prepareCollection() { $collection = Mage::getModel('бренды / бренды')->getCollection(); $ This->setCollection($ сбор); Родитель:: _ prepareCollection (); вернуть $this; }