0

現在、次のイベントをリッスンするオブザーバーを備えた Magento モジュールがあります。

  • sales_order_invoice_save_after
  • sales_order_place_after
  • sales_order_shipment_save_after
  • order_cancel_after

オブザーバーは、注文に関する重要な詳細をパッケージ化し、クライアントが選択した出力 (JSON、CSV、XML) でそれらをリモート システムにエクスポートするモデル内のメソッドを呼び出します。

ただし、エクスポートする前にデータの変更を必要とするクライアントが 1 つあります。

私がやりたいのは、永久に維持する「特別な」バージョンを作成するのではなく、このモジュールをカスタム ローカル モジュールで拡張することです。これを処理するメソッドをオーバーライドするのに十分なほど簡単にモデルを拡張できますが、それが確実に呼び出されるようにする方法が正確にはわかりません。

オブザーバーによって呼び出されたクラスをオーバーライドするにはどうすればよいですか?

これは私の問題に対する正しいアプローチですか?たとえば、どのクラスがプロセスを処理するかを決定するための構成設定を探す、ある種のディスパッチ モデルを用意する方が適切でしょうか?

4

1 に答える 1

0

オブザーバー モデル自体をオーバーライドしようとしているか、オブザーバーによって呼び出されたモデルをオーバーライドしようとしているかは、完全には明確ではありません。

ではMage_Core_Model_App::dispatchEvent()、Magento はMage::getModel($obs['model'])オブザーバー モデルを取得するために使用します。modulename/modelnameしたがって、構成がオブザーバーをそのグループ名で (つまり、ではなく)参照している限り、Foo_Modulename_Model_Modelname標準の Magento 書き換えを使用して、別のモジュールでオブザーバー モデルを変更できます。

<config>
  <global>
    <models>
      <!-- this is the group name of the module's models -->
      <modulename>
        <rewrite>
          <!-- rewrite the modulename/modelname model to use a different class -->
          <modelname>Bar_Modulename_Model_Modelname</modelname>
        </rewrite>
      </modulename>
    </models>
  </global>
</config>

これは、別のモデルをオーバーライドする場合も同じように機能します。たとえば、オブザーバーが を呼び出す場合、クラスを同じようにMage::getModel('mymodule/order_export')書き直す必要があります。mymodule/order_export

于 2015-01-15T03:17:54.470 に答える