Có nhiều cách tiếp cận nhưng tôi sẽ bắt đầu với cách nó không được thực hiện để làm rõ một số quan niệm sai lầm phổ biến:
- Đó là không thể thực hiện để ghi đè lên lớp điều khiển bằng cách sao chép chúng
app/code/local
. Điều này là do các lớp trình điều khiển không được tải bởi Varien_Autoload
, thay vào đó các tệp được bao gồm rõ ràng.
- Không nên sử dụng
<rewrite><controller><to>
cú pháp nữa. Đây là một kỹ thuật cũ đã lỗi thời kể từ Magento 1.3 (xem: Bộ điều khiển ghi đè so với yêu cầu bộ điều khiển hành động ghi đè )
Thêm / ghi đè hành động của bộ điều khiển
Để thêm các hành động của bộ điều khiển vào một bộ điều khiển hiện có, hãy sử dụng các thao tác sau trong tệp config.xml của bạn:
<frontend> <--- area (adminhtml or frontend)
<routers>
<checkout> <--- front name (in admin always "adminhtml")
<args>
<modules>
<stack_checkout before="Mage_Checkout">Stack_Checkout</stack_checkout>
^ ^
| |
module to override |
</modules> (in admin always |
</args> "Mage_Adminhtml") your module
</checkout>
</routers>
</frontend>
Sau đó tạo một bộ điều khiển trong mô-đun của bạn, chẳng hạn như
class Stack_Checkout_OnepageController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
// here you override checkout/onepage/index
}
public function helloAction()
{
// here you create a new action checkout/onepage/hello
}
}
Bạn không cần phải mở rộng lớp trình điều khiển gốc vì Magento sẽ tìm trong cả hai lớp, theo thứ tự được xác định bởi before="..."
Nếu bạn cần mở rộng lớp ban đầu vì bạn muốn sử dụng lại các phương thức khác từ nó, bạn phải bao gồm nó (hãy nhớ rằng, bộ điều khiển không được tự động tải):
require_once(Mage::getModuleDir('controllers','Mage_Checkout') . DS . 'OnepageController.php');
Sử dụng trình quan sát để sửa đổi hành động của bộ điều khiển
Nếu bạn không thêm hành động mới , một cách khác là sử dụng người quan sát để sửa đổi hành vi của hành động hiện có. Mọi hành động của bộ điều khiển đều kích hoạt một sự kiện "preispatch" động trong biểu mẫu controller_action_predispatch_$FRONTNAME_$CONTROLLER_$ACTION
, ví dụcontroller_action_predispatch_checkout_onepage_index
Trong trình quan sát, bạn có quyền truy cập vào chính lớp điều khiển bằng cách sử dụng
$controller = $observer->getControllerAction();
Nếu bạn không muốn phương thức ban đầu được kích hoạt, hãy nói với Magento để không tiếp tục gửi hành động:
$controller->setFlag('', Mage_Core_Controller_Front_Action::FLAG_NO_DISPATCH, true);
Để hoàn thiện: Bạn cũng có thể ngăn các sự kiện "postdispatch" theo cách tương tự, nhưng điều này thường không cần thiết (đây là một ví dụ hữu ích: XML có thêm nội dung ):
$controller->setFlag('', Mage_Core_Controller_Front_Action::FLAG_NO_POST_DISPATCH);
Nói về điều này, bạn cũng có thể thêm một người quan sát controller_action_postdispatch_$FRONTNAME_$CONTROLLER_$ACTION
nếu bạn muốn thực hiện các hành động bổ sung hoặc sửa đổi phản hồi sau khi hành động ban đầu được thực thi.