Наверх

Изменяем алгоритм подсчета просмотров страниц в компоненте Tickets

Мой блог работает на Tickets от bezumkin, однако Tickets считает просмотры только зарегистрированными пользователями. А у меня в блоге много читателей, кто получает обновления, например, по RSS и не регистрируются. Вот и решил я сделать так, чтобы любые просмотры писались в базу.

Для этого я каждому незарегистрированному читателю устанавливаю cookies, чтобы потом его опознать и повторно не считать его же просмотры.

Ну и добавляем новую запись о просмотре в базу (объект TicketView):
// Проверяем, что пользователь неавторизован
if ($modx->user->id || $modx->resource->class_key != 'Ticket') return;

// Если у пользователя не установлена cookie, устанавливаем
if (!$user = (int) $_COOKIE['viewer']) {
    $c = $modx->newQuery('TicketView');
    $c->sortby('uid','DESC');
    $c->limit('1');
    $maxuser = $modx->getObject('TicketView',$c);
    $user = (int) $maxuser->get('uid') + 1;
    SetCookie('viewer',$user,time()+31536000,'/');
}

// Проверяем, не смотрел ли этот читатель текущую страницу раньше
// Если не смотрел, вносим запись о нем в просмотры страницы
$table = $modx->getTableName('TicketView');
$timestamp = date('Y-m-d H:i:s');
$res = $modx->resource->id;
$sql = "INSERT INTO {$table} (`uid`,`parent`,`timestamp`) VALUES ($user,$res,'{$timestamp}') ON DUPLICATE KEY UPDATE `timestamp` = '{$timestamp}'";
if ($stmt = $modx->prepare($sql)) {
	$stmt->execute();
}
return;

24 комментария

  1. Василий Наумкин 04 мая 2013, 17:18(Комментарий был изменён) # 0
    Хотел бы немного уточнить:
    1. Модель компонента не нужно подключать, он уже подкючен при запуске ядра через addExtensionPackage.
     Если же тебе нужен класс Tickets, то достаточно
    $Tickets = $modx->getService('tickets');
    2. Учет куками не совсем корректен по двум причинам:
    — легко накрутить просмотры
    — ты пишешь в таблицу, что будущий, еще не зарегистрированный юзер уже посмотрел заметку — это даст неверный счетчик новых комментариев тикета, для него. Ведь он еще не видел страницу, ее кто-то другой посмотрел.

    Я много вариантов прокручивал и учет только авторизованных просмотров, на мой взгляд — самый верный.
    1. Илья Уткин 04 мая 2013, 18:03(Комментарий был изменён) # 0
      Ну да, подсчет не совсем корректен, согласен, но большие цифры радуют больше) Тем более когда на сайте зарегистрированы только 8 человек)))
    2. Андрей Трофименко 24 декабря 2013, 19:33(Комментарий был изменён) # 0
      Здравствуйте Илья!
      Скажите, где нужно разместить вышеприведенный код?
      1. Илья Уткин 25 декабря 2013, 10:38(Комментарий был изменён) # 0
        Создаете сниппет и размещаете его прямо на странице (в шаблоне тикета)
      2. Андрей Трофименко 25 декабря 2013, 14:16(Комментарий был изменён) # 0
        Создал сниппет [[!TicketView]], вставил в шаблон тикетов — не считает. :(
        1. Илья Уткин 25 декабря 2013, 14:24(Комментарий был изменён) # 0
          Ну не знаю… Этот код я прямо из сниппета скопировал в статью — символ в символ. У меня считает… Проверяйте построчно, что именно не работает.
        2. Андрей Трофименко 25 декабря 2013, 14:58(Комментарий был изменён) # 0
          Буду искать…
          1. Алексей 22 апреля 2014, 21:00 # 0
            Для отсеивания подсчета просмотра страниц поисковыми ботами, лучше всего обернуть этот сниппет в Ajax. Боты не часто используют javascript, поэтому подсчет будет идти вернее.
            1. Саша Друмс 02 июля 2014, 17:08 # 0
              Привет, Илья.
              Тоже столкнулся с проблемой: не выводится количество просмотров.
              Не мог бы ты подсказать, что должно быть вызвано на странице, чтобы считались просмотры? Просто все шаблоны тикетов переделывал и не могу понять, где ошибка :-(
              И еще как их потом вывести в getTickets, плейсхолдером сниппета?
              1. Илья Уткин 03 июля 2014, 07:39 # 0
                Просмотры считает плагин Tickets. Проверь, активен ли он. Ну и, естественно, считает он просмотры только у тикетов и только просмотры зарегистрированными и авторизованными пользователями. Как раз для того, чтобы считать просмотры всех посетителей (даже неавторизованных) мне и пришлось писать этот небольшой костыль.

                Выводит же количество просмотров сниппет TicketMeta. Подробности Василий писал у себя в блоге.
                1. Слава 28 января 2016, 09:40 # 0
                  Илья, у тебя на странице раздела ilyaut.ru/blog/ просмотры тоже выводятся от не авторизованных? Если да, то направь перстом стадо оленье: как это сделать :)
                  1. Илья Уткин 28 января 2016, 09:43 # 0
                    Сейчас у меня просмотры выводятся по данным Яндекс-Метрики (используется API)
                    1. Слава 28 января 2016, 09:48 # 0
                      Ого, мощно.
                      А используя плагин выше просмотры не авторизованных в разделе реализовать можно?
                      1. Илья Уткин 28 января 2016, 09:51 # 0
                        Ну он вообще именно для этого =))
                        1. Слава 28 января 2016, 09:57 # 0
                          А знаешь, что iPhone не открывает страницу где вызван сниппет [[!TicketView]]?
                          1. Илья Уткин 28 января 2016, 09:58 # 0
                            Видимо, что-то не так в этом сниппете с cookies…
                            1. Слава 28 января 2016, 10:00 # 0
                              Походу да…
                        2. Илья Уткин 28 января 2016, 09:56 # 0
                          Вообще, последняя версия Tickets считает и неавторизованные просмотры, насколько я в курсе — надо только установить системную настройку соответствующую (count_guests, вроде)
                          1. Слава 28 января 2016, 09:59 # 0
                            Спасибо, Ща буду пробовать реализовать через Тикет.
                            Тебе, как всегда, огромное спасибо за поддержку!
                            1. Слава 28 января 2016, 10:07 # 0
                              Поспешил я пробовать…
                              А где настройку count_guests выставить?
                              Плагин: Tickets — Системные события? Не смог там найти похожего…
                              1. Илья Уткин 28 января 2016, 10:08 # 0
                                Нет, прям в настройках системы должен быть такой пункт
                                1. Слава 28 января 2016, 10:12 # 0
                                  Так и есть, спасибо!

                                  Кто не понял: Настройки системы — в поле поиск по кдючу вводим «count_guests » — ставим «Да»
                  2. Rasul 17 ноября 2014, 21:26(Комментарий был изменён) # +1
                    Выкидывал ошибку, если в базе нет ни одного просмотра. Причем, если в админке авторизован, то просмотр он не считает, а авторизация еще не прикручена.
                    тупо добавил проверку, чтобы он первый просмотр добавлял, вроде заработало.
                    if ($maxuser->get('uid')) {
                            $user = (int) $maxuser->get('uid') + 1;
                        } else {
                            $user = 0;
                        }
                    1. Слава 28 января 2016, 09:28(Комментарий был изменён) # 0
                      Между каких строк вставлять указанный кусок кода? в пхп не бум-бум…
                      А так спорный вопрос в решении Василия в подсчете только авторизованными юзерами — практика доказывает обратное.

                    Авторизация

                    через сервис Loginza:

                    Подписка или RSS

                    Буду присылать новые статьи — никакого спама



                    Шаблоны MODX

                    1 2 Дальше »

                    Объектная
                    модель
                    MODX