Thêm khối để bố trí linh hoạt trong trình quan sát sự kiện


8

Tôi muốn biết làm thế nào để sử dụng layout.xml với trình quan sát sự kiện.

Tôi muốn hiển thị một thông báo ở chân trang khi thanh toán được thực hiện thành công.

Tôi biết tôi phải sử dụng sự kiện checkout_onepage_controller_success_action

Làm cách nào để sử dụng trình điều khiển hoặc layout.xml với trình quan sát sự kiện?

Câu trả lời:


13

Sự kiện checkout_onepage_controller_success_actionđược kích hoạt ngay trước khi bố cục được hiển thị, vì vậy bạn vẫn có thể thao tác nó.

Người quan sát chỉ nhận id đơn hàng làm tham số, vì vậy bạn phải lấy bố cục qua mô hình ứng dụng:

$layout = Mage::app()->getLayout();

Bây giờ bạn có thể thực hiện các thay đổi của mình theo chương trình, như thế này:

$messageBlock = $layout->createBlock('core/template', 'payment_message_block');
$messageBlock->setTemplate('payment_message.phtml');
$layout->getBlock('footer')->append($messageBlock);

Nếu bạn sử dụng controller_action_layout_load_beforesự kiện, bạn cũng có thể tải một điều khiển bố cục tùy chỉnh như thế này, nếu trên trang thành công:

if ($observer->getAction()->getFullActionName() === 'checkout_onepage_success') {
    $layout = $observer->getLayout();
    $layout->getUpdate()->addHandle('custom_layout_handle');
}

mà bạn có thể định nghĩa trong XML:

<layout>
  <custom_layout_handle>
     <reference name="footer">
       <block type="core/template" name="payment_message_block" template="payment_message.phtml" />
     </reference>
  </custom_layout_handle>
</layout>

Cập nhật: Khối chân trang được lưu trữ, vì vậy chúng tôi phải đảm bảo rằng một phiên bản khác được lấy từ bộ đệm nếu có thông báo. Ví dụ:

$footer = $layout->getBlock('footer');
$footer->setCacheKey(sha1($footer->getCacheKey() . '-payment-message');

Làm thế nào để truyền dữ liệu di truyền vào tập tin phtml? mà tôi đang thể hiện

Tham chiếu khối của bạn theo tên và sử dụng setData(). Ví dụ:

$block = $layout->getBlock('payment_message_block')->setData('messsage', 'Hello');

Và trong mẫu:

echo $this->getData('message');

1
Tôi không chắc chắn điều này hoạt động cho khối chân trang. Nó sẽ hoạt động cho hầu hết các khối khác, nhưng khi bật bộ đệm, chân trang được lưu vào bộ đệm và nó có thể không hiển thị thông báo.
Marius

Điểm hay @Marius, nếu có thể, tôi sẽ cố gắng sử dụng before_body_endmà không được lưu trong bộ nhớ cache
Fabian Schmengler

Đúng, nên làm việc.
Marius

Nếu nó phải footervì lý do thiết kế, tôi đã thêm một giải pháp thay đổi khóa bộ đệm.
Fabian Schmengler

đó là lý do tại sao tôi cũng bối rối vì trong bố cục không có gì đề cập đến liên quan đến người quan sát. mà tôi đã tìm thấy trước khi gửi câu hỏi ở đây
Rahul Chaurasia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.