使用Mage :: app('')的Magento事件

时间:2011-10-05 20:47:28

标签: php events magento magento-1.5

我正在尝试让一个简单的事件观察者工作,但我不知道在这种情况下是否可能。最终,我想在Shipworks推动订单更新时发起一个事件。我认为因为Shipworks完全在他们的shipworks3.php脚本中完成,并且没有调用Mage::run()来初始化整个商店(它使用Mage::app(''),观察者没有附加到事件..在这一点上,至少那是我的理论。但是,我似乎无法让它发挥作用。

下面是一些示例代码,我将它们放在一起进行测试。如果您对此有任何想法,请告诉我。

实施例

首先,我创建了一个带有观察者和前端控制器的简单模块,用于测试目的:

config.xml中

<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>

Observer.php

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";
    }
}

模块配置XML

<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确实发射了这个事件,但是我的观察者没有抓住它。

eventtest.php

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事件系统?

谢谢!

3 个答案:

答案 0 :(得分:3)

每次都会错过Typos。在我的config.xml中,我有<events>...</events>之外的<global>...</global>块。哎呀...解决这个问题。

重要的是要注意,在这种情况下,全局 区域是默认加载的唯一区域。因此,当您刚刚运行Mage::app('')时,要将我的事件观察者附加到某个事件,您需要将其放在<global>...</global>部分中。相反,我相信WebFlakeStudio的答案应该有效,尽管我还没有测试过。

希望这有助于某人。

答案 1 :(得分:0)

我认为您需要包含以下行才能使其正常工作:

Mage::getConfig()->loadEventObservers($scope);
Mage::app()->addEventArea($scope);

$scope值可以是frontendadminhtml

答案 2 :(得分:0)

你不需要这个:

<depends>
            <Mage_Core />
</depends>

在模块配置中。