Magento запускает наблюдателя с пользовательским статусом заказа

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

Практическая ситуация: люди выбирают: «Платеж получен», срабатывает //DO STUFF в Observer.

Это не работает, так что здесь не так? (статус отображается правильно) :-(

config.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MOD_PaidStatus>
            <version>1.0.0</version>
        </MOD_PaidStatus>
    </modules>
    <global>
        <sales>
            <order>
                <statuses>
                    <payment_received translate="label"><label>Payment Received</label></payment_received>
                </statuses>
                <states>
                    <processing translate="label">
                        <label>Processing</label>
                        <statuses>
                            <processing default="1"/>
                            <payment_received default="2" />
                        </statuses>
                        <visible_on_front/>
                    </processing>
                    <pending translate="label">
                        <label>Pending</label>
                        <statuses>
                            <pending default="1"/>
                            <payment_received default="2" />
                        </statuses>
                        <visible_on_front/>
                    </pending>
                </states>                  
            </order>            
        </sales> 
        <events>
                <sales_order_resource_save_attribute_after>
                        <observers>
                                <PaidStatus>                                        
                                        <class>MOD_PaidStatus/observer</class>         
                                        <method>observeAttributeChange</method>
                                        <type>singleton</type>
                                </PaidStatus>
                        </observers>
                </sales_order_resource_save_attribute_after>
        </events>
    </global>
</config>

И мой Observer.php выглядит так:

class MOD_PaidStatus_Model_Observer {

public function observeAttributeChange($observer){
    $attribute = $observer->getEvent()->getAttribute();
    if  ($attribute->getAttributeCode() == 'status') {
        mail('[email protected]', 'testcase', 'foo bar?');
    }
}

}


person Bob van Luijt    schedule 05.02.2013    source источник


Ответы (2)


Для возможности выполнения каких-либо действий по изменению атрибута заказа «статус» желательно наблюдать за событием. В этом случае событие будет sales_order_resource_save_attribute_after. Функцию наблюдателя можно настроить следующим образом:

class YourPackage_YourModule_Model_Observer {

public function observeAttributeChange($observer) 
{

    $attribute = $observer->getEvent()->getAttribute();

    if  ($attribute->getAttributeCode() == 'status') {
    // DO STUFF
    }
}

В вашем config.xml введите необходимую конфигурацию наблюдателя

<global>
        <events>
                <sales_order_resource_save_attribute_after>
                        <observers>
                                <your_observer_node_name>                                        
                                        <class>yourpackage_yourmodule/observer</class>         
                                        <method>observeAttributeChange</method>
                                        <type>singleton</type>
                                </your_observer_node_name>
                        </observers>
                </sales_order_resource_save_attribute_after>
        </events>
</global>
person Oleg Ishenko    schedule 05.02.2013
comment
спасибо, я обновил код в вопросе, но не уверен, что понял. Я до сих пор не получаю письмо по адресу: [email protected] - person Bob van Luijt; 05.02.2013
comment
Можете ли вы проверить, вызывается ли функция observeAttributeChange($observer)? (используя отладчик или вставляя вызов журнала). Если да, то атрибут attributeCode равен «статусу»? - person Oleg Ishenko; 06.02.2013

Вы можете сделать это с помощью перезаписи или наблюдателя.

Вы делаете своего рода смесь этих двух концепций.

Чтобы использовать перезапись, не называйте файл Observer, используйте что-то вроде Order.php :

class MOD_PaidStatus_Model_**Order** extends Mage_Sales_Model_Order

и в вашем config.xml в глобальном узле добавьте это:

<models>
    <sales>
         <rewrite>
             <order>MOD_PaidStatus_Model_Order</order>
         </rewrite>
    </sales>
</models>

Если вы хотите пройти через Observer, используйте имя Observer.php, а имя класса должно быть:

MOD_PaidStatus_Model_Observer

и он не должен ничего расширять.

Функция больше похожа

public function myEventHandling($event)
{
    $order = $event->getOrder();
    $status = $order->getStatus();
    //DO YOUR STUFF here
}

Но вы должны прослушивать событие order_status_changed_after, которого не существует, поэтому вы также добавляете его, чтобы вызвать его... Очень большой материал, если вы не подтвержденный разработчик.

Если вы хотите что-то подобное, вам нужен узел события в вашем файле config.xml, чтобы связать ваш Observer и его метод с событием. Поищите информацию об обработке событий в Magento.

С уважением,

Edit.: для наблюдателя и способа события смотрите предыдущий пост. Но обработка такого общего события требует очень много ресурсов.

person dagfr    schedule 05.02.2013
comment
спасибо за ответ, я обновил сообщение, но я все еще не получаю электронное письмо, и я не вижу, что здесь не так :-S - person Bob van Luijt; 05.02.2013