11

私の知る限り、スクリプトがMagentoの外部で実行されると、イベントが発生したときにオブザーバーは呼び出されません。なんで?どうすれば修正できますか?

以下は、私をこの質問に導いた元の問題です。問題は、カタログルールを適用するオブザーバーが呼び出されないことです。イベントは発生しますが、オブザーバーはそれを取得しません。


Magentoセッションをロードする外部スクリプトを実行しています。

そのスクリプト内で、私は製品をロードし、たくさんのプロパティを取得しています。1つの問題はgetFinalPrice()、製品に適用されるカタログルールが適用されないことです。

私はセッションを設定するために私が知っているすべてのことをしています。これらのルールが適用されるものはないようです。

テストスクリプトは次のとおりです。

require_once "app/Mage.php";
umask(0);
$app = Mage::app("default");

$app->getTranslator()->init('frontend');  //Probably not needed
Mage::getSingleton('core/session', array('name'=>'frontend'));
$session = Mage::getSingleton("customer/session");
$session->start();  //Probably not needed
$session->loginById(122);

$product = Mage::getModel('catalog/product')->load(1429);
echo $product->getFinalPrice();

任意の洞察をいただければ幸いです。

4

1 に答える 1

14

コマンド ライン スクリプトを実行するとイベント のみが発生するように見えるため、フックしようとしているイベントは<frontend />またはイベントであると最初に推測します。<admin /><global />

Magento には、「領域」と呼ばれるこの概念があります。エリアは、システム内に存在する個々のアプリケーションのようなものです (しかし、完全ではありません。概念についてはまだ少し曖昧です)。オブザーバーで config.xml をセットアップするときは、それらを<global />タグに配置します。 、<frontend />タグ、または<admin />タグ。

イベントに関しては、Magento は特定のリクエストに対して処理する必要がある領域のみをロードします。そのため、<global />エリアは常にロードされます。ただし、<frontend />または<admin />領域は、アプリケーションがコントローラーのディスパッチに到達した場合にのみロードされます。具体的には、次のファイル/行で

File: app/code/core/Mage/Core/Controller/Varien/Action.php
Mage::app()->loadArea($this->getLayout()->getArea());

これは、コマンド ライン アプリケーションでは決して起こりません。領域のみ<global />がロードされます。

したがって、最初の段落で述べたように、Magento<frontend /> がアプリケーションの領域をロードしないため、オブザーバーが起動していないと推測されます。解決策として、オブザーバーをその<global />エリアに移動してみてください。手動で呼び出すこともできます

Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND);

ただし、その領域のすべてのオブザーバーをロードすることになり<frontend />、その多くはおそらく Web ブラウザーのコンテキストを想定して作成されています。

それでも解決しない場合は、クラスのdispatchEventメソッドを見てください。Mage_Core_Model_Appそこで、イベント オブザーバーが呼び出されます。

于 2010-05-13T02:20:09.177 に答える