发送发票时获取订单地址

时间:2013-02-12 18:05:55

标签: php magento

我正在覆盖Mage_Core_Model_Email_Template - 类send() - 方法,以便在发送电子邮件的同时向客户发送短信。 我不确定该怎么做才能将客户信息与订单联系起来。通常所有信息都作为变量插入到电子邮件模板中,但我需要从上面提到的类中使用PHP访问它。它必须是订单对象中的客户信息,如姓名,电话等,因为订单可以放置而无需在网上商店注册(也可以获得特定订单的正确信息)。

任何帮助都会受到高度赞赏,我不知道如何从这个类中获得orderId。还希望能够在管理视图中列出这些客户特定的字段名称,以选择电话字段作为SMS收件人的来源,因此,如果有办法输出与订单相关的所有客户特定字段名称也很棒。

提前致谢! :)

3 个答案:

答案 0 :(得分:1)

Magento有一个事件驱动的体系结构,所以在这样的问题中,创建一个Observer来捕获一个事件要好得多。 How to create observers您的案例中的此事件是“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方法。

答案 1 :(得分: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());
            }

        }

    }

答案 2 :(得分: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方法,然后您可以通过方法{{1}访问所需的数据您可以在我之前的回答中找到订单对象中的地址和客户信息。