Magento Event
1. Hệ thống Event – Observer trong Magento
Điều quan trọng trước tiên cần nhắc lại , đó là nguyên tắc cơ bản mà Hệ thống Event – Observer trong Magento hoạt động:
Khi một bên gửi đi một event (khi một customer login, load hay save một model, …), một bên khác lắng nghe event nhất định và thực hiện logic của nó khi event đó được gửi đi.
- Để gửi đi một sự kiện, ta sử dụng đoạn code như sau:
- Để bắt một event, đầu tiên ta khai báo trong file NameSpace/YourModule/etc/config.xml
Trong đó:
global : scope – có thể là global, frontend, adminhtml
event_name : tên của event, khai báo trong hàm Mage::dispatchEvent();
unique_id : cần là duy nhất trong tất cả module đang chạy trên site
class : class sẽ gọi tới khi bắt được event_name
method : function được gọi tới trong class
Sau đó viết đoạn code để chạy khi bắt được event
Trong đó:
$observer là các biến được truyền vào trong function Mage::dispatchEvent();
(variable_one, variable_two)
Tham khảo một số event default của Magento:
http://rabee.me/2014/06/06/Magento-Events-Cheat-Sheet-1-9/
https://magento2.atlassian.net/wiki/display/m1wiki/Magento+1.x+Events+Reference
2. Magento Overriding Class
Đôi khi ta cần phải thay đổi một chức năng nào đó của Magento core code. Tuy nhiên việc sửa đổi core file là một giải pháp không được khuyến khích bởi việc này có thể dẫn đến việc mất những thay đổi khi upgrade Magento lên phiên bản mới hơn. Sau đây là hai giải pháp cho việc thay đổi chức năng của Magento core code.
Giải pháp 1: Copy core file sang coodpool local theo đúng đường dẫn
Ví dụ: Khi cần sửa file app/code/core/Mage/Customer/Model/Customer.php, ta Copy file đến app/code/local/Mage/Customer/Model/Customer.php rồi thực hiện thay đổi. Lúc này Magento sẽ thực hiện code trong file tại codepool local thay vì core.
--> Ưu và nhược điểm của giải pháp này:
- Ưu điểm: Nhanh và không bị mất các thay đổi khi upgrade Magento
- Nhược điểm: Phải copy cả file trong khi chỉ cần thay đổi một function. Có thể không nhận được một số thay đổi cần thiết của code core khi upgrade Magento lên bản mới hơn.
Giải pháp 2: Viết Module để thực hiện Rewrite
- Rewrite Blocks
Khai báo rewrite trong file NameSpace/YourModule/etc/config.xml
Sau đó tạo class như đã khai báo trong file config.xml
app/code/local/NameSpace/YourModule/Block/Customer/Account/Forgotpassword.php
- Rewrite Helpers
Tương tự như block, ta cũng làm 2 bước:
Khai báo rewrite
Và tạo class
app/code/local/NameSpace/YourModule/Helper/Customer/Data.php
- Rewrite Models
Khai báo rewrite (model và resource model)
Tạo class
app/code/local/NameSpace/YourModule/Model/Customer.php
- Rewrite Controllers
Rewrite controller hơi khác một chút so với các class trên.
Khai báo trong file etc/config.xml:
frontend controller
admin controller
Khai báo class controller cần rewrite
Frontend controller
Admin controller
--> Ưu và nhược điểm của giải pháp này:
- Ưu điểm: Chỉ cần sửa một function cần rewrite, hạn chế tối đa vấn đề khi upgrade Magento lên phiên bản mới
- Nhược điểm: Khai báo, config phức tạp
Thông tin kỹ thuật
Author | Vu Manh Hung |
---|
Questions and Answers
There are no entries.