2012-07-02 20 views
5

Una volta ho provato a creare alcune colonne personalizzate. Ho creato l'intera struttura XML come avrei dovuto. Ho creato i controller. Ho persino creato il controller di griglia personalizzato.Ordinamento colonna griglia Magento

Dopo aver creato la mia griglia personalizzata, ho pensato che le colonne sarebbero state ordinate. Ho sbagliato, ho sbagliato. Facendo clic sulle intestazioni delle colonne non fai nulla.

Suggerimenti?

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

penso che ho risolto il problema cambiando 'setId ('gm_product_grid')' a 'setId ('adminhtml_products_grid')'. Gradirei la verifica, comunque. –

risposta

13

Si dovrebbe rimuovere questa riga:

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

Se si desidera impostare l'ordinamento di default da qualche attributo è necessario utilizzare il metodo setDefaultDir del blocco di griglia:

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

setId metodo non può essere il motivo di questo problema. Inoltre dovresti implementare gridAction per te adminhtml controller che restituirà html della griglia ordinata. Qualcosa di simile a questo:

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, rimozione '-> addAttributeToSort()' risolto il problema. Tuttavia, il codice relativo al controller era un po 'confuso. 'indexAction()' è già definito con '$ this-> loadLayout()' e '$ this-> renderLayout();' –

+1

Mi dispiace. Penso che dovresti implementare 'gridAction' solo se vuoi usare ajax per la griglia. Per AJAX, dovresti anche creare una funzione pubblica 'getGridUrl() {return $ this-> getUrl ('*/*/grid', array ('_ current' => true)); } 'nel tuo blocco Grid. E nel tuo metodo '__construct' aggiungi questa riga' $ this-> setUseAjax (true); '. Puoi anche rimuovere la chiamata '$ this-> loadLayout()' perché in quel caso non è necessario – Serjio

+0

Serjio, grazie per il chiarimento. Questo aiuta. :) –

Problemi correlati