0

Magento モジュールを作成していますが、カスタムの orderstatus が選択されたときに Observer がトリガーされるようにします。

実際の状況: 人々が選択://DO STUFFオブザーバーの「Payment Received」がトリガーされます。

これは機能していません。では、何が問題なのですか? (ただし、ステータスは正しく表示されます) :-(

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('test@testcase.com', 'testcase', 'foo bar?');
    }
}

}

4

2 に答える 2

1

注文の属性「ステータス」の変更時にいくつかのアクションを実行できるようにするには、イベントを観察することが望ましいです。この場合、イベントは になります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>
于 2013-02-05T13:32:06.613 に答える
0

これは、書き換えまたはオブザーバーで行うことができます。

これらの 2 つの概念の一種のミックスを行います。

書き換えを使用するには、ファイルに 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.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 ファイルにイベント ノードが必要です。Magento でのイベント処理について検索する

よろしく、

編集: オブザーバーとイベントの方法については、前の投稿を参照してください。しかし、このような一般的なイベントの処理は、非常にリソースを消費する方法です。

于 2013-02-05T13:34:38.323 に答える