Magento Observer Events - thứ tự các hoạt động


9

Tôi đang cố gắng đưa chức năng vào catalog_model_product_duplicatesự kiện. Một phần của mô-đun này sẽ là để đảm bảo rằng trạng thái tồn kho của sản phẩm trùng lặp cũng được sao chép; Hiện tại thì không.

Tôi thấy rằng CatalogInventoryquan sát sự kiện này và thiết lập một số thông tin chứng khoán tiêu chuẩn. Tôi có thể được đảm bảo rằng các sự kiện cốt lõi được giải quyết trước người dân địa phương của tôi không? Có bất kỳ thứ tự hoạt động ở đây mà tôi có thể dựa vào?

Câu trả lời:


11

Thứ tự mà các sự kiện được gửi đi phụ thuộc vào thứ tự mà các mô-đun được tải. Vì bạn cần chắc chắn rằng các CatalogInventoryquan sát viên của mô-đun kích hoạt trước khi thực hiện, điều bạn cần làm chỉ đơn giản là cấu hình mô-đun của bạn để phụ thuộc vào Mage_CatalogInventorymô-đun. Bạn có thể làm điều này bằng cách thêm một nút phụ thuộc vào mã trong app/etc/modules/My_Module.xmltệp của bạn :

<config>
    <modules>
        <My_Module>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_CatalogInventory />
            </depends>
        </My_Module>
    </modules>
</config>

Các dependsnút trong XML trên là mảnh quan trọng của cấu hình ở đây, vì nó buộc các module lõi Magento để tải trước khi bạn không có gì.


7

Thứ tự mà các sự kiện được gửi đi không thể dễ dàng được đảm bảo. Chúng phụ thuộc vào thứ tự các mô-đun được tải. Thông thường tất cả các nhà quan sát sự kiện cốt lõi sẽ được gọi trước các nhà quan sát nhóm mã cộng đồng và địa phương.

Có một phương pháp để buộc các nhà quan sát magento bắn sau một tùy chỉnh bằng cách "giả mạo" một sự phụ thuộc của một mô-đun cốt lõi vào một địa phương hoặc cộng đồng. Hãy xem câu trả lời của Lee tại đây: Tạo một người quan sát tùy chỉnh bắn trước một người quan sát Magento hiện có .

/app/etc/modules/groupname_Page.xml

<config>
    <modules>
        <Groupname_Page>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <!-- Your dependencies go here -->
            </depends>
        </Groupname_Page>
        <Enterprise_PageCache>
            <depends>
                <Groupname_Page />
            </depends>
        </Enterprise_PageCache>
    </modules>
</config>

Cá nhân tôi không thích cách tiếp cận đó vì tôi không biết hậu quả nào buộc sự phụ thuộc đó sẽ có.

Đối với trường hợp sử dụng của bạn, có vẻ như bạn nên thực hiện một số loại phát hiện dữ liệu / trạng thái để biết liệu nó có bị bắn hay không. Kiểm tra dữ liệu / trạng thái trên một mô hình sẽ tốt hơn là cố gắng tạo ra một thứ tự sự kiện.


Tuy nhiên, trong trường hợp của tôi, tôi không có gì để làm nếu mặt hàng chứng khoán chưa tồn tại. Bạn có suy nghĩ gì về một sự kiện sau này mà tôi có thể đánh hơi để xem liệu đó có phải là kết quả của phương pháp trùng lặp không?
philwinkle

5

Một câu trả lời chung chung

Các quan sát viên được thực hiện theo khu vực trước, sau đó theo thứ tự tải mô-đun

Điều đó có nghĩa là, tất cả các quan sát viên đã đăng ký <global>được thực thi trước khi tất cả các quan sát viên đã đăng ký trong <frontend>hoặc <adminhtml>.

Trong một khu vực, các trình quan sát được thực thi theo thứ tự chúng xuất hiện trong cây XML cấu hình được hợp nhất, có nghĩa là về mặt kỹ thuật theo thứ tự các mô-đun đã được tải.

Thứ tự tải mô-đun được xác định như sau:

  1. Một đồ thị phụ thuộc được xây dựng từ <depends>các định nghĩa trong app/etc/modules/*.xml. Nếu X phụ thuộc vào Y, Y được tải trước X.

  2. Sau khi đặt hàng theo sự phụ thuộc, các mô-đun cốt lõi được ưu tiên hơn các mô đun cộng đồng và cục bộ

  3. Mọi thứ khác được tải theo thứ tự abc. Lưu ý rằng tên tệp trong app/etc/modulesđược sử dụng để so sánh, không phải tên mô-đun thực tế.

Vì vậy, bạn có hai tùy chọn để ảnh hưởng đến thứ tự tải mô-đun:

  1. phụ thuộc vào một mô-đun khác để các quan sát viên của bạn thực hiện sau nó (hoặc làm cho mô-đun khác phụ thuộc vào mô-đun của bạn để thực hiện chúng trước đó)
  2. Đổi tên tệp định nghĩa mô-đun. Bạn không cần phải đổi tên chính mô-đun vì tên tệp không quan trọng đối với bất cứ điều gì khác ngoài việc tải thứ tự.

("3. thêm mô-đun của bạn vào nhóm mã lõi" không được tính)

Xem thêm:


1

Chỉ cần một gợi ý, quan sát cả catalog_model_product_duplicatecatalog_model_product_save_aftervới người quan sát đơn lẻ. Trong catalog_model_product_duplicatethiết lập dữ liệu hàng tồn kho dưới dạng dữ liệu quan sát viên và catalog_model_product_save_aftersử dụng dữ liệu đó để điền vào khoảng không quảng cáo cho sản phẩm trùng lặp.


Vì vậy, bạn đang đề xuất lưu một tài sản cho đối tượng được trao cho tôi trong sự kiện, sau đó thử nghiệm trên catalog_model_product_save_after... điều đó có thể hoạt động. Cạm bẫy duy nhất sẽ là duy trì tài sản mà không gọi save()... bất kỳ suy nghĩ nào ở đó?
philwinkle

Bạn sẽ lưu mô hình hàng tồn kho, không phải sản phẩm, vì vậy bạn không nên bị cuốn vào vòng lặp.
Petar Dzhambazov
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.