Opencart VQMod向订单确认邮件添加额外数据


Opencart VQMod add extra data to order confirmation mail

我使用的是OC 1.5.5.1版本

问题是,我想通过VQMod在订单的确认电子邮件中添加一些额外的信息。我有这个脚本(整个VQMod文件的一部分):

<file name="/catalog/view/theme/kadobos/template/checkout/checkout.tpl">
    <operation>
        <search position="after">
            <![CDATA[<script type="text/javascript"><!--]]>
        </search>
        <add>
            <![CDATA[
            // ORDER INFO CODE!!!
            $('#button-confirm').live('click', function() {
                waardes = [];
                $('input[class=order_info_radio]:checked').each(function(index) {
                    waardes[$(this).attr("name").replace("order_info_answer_", "")] = $(this).attr("value");
                });
                $('input[class=order_info_input]').each(function(index) {
                    waardes[$(this).attr("name").replace("order_info_answer_", "")] = $(this).attr("value");
                });
                $('textarea[class=order_info_textarea]').each(function(index) {
                    waardes[$(this).attr("name").replace("order_info_answer_", "")] = $(this).attr("value");
                });
                $.ajax({
                    type: "POST",
                    data: {waardes:waardes},
                    url: "index.php?route=module/order_info",
                    success: function(msg){
                        // console.log(msg);
                    }
                });
            });
            // END OF ORDER INFO CODE!!!
            ]]>
        </add>
    </operation>
</file>
    <!-- Factuur die wordt verstuurd -->
    <file name="/catalog/model/checkout/order.php">
        <operation>
            <search position="before">
                <![CDATA[if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/mail/order.tpl')) {]]>
            </search>
            <add>
                <![CDATA[
                // ORDER INFO CODE!!!
                $this -> load -> model('module/order_info');
                global $log;
                $template -> data['order_info_waardes'] = $this -> model_module_order_info -> getAnswers($order_id);
                $log->write(print_r($template -> data['order_info_waardes'], true));
                $log->write("Order ID: " . $order_id);
                // END OF ORDER INFO CODE!!!
                ]]>
            </add>
        </operation>
    </file>
    <file name="/catalog/view/theme/kadobos/template/mail/order.tpl">
        <operation>
            <search position="replace">
                <![CDATA[<span id="order_info_holder"></span>]]>
            </search>
            <add>
                <![CDATA[
                <!-- ORDER INFO CODE!!! -->
                <div id="tab-extra-info" >
                <table class="form">
                    <tbody>
                        <?php
                         foreach($order_info_waardes as $order_info_waardes_key => $order_info_waardes_value){ ?>
                            <tr>
                                <td><?php echo $order_info_waardes_value['title']; ?></td>
                                <td><?php echo $order_info_waardes_value['value']; ?></td>
                            </tr>
                         <?php } ?>
                    </tbody>
                </table>
            </div>
                <!-- END OF ORDER INFO CODE!!! -->
                ]]>
            </add>
        </operation>
    </file>

控制器文件(module/order_info):

<?php
class ControllerModuleOrderInfo extends Controller {
    public function index() {
        global $log;
        $this -> load -> model("module/order_info");
        $order_num = $this -> session -> data['order_id'];
        $log->write("Order ID ( tijdens opslaan ): " . $order_num);
        foreach ($this -> request -> post['waardes'] as $key => $value) {
            if ($value == "undefined") {
                continue;
            }
            $info = $this -> model_module_order_info -> getInfo($key);
            $this -> model_module_order_info -> insertAnswer($order_num, $info['title'], $value);
        }
    }
}

和模型文件(module/order_info)(部分):

<?php
class Modelmoduleorderinfo extends Model {
    public function getAnswers($uid) {
        $query = "SELECT " . DB_PREFIX . "order_info_entrys.uid, " . DB_PREFIX . "order_info_entrys.title, " . DB_PREFIX . "order_info_entrys.`value` FROM `" . DB_PREFIX . "order_info_entrys` WHERE " . DB_PREFIX . "order_info_entrys.order_id = " . $uid;
        $resultSet = $this -> db -> query($query);
        return $resultSet -> rows;
    }
}

但我没有从模型中得到任何数据(上面的代码)。如果我在数据库中查看,数据就在那里,并提供了正确的信息。

所以我试着把我得到的所有信息都记录到错误日志中,这就是我得到的:

2013-12-06 9:27:54 - Array
(
)
2013-12-06 9:27:54 - Order ID: 36186
2013-12-06 9:27:54 - Array
(
)
2013-12-06 9:27:54 - Order ID: 36186
2013-12-06 9:27:54 - Order ID ( tijdens opslaan ): 36186

正如你所看到的,首先是确认电子邮件发送,然后是存储在数据库中的信息。但数据需要首先存储,我认为这种情况已经发生了(因为ajax请求)。但我认为ajax请求太慢了,服务器继续解析所有信息并发送电子邮件。

那么你们知道我如何保存所有东西直到成功确认(数据被存储)吗?或者你们知道另一种方法吗?

查看您的代码,我可以看到一切都很好。这里缺少的真正重要的东西是您调用您的orderInfo控制器来存储信息的地方。因为我确信您在订单保存后调用此-但我的意思是,您在该调用后调用此

$this->model_checkout_order->confirm();

我说得对吗?

因为您可能注意到,confirm方法是发送电子邮件的方法,如果orderInfo数据尚未存储,则无法将任何内容插入邮件模板。。。

只是关于订单生命周期的结账过程的一个小提示:

  • 在结账的确认选项卡上,订单被保存到DB(处于非活动状态,没有状态,甚至在管理中看不到)
  • 在确认付款流程后,或者(在付款流程后)订单被确认为相应的状态-,然后在此处发送电子邮件

因此,您的赌注是在发送电子邮件之前,将所有orderInfo保存在addOrder方法中或confirm方法中。

还有一个提示:第一个选项是您的票证,与第二个选项一样。如果使用了某个支付网关(重定向到支付网关并返回),您可能会丢失要保存的信息。因此,将orderInfo数据存储在addOrder()方法中,您可以确定,当订单得到确认时,数据就在那里,电子邮件中会包含它们。