Пользовательский наблюдатель не срабатывает - PullRequest
3 голосов
/ 10 января 2012

Я пытаюсь написать наблюдателя для magento, который будет активирован, когда заказ будет помечен как отгруженный и ему будет присвоен номер для отслеживания.

Когда я захожу через администратора и размещаю заказ, выставляю счет-фактуру, а затем отправляюсь, чтобы доставить нужную мне функцию, которая на самом деле никогда не вызывается, и я не понимаю, почему.

Я просмотрел несколько страниц на веб-сайте magento, чтобы увидеть, что я могу делать неправильно, но я просто не могу понять (http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method & http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-2-the-magento-config).

Обратите внимание, что я вижу модуль в области расширенного администрирования, и он включен.

Если кто-нибудь сможет просмотреть код, который я прикрепил, и сообщить мне, где моя проблема, это было бы очень полезно.

Вот мой класс Observer, который находится в app / code / local / WR / TrackingEmail / Model / Observer.php

class WR_TrackingEmail_Model_Observer
{
    public function sendTrackEmail($observer)
    {
        $track = $observer->getEvent()->getTrack();
        $shipment = $track->getShipment(true);
        $shipment->sendEmail();
    }
}

Вот мой config.xml для модуля

<config>
    <global>
        <modules>
            <wr_trackingemail>
                <version>0.1.1</version>
            </wr_trackingemail>
        </modules>
        <events>
            <sales_order_shipment_track_save_after>
                <observers>
                    <Wr_trackingemail_model_observer>
                        <type>singleton</type>
                        <class>WR_TrackingEmail_Model_Observer</class>
                        <method>sendTrackEmail</method>
                    </Wr_trackingemail_model_observer>
                </observers>
            </sales_order_shipment_track_save_after>
        </events>
    </global>
</config>

Вот мое приложение / etc / modules / WR_TrackingEmail.xml

<config>
    <modules>
        <WR_TrackingEmail>
            <active>true</active>
            <codePool>local</codePool>
        </WR_TrackingEmail>
    </modules>
</config>

Ответы [ 2 ]

11 голосов
/ 10 января 2012

Ваше утверждение "Пользовательский наблюдатель не вызван" оставляет много места для интерпретации.Вот что вы хотите проверить.

Кажется, ваш наблюдатель настроен правильно (хотя тег модулей находится вне глобального тега, но в данном случае это не имеет значения).Вы можете проверить свою настройку, выполнив следующий код самостоятельно из пустого действия контроллера (или другого загрузчика, загруженного события, сценария Magento)

Mage::dispatchEvent('sales_order_shipment_track_save_after');

, а затем заменив sendTrackEmail на

* 1008.*

Если выполнение остановится с текстом

WR_TrackingEmail_Model_Observer::sendTrackEmail

, вы будете знать, что ваше событие настроено правильно.

Если ваше событие настроено правильно, следующий шаг - убедиться, что событие действительно запускается при выполнении указанных выше действий.Вы можете зарегистрировать эти события в app/Mage.php, добавив этот временный код регистрации

public static function dispatchEvent($name, array $data = array())
{
    //brain dead logging
    file_put_contents('/tmp/events.log',"$name\n",FILE_APPEND);
    Varien_Profiler::start('DISPATCH EVENT:'.$name);
    $result = self::app()->dispatchEvent($name, $data);
    #$result = self::registry('events')->dispatch($name, $data);
    Varien_Profiler::stop('DISPATCH EVENT:'.$name);
    return $result;
}

Кроме того, есть хороший шанс, что выход из вашего выхода выше все равно приведет к остановке выполнения, если ваше событие запускается.

Если вы определили, что ваш наблюдатель настроен правильно, и ваше событие запускается, то проблема не в том, что событие инициируется, а в том, что ваш код наблюдателя не выполняет то, что, по вашему мнению, делает.Повторно добавьте свой код, но оставьте свой выход на месте

class WR_TrackingEmail_Model_Observer
{
    public function sendTrackEmail($observer)
    {
        $track = $observer->getEvent()->getTrack();
        $shipment = $track->getShipment(true);
        $shipment->sendEmail();
        exit(__METHOD__);
    }
}

Это позволит вам снова и снова загружать браузер для проверки кода наблюдателя.Удачи!

1 голос
/ 10 января 2012

Вы зарегистрировали свой модуль под app/etc/modules/ в файле .xml?

<?xml version="1.0"?>
<config>
    <modules>
        <Wr_Trackingemail>
            <active>true</active>
            <codePool>local</codePool>
        </Wr_Trackingemail>
    </modules>
</config>
...