2012-07-02 11 views
5

Érase una vez que traté de crear algunas columnas personalizadas. Creé toda la estructura XML como debería. Creé controladores. Incluso creé el controlador de grilla personalizado.clasificación de la columna de la cuadrícula Magento

Después de crear mi grilla personalizada, calculé que las columnas ordenarían. Estaba equivocado, totalmente equivocado. Al hacer clic en los encabezados de las columnas, no se hace nada.

Sugerencias?

class Company_Googlemerchant_Block_Adminhtml_Products_Grid extends Mage_Adminhtml_Block_Widget_Grid 
{ 
public function __construct() 
{ 
    parent::__construct(); 
    $this->setId('gm_product_grid'); 
    $this->setDefaultSort('id'); 
    $this->setDefaultDir('ASC'); 
    $this->setSaveParametersInSession(false); 
} 

protected function _prepareCollection() 
{ 
    $storeId = 1; 
    $collection = Mage::getModel('catalog/product')->getCollection()->addStoreFilter($storeId); 
    $collection 
     ->addAttributeToSelect('enable_googlemerchant') 
     ->addAttributeToSelect('name') 
     ->addAttributeToSelect('entity_id') 
     ->addAttributeToSelect('type_id') 
     ->addAttributeToSelect('status') 
     ->addFieldToFilter('enable_googlemerchant', array("eq" => '1')) 
     ->addFieldToFilter('status', array("eq" => '1')) 
     ->addAttributeToSort('name', 'asc') 
     ; 

    $this->setCollection($collection); 

    return parent::_prepareCollection(); 
} 

protected function _prepareColumns() 
{ 
    $this->addColumn('id', array(
     'header' => Mage::helper('googlemerchant')->__('ID'), 
     'align'  =>'left', 
     'index'  => 'entity_id', 
     'width'  => '100px', 
    )); 

    $this->addColumn('product_name', array(
     'header' => Mage::helper('googlemerchant')->__('Product Name'), 
     'align'  =>'left', 
     'index'  => 'name', 
     'width'  => '250px', 
    )); 

    $this->addColumn('type_id', array(
     'header' => Mage::helper('googlemerchant')->__('Product Type'), 
     'align'  =>'left', 
     'index'  => 'type_id', 
     'width'  => '100px', 
    )); 

    $this->addColumn('action', array(
     'header' => Mage::helper('googlemerchant')->__('Action'), 
     'width' => '100px', 
     'type' => 'action', 
     'getter' => 'getId', 
     'actions' => array(
      array(
       'caption' => Mage::helper('googlemerchant')->__('Remove from export'), 
       'url'  => array('base' => '*/*/removeexport'), 
       'field' => 'id' 
      ) 
     ), 
     'filter' => false, 
     'sortable' => true, 
     'index'  => 'id', 
    )); 

    return parent::_prepareColumns(); 
} 

}

+0

creo He arreglado el problema cambiando 'setId ('gm_product_grid')' a 'setId ('adminhtml_products_grid')'. Agradecería la verificación, sin embargo. –

Respuesta

13

Debe eliminar esta línea:

->addAttributeToSort('name', 'asc') 

Si desea establecer por defecto la clasificación por algunos atribuyen es necesario utilizar el método setDefaultDir del bloque de rejilla:

$this->setDefaultSort('name'); 
$this->setDefaultDir('asc'); 

El método setId no puede ser el motivo de este problema. También debe implementar gridAction para su controlador adminhtml que devolverá html de la cuadrícula ordenada. Algo como esto:

class My_Module_Adminhtml_EntityController extends Mage_Adminhtml_Controller_Action { 
................................................... 
    public function gridAction() 
    { 
     $this->loadLayout(); 
     // for AJAX queries 
     $this->getResponse()->setBody(
      // it means that you have difened class My_Module_Block_Adminhtml_Entity_Grid 
      $this->getLayout()->createBlock('my_module/adminhtml_entity_grid')->toHtml() 
     ); 
    } 
} 
+0

Serjio, eliminando '-> addAttributeToSort()' corrigió el problema. Sin embargo, tu código sobre el controlador era un poco confuso. 'indexAction()' ya está definido con '$ this-> loadLayout()' y '$ this-> renderLayout();' –

+1

Lo siento. Creo que deberías implementar 'gridAction' solo si quieres usar ajax para grid. Para AJAX, también debe crear un método 'public function getGridUrl() {return $ this-> getUrl ('*/*/grid', array ('_ current' => true)); } 'en tu bloque de cuadrícula. Y en su método '__construct 'agregue esta línea' $ this-> setUseAjax (true); '. También puede eliminar la llamada '$ this-> loadLayout()' porque no es necesario en ese caso – Serjio

+0

Serjio, gracias por la aclaración. Eso ayuda. :) –

Cuestiones relacionadas