Какое событие подойдёт для плагина
Друзья, вернулся к попыткам научиться писать сниппеты. В целом многое получается и за это огромное спасибо modx.pro и всем его участникам!
Сейчас нужен совет
Делаю статистику по совершённым покупкам, уже есть общая таблица с рейтингом всех покупателей по количеству купленных товаров и сумме покупок. Раньше всё считалось перед выводом страницы с помощью сниппетов pdoTools, данных становится слишком много и сейчас пытаюсь сделать сниппет который считает тоже самое но записывает в неиспользуемые поля user'ов (fax,zip), чтобы это потом можно было сортировать и быстрее выводить
В целом всё работает, я записал всем пользователям данные пройдя по каждому пользователю с помощью pdoUsers вот таким сниппетом:
Основной вопрос:
Не могу придумать на какое событие сделать плагин, чтобы при любых изменениях (со стороны пользователя или менеджера) заново записывались общая сумма покупок и количество товаров. И как при этом поменять сниппет, чтобы выбирать именно того юзера у которого происходят изменения.
Второй момент — буду рад почитать критику сниппета, всё делаю на коленке для своего сайта, набираюсь опыта
Сейчас нужен совет
Делаю статистику по совершённым покупкам, уже есть общая таблица с рейтингом всех покупателей по количеству купленных товаров и сумме покупок. Раньше всё считалось перед выводом страницы с помощью сниппетов pdoTools, данных становится слишком много и сейчас пытаюсь сделать сниппет который считает тоже самое но записывает в неиспользуемые поля user'ов (fax,zip), чтобы это потом можно было сортировать и быстрее выводить
В целом всё работает, я записал всем пользователям данные пройдя по каждому пользователю с помощью pdoUsers вот таким сниппетом:
<?php
// Получаем все заявки
$q = $modx->newQuery('msOrder', array('id:>' => 0));
$q->limit(0);
$q->prepare();
$q->stmt->execute();
$ord = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
// Получаем заявки одного пользователя со статусом отправлено и подтверждено
if (isset($ord)) {
foreach ($ord as $v) {
$user = $v['msOrder_user_id'];
$status = $v['msOrder_status'];
if ($user == $userid and in_array($status, [1, 3])) {
$order[] = $v['msOrder_id'];
}
}
}
// Получаем id товаров в заявках
$w = $modx->newQuery('msOrderProduct', array('order_id:IN' => $order));
$w->limit(0);
$w->prepare();
$w->stmt->execute();
$prod = $w->stmt->fetchAll(PDO::FETCH_ASSOC);
if (isset($prod)) {
foreach ($prod as $e) {
$prods[] = $e['msOrderProduct_product_id'];
$count = count($prods); // количество купленых товаров
$uniq = array_unique($prods);
$uniqcount = count($uniq); // количество уникальных купленых товаров
$prices[] = $e['msOrderProduct_price'];
}
for($i=1;$i<sizeof($prices);++$i) {
$prices[0] += (int)$prices[$i];
}
}
// получаем данные уникальных товаров
$e = $modx->newQuery('msProductData', array('id:IN' => $uniq));
$e->limit(0);
$e->prepare();
$e->stmt->execute();
$res = $e->stmt->fetchAll(PDO::FETCH_ASSOC);
if (isset($res)) {
foreach ($res as $v) {
$arr[] = $v['msProductData_price'];
}
}
for($i=1;$i<sizeof($arr);++$i) {
$arr[0] += (int)$arr[$i];
}
$uniqsum = $arr[0]; // стоимость уникальных товаров
// записываем данные в поля профиля
if (isset($uniqcount)) {
$profile = $modx->getObject('modUserProfile', ['internalKey' => $userid]);
$fax = $profile->get('fax');
$zip = $profile->get('zip');
$profile->set('fax', $uniqsum);
$profile->set('zip', $uniqcount);
$profile->save();
}
Основной вопрос:
Не могу придумать на какое событие сделать плагин, чтобы при любых изменениях (со стороны пользователя или менеджера) заново записывались общая сумма покупок и количество товаров. И как при этом поменять сниппет, чтобы выбирать именно того юзера у которого происходят изменения.
Второй момент — буду рад почитать критику сниппета, всё делаю на коленке для своего сайта, набираюсь опыта
Поблагодарить автора
Отправить деньги
Комментарии: 6
если вы хотите сделать плагин для добавления суммы заказа и количества товаров в поля юзера, вам надо повесить его на событие создания заказа (msOnCreateOrder). Ну и на всякий случай еще можно сделать плагин на вычитание данных заказа (msOnRemoveOrder) если нужно убирать из статистики удаленные заказы.
Спасибо! Вроде бы так и надо, ещё скорее всего нужно на msOnUpdateOrder тоже его вешать, чтобы учитывались отменённые заказы и заказы которые «на уточнении» (у меня 4 статуса заказа)
Но я в таком варианте не пойму как выбирать именно того пользователя чей Ордер срабатывает на событие. Можно добавлять юзера из сессии, но я так понимаю, что тогда плагин будет брать id менеджера если он отредактирует заказ из админки
Но я в таком варианте не пойму как выбирать именно того пользователя чей Ордер срабатывает на событие. Можно добавлять юзера из сессии, но я так понимаю, что тогда плагин будет брать id менеджера если он отредактирует заказ из админки
ненене, нужно брать user_id из таблицы заказов. По моему это поле должно быть в объекте Order, если не ошибаюсь
кажется понял, моя ошибка в том что я этот же сниппет пытался переделать, а нужно другой плагин писать, Сейчас сниппет сначала берёт все заказы, а потом ищет определённого юзера, а мне нужно брать конкретный ордер и с ним работать.
Осталось понять как сделать запрос именно к тому ордеру который сработал на msOnCreateOrder, msOnUpdateOrder и msOnRemoveOrder
Осталось понять как сделать запрос именно к тому ордеру который сработал на msOnCreateOrder, msOnUpdateOrder и msOnRemoveOrder
ну это попроще вопрос. В документации видно что в плагинах на данные события сразу доступен экземпляр заказа. переменная $msOrder вроде, или $order.
то что, нужно. спасибо большое!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.