2011-12-16 40 views
15

Tôi đang sử dụng lưới trong quản trị Magento (mở rộng Mage_Adminhtml_Block_Widget_Grid) để hiển thị nội dung của bảng cơ sở dữ liệu. Tôi thấy trong một số module khác rằng có một tùy chọn để được thiết lập trong các nhà xây dựng để sử dụng nạp ajax thay vì trang tải lại
này được xây dựng của tôi:Magento - bộ lọc lưới sử dụng ajax tải lại toàn bộ trang

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

nhưng khi tôi nhấp vào bộ lọc của lưới điện và bấm nút tìm kiếm, nó tải lại trang WHOLE (bao gồm đầu trang, chân trang, ...) INSIDE div lưới.
Bất kỳ ý tưởng nào về lý do này?

+0

không chắc chắn, nhưng có lẽ một số javascript cũng được áp dụng cho lưới ... hãy nhìn vào tập tin .phtml đối với một số lưới khác. – usoban

Trả lời

19

Tôi tìm thấy giải pháp:
Đầu tiên tôi đã có thêm chức năng sau vào lớp lưới

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

mỗi cuộc gọi ajax sau đó sẽ được gửi đến địa chỉ này (và các hành động điều khiển tương ứng) chứ không thì url của trang.
sau đó tôi thêm vào các bit sau vào file layout XML:

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

này ghi đè phần tử gốc và chỉ hiển thị những khối lưới. vì thế gọi ajax của tôi sẽ chỉ tải lưới điện được cập nhật chính nó và sẽ không bao gồm header, footer vv

+4

Tôi gặp sự cố khi cửa sổ tải ajax không đóng sau khi chuyển thành công sang trang tiếp theo.Trong hành động điều khiển của tôi, tôi đã cố gắng trở lại; trả về 1; trả lại đúng; echo 1; vv không có gì làm việc. Làm thế nào tôi có thể đóng cửa sổ ajax? – tester

+0

Cũng có cùng một vấn đề với spinner không biến mất. Hình đó là do 'Vendor_Module_Block_Adminhtml_Model_Grid.php' của tôi không đặt' $ this-> setId ("some_id"); 'bên trong' __construct() 'function – Patchee

13

Bạn cũng có thể thêm một phương pháp "gridAction" để điều khiển quản trị của bạn thay vì tạo ra một xml bố trí

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

Giả sử:

Khối Đường dẫn: /app/code/local/{Namespace}/{Module}/Block/Adminhtml/{Module}/Grid.php

+0

Thx, hoạt động của nó! –

13

Add follwing mã vào __construct() chức năng trong:

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

$this->setUseAjax(true); 

Bây giờ Thêm chức năng sau cuối cùng của tập tin này.

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

Bây giờ Thêm chức năng sau tại cuối cùng trong:

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

Courtesy: Nirav Kadiya

3

Các Nirav Kadiya gần như làm việc cho tôi nhưng tôi tạo gridAction chức năng như thế này trong Bộ điều khiển quản trị:

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

Và bao gồm này trong de Lưới nộp

public function getGridUrl() 
    { 
      return $this->getUrl('*/*/grid', array('_current'=>true)); 
    } 
Các vấn đề liên quan