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));
}