Отложенная отправка писем из minishop2 клиенту

Стояла задача ускорить формирование заказа. Слабым звеном на сайте оказалась отправка почты. Было решено ее отправлять после формирования заказа.

Для этого возникла идея сделать следующее:
1. Отключаем оповещение у новых заказов
2. Создаем новый статус заказа Оповещение с идентичными чанками.
3. Пишем сниппет и вызываем его из CronManager:
<?php
// смотрим последний заказ
$c = $modx->newQuery('msOrder');
$c->where(array('type' => 0));
$c->limit(1);
$c->sortby('id', DESC);

$miniShop2 = $modx->getService('miniShop2');
$results = $modx->getIterator('msOrder', $c);

foreach ($results as $result) {
         $order_id = $result->get('id');
         $status = $result->get('status');\
		 // если статус заказа Новый
         if ($status == '1') {
             $miniShop2->changeOrderStatus($order_id, 25);
             $output = $order_id.' - '.$status;
         }
     }

//Пишем результат в лог по адресу: core/cache/logs/order.new.log
$modx->log(modX::LOG_LEVEL_ERROR,$order_id, array(
    'target' => 'FILE',
    'options' => array(
        'filename' => 'order.new.log'
    )
));

return $output;
Вроде все работает.

Вопрос: все ли сделано верно и есть ли более правильное решение?
Валентина Павлова
17 февраля 2021, 18:32
modx.pro
1
109
+1

Комментарии: 9

Артур
17 февраля 2021, 18:57
0
Нормальное решение по-моему, если моё мнение важно)))
    Aleksandr Huz
    17 февраля 2021, 21:34
    0
    И потом сидишь и думаешь, а сделал ли я заказ в магазине.
      Артур
      17 февраля 2021, 21:39
      0
      Зря вы так, вряд ли они большую задержку сделали.
        Валентина Павлова
        17 февраля 2021, 21:51
        0
        Письмо приходит в течение минуты после заказа. Имхо, допустимо.
          Alexey
          18 февраля 2021, 09:36
          0
          В сниппете выбирается последний заказ. А если в течение этой минуты ещё заказ прилетит? Сниппет его возьмет, обработает, а предыдущий заказ пролетит, получается.
        Наумов Алексей
        18 февраля 2021, 11:00
        +1
        Решение хорошее.
        Но проблема в выборке 1 последнего заказа. Почему? Нужно просто выбирать все заказы со статусом Новый, и всем им менять статус на Оповещение.
          Валентина Павлова
          18 февраля 2021, 15:45
          0
          Все не получается, потому как все остальные до нововведения со статусом Новый. Может, выбирать все созданные за последний день или минуту?
            Наумов Алексей
            18 февраля 2021, 16:34
            0
            Так поменяйте всем старым статус тоже, руками или скриптом.
            Валентина Павлова
            18 февраля 2021, 16:33
            0
            <?php
            // заказы за последний час
            $c = $modx->newQuery('msOrder');
            $now = date("Y-m-d H:i:s");
            $hours = date('Y-m-d H:i:s',(strtotime('-1 hours', strtotime($now))));
            $c->where(array(
                'type' => 0, 
                'status' => 1,
                'createdon:<' => $now,
                'createdon:>' => $hours
                ));
            $c->sortby('id', DESC);
            
            $miniShop2 = $modx->getService('miniShop2');
            $results = $modx->getIterator('msOrder', $c);
            
            // выводим
            if(count($results) > 0){
                foreach ($results as $result) {
                     $order_id = $result->get('id');
                        $miniShop2->changeOrderStatus($order_id, 25);
                        //Пишем результат в лог по адресу: core/cache/logs/order.new.log
                        $modx->log(modX::LOG_LEVEL_ERROR,$order_id, array(
                            'target' => 'FILE',
                            'options' => array(
                                'filename' => 'order.new.log'
                                )
                        ));
                }
            } 
            
            return $output;
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            9