Просмотры страниц на Tickets в виджете админки

Попросили меня в предыдущей статье привести свой вариант виджета используя просмотры Tickets, но не вписался в комментарий и написал отдельный топик.



Подумал, что лучше всё-таки использовать pdoResources, чтобы выводило не только тикеты, а любую страницу сайта.

Вот моё готовое решение (нужны установленные pdoTools, Tickets):

  1. Идем в настройки -> панели -> виджеты -> создать виджет -> 1. Задаём имя виджету 2. Тип виджета — Сниппет 3. Вставляем в содержимое виджета название сниппета и сохраняем: widget_popular_resources



  2. Добавляем созданный нами виджет в панель Default в настройки -> панели -> вкладка Панели -> Правой кнопкой мыши по Default -> Редактировать панель -> кнопка Добавить виджет -> выбираем наш созданный видюжет.

  3. Создаём сниппет widget_popular_resources (в parents можно вставлять своего родителя):
    <?php
    $output = $modx->runSnippet('pdoResources', array(
        'limit' => 30,    
        'parents' => 0,  
        
        'tplWrapper' => 'tpl.widget.popular.wrapper',    
        'tpl' => 'tpl.widget.popular.row',   
        
        'loadModels' => 'tickets',    
        'class' => 'Ticket',    
        'leftJoin' => '{
            "TicketView": {
                "class": "TicketView",
                "on": "Ticket.id = TicketView.parent"
            }
        }',
        'select' => '{
            "Ticket": "Ticket.*",
            "TicketView": "COUNT(TicketView.uid) as views"
        }',
        'groupby' => 'Ticket.id',    
        'sortby' => '{ "views":"DESC" }',    
    ));
    return $output;
  4. Чанк tpl.widget.popular.wrapper:
    <style>
    .table {width: 100%;max-width: 100%;margin-bottom: 20px;border-collapse:collapse;}
    .table>thead>tr>th, .table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>td, .table>tbody>tr>td, .table>tfoot>tr>td {padding: 8px;line-height: 1.42857143;vertical-align: top;border-top: 1px solid #ddd;}
    .table>thead>tr>th {vertical-align: bottom;border-bottom: 2px solid #ddd; font-weight: bold;}
    .table>caption+thead>tr:first-child>th, .table>colgroup+thead>tr:first-child>th, .table>thead:first-child>tr:first-child>th, .table>caption+thead>tr:first-child>td, .table>colgroup+thead>tr:first-child>td, .table>thead:first-child>tr:first-child>td {border-top: 0;}
    .table>tbody+tbody {border-top: 2px solid #ddd;}
    .table .table {background-color: #fff;}
    .table-condensed>thead>tr>th, .table-condensed>tbody>tr>th, .table-condensed>tfoot>tr>th, .table-condensed>thead>tr>td, .table-condensed>tbody>tr>td, .table-condensed>tfoot>tr>td {padding: 5px;}
    .table-bordered {border: 1px solid #ddd;}
    .table-bordered>thead>tr>th, .table-bordered>tbody>tr>th, .table-bordered>tfoot>tr>th, .table-bordered>thead>tr>td, .table-bordered>tbody>tr>td, .table-bordered>tfoot>tr>td {border: 1px solid #ddd;}
    .table-bordered>thead>tr>th, .table-bordered>thead>tr>td {border-bottom-width: 2px;}
    .table-striped>tbody>tr:nth-of-type(odd) {background-color: #f9f9f9;}
    .table-hover>tbody>tr:hover {background-color: #f5f5f5;}
    </style>
    <table class="table table-striped table-hover">
        <thead>
            <tr>
                <th>Название ресурса</th>
                <th>Просмотров</th>
            </tr>
        </thead>
    	<tbody>
    
    [[+output]]
    
        </tbody>    
    </table>
  5. чанк tpl.widget.popular.row:
    <tr>
        <td>
            [[+parent:isnot=`0`:then=`<a href="[[~[[+parent]]]]" target="_blank">[[#[[+parent]].pagetitle]]</a> » `]]
            <a href="[[~[[+id]]]]" target="_blank">[[+pagetitle]]</a>
        </td>
        <td>[[+views]]</td>
    </tr>
Последний момент. Если вы хотите чтобы учитывались просмотры незарегистрированными пользователям (гостями), то включите эту возможность в системной настройке tickets.count_guests.

Вот в принципе и всё. Оформление регулируется под себя в чанках. В сниппете указывается родитель для отдельных разделов сайта.

Пользуйтесь!

.`````````````````````````````````````````````
``````````````````````````````````````````````
``````````````````````````````````````````````
```@@@`````@@@````@@@@```,@@@@@'```@@@``@@@```
````+@,```,@+```+@;``@@.```@``.@@```@,``.@````
````@+@```@'@```@`````;@```@````+@```@``@`````
````@;@```@;@``@@``````@;``@`````@```#@+@`````
````@:;@`#',@``@:``````@@``@`````@,```@@``````
````@.`@`@``@``@;``````@+``@`````@,```@@``````
````@``@'@``@``#@``````@.``@`````@```@,#@`````
````@```@```@```@:````#@```@````@@``:@``@.````
```,@,`````,@,``.@@:;@@```,@;;'@@``,@,``:@,```
```+++`````+++````'@@:```.+++++````+++``+++```
``````````````````````````````````````````````
``````````````````````````````````````````````
``````````````````````````````````````````````


UPD.
Вариант статистики за последний квартал (изменённый сниппет):
<?php
$period = date('Y-m-d H:i:s', strtotime("-3 month") ); // за последние 3 месяца
$output = $modx->runSnippet('pdoResources', array(
    'limit' => 30,    
    'parents' => 0, 
    
    'tplWrapper' => 'tpl.widget.popular.wrapper',    
    'tpl' => 'tpl.widget.popular.row',   
    
    'loadModels' => 'tickets',    
    'class' => 'Ticket',    
    'leftJoin' => '{
        "TicketView": {
            "class": "TicketView",
            "on": "Ticket.id = TicketView.parent"
        }
    }',
    'select' => '{
        "Ticket": "Ticket.*",
        "TicketView": "COUNT(TicketView.uid) as views"
    }',
    'groupby' => 'Ticket.id',    
    'sortby' => '{ "views":"DESC" }',    
    'where'  => '{ "TicketView.timestamp:>": "'.$period.'" }',
));
return $output;

UPD2
В комментариях привёл пример переписанного чанка на феноме с добавлением новых фишек.
Василий Столейков
02 февраля 2017, 10:00
modx.pro
32
5 299
+15
Поблагодарить автора Отправить деньги

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

Василий Столейков
02 февраля 2017, 13:39
1
+2
Добавил вариант вывода статистики за квартал (последние 3 месяца) в конце статьи.
    Сергей
    02 февраля 2017, 16:42
    0
    поставил, все работает))) как мне кажется в моей статье более гибко, возможно разбить на несколько виджетов с нужными разделами, вплоть до самих страниц, просто перечисляем id ресурсов. Это помогает в том случает, когда сайт большой, потому что искать нужную инфу в огромном списке не всегда удобно. В частности я разделил на статьи и услуги. Основную функцию подсчет просмотров оба виджета выполняют)) а там уже каждый сам выберет))
      Василий Столейков
      02 февраля 2017, 21:50
      0
      (в parents можно вставлять своего родителя)
      А кто мешает в сниппете указать parents разделов? Можно и resources использовать под худой конец. Я написал об этом в статье, читайте внимательно.
        Василий Столейков
        02 февраля 2017, 22:00
        1
        0
        в моей статье более гибко, возможно разбить на несколько виджетов с нужными разделами, вплоть до самих страниц
        А ты уверен что тут точно так же нельзя?
          Василий Столейков
          03 февраля 2017, 11:17
          1
          0
          Привёл пример с несколькими виджетами. Там просто нужно создать новый сниппет и прописать его под свои условия и вписать в новый виджет. Там у меня на примере виджет недельный и квартальный.
        brioni
        02 февраля 2017, 18:34
        0
        Не хватает отображения просмотров в виде 1К, 1КК, 1М и тд. В админке и на сайте.
          Здоров Александр
          02 февраля 2017, 19:05
          +1
          не все поймут, больше чем уверен такое обозначение, сам часто встречаю вопросы а что за 1К?, а КК у многих за гранью, скорее тогда вводить разрядность типа 1,5 тыс, 100 тыс. 1 мл и т.д.
            Василий Столейков
            02 февраля 2017, 21:53
            1
            0
            сам часто встречаю вопросы а что за 1К?
            и что за 1К? Первый Канал? Впервые слышу.
              Здоров Александр
              02 февраля 2017, 22:01
              +1
              1К — чаще игровое обозначение, равное 1 000, 1КК — 100 000, 1М — миллион
            Василий Столейков
            02 февраля 2017, 21:57
            1
            0
            А что такое 1К? (Первый Канал) А что такое 1М (Один Метр)? )))

            Если нужно цифры как-то разбивать и форматировать — никто тебе это не мешает сделать прямо в чанке. В статье дана базовая схема, а оформление уже у каждого как муза душезаказчик прикажет.

            Используй в чанке Fenom и пиши какие угодно условия с данными под твои задачи. Можешь через модификатор свой их прогонять, а можешь прямо в чанке if else настрочить.
              Andrei D.
              02 февраля 2017, 22:07
              0
              1000 = 1k
              10000 = 10k
              100000 = 100k
              1000000 = 1kk

              это общепринятые в it сфере обозначения. откройте твиттер и удивитесь
                Здоров Александр
                02 февраля 2017, 22:11
                0
                1 миллион уже не 1М? впрочем я вам верю больше, я только в паре игр, в которых иногда бываю встречаю такие аббревиатуру
                  Василий Столейков
                  02 февраля 2017, 22:13
                  1
                  +1
                  Открыл твиттер и удивился — там никаких ожидаемых k не увидел, только общепринятое сокращение «тыс.»…

                  Открыл интернет — ещё больше запутался:
                  1к = 1 кило, 10^3, килограмм. километр. килопаскаль.
                    Здоров Александр
                    02 февраля 2017, 22:18
                    0
                    вот из приведенного ниже примера хабра
                    joxi.ru/p27RQEyUXavlm7
                    где просмотров 9,1К — это ~9 100 просмотров (причем как от 101 так и до 199)
                    К выступает в роле, как я понимаю, кило, как в байтах или битах
                    итого получаем что
                    1 000 — 1К
                    10 000 — 10К
                    100 000 — 100К
                    1 000 000 — 1КК (хотя как по мне логичней 1М)
                      Василий Столейков
                      02 февраля 2017, 22:27
                      1
                      0
                      Нда… а к такой неточной формулировке ещё нужно привыкнуть. То есть я не смогу увидеть точные цифры, а только лишь приблизительные.
                      И по сути все 30 страниц будут одинаковыми, типа:
                      Главная - 1К
                      Каталог - 1К
                      Товар 1 - 1К
                      Товар 2 - 1К
                      ...
                      Ведь тут же подсчёт ведётся по убыванию, и цифры будут отличаться возможно несколькими значениями или десятками… Пока что я не вижу смысла добавлять это в этот виджет, неубедительно.
                        Здоров Александр
                        02 февраля 2017, 22:30
                        +1
                        я слал выше хабр пример, и опять же не я поднял тему, скорее актуально для чего-то крайней популярного, интересно, если ли такое, но судя по вашему скрину есть и успешно работает, поздравляю!
                        вы упоминаете fenom, может тогда стоит поделиться мыслями по, походу. маскам для значений
                          Василий Столейков
                          02 февраля 2017, 22:33
                          1
                          0
                          согласен, актуально для мега-популярного.
                          Ок, я подумаю, но сначала мне нужно познакомиться получше с темой, погуглю на этот счёт, а то ещё есть вопросы разные, без чёткого понимания задачи не смогу сделать ничего.
                Здоров Александр
                02 февраля 2017, 22:04
                0
                если автор топика выше меня не тролит, то, как видите, же проблема на лицо
                  Василий Столейков
                  02 февраля 2017, 22:08
                  1
                  +1
                  Да, проблема на лицо, это точно. Я сегодня узнал что-то новое, спасибо. Смутно догадывался, но и сейчас ещё не до конца понимаю как это должно выглядеть.
                  По сути я чуть выше написал, что переделать это можно как угодно, под любую задачу — благо феном трудится. Но если сильно нужно такое обозначение, то могу сделать, но мне нужно чёткое представление как это должно выглядеть и в каких случаях. Тыкните носом в пример, что ли. Либо сами делайте как вам нужно.
                    Здоров Александр
                    02 февраля 2017, 22:11
                    0
                    вот выше привели пример
                      Василий Столейков
                      02 февраля 2017, 22:16
                      1
                      0
                      Нет, не совсем то. В каких случаях будет показываться?
                      Если число 1004, то как должно выглядеть, 1k4?
                        brioni
                        02 февраля 2017, 22:19
                        0
                        так и будет 1К, пока не наберется 1,1К (1100)
                          Здоров Александр
                          02 февраля 2017, 22:21
                          0
                          думаю 1К
                          сами посмотрите habrahabr.ru/hubs/ как там рейтинг организован
                          так то для мощного сообщества идея интересная, но именно для мощного
                            Василий Столейков
                            02 февраля 2017, 22:29
                            1
                            +1
                            Да, именно для мощного, где разница большая, но для данного виджета эта система сокращения бессмысленна, как я и описал выше.
                        brioni
                        02 февраля 2017, 22:15
                        0
                        Хабр использует: habrahabr.ru/top/ а они тоже вроде как на Тикетах.
                        Хоть это и вообще не проблема, но когда количество просмотров переходит за 10 000 у меня плывет верстка чанка TicketsMeta. Ну и быть в тренде тоже не помешает.
                        А в феноме я не бум-бум, поэтому могу только стрелки навести :(
                          Василий Наумкин
                          03 февраля 2017, 06:19
                          +3
                          Хабр использует: habrahabr.ru/top/ а они тоже вроде как на Тикетах.
                          Не шути так.

                          Это Tickets позаимствовали всё, что только можно, с Хабра. А у них свой уникальный движок.
                        brioni
                        02 февраля 2017, 22:10
                        0
                        )) скажем так — это некий индикатор продвинутого сайта, типа Instagram и пр.
                          Здоров Александр
                          02 февраля 2017, 22:28
                          0
                          вопрос актуальности, возьмём, даже это сообщество:
                          после просмотра самых самых постов вышло что пост modx.pro/components/10835-ms2gallery-20/ имеет 725 просмотров
                            brioni
                            02 февраля 2017, 22:59
                            0
                            Да, но если включить в настройках «просмотры неавторизованными пользователями» — цифры будут в разы больше.
                              Василий Столейков
                              02 февраля 2017, 23:05
                              1
                              0
                              Но даже в таком случае это не для всех сайтов подойдёт, а для самых посещаемых.
                              В конце статьи я дал вариант наиболее используемой статистики — по кварталам (3 месяца), а это ещё больше сокращает числа.
                              Но даже если и нужна такая система, то мне нужны реальные примеры. Переведите мне разные числа в эту систему. Я не могу найти в интернете нормального объяснения. Все говорят что К — это 3 нуля. То есть 1к = 1000. Но как быть с числами, где нету нулей. Например переведите мне эти:

                              1001
                              1020
                              10222
                              12222
                              222222
                              1000009
                              1039999
                              10000000
                              11111111
                                Алексей Федоров
                                03 февраля 2017, 07:20
                                +1
                                Встречал округления до 1 знака после запятой, но не думаю, что виджет в админке должен показывать 1к, 2,2к и т.д. Во-первых, там должна быть максимально точная информация, а во-вторых, если говорить об удобстве, то верхний разделить по трем знакам более удобен в данном случае. Имею в виду вот такое.
                                1'001
                                1'020
                                10'222
                                12'222
                                222'222
                                1'000'009
                                1'039'999
                                10'000'000
                                11'111'111
                                Тогда цифры не сливаются и можно сразу заметить где 100 тысяч, а где 10 млн.

                                Если же говорить по существу обсуждаемого в комментах вопроса, то сокращения и в формате добавления тыс., млн и в виде к, кк имеет смысл делать для фронта при высоких показателях посещаемости. Для реализации этой вещи я бы обратился к Илье Уткину, поскольку его units выполняет смежную функцию (подстановка правильных окончаний для численных значений). Мое мнение таково, что нужно добавлять функционал инструменту, который уже в нужном направлении работает. Как расширение возможностей units можно добавить варианты сокращения самого числа с подстановкой в конце «млн» и «кк» по значению отдельного параметра. К примеру, &cut со значениями default (не сокращаем), rus (добавка тыс., млн, млрд) и eng (добавляем к, кк и что там дальше идет).
                                Ну, это все на уровне мыслей в слух, так что варианты есть, но сокращать данные в админке — зло))
                                  Василий Столейков
                                  03 февраля 2017, 10:43
                                  1
                                  +1
                                  но сокращать данные в админке — зло))
                                  100%!

                                  верхний разделить по трем знакам более удобен в данном случае
                                  Для меня лично удобнее общепринятое разделение запятой: «11,111,111».

                                  Чтобы разделить запятой, в чанке tpl tpl.widget.popular.row достаточно заменить [[+views]] на феномовский эквивалент с модификатором:
                                  {$views|number_format}

                                  Либо написать собственный модификатор, используя эту же php-функцию (почему-то встроенный на феноме number_format у меня не хочет принимать параметры для указания своего разделителя).
                                    Алексей Федоров
                                    03 февраля 2017, 11:13
                                    0
                                    Для меня лично удобнее общепринятое разделение запятой: «11,111,111».
                                    Это уже малопринципиальные детали)) А вот за указание где и что поправить спасибо)
                                      Василий Столейков
                                      03 февраля 2017, 11:15
                                      1
                                      +1
                                      Чуть ниже привёл пример переделанного на феном чанка с форматированными числами.
                      Василий Столейков
                      03 февраля 2017, 11:14
                      1
                      +2
                      Переписал чанк на феном и добавил пару фишек, например хлебные крошки до третьего уровня, id-шку, ссылку на редактирование и форматирование больших чисел функцией number_format:

                      <tr>
                          <td>
                              {if $parent|resource:'parent'}<a href="{$parent|resource:'parent'|url}" target="_blank">{$parent|resource:'parent'|resource:'pagetitle'}</a> » {/if}
                              {if $parent}<a href="{$parent|url}" target="_blank">{$parent|resource:'pagetitle'}</a> » {/if}
                              <a href="{$id|url}" target="_blank">{$pagetitle}</a> ({$id}) <a href="{'manager_url'|option}?a=resource/update&id={$id}" target="_blank" style="float: right"><em>ред.</em></a>
                          </td>
                          <td>{$views|number_format}</td>
                      </tr>
                      Вот в итоге что у меня получилось:


                      Тут у меня 2 виджета, один за просмотры за неделю, другой за квартал. Интересно наблюдать например огромное посещение 404-й страницы (Ой! что-то не так...) — видно что что-то действительно не так, нужно исправлять. robots.txt тоже почему-то весьма популярный, видно в гостевом режиме засчитываются посещения поисковых роботов (мне так кажется)…

                      Думаю для скорой статистики он подойдёт, для более детальной надо бежать в Метрику Яндекса.
                        Дмитрий
                        24 ноября 2021, 16:45
                        0
                        Не работает, не показывает названия ресурсов и хлебные крошки.
                          Дмитрий
                          24 ноября 2021, 18:05
                          +1
                          Чтобы работало, надо в коде сниппета заменить
                          'select' => '{
                                  "Ticket": "Ticket.*",
                          на
                          'select' => '{
                                  "Ticket": "Ticket.id as id, Ticket.parent as parent, Ticket.pageTitle as pagetitle",
                          Дмитрий
                          29 ноября 2021, 11:54
                          0
                          Подскажите, почему не работает сортировка по кол-ву просмотров в левой панели?
                          Слева за месяц, справа — за все время.
                          Сниппеты используют общие чанки. Предполагаю, что не «очищается» {$output}.
                          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                          38