Magento Observerイベント - 操作順序
-
16-10-2019 - |
質問
機能を注入しようとしています catalog_model_product_duplicate
イベント。このモジュールの一部は、重複した製品の在庫状態も複製されるようにすることです。現在、そうではありません。
私はそれを見る CatalogInventory
このイベントを観察し、いくつかの標準的な在庫情報を設定します。地元の人々の前にコアイベントが解決されることを保証できますか?ここに私が頼ることができる操作の順序はありますか?
解決
イベントが派遣される順序は、モジュールがロードされる順序に依存します。あなたはそれを確実にする必要があるので CatalogInventory
モジュールのオブザーバーがあなたのものをする前に発射する前に、あなたがする必要があることは、単にモジュールを構成するように構成することです Mage_CatalogInventory
モジュール。これを行うことができます。 app/etc/modules/My_Module.xml
ファイル:
<config>
<modules>
<My_Module>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_CatalogInventory />
</depends>
</My_Module>
</modules>
</config>
depends
上記のXMLのノードは、Magentoコアモジュールにロードする前に強制的に強制されるため、ここで重要な構成です。
他のヒント
イベントが発送される順序は、簡単に保証することはできません。それらは、モジュールがロードされる順序に依存します。通常、すべてのコアイベントオブザーバーは、コミュニティおよびローカルコードプールオブザーバーの前に呼び出されます。
コアモジュールのローカルモジュールまたはコミュニティのモジュールに依存することにより、カスタムオブザーバーをカスタムオブザーバーに発射するように強制する方法があります。ここでリーの答えを見てください: 既存のMagentoオブザーバーの前にカスタムオブザーバーの火を作る.
/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>
私は個人的にそのアプローチが好きではありません。その依存関係がどのような結果が強制されるかわからないからです。
ユースケースでは、データ/状態が発射されたかどうかを知るために、ある種の検出を行う必要があると思われます。モデルでデータ/状態を確認することは、イベントの注文を強制しようとするよりも望ましいでしょう。
一般的な答え
オブザーバーはによって実行されます 範囲 最初に、次に モジュールの読み込み順序
つまり、すべてのオブザーバーが登録されています <global>
実行されます 前 すべてのオブザーバーが登録されています <frontend>
また <adminhtml>
.
領域内で、オブザーバーは合併した構成XMLツリーに表示される順序で実行されます。これは、技術的にモジュールがロードされていることを意味します。
モジュールの読み込み順序は次のように決定されます。
依存関係グラフはから構築されています
<depends>
定義app/etc/modules/*.xml
. 。 xがyに依存する場合、yはxの前にロードされます。依存関係による注文後、コアモジュールはコミュニティおよびローカルモジュールよりも優先されます
他のすべてはアルファベット順にロードされます。ファイル名が次のことに注意してください
app/etc/modules
実際のモジュール名ではなく、比較に使用されます。
したがって、モジュールの読み込み順に影響を与える2つのオプションがあります。
- 別のモジュールに依存して、オブザーバーをその後実行する(または、他のモジュールに依存して以前に実行するようにします)
- モジュール定義ファイルの名前を変更します。ファイル名は注文を読み込む以外に重要ではないため、モジュール自体の名前を変更する必要はありません。
( "3.モジュールをコアコードプールに追加する"カウントされません)
参照:
ただの提案、両方を観察してください catalog_model_product_duplicate
と catalog_model_product_save_after
シングルトンオブザーバーと。の catalog_model_product_duplicate
在庫データをオブザーバーデータ、およびinとして設定します catalog_model_product_save_after
そのデータを使用して、重複した製品の在庫を埋め込みます。