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

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