Ghi đè phương thức preDispatch của bộ điều khiển lõi


7

Tôi cần ghi đè phương thức preDispatch của bộ điều khiển lõi. Bộ điều khiển lõi kế thừa từ Mage_Checkout_Controller_Action, bản thân nó có một phương thức preDispatch cần được gọi. Vì tôi đang mở rộng từ bộ điều khiển lõi mà tôi muốn ghi đè, tôi không thể gọi parent::preDispatch(), vì điều đó sẽ kéo theo chức năng mà tôi đang cố gắng tránh.

Câu hỏi của tôi là - Làm thế nào tôi có thể gọi một phương thức được ghi đè cao hơn 2 cấp trong chuỗi thừa kế, hoặc tôi chỉ đang thực hiện sai cách này?

Cập nhật

Rõ ràng điều này hoạt động:

Mage_Checkout_Controller_Action::preDispatch(); (mặc dù phương pháp đó không tĩnh, tôi đoán bạn học được điều gì đó mới mỗi ngày ..)

Bây giờ câu hỏi của tôi là: Có cách nào tốt hơn để làm điều này mà không phải sao chép tất cả các chức năng từ lớp tôi đang ghi đè?

Lý do tôi cố gắng này là vì tôi đã đi theo con đường này , cố gắng buộc Magento nhớ các bài tập địa chỉ khi khách hàng trải qua kiểm tra nhiều lần và sau đó rời đi. (FWIW, tôi thấy bài viết được liên kết với bài viết rất hay giúp tôi đi đúng hướng, nhưng dường như còn thiếu rất nhiều các bước cần thực hiện để làm việc này).

Bộ điều khiển mà tôi ghi đè là MultiShippingContoder lõi có chuyển hướng quay lại IndexAction đa biến cần tránh. Nói một cách dễ hiểu, tôi đã hoàn thành chức năng này, tiết kiệm cho một số vấn đề (liên quan đến việc thêm mục đầu tiên vào giỏ hàng và Mage_Sales_Model_Quote_Item-> getQuoteItem () trả về null trong mẫu địa chỉ. đó là một cuộc thảo luận hoàn toàn khác nhau).


1
Chỉ trong trường hợp bất kỳ ai khác đi lang thang về điều này sau đó và tự hỏi làm thế nào / tại sao cú pháp tĩnh (dường như) đang hoạt động. Tôi muốn giới thiệu cho bạn câu trả lời StackOverflow này giải thích nó rất tốt. Nói tóm lại, nó không "tĩnh" giống như parent::someMethod()không tĩnh, mà chỉ định một phần của cây thừa kế để duyệt qua trước khi gọi một phương thức trong $thisngữ cảnh phù hợp của thể hiện của lớp hiện tại.
Brian

Câu trả lời:


8

Tôi nghĩ thật thú vị khi biết chính xác những gì bạn đang cố gắng thực hiện, nhưng tôi có thể cung cấp cho bạn một vài gợi ý mà không cần biết chi tiết:

Trong hầu hết các trường hợp nếu phương thức bạn đang cố gắng tham chiếu không sử dụng $this, bạn có thể gọi nó một cách an toàn:

Mage_Checkout_Controller_Action::preDispatch()

Nhưng có lẽ bạn nên làm điều này thông qua một bộ quan sát trước điều khiển. Magento cho bạn khả năng thực hiện điều này trong Mage_Core_Controller_Varien_Action:

abstract class Mage_Core_Controller_Varien_Action
{
    // [...]
    public function preDispatch()
    {
        // [...]
        if ($this->_rewrite()) {
            return; // [What is the purpose if this?]
        }
        // [...]

        // [This is where my event needs to be firing, but this code never gets 
        // executed because the controller is rewritten]
        Mage::dispatchEvent(
            'controller_action_predispatch_'.$this->getFullActionName(),
            array('controller_action'=>$this)
        );

    }
    // [...]
}

Tất cả bạn phải làm là thêm tên hành động đầy đủ vào cuối controller_action_predispatch. Một ví dụ về chức năng đánh giày vào Onepage Savebilling:

    <events>
        <controller_action_predispatch_checkout_onepage_saveBilling>
            <observers>
                <some_unique_name_for_this_event>
                    <class>yourmodel/observer</class>
                    <method>myPredispatchObserver</method>
                </some_unique_name_for_this_event>
            </observers>
        </controller_action_predispatch_checkout_onepage_saveBilling>
    </events>

Hơn nữa, trong phương thức quan sát viên của bạn, bạn cần chấp nhận người quan sát và bạn có thể lấy chính bộ điều khiển từ getEvent:

<?php

class MyCompany_MyModule_Model_Observer
{

    public function myPredispatchObserver($observer)
    {
        $controller = $observer->getEvent()->getControllerAction();
    }
}

1
Cảm ơn vì sự sáng suốt. Tôi đã cập nhật câu hỏi của mình là tại sao tôi làm điều này.
Jeff Lambert

1

Tôi đang sử dụng điện thoại của mình, nhưng tôi nghĩ rằng bạn có thể sử dụng bất kỳ một trong số các sự kiện để xóa chuyển hướng khỏi đối tượng phản hồi.

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.