Magento sales_order_place_after observer

Я пытаюсь написать наблюдателя, который будет экспортировать данные заказа при размещении заказа. Я еще не писал никаких модулей. Основываясь на моей реализации в этой статье: 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, если это имеет значение по любой причине.

Ответ 1

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

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

Ответ 2

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

Взглянув на образцы выше, у вас есть несколько вещей, которые не совсем правильны.

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

magento/app/etc/modules/Feed.xml

Этот файл должен быть назван Packagename_Modulename, поэтому вы, вероятно, захотите

magento/app/etc/modules/Feed_Sales.xml

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

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

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

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

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