我正在尝试让一个简单的事件观察者工作,但我不知道在这种情况下是否可能。最终,我想在Shipworks推动订单更新时发起一个事件。我认为因为Shipworks完全在他们的shipworks3.php
脚本中完成,并且没有调用Mage::run()
来初始化整个商店(它使用Mage::app('')
,观察者没有附加到事件..在这一点上,至少那是我的理论。但是,我似乎无法让它发挥作用。
下面是一些示例代码,我将它们放在一起进行测试。如果您对此有任何想法,请告诉我。
首先,我创建了一个带有观察者和前端控制器的简单模块,用于测试目的:
<config>
<modules>
<VPS_Test>
<version>0.1.0</version>
</VPS_Test>
</modules>
<global>
<models>
<vps_test>
<class>VPS_Test_Model</class>
</vps_test>
</models>
</global>
<events>
<test_event_one>
<observers>
<test_event_one>
<type>singleton</type>
<class>VPS_Test_Model_Observer</class>
<method>foo_test_global</method>
</test_event_one>
</observers>
</test_event_one>
</events>
<frontend>
<events>
<test_event_one>
<observers>
<test_event_one>
<type>singleton</type>
<class>VPS_Test_Model_Observer</class>
<method>foo_test_front</method>
</test_event_one>
</observers>
</test_event_one>
</events>
<routers>
<vps_test>
<use>standard</use>
<args>
<module>VPS_Test</module>
<frontName>vpstest</frontName>
</args>
</vps_test>
</routers>
</frontend>
</config>
class VPS_Test_Model_Observer extends Mage_Core_Model_Abstract
{
public function foo_test_front(Varien_Event_Observer $observer)
{
echo "foo_test event caught in observer FRONT";
}
public function foo_test_global(Varien_Event_Observer $observer)
{
echo "foo_test event caught in observer GLOBAL";
}
}
<config>
<modules>
<VPS_Test>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Core />
</depends>
</VPS_Test>
</modules>
</config>
接下来,为了对此进行测试,我在浏览器中加载了http://my_domain/vpstest
并看到了预期的输出(即,它调度了事件并且我的观察者捕获了它)
然后我在我的网站的根目录中创建了eventtest.php
,然后从我的浏览器中点击它。在这种情况下,Magento确实发射了这个事件,但是我的观察者没有抓住它。
require 'app/Mage.php';
error_reporting(E_ALL | E_STRICT);
ini_set('html_errors', 1);
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
try {
Mage::app('');
echo "event test<br/>";
$foo = Mage::getModel('vps_test/observer');
echo get_class($foo) . '<br />';
Mage::dispatchEvent('test_event_one', array('object' => ''));
}
catch(Exception $e)
{
echo "exception<br/>$e";
}
所以....我不做什么?是否可以在没有运行完整的Magento应用程序的情况下使用Magento事件系统?
谢谢!
答案 0 :(得分:3)
<events>...</events>
块在之外的<global>...</global>
块。哎呀...解决这个问题。
重要的是要注意,在这种情况下,全局 区域是默认加载的唯一区域。因此,当您刚刚运行Mage::app('')
时,要将我的事件观察者附加到某个事件,您需要将其放在<global>...</global>
部分中。相反,我相信WebFlakeStudio的答案应该有效,尽管我还没有测试过。
希望这有助于某人。
答案 1 :(得分:0)
我认为您需要包含以下行才能使其正常工作:
Mage::getConfig()->loadEventObservers($scope);
Mage::app()->addEventArea($scope);
$scope
值可以是frontend
或adminhtml
。
答案 2 :(得分:0)
你不需要这个:
<depends>
<Mage_Core />
</depends>
在模块配置中。