Magento - фильтр сетки с помощью ajax перезагружает всю страницу

Я использую сетку в magento admin (расширяя Mage_Adminhtml_Block_Widget_Grid), чтобы отобразить содержимое таблицы базы данных. Я видел в некоторых других модулях, что в конструкторе есть опция, чтобы использовать перезагрузку ajax вместо перезагрузки страницы

это мой конструктор:

public function __construct() {
    parent::__construct();
    $this->setId('myGrid');
    $this->setSaveParametersInSession(true);
    $this->setVarNameFilter('my_filter');
    $this->setUseAjax(true);
}

но когда я нажимаю фильтр сетки и нажимаю кнопку поиска, он перезагружает страницу WHOLE (включая верхний колонтитул, нижний колонтитул,...). Внутри сетки div.
Любые идеи, почему это так?

Ответы

Ответ 1

Я нашел решение:
Сначала мне пришлось добавить следующую функцию в класс сетки

 public function getGridUrl()
 {
   return $this->getUrl('*/*/grid', array('_current'=>true));
 }

каждый вызов ajax затем будет отправлен на этот url (и соответствующее действие контроллера), а не на URL-адрес страницы.
затем я добавил следующий бит в XML файл макета:

<module_controller_grid>
  <reference name="root">
    <block type="package/gridblockname" name="root" output="toHtml" />
  </reference>
</module_controller_grid>

это перезаписывает корневой элемент и отображает только блок сетки. поэтому мой вызов ajax будет загружать только обновленную сетку и не будет включать заголовок, нижний колонтитул и т.д.

Ответ 2

Вы также можете добавить метод "gridAction" к контроллеру администратора вместо создания макета xml

public function gridAction()
{
    $this->loadLayout();
    $this->getResponse()->setBody(
           $this->getLayout()->createBlock('{Namespace}/adminhtml_{Module}/grid')->toHtml()
    ); 
}

Предполагая, что:

Путь к блоку: /Приложения/код/​​локальные/{Пространство имен}/{} модуль/блок/Adminhtml/{} Модуль/Grid.php

Ответ 3

Добавьте следующий код в функцию __construct() в:

app/code/local/[Name_Space]/[Module_Name]/Block/Adminhtml/[Module_Name]/Grid.php file.

$this->setUseAjax(true);

Теперь добавьте следующую функцию в конце этого файла.

public function getGridUrl()
  {
      return $this->getUrl('*/*/grid', array('_current'=>true));
  }

Теперь добавьте следующую функцию, наконец, в:

app/code/local/[Name_Space]/[Module_Name]/controllers/Adminhtml/[Module_Name]Controller.php file.

public function gridAction()
     {
        $this->loadLayout();
        $this->getResponse()->setBody(
               $this->getLayout()->createBlock('[Module_Name]/adminhtml_[Module_Name]_grid')->toHtml()
        );
     }

Предоставлено: Nirav Kadiya

Ответ 4

Nirav Kadiya почти работает для меня, но я создаю функцию gridAction, как это в Admin Controller:

public function gridAction()
     {
        $this->loadLayout();
        $this->getResponse()->setBody(
               $this->getLayout()->createBlock('[Module_Name]_Block_Adminhtml_[Model_Name]_Grid')->toHtml()
        );
     }

И включите это в файл Grid

public function getGridUrl()
    {
          return $this->getUrl('*/*/grid', array('_current'=>true));
    }