Какое событие подойдёт для плагина

Друзья, вернулся к попыткам научиться писать сниппеты. В целом многое получается и за это огромное спасибо modx.pro и всем его участникам!

Сейчас нужен совет
Делаю статистику по совершённым покупкам, уже есть общая таблица с рейтингом всех покупателей по количеству купленных товаров и сумме покупок. Раньше всё считалось перед выводом страницы с помощью сниппетов 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();
}

Основной вопрос:
Не могу придумать на какое событие сделать плагин, чтобы при любых изменениях (со стороны пользователя или менеджера) заново записывались общая сумма покупок и количество товаров. И как при этом поменять сниппет, чтобы выбирать именно того юзера у которого происходят изменения.

Второй момент — буду рад почитать критику сниппета, всё делаю на коленке для своего сайта, набираюсь опыта
vrm13
13 декабря 2019, 19:51
modx.pro
550
+1
Поблагодарить автора Отправить деньги

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

gruzoveek
16 декабря 2019, 09:09
0
если вы хотите сделать плагин для добавления суммы заказа и количества товаров в поля юзера, вам надо повесить его на событие создания заказа (msOnCreateOrder). Ну и на всякий случай еще можно сделать плагин на вычитание данных заказа (msOnRemoveOrder) если нужно убирать из статистики удаленные заказы.
    vrm13
    16 декабря 2019, 09:55
    0
    Спасибо! Вроде бы так и надо, ещё скорее всего нужно на msOnUpdateOrder тоже его вешать, чтобы учитывались отменённые заказы и заказы которые «на уточнении» (у меня 4 статуса заказа)

    Но я в таком варианте не пойму как выбирать именно того пользователя чей Ордер срабатывает на событие. Можно добавлять юзера из сессии, но я так понимаю, что тогда плагин будет брать id менеджера если он отредактирует заказ из админки
      gruzoveek
      16 декабря 2019, 10:06
      +1
      ненене, нужно брать user_id из таблицы заказов. По моему это поле должно быть в объекте Order, если не ошибаюсь
        vrm13
        16 декабря 2019, 10:19
        0
        кажется понял, моя ошибка в том что я этот же сниппет пытался переделать, а нужно другой плагин писать, Сейчас сниппет сначала берёт все заказы, а потом ищет определённого юзера, а мне нужно брать конкретный ордер и с ним работать.

        Осталось понять как сделать запрос именно к тому ордеру который сработал на msOnCreateOrder, msOnUpdateOrder и msOnRemoveOrder
          gruzoveek
          16 декабря 2019, 10:23
          +1
          ну это попроще вопрос. В документации видно что в плагинах на данные события сразу доступен экземпляр заказа. переменная $msOrder вроде, или $order.
            vrm13
            16 декабря 2019, 10:31
            0
            то что, нужно. спасибо большое!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    6