Использование событий Magento с Mage :: app ('') - PullRequest
1 голос
/ 06 октября 2011

Я пытаюсь заставить простого наблюдателя событий работать, но я не знаю, возможно ли это даже в этих обстоятельствах.В конечном счете, я хотел бы вызвать событие, когда 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";
    }
}

Модуль Config 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 ]

3 голосов
/ 06 октября 2011

Опечатки получат вас каждый раз. В моем config.xml у меня был <events>...</events> блок вне блока <global>...</global>. Упс ... Исправление, которое решило мою проблему.

Важно отметить, что в этом случае global area является единственной областью, загружаемой по умолчанию. Поэтому, чтобы присоединить мой наблюдатель к событию, когда вы просто запускаете Mage::app(''), вам нужно поместить его в раздел <global>...</global>. И наоборот, я считаю, что ответ WebFlakeStudio должен работать, хотя я его не проверял.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 06 октября 2011

Вам не нужно это:

<depends>
            <Mage_Core />
</depends>

в конфигурации вашего модуля.

0 голосов
/ 06 октября 2011

Я думаю, вам нужно включить следующие строки, чтобы это работало:

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

Где $scope значение может быть frontend или adminhtml.

...