2011-04-09 12 views
5

Estoy intentando crear un módulo personalizado en magento admin. Llegué al punto donde se agregó un nuevo enlace al menú y al hacer clic en él, puedo navegar a la acción de índice del controlador del módulo. Pero aquí no puedo ver la cuadrícula, solo aparecen el texto del encabezado y el botón que se ha agregado en la construcción del bloque.La cuadrícula no aparece en el módulo de administración personalizada en Magento

Veo que, dado que este bloque amplía la clase Mage_Adminhtml_Block_Widget_Grid_Container, agregará por sí solo el bloque de cuadrícula dentro de este módulo como elemento secundario.

Y se incluye el Grid.php que he verificado al imprimir algo en el método _prepareColumns modificado.

¿Qué me falta aquí?

Estos son los contenidos del archivo 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())); 
    } 
} 

Gracias

PS. He intentado limpiar el caché pero no tuve suerte

Respuesta

1

De memoria creo que _prepareColumns() se llama antes de _prepareCollection(), por lo que si hay un error en la colección, la cuadrícula no se procesará aunque hayas confirmado el método de las columnas.

Parte de parent::_prepareCollection() trata de estimar el número de páginas de getSize()getSelectCountSql() y métodos de la colección, a menudo se olvide de comprobar los resultados están produciendo cuerdo que me hace tropezar. Asegúrese de que todos los registros se enciende y se puso lo siguiente en su .htaccess archivo:

php_flag display_errors on 
SetEnv MAGE_IS_DEVELOPER_MODE true 

Trate de ver lo que la consulta se está generando con estos comandos:

Mage::log((string)$collection->getSelect()); 
Mage::log((string)$collection->getSelectCountSql()); 
+0

sí había un problema en _prepareCollection como usted ha dicho. Establecer la bandera display_errors en realmente ayudó. ¡Gracias una tonelada! – naiquevin

+0

@naiquevin ¿Qué problema tenías en _prepareCollection? Tengo un problema similar. En mi clase Grid, la función __construct funciona bien. Pero mi código no va a la función _prepareCollection. –

1

Parece que tienes los bloques de la cuadrícula establecieron correctamente. Sin embargo, todavía necesita cargar la grilla en el diseño y renderizarla. Esto se puede hacer en adminhtml layout xml o en el controlador.

En su /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> 

En su controlador:

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

Tenga en cuenta que usted tiene que modificar el anterior para su implementación particular. Creo que el layout xml es más difícil de comprender inicialmente que la instanciación programática en el controlador, sin embargo, a la larga, conduce a una menor cantidad de código.

0

Sólo tenían una visión rápida y lo único que puedo ver en su código es:

 
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; 
    } 
Cuestiones relacionadas