Opencart VQMod добавляет дополнительные данные в письмо с подтверждением заказа

Я использую ОС версии 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 медленный, и что сервер продолжает анализировать всю информацию и отправлять электронную почту.

Итак, вы, ребята, знаете, как я могу удерживать все до тех пор, пока не будет подтверждено успешное подтверждение (данные сохранены), или вы, ребята, знаете другой способ?


person Mathlight    schedule 06.12.2013    source источник


Ответы (1)


Глядя на ваш код, я вижу, что все в порядке, почти. Действительно важная вещь, которой здесь не хватает, — это место, где вы вызываете свой orderInfo контроллер для хранения информации. Потому что я уверен, что вы вызываете это после заказа, но я имею в виду, что вы вызываете это после этого вызова:

$this->model_checkout_order->confirm();

Я прав?

Поскольку метод confirm, как Вы могли заметить, отправляет электронные письма, и если данные orderInfo еще не сохранены, в шаблон письма вставлять нечего...

Небольшой намек на то, как происходит процесс оформления заказа в отношении жизненного цикла заказа:

  • на вкладке Подтвердить оформления заказа заказ сохранен в БД (неактивный, без статуса, даже в администрации не видно)
  • после подтверждения либо происходит процесс оплаты, либо (и после процесса оплаты) заказ подтверждается с соответствующим статусом - и здесь отправляется электронное письмо

Таким образом, ваша ставка состоит в том, чтобы сохранить все orderInfo либо в методе addOrder, либо в методе confirm до отправки электронного письма.

И еще одна подсказка: Первый вариант - Ваш билет, так как со вторым Вы можете потерять информацию для сохранения в случае использования какого-либо платежного шлюза (с редиректами на платежный шлюз и обратно). Поэтому храните данные orderInfo прямо в методе addOrder(), и вы будете уверены, что когда заказ будет подтвержден, данные есть, и электронное письмо будет содержать их.

person shadyyx    schedule 06.12.2013
comment
Хорошо, я действительно использую платежную систему, так что тогда это может быть проблемой... Но я попытаюсь установить код на 1 шаг раньше, и тогда это сработает? (даже с тем же запросом ajax для хранения данных?)\ - person Mathlight; 06.12.2013
comment
Вы, сэр, действительно мой герой! Большое спасибо за вашу помощь. Это работает как шарм :-D Большое спасибо! - person Mathlight; 06.12.2013
comment
Да, и пожалуйста, забудьте о ключевом слове global... Оно использовалось в PHP4... Переменная $log в любое время может быть доступна $this->log как в контроллерах, так и в моделях, поскольку OC использует это registration, который можно рассматривать как шаблон IoC (конкретно реализация сервисного контейнера). - person shadyyx; 06.12.2013
comment
Хорошо, спасибо за информацию. Это был первый результат Google, поэтому я использовал его очень быстро (и грязно: D) для тестирования. Но я буду иметь это в виду! Еще раз спасибо :D - person Mathlight; 06.12.2013