0

我重写了Mage_Core_Model_Email_Template-classsend()方法,以便在发送电子邮件的同时向客户发送 SMS。我不知道该怎么做是将客户信息与订单相关联。通常所有信息都作为变量插入到电子邮件模板中,但我需要在 PHP 中从提到的类中访问它。它需要是订单对象中的客户信息,例如姓名、电话等,因为可能无需在网上商店注册即可下订单(也可以获取特定订单的正确电话号码)。

任何帮助将不胜感激,我什至不知道如何从此类中获取 orderId。还希望能够在管理员视图中列出这些客户特定字段名称,以选择电话字段作为 SMS 收件人的来源,因此如果有一种方法可以输出与订单相关的所有客户特定字段名称,也很棒。

提前致谢!:)

4

3 回答 3

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 类发送短信,无需重写send方法。

于 2013-02-12T20:47:06.817 回答
1

如果您要覆盖该send函数,您可以使用它的参数$variables,一个数组,其中包含一个order对象($variables['order'])等数据。这适用于订单电子邮件、发票、装运和 creditmemo 电子邮件。

这使我的“注册订单”的建议变得多余。


首先想到的是捕获下订单时调度的事件,并将订单对象从事件保存到 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

我仍然说事件捕获是实用的方法,但我尊重你的观点。所以在另一种方式中,sendMail方法Mage_Sales_Model_Order_Invice包含“订单”对象作为模板参数:

       $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 回答