Magento - 使用ajax的网格过滤器重新加载整个页面

时间:2011-12-16 12:42:20

标签: php magento

我在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中的整个页面(包括页眉,页脚......)。 任何想法为什么会这样?

4 个答案:

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