magento sales_order_place_after наблюдатель - PullRequest
14 голосов
/ 01 июля 2010

Я пытаюсь написать наблюдателя, который будет экспортировать данные заказа при его размещении. Я не писал никаких модулей раньше. Основываясь на моей реализации на этой статье: http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method

Пока что я просто пытаюсь вызвать какой-то фиктивный код для записи в файл. В моем журнале ничего не отображается, и файл не изменяется. У пользователя apache есть разрешение на каталог. Я отключил кеширование конфигурации в настройках Magento. Я немного запутался в некоторых соглашениях об именах; Я просто пытался следовать примеру. Кто-нибудь знает, где я иду не так?

в magento / app / etc / modules / Feed.xml:

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

в magento / app / code / local / Feed / Sales / etc / config.xml:

<?xml version="1.0"?>
<config>
    <global>
        <models>
            <feedsales>
                <class>Feed_Sales_Model</class>
            </feedsales>
        </models>
        <events>
            <sales_order_place_after>
                <observers>
                    <feed_sales_order_observer>
                        <type>singleton</type>
                        <class>sales/order_observer</class><!-- I've also tried Feed_Sales_Model_Order_Observer here -->
                        <method>export_new_order</method>
                    </feed_sales_order_observer>
                </observers>
            </sales_order_place_after>
        </events>
    </global>
</config>

в magento / app / code / local / Feed / Sales / Model / Order / Observer.php:

<?php
class Feed_Sales_Model_Order_Observer
{
    public function __contruct()
    {

    }

    /**
     * Exports new orders to an xml file
     * @param Varien_Event_Observer $observer
     * @return Feed_Sales_Model_Order_Observer
     */
    public function export_new_order($observer)
    {
        Mage::log("reached export_new_order");
        try
        {
            $dumpFile = fopen('/home/jorelli/new_orders/testdump', 'w+');
            fwrite($dumpFile, 'this is a test!');
        }
        catch (Exception $e)
        {
            Mage::log("order export failed.\n");
        }
        return $this;
    }
}
?>  

Magento 1.4 на Debian Lenny с Apache2, если это важно по какой-либо причине.

Ответы [ 3 ]

14 голосов
/ 01 июля 2010

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

Глядя на примеры выше, у вас есть несколько не совсем правильных вещей.

Во-первых, ваш файл в папке etc назван неверно

magento/app/etc/modules/Feed.xml

Этот файл требуетбыть названным Packagename_Modulename, так что вы, вероятно, хотите

magento/app/etc/modules/Feed_Sales.xml

Посмотрите на Система -> Конфигурация -> Дополнительно, чтобы увидеть, появляется ли ваш модуль.Если это так, вы правильно назвали этот файл.Без этого созданный вами модуль не будет загружен в систему, и у вашего кода никогда не будет шансов на выполнение.

Далее вы неправильно указываете класс.Вы говорите

sales/order_observer

, но первая часть URI (продажи) неверна.Вы определили раздел моделей как

    <models>
        <feedsales> <!-- this is your model part -->
            <class>Feed_Sales_Model</class>
        </feedsales>
    </models>

, что означает, что вы хотите

feedsales/order_observer

Извлечь вкладку Class / URI в сообщении Commerce Bug и попытаться ввести некоторые URI (например,sales/order), чтобы лучше понять, что здесь происходит.

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

Наконец, и я понимаю, что вы копировали примеры, рассмотрите возможность размещения своихмодуль в папке с именем, отличным от Sales.Я считаю, что имитация имен основных папок Magento только добавляет дополнительный слой путаницы, а это не то, что вам нужно, пока вы изучаете систему.

3 голосов
/ 01 июля 2010

Кажется, проблема в заявлении вашего наблюдателя.Попробуйте:

    <events>
        <sales_order_place_after>
            <observers>
                <feed_sales_order_observer>
                    <type>singleton</type>
                    <class>feedsales/order_observer</class>
                    <method>export_new_order</method>
                </feed_sales_order_observer>
            </observers>
        </sales_order_place_after>
    </events>
0 голосов
/ 01 июля 2010

Святое дерьмо.Я был глуп.Я протестировал его с помощью сценария командной строки, как и многие другие, но этот конкретный файл был доступен для записи только интерпретатору командной строки, а не интерпретатору Apache.Я должен был покинуть офис ранее прошлой ночью.

Хорошо для записи, это то, как вы запускаете действие по размещению заказа.Я оставлю это для потомков.

...