Отложенная отправка писем из minishop2 клиенту
Стояла задача ускорить формирование заказа. Слабым звеном на сайте оказалась отправка почты. Было решено ее отправлять после формирования заказа.
Для этого возникла идея сделать следующее:
1. Отключаем оповещение у новых заказов
2. Создаем новый статус заказа Оповещение с идентичными чанками.
3. Пишем сниппет и вызываем его из CronManager:
Вопрос: все ли сделано верно и есть ли более правильное решение?
Для этого возникла идея сделать следующее:
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;
Вроде все работает. Вопрос: все ли сделано верно и есть ли более правильное решение?
Комментарии: 9
Нормальное решение по-моему, если моё мнение важно)))
И потом сидишь и думаешь, а сделал ли я заказ в магазине.
Зря вы так, вряд ли они большую задержку сделали.
Письмо приходит в течение минуты после заказа. Имхо, допустимо.
В сниппете выбирается последний заказ. А если в течение этой минуты ещё заказ прилетит? Сниппет его возьмет, обработает, а предыдущий заказ пролетит, получается.
Решение хорошее.
Но проблема в выборке 1 последнего заказа. Почему? Нужно просто выбирать все заказы со статусом Новый, и всем им менять статус на Оповещение.
Но проблема в выборке 1 последнего заказа. Почему? Нужно просто выбирать все заказы со статусом Новый, и всем им менять статус на Оповещение.
Все не получается, потому как все остальные до нововведения со статусом Новый. Может, выбирать все созданные за последний день или минуту?
Так поменяйте всем старым статус тоже, руками или скриптом.
<?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;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.