Список наиболее покупаемых товаров minishop2

Вчера пришло письмо от работодателя, с просьбой придумать способ, который позволит менеджеру сайта видеть перечень всех приобретенных товаров, а также видеть, сколько раз каждый товар был куплен.
Решением этого стал сниппет mostPopular.php, которым делюсь с вами, хотя уверен, что большинство сделает лучше, но тем не менее — вдруг кому пригодится.
Скачать можно с гитхаб, там всего два файла — сниппет и чанк к нему.
github.com/Alex-Mel/mostBoughtProducts
Александр Мельник
28 января 2019, 09:48
6
371
+7

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

Это сообщение было удалено
Артем
04 февраля 2019, 09:31
0
Справится ли сниппет, если на сайте будет 10К заказов?
    Александр Мельник
    04 февраля 2019, 09:44
    +1
    Не знаю, Артем. Я ведь не позиционирую это как превосходную программу.
    Это ведь лишь один из вариантов решения этого вопроса, на который у меня хватило мозгов и он очень не идеальный, но свою функцию выполняет.
    Да и «справиться или нет» наверное во многом будет зависеть от мощностей сервера, настройки php.ini и так далее.
      Stanislavsky
      09 февраля 2019, 14:44
      0
      У тебя методы типа getCollection будут тормозить. Мне кажется лучше бы было напрямую SQL запросом получить все заказы.
Stanislavsky
09 февраля 2019, 14:42
0
Я думаю, что здесь нужно добавить дополнительное поле для товара в админке, в котором будет хранится количество покупок. После создавать свой плагин и вешать на событие создания заказа. Ну, и как раз тогда уже записывать количество покупок товара в эти поля.
    Александр Мельник
    09 февраля 2019, 18:18
    0
    Вы совершенно правы. Но это нужно было изначально про составлении ТЗ подумать. А у нас все как всегда, через одно место)
vrm13
11 февраля 2019, 18:34
+1
на 1000 + заказов очень тормозило

Total parse time 2.7370908 s
Total queries 3713
Total queries time 1.4645813 s
Memory peak usage 14 Mb
MODX version	MODX Revolution 2.7.0-pl (advanced)
PHP version 7.1.26
Database version mysql 5.6.33-79.0-log
From cache false

Попробовал избавиться от лишнего, хотя я не особо силён в php. То есть у меня заработало, но я не до конца понимаю всё ли сделал правильно.

Просто напрямую выбираю из таблицы msOrderProduct айди товаров и сразу считаю. Код сниппета получился такой:
<?php
$q = $modx->newQuery('msOrderProduct', array('id:>' => 0));
$q->limit(0);
$res = $modx->getCollection('msOrderProduct', $q);
foreach ($res as $v) {
	$list[]= $v->get('product_id');
}
$products=[];
foreach ($list as $product) {
   $products[(int)$product]++;
}
arsort($products);
$result=[];
$pdoFetch = new pdoFetch($modx, $scriptProperties);
foreach ($products as $id=>$oneProduct){
    $url = $modx->makeUrl($id);
    $test = $modx->getObject('modResource',$id);
    $name = $test->get('pagetitle');
    $result[]=['id'=>$id,'name'=>$name,'url'=>$url,'counter'=>$oneProduct];
}

$output = $pdoFetch->getChunk($tpl, array(
    'products' => $result
    
));
return $output;

Теперь гораздо быстрее, а результат тот же
Total parse time 0.4497349 s
Total queries 338
Total queries time 0.0402529 s
Memory peak usage 6 Mb

повторюсь, я так себе программист, всё методом тыка, но вроде бы работает. Автору спасибо за идею!
Александр Мельник
11 февраля 2019, 18:38
+1
Вы молодец.
Vlad Brise
18 февраля 2019, 23:08
0
Не плохо. Сейчас работаю над похожим проектом, только заказчик требует очень подробную статистику по заказам, товарам, какие товары зарезервированы пользователем, а какие нет, короче много всякой инфы и я решил делать такую црмку на Ларке, спустя месяц работы могу сказать, что MODX прекрасно работает вместе с Laravel и довольно шустро, мне кажется фронтенд статистику лучше делать на Ларе, чисто мое мнение.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.