0

メールの送信と同時に顧客に SMS を送信するために、 Mage_Core_Model_Email_Template-class -メソッドをオーバーライドしています。send()よくわからないのは、顧客情報を注文に関連付けることです。通常、すべての情報は電子メール テンプレートに変数として挿入されますが、上記のクラスから PHP でアクセスする必要があります。また、注文は Web ショップに登録せずに行うことができるため (特定の注文の正しい電話番号を取得するためにも)、注文オブジェクトからの名前、電話番号などの顧客情報である必要があります。

このクラス内から orderId を取得する方法さえわかりません。また、SMS 受信者のソースとして電話フィールドを選択するために、これらの顧客固有のフィールド名を管理者ビューに一覧表示できるようにしたいので、注文に関連するすべての顧客固有のフィールド名を出力する方法があればも素晴らしいです。

前もって感謝します!:)

4

3 に答える 3

1

イベント キャプチャが実用的な方法であると今でも言いますが、私はあなたの意見を尊重します。逆に、 のsendMailメソッドにMage_Sales_Model_Order_Inviceはテンプレート パラメータとして「order」オブジェクトが含まれます。

       $mailer->setTemplateParams(array(
            'order'        => $order,
            'invoice'      => $this,
            'comment'      => $comment,
            'billing'      => $order->getBillingAddress(),
            'payment_html' => $paymentBlockHtml
        )
    );

mailerオブジェクトはクラスのインスタンスです。このクラスMage_Core_Model_Email_Template_Mailerのメソッドを上書きすることをお勧めします。sendその後、メソッドを介して必要なデータにアクセス$this->getTemplateParams()し、注文オブジェクトから住所と顧客情報にアクセスできます。以前の回答で確認できます。

于 2013-02-13T09:19:38.867 に答える
1

関数をオーバーライドしている場合はsend、そのパラメータ$variablesである配列を使用できます。この配列には、他のデータとともにorderオブジェクト ( $variables['order']) が含まれています。これは、注文の電子メール、請求書、出荷、およびクレジットメモの電子メールに当てはまります。

これにより、「注文を登録する」という私の提案は冗長になります。


最初に頭に浮かぶのは、注文が行われたときにディスパッチされるイベントをキャプチャし、イベントから注文オブジェクトを Magento レジストリに保存することです。次に、オーバーライドされた関数からそのレジストリ エントリを取得できますsend。これは、キュー プロセッサから SMS がディスパッチされるときのように、注文を送信するリクエスト中に SMS が送信され、その後ではないと仮定すると機能するはずです。

したがって、このアイデアは次のように実装できます。

オブザーバーを登録する

<config>
    <!-- -->
    <global>
        <!-- -->
        <events>
            <sales_order_place_after>
                <observers>
                    <yournodename>
                        <class>YourPackage_YourModule_Model_Observer</class>
                        <method>registerOrder</method>
                    </yournodename>
                </observers>
            </sales_order_place_after>
        </events>
        <!-- -->
    </global>
    <!-- -->
</config>

オブザーバーを実装する

class YourPackage_YourModule_Model_Observer 
{
    public function registerOrder(Varien_Event_Observer $observer)
    {
        $order = $observer->getEvent()->getOrder();
        Mage::register('currentOrder', $order);
    }
}

レジストリ エントリにアクセスします。

public function send()
    {
        $order = Mage::registry('currentOrder');
        if ($order instanceof Mage_Sales_Model_Order) {
            $address = $order->getBillingAddress();
            if (!$order->getCustomerId()) {
                //guest order
            } else  {
                $customer = Mage::getModel('customer/customer')
                    ->load($order->getCustomerId());
            }

        }

    }
于 2013-02-12T20:50:50.860 に答える
1

Magento はイベント駆動型のアーキテクチャを備えているため、このような問題では、オブザーバーを作成してイベントをキャッチする方がはるかに優れています。オブザーバーの作成方法このイベントは「sales_order_invoice_register」です。これには、モジュールの設定が必要です。app/code/local/Stack/Test/etc/config.xml:

        <events>
        <sales_order_invoice_register>
            <observers>
                <stacktest>
                    <type>singleton</type>
                    <class>stacktest/observer</class>
                    <method>sendSMS</method>
                </stacktest>
            </observers>
        </sales_order_invoice_register>
    </events>

そして、あなたのオブザーバーは次のapp/code/local/Stack/Test/Model/Observer.phpとおりです。

class Stack_Test_Model_Observer extends Mage_Core_Model_Observer
{
public function sendSMS($observer)
{
    #get the customer
    $order = $observer->getEvent()->getOrder();

    Mage::log($order->getBillingAddress());
    Mage::log($order->getShippingAddress())
    Mage::log($order->getCustomerEmail());
    Mage::log($order->getCustomerFirstname());
    Mage::log($order->getCustomerLastname());
    ...

このようにすべてのデータを取得し、Observer クラスから直接 SMS を送信できますsend。メソッドをオーバーライドする必要はありません。

于 2013-02-12T20:47:06.817 に答える