我在magento admin(扩展Mage_Adminhtml_Block_Widget_Grid
)中使用网格来显示数据库表的内容。我在其他一些模块中看到,在构造函数中可以设置一个选项来使用ajax reloads而不是page reloads
这是我的构造函数:
public function __construct() {
parent::__construct();
$this->setId('myGrid');
$this->setSaveParametersInSession(true);
$this->setVarNameFilter('my_filter');
$this->setUseAjax(true);
}
但是当我单击网格的过滤器并单击搜索按钮时,它会重新加载整个网格div中的整个页面(包括页眉,页脚......)。 任何想法为什么会这样?
答案 0 :(得分:19)
我找到了解决方案:
首先,我必须将以下函数添加到网格类
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调用只会加载更新的网格本身,不会包含页眉,页脚等。
答案 1 :(得分:13)
您还可以向管理控制器添加“gridAction”方法,而不是创建布局xml
public function gridAction()
{
$this->loadLayout();
$this->getResponse()->setBody(
$this->getLayout()->createBlock('{Namespace}/adminhtml_{Module}/grid')->toHtml()
);
}
假设:
阻止路径: /应用程序/代码/本地/ {命名空间} / {模块} /块/ Adminhtml / {模块} /Grid.php
答案 2 :(得分:13)
将以下代码添加到__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
答案 3 :(得分:4)
Nirav Kadiya几乎适合我,但我在管理员控制器中创建了这样的gridAction函数:
public function gridAction()
{
$this->loadLayout();
$this->getResponse()->setBody(
$this->getLayout()->createBlock('[Module_Name]_Block_Adminhtml_[Model_Name]_Grid')->toHtml()
);
}
并在de Grid文件中包含此内容
public function getGridUrl()
{
return $this->getUrl('*/*/grid', array('_current'=>true));
}