2011-11-26 26 views
5

Tôi ajaxifying cửa hàng Magento của tôi, và khá nhiều tất cả mọi thứ đang diễn ra thuận buồm xuôi, ngoại trừ một điều:Sử dụng hệ thống thông điệp built-in Magento trong điều khiển tùy chỉnh + hành động

Vấn đề: tôi dường như không thể để truy xuất và hiển thị khối tin nhắn trong các câu trả lời cho các yêu cầu AJAX.

Giải thích: tôi đang nói về các màu đỏ (hoặc xanh lá cây, khi đó là một thông báo thành công) thanh mà dường như người sử dụng sau khi thử một cái gì đó mà không làm việc (ví dụ như bổ sung thêm mặt hàng vào giỏ hàng hơn cổ phiếu cho phép). Khi trả lời các yêu cầu ajax nhất định tạo ra lỗi, tôi muốn hiển thị đánh dấu thư thông qua một mẫu trống rỗng, được sử dụng để trả lời cho yêu cầu ajax này. Khi không có lỗi xảy ra, một phản ứng phù hợp khác được trả về.

Những điều tôi đã cố gắng: Dưới đây là một vài dòng mã PHP mà tôi đã cố gắng sử dụng:

$_messages = Mage::getSingleton("core/session")->getMessages(); 
echo $this->getLayout()->createBlock("core/messages")->setMessages($_messages)->getGroupedHtml(); 

echo $this->getMessagesBlock()->getGroupedHtml(); 

echo Mage::app()->getLayout()->getMessagesBlock()-> 
     setMessages(Mage::getSingleton('customer/session')->getMessages(true))->getGroupedHtml(); 

Mage::log ging các dữ liệu cho thấy các bộ sưu tập thư trống.

Đây là bố cục XML (Tôi đang sử dụng $this->loadLayout('ajax_msg_handle'); từ bộ điều khiển) :.

<ajax_msg_handle> 
    <block type="core/template" name="error.root" output="toHtml" template="page/html/ajax-messages.phtml"> 
    <block type="core/messages" name="global_messages" as="global_messages"/> 
    <block type="core/messages" name="messages" as="messages"/> 
    </block> 
</ajax_msg_handle> 

Cũng là một điểm chi tiết, tôi đã xem xét những điều sau đây:

Hầu hết các hành động, giống như của giỏ hàng "xóa", "chỉnh sửa" và trang sản phẩm của "thêm vào giỏ hàng", đầu tiên chuyển hướng đến một nơi khác, vì vậy yêu cầu thứ hai được thực hiện, hiển thị lỗi. Có thể những tin nhắn này không bao giờ được hiển thị ngay lập tức, nhưng chỉ khi trả lời yêu cầu sau khi một thông báo phát sinh lỗi. Vì vậy, tôi đã cố gắng để làm theo quy ước này có thể bằng cách chuyển hướng đến một hành động hiển thị các thông điệp này, nhưng điều này đã không làm việc hoặc.

Nếu có ai đó có thể cho tôi biết cách để các thông điệp đó xuất hiện, nó sẽ làm cho ngày của tôi.

Trả lời

4

khối thư bạn đang cố gắng sử dụng không giả sử để làm việc cho các truy vấn AJAX. Như bạn đã chỉ ra, nó chỉ xuất hiện sau khi chuyển hướng, ví dụ:

  • thông điệp được thiết lập trong phiên giao dịch thông qua một cái gì đó như: Mage::getSingleton('adminhtml/session')->addError(Mage::helper('modulename')->__('error message'));
  • sau đó được chuyển hướng: $this->_redirect('*/*/');
  • mà gây nên một thương hiệu truy vấn mới, tải bố cục. Khi bố cục được thiết lập, vì có một thông báo, nó sẽ hiển thị.

Để hiển thị khối thông điệp này trực tiếp trong cuộc gọi AJAX (nghĩa là không có chuyển hướng), bạn phải:

  • trong hành động của bộ điều khiển của bạn: thiết lập các thông điệp và tải các khối:

    Mage::register('message', Mage::helper('yourmodule')->__('the error message'); 
    $layout = $this->getLayout(); 
    $update = $layout->getUpdate(); 
    $update->load('ajax_msg_handle'); //loading your custom handle, defined in your module's layout .xml file 
    $layout->generateXml(); 
    $layout->generateBlocks(); 
    $output = $layout->getOutput(); 
    $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('error' => $output))); 
    
  • trong của bạn.phtml echo thông điệp:

    <ul class="messages"> 
        <li class="error-msg"> 
         <ul> 
          <li><?php echo Mage::registry('message'); ?></li> 
         </ul> 
        </li> 
    </ul> 
    
  • đầu ra phản ứng trong mã javascript của bạn ở phần onComplete của cuộc gọi ajax của bạn:

    onComplete: function(transport) { 
        $$('.main-col-inner')[0].insert({before:transport.responseText.evalJSON().error}); 
        Element.hide('loading-mask'); 
    } 
    

Lưu ý rằng nó sẽ tốt hơn thực tế để làm cho khối của riêng bạn loại, điều đó sẽ mở rộng Mage_Core_Block_Messages và quản lý thư trong các phương thức của khối đó, thay vì sử dụng sổ đăng ký.
Hy vọng điều đó giúp

+0

Cảm ơn bạn rất nhiều! Tôi vẫn không biết Ở đâu nó được quyết định rằng một tin nhắn chưa được hiển thị, nhưng phương pháp của bạn có hiệu quả giải quyết vấn đề của tôi. – pancake

Các vấn đề liên quan