Tôi có thể tìm danh sách đầy đủ các sự kiện Magento ở đâu?


94

Tôi biết rằng Magento có một hệ thống giống như cái móc gọi là sự kiện. Có ai có một danh sách đầy đủ hoặc một tập lệnh có thể được sử dụng để xác định những sự kiện nào có thể được gọi không?


4
Tôi sử dụng điều này như một cheat sheet đẹp nicksays.co.uk/magento-events-cheat-sheet-1-7
Derrik Nyomo

1
@DerrikNyomo - bạn nên đăng nó dưới dạng câu trả lời cùng với bản tóm tắt thông tin mà nó cung cấp. :-)
đánh dấu

1
Cheat sheet cho các sự kiện thực tế là rắc rối hơn, vì chúng cho bạn cảm giác sai lầm rằng "sự kiện tôi muốn không tồn tại" và bạn có thể lãng phí hàng giờ mã hóa, đã bỏ lỡ một sự kiện có thể đã được sử dụng (vì rất nhiều được tạo động) Tôi đã đăng một câu trả lời cho câu hỏi này: liên kết và câu trả lời của tôi cũng liên quan đến câu hỏi này. Nó không cung cấp cho bạn một 'danh sách' hoàn chỉnh, nhưng nó cung cấp cho bạn một danh sách đầy đủ các sự kiện cho tải hành động / trang mà bạn quan tâm đến.
ProxiBlue

Câu trả lời:


102

Không có danh sách tất cả các sự kiện magento, bởi vì hầu hết các sự kiện được đặt tên động.

Nếu bạn hỏi tôi, biết những sự kiện quan trọng này (và hậu quả) là điểm khởi đầu tốt (bên cạnh danh sách từ nick):

Mọi đối tượng được mở rộng từ Mage_Core_Model_Abauge gửi rất nhiều sự kiện xung quanh việc tải, lưu và xóa:

app/code/core/Mage/Core/Model/Abstract.php:255
Mage::dispatchEvent($this->_eventPrefix.'_load_before', $params);
// e.g. sales_order_load_before, checkout_cart_load_before

Ví dụ để thêm kiểm tra, sau khi đối tượng được tải

app/code/core/Mage/Core/Model/Abstract.php:267
Mage::dispatchEvent($this->_eventPrefix.'_load_after', $this->_getEventData());
// e.g. cms_page_load_after

để thêm dữ liệu bổ sung vào đối tượng trước khi nó được lưu

app/code/core/Mage/Core/Model/Abstract.php:391
Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
// e.g. catalog_product_save_before

Để lưu các mô hình khác sau khi "cha mẹ" được lưu

app/code/core/Mage/Core/Model/Abstract.php:466  
Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
// e.g. catalogrule_rule_save_after

làm sạch, trước khi mô hình bị xóa

app/code/core/Mage/Core/Model/Abstract.php:501
Mage::dispatchEvent($this->_eventPrefix.'_delete_before', $this->_getEventData());
// e.g. store_delete_before

làm sạch, trước khi mô hình bị xóa - hoặc có thể sau đó? Bạn đang ở đây vẫn còn trong giao dịch!

app/code/core/Mage/Core/Model/Abstract.php:529
Mage::dispatchEvent($this->_eventPrefix.'_delete_after', $this->_getEventData());
// e.g. website_delete_after

Nếu bạn muốn chắc chắn thực thể đã bị xóa

app/code/core/Mage/Core/Model/Abstract.php:541
Mage::dispatchEvent($this->_eventPrefix.'_delete_commit_after', $this->_getEventData());
// e.g. customer_delete_commit_after

Các bộ sưu tập được mở rộng từ Mage_Core_Model_Resource_Db_Collection_Abauge cũng có hai sự kiện chung:

Ví dụ: để thay đổi SQL để tải bộ sưu tập:

app/code/core/Mage/Core/Model/Resource/Db/Collection/Abstract.php:588
Mage::dispatchEvent($this->_eventPrefix.'_load_before', array(
    $this->_eventObject => $this
));
// e.g. sales_order_status_history_collection_load_before

Ví dụ: để thêm dữ liệu bổ sung cho các đối tượng:

app/code/core/Mage/Core/Model/Resource/Db/Collection/Abstract.php:637
Mage::dispatchEvent($this->_eventPrefix.'_load_after', array(
    $this->_eventObject => $this
));
// e.g. sales_order_shipment_collection_load_after

4
Rất nhiều một câu trả lời tốt; hy vọng cho một cái gì đó chúng ta có thể nhét vào wiki. Tầm quan trọng của các _eventPrefixsự kiện mô hình, các sự kiện yêu cầu được nhắm mục tiêu, các sự kiện khối chung đôi khi hữu ích và tầm quan trọng của việc đăng nhập để tìm các sự kiện
đánh dấu

1
Xuất sắc. Tôi muốn lưu ý rằng trong Magento 2 họ thực sự cần phải đảm bảo tất cả các lớp cốt lõi có tiền tố sự kiện được xác định. Tôi thực sự đã viết lại các lớp chỉ để xác định tiền tố sự kiện để tôi có thể dễ dàng móc vào các sự kiện lưu / tải. Hừm. Thật ra tôi nghĩ tôi sẽ tự mình kiểm tra nguồn Magento 2.
Tim Reynold

3
Cách tiếp cận tôi thường thực hiện là, chỉnh sửa nhanh / lưu / trở lại app/code/core/Mage/Core/Model/App.phpmage::log($eventName,null,'events.txt',true);để các dispatchEventphương pháp. Tải trang tôi đang cố gắng quan sát. Rõ ràng là không để nguyên trạng này và hoàn nguyên sau khi var / log / event.txt của bạn được tạo. Bẩn, vâng. Nhanh lên :)
B00mer

2
tốt, nếu bạn muốn người quan sát của bạn ở trên một trang. Nhưng hãy cẩn thận, có những sự kiện nên được gửi đi, nhưng có thể không. Có một đơn đặt hàng hoặc sự kiện thanh toán không được ném, khi được thanh toán bằng paypal ...
Fabian Blechschmidt

Có sự kiện nào bị sa thải sau khi tạo lô hàng trong magento @FabianBlechschmidt
Kingshuk Deb

48

Làm điều đẫm máu grep 'Mage::dispatchEvent' app/ -rsnĐiều này sẽ cung cấp cho bạn một danh sách các sự kiện cụ thể cho cài đặt của bạn vì danh sách các sự kiện có thể thay đổi tùy thuộc vào phiên bản Magento, các tùy chỉnh và tiện ích mở rộng được cài đặt.


2
Đó là lời khuyên tốt nhất, nó cũng sẽ bao gồm các sự kiện mô-đun của bên thứ 3. Thông thường khi tôi muốn biết những sự kiện nào tôi có thể nối vào trang cụ thể, tôi đăng nhập ứng dụng: tham số ClarkEvent.
Petar Dzhambazov

1
Grep cũng sẽ cung cấp cho bạn thông tin xấu: Ví dụ: nó tuyên bố điều đó sales_order_place_aftersẽ xảy ra, nhưng có vẻ như lời kêu gọi bắn nó được nhận xét Checkout/Type/Onepage.php.
kojiro

Đây là một câu trả lời kém vì nó sẽ chỉ nhận một phần nhỏ các sự kiện có sẵn vì nó hoàn toàn bỏ lỡ tất cả các sự kiện được tạo động. @PetarDzhambazov đưa ra lời khuyên tốt để đăng nhập từ người điều phối và sau đó tải các trang bạn quan tâm. Câu trả lời hay nhất cho đến nay là câu trả lời được chấp nhận được đưa ra bởi FabianBlechschmidt
Dom

26

Tôi sử dụng điều này như một bảng cheat tốt đẹp http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ . Nó có tất cả các sự kiện có thể được gọi trong 1.7.


4
Vì bạn đã hoàn thành tốt việc liên kết nội dung, tốt nhất cũng nên cung cấp nội dung ở đây trong trường hợp Nick nói "vít Magento" và xóa trang của anh ấy :-)
đánh dấu

3
Tôi không phải là người hâm mộ của danh sách này, bởi vì 1: nó chưa hoàn chỉnh, 2: có 1231 blog khác về Magento với "tất cả" các sự kiện trong Magento (+ một số trang wiki trên Magento).
FlorinelChis

@benmark đoán những gì đã xảy ra trong thời gian trung bình ...
toon81

9

Tôi biết rằng câu hỏi này đã được trả lời Tôi chỉ cần thêm cách của tôi ở đây:

  • Tôi chuẩn bị trang mà tôi muốn quan sát trong trình duyệt của mình
  • Tôi mở ứng dụng / Mage.php
  • cho public static function dispatchEvent(ln: ~ 446) khi bắt đầu tôi thêm //Mage::log($name, null, 'events.log', true);
  • không chú ý đến dòng đó
  • làm mới trang mà tôi đang trên
  • bình luận lại dòng đó

Sau đó, bạn mở var / log / event.log (~ 40kb) và chỉ xem toàn bộ rất nhiều sự kiện trên trang đó! :)


2
Điều này sẽ bỏ lỡ một số sự kiện được kích hoạt trước khi cấu hình cửa hàng được hợp nhất.
đánh dấu

6

Câu trả lời đã được chấp nhận nhưng Ill vẫn gửi câu trả lời của tôi cho tương lai:

Nếu bạn muốn xem danh sách các sự kiện mà Magento có, bạn có 3 tùy chọn:

1) Google cho nó, có rất nhiều người đã biên soạn một danh sách các sự kiện Magento

2) Tạo một mô-đun móc vào controller_action_predispatchsự kiện là sự kiện được gọi trước khi bất kỳ sự kiện nào khác được gọi. Trong mô-đun này, bạn có thể đăng nhập một số sự kiện được gửi đi:

Thêm phần sau vào config.xml

<events>
    <controller_action_postdispatch>
        <observers>
            <controller_action_after>
                <class>yourmodule/observer</class>
                <method>hookToControllerActionPostDispatch</method>
            </controller_action_after>
        </observers>
    </controller_action_postdispatch>
</events>

Và bên trong yourmodule / Model / Observer:

public function hookToControllerActionPostDispatch($observer) {
    Mage::log($observer->getEvent()->getControllerAction()->getFullActionName());
}

Ở trên sẽ ghi lại mọi sự kiện được gửi ...

3) Nếu bạn có quyền truy cập SSH, bạn có thể chạy lệnh sau để có cái nhìn tổng quan về tất cả các sự kiện (và các tệp của chúng được gửi đi):

cd /path/to/<magento-root>
grep -nris 'dispatchEvent' app/code/

1
Xin lỗi - trong khi # 3 là tốt, thông tin trong 1 & 2 từ câu trả lời của bạn thực sự không chính xác. 1) Có một vài sự kiện bị sa thải trước đó controller_action_predispatch, đáng chú ý controller_front_init_before. 2) Cách tiếp cận này đơn giản sẽ không ghi lại mọi sự kiện được gửi đi, đây là phần lỗi chính tả hay chưa hoàn chỉnh?
đánh dấu

Đã chỉnh sửa nó thành "nhất";)
Kenny

2
Xin lỗi, vẫn không chính xác lắm :-( - còn rất nhiều sự kiện được gửi đi (tiền tố, bố cục, kết xuất, cũng như tải mô hình và bộ sưu tập) ...
đánh dấu

Cập nhật câu trả lời cho "một số sự kiện".
Kenny

4

Tôi đang sử dụng Thanh công cụ dành cho nhà phát triển Magento có tính năng hiển thị các sự kiện có thể quan sát được trên trang đã tải.



4

Tôi đã thực hiện một grep trên mô-đun Mage lõi của Magento và tuân thủ một danh sách,

Danh sách đầy đủ các sự kiện Magento

PS Như đã chỉ ra, có thể chứa các sự kiện nằm trong các chức năng không dùng được của Magento, do đó, hãy kiểm tra tệp và tham chiếu dòng trước khi thực hiện.

Mở để góp ý!


1
Bạn vẫn còn thiếu tất cả các sự kiện ma thuật được phân lớp. Không thể được grepping cho.
đánh dấu

Sự kiện kỳ ​​diệu như trong? Những người năng động? Bạn có thể giải thích plz @benmark
huzefam


@benmark Tôi đồng ý, tôi không nghĩ rằng chúng ta cần chuẩn bị một danh sách rõ ràng cho việc này
huzefam

Do đó, nhận xét của tôi, được đưa ra dựa trên việc sử dụng "toàn diện"
đánh dấu

4
grep "::dispatchEvent" -R * | sort -u

grep "eventPrefix" -R * | sort -u

Lệnh grep được liệt kê trước đó sẽ hiển thị các bản sao (rất nhiều) và nó không bao gồm danh sách các tiền tố sự kiện sẽ được yêu cầu để hiểu các tên sự kiện được tạo động. Các lệnh này hiển thị cả hai danh sách chỉ có các giá trị duy nhất. Bạn có thể thêm cờ -n như câu trả lời grep khác và lấy số dòng tôi giả sử. Nhưng câu hỏi không hỏi họ ở đâu trong mã. ~ _ ~


chúng tôi có câu trả lời tương tự ở đây. Tham khảo câu trả lời của @TimBezhashvyly
Rajeev K Tomy

loại .... lệnh grep được liệt kê trước đó sẽ hiển thị các bản sao (rất nhiều) và nó không bao gồm danh sách các tiền tố sự kiện sẽ được yêu cầu để hiểu các tên sự kiện được tạo động. Các lệnh này hiển thị cả hai danh sách chỉ có các giá trị duy nhất. Bạn có thể thêm cờ -n như câu trả lời grep khác và lấy số dòng tôi giả sử. Nhưng câu hỏi không hỏi họ ở đâu trong mã.
mprototype

bạn có thể vui lòng thêm mô tả này vào câu trả lời của bạn Sau đó, câu trả lời của bạn trở nên cực hay ... (sẵn sàng thực hiện upvote sau đó) :-)
Rajeev K Tomy

cái đó có giúp ích không?
mprototype

Đúng. +1 cho điều đó. :)
Rajeev K Tomy






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.