【问题标题】:Checkout Observer Modification 1.7+结帐观察者修改 1.7+
【发布时间】:2013-10-15 10:38:18
【问题描述】:

这是关于我再次修补以查看此修改是否有效:

我修改了 Mage/Checkout/Model/Observer.php:

public function salesQuoteSaveAfter($observer)
{
    $quote = $observer->getEvent()->getQuote();
    Start of added code --- > $post = Mage::app()->getRequest()->getPost();//Mage::app()->getRequest()->getPost();
    if(isset($post['shipping']['email'])){
        if(isset($_SESSION['emailadd'])){
            unset($_SESSION['emailadd']);
            $_SESSION['emailadd'] = 'test2@mail.com';//$post['shipping']['email'];
        }else{
            $_SESSION['emailadd'] = 'test@mail.com';//$post['shipping']['email'];
        }
    }else{
        if(isset($_SESSION['emailadd'])){
            unset($_SESSION['emailadd']);
            $_SESSION['emailadd'] = 'test3@mail.com';//$post['shipping']['email'];
        }else{
            $_SESSION['emailadd'] = 'test4@mail.com';//$post['shipping']['email'];
        }
    }   <--End of added code;
    /* @var $quote Mage_Sales_Model_Quote */
    if ($quote->getIsCheckoutCart()) {
        Mage::getSingleton('checkout/session')->getQuoteId($quote->getId());
    }
}

问题是这段代码:没有返回任何设置会话['emailadd'] = test4@mail.com

$post = Mage::app()->getRequest()->getPost();

如果我的代码使用了错误的方法,如何添加一个 salesQuoteSaveBefore() 方法,该方法在发送数据库中的数据之前调用?在这样做之前是否需要配置 XML?

因为首先我的目标只是从 onepage/checkout 输入中获取输入数据或发布数据,特别是 shipping[email] 输入,不要告诉我没有,因为有:

<li>
            <div class="input-box">
                <label for="shipping:emailadd"><?php echo $this->__('Email Address') ?> <span class="required">*</span></label><br />
                <input type="text" name="shipping['email']" id="shipping:emailadd" value="<?php echo $this->htmlEscape($this->getAddress()->getEmail()) ?>" title="<?php echo $this->__('Email Address') ?>" class="validate-email required-entry input-text" />
            </div>
            <div class="input-box">
                <label for="shipping:emailadd"><?php echo $this->__('Confirm Email') ?> <span class="required">*</span></label><br />
                <input type="text" name="shipping[emailconfirm]" id="shipping:emailconfirm" value="<?php echo $this->htmlEscape($this->getAddress()->getEmail()) ?>" title="<?php echo $this->__('Email Address') ?>" class="validate-email required-entry input-text" />
            </div>
        </li>

我想要得到的只是这个单一的 shipping[email] 输入,它有点儿问题,因为我已经坚持了这么久。但是在提交 onepage/checkout 后我找不到获得它的价值的方法。

任何帮助将不胜感激。

【问题讨论】:

    标签: magento magento-1.7


    【解决方案1】:

    首先,您正在编辑核心文件。这是不受欢迎的。 您可以轻松地从控制器获得运输电子邮件。使用事件吸收器比重写文件好。但这很难在写作上进行比较。

    只需覆盖 core->Mage->checkout->controllers 处的 OnepageController.php。

    这里是代码,

    include_once("Mage/Checkout/controllers/OnepageController.php");  
    
    
        class Pakagename_Modulename_OnepageController extends Mage_Checkout_OnepageController
    {
    public function saveBillingAction()
        {
            if ($this->_expireAjax()) {
                return;
            }
            if ($this->getRequest()->isPost()) {
    //            $postData = $this->getRequest()->getPost('billing', array());
    //            $data = $this->_filterPostData($postData);
                $data = $this->getRequest()->getPost('billing', array());
                $customerAddressId = $this->getRequest()->getPost('billing_address_id', false);
    
                if (isset($data['email'])) {
                    $data['email'] = trim($data['email']);
                }
    

    这里的问题是客户可能使用不同的电子邮件进行运输和计费。因此,您需要检查运输和账单保存操作。

    添加到会话

    $email = $data['email'];
    Mage::getSingleton('core/session')->setMyValue($email); 
    

    那么在这里我假设您正在尝试编辑订单电子邮件模板。 1) 编辑 sendNewOrderEmail() 函数位于

    app/code/core/Mage/Sales/Model/Order.php

    $my_email = Mage::getSingleton('core/session')->getMyValue();
     $mailer->setTemplateParams(array(
              'order'        =>  $this,
              'billing'      =>  $this->getBillingAddress(),
              'payment_html' => $paymentBlockHtml,
              'my_email'  => "$my_email" //New custom value
           ));
    

    那么以后你可以像这样获取那封电子邮件

    {{ var my_email }}
    

    如果您想编辑发票模板,那么您应该找到相应的函数来定义自定义电子邮件变量。就是这样……!

    【讨论】:

    • 抱歉忘了说明,我是在app/code/local下添加的。这就是 billingAction 的代码,是的。这使我能够在 order_*.html 模板下检索为 var order.getBillingAddress().getEmail() ,如果我在 $data = $this-&gt;getRequest()-&gt;getPost('shipping', array());if (isset($data['email'])) { $data['emailadd'] = trim($data['email']); } 的运输中做同样的事情,那么我应该能够访问用于运输的电子邮件变量 .getEmailadd()对?还是错了?。
    • 只是一个后续问题,如何在电子邮件订单模板中使用 $data['email'] 进行运输?我的意思是,在计费中,我可以使用{{var order.getBillingAddress().getEmail()}}{{var order.getCustomerEmail()}} 在计费数组中显示客户电子邮件,在装运时怎么样,你说我收到了装运电子邮件,但我如何在电子邮件订单模板中使用它?因为我无法在其中进行会话,并且每当我尝试时,当我执行结帐订单时,它会将我重定向回购物车页面。
    • 德里克..我完全糊涂了。其实你的意思是什么..?你想做什么..?我发布的上面的代码将获得客户在结帐时输入的电子邮件地址..就是这样..!请解释你想做什么..那么只有我可以帮助你..!
    • 我首先要做的是:获取已完成的运输[电子邮件]。最后一件事是将其用作例如 order_new_guest.html 订单电子邮件模板的一部分,仅此而已。我想使用我得到的值,以便管理员可以同时收到帐单和发货电子邮件,而不仅仅是帐单电子邮件。
    • 所以,您想在结账时获取送货和账单电子邮件(如果两者不同)地址,并在您的电子邮件模板中使用它吧..?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多