[REVO] HitsPage - Количество просмотра страниц для MODX Revolution

HitsPageЭто старое маленькое расширение, которое я перписал.
Демонстрационная страница
Проект на GitHub
. Мы не использовали ограничения по IP на просмотр вашего ресурса, так как для такого подсчёта есть старонии сервисы. Главная задача знать количество хитов посещения вашего ресурса и таким образом анализировать, на сколько интересен ваш ресурс.
Интеграция
Для того, чтобы подсчитать количество посещений на вашем ресурсе, вам достаточно на место вывода количества просмотров в шаблоне вашего ресурса установить снипет
[[!HitsPage]]

Вывод количества просмотров в ленте новостей.
При выводе ресурсов через расширения getPage или getResources, зачастую такие ресурсы у нас в кэше и мы не сможем отобразить динамические данные без обновления кэша или, если даже установить некэшированный вызов вывода количества просмотров, то, нужно, чтобы все вложенные чпнки до вызова снипета не кэшированного были тоже не кэшированные. Да и накладно выбирать значения динамическии для каждого ресурса отдельно, поэтому, для вывода количества комментариев в ленте, мы используем плагин, который собирает данные id ресурсов, затем одним запросом выбирает всё с БД и заменяет на актуальные данные.
Для этого в шаблоне вывода ресурса (getPage или getResources), на место показа количество посещений вставляем такой код
{%hp-[[+id]]%}

ВАЖНО! Для того, чтобы активировать плагин на данном ресурсе, нужно в шаблоне вывода ленты вставит вызов снипета
[[HPCount]]
. Это я сделал, для того, чтобы плагин за ненадобности не парсил каждый ресурс.
Дополнительные параметры
Иногда бывает необходимость при выводе ленты новостей к примеру, сортировать вывод по посещаемости.
Для такой возможности, мы записываем копию данных посещения в TV. Для этого, при вызове на странице ресурса снипета HitsPage, мы добавляем параметр записи в TV с именем HitsPage
Вызов сниппета в таком случае будут иметь вид
[[!HitsPage? &saveTv=`true`]]

ВАЖНО! Не забудьте предварительно назначить TV c именем HitsPage к соответствующим шаблонам. где будут стоять вызов сниппета.

Более подробно расписанно на странице помощи

36 комментариев

avatar
О у меня есть похожий плагин но для EVO) надо тоже опубликовать будет )
avatar
Ждёмс…
avatar
Как только согласую с соавтором )
avatar
а можно ссылочку, если уже опубликован?
спасибо
avatar
И всётаки то что он считает КАЖДЫЙ заход на страницу это огромный минус, я в своё время обошелся одним числовым тв параметром и небольшим плагином, который какраз считает один переход от одного пользователя и реализация проще некуда:

<?php

 // Ограничение по шаблону
$tpls = array(1,2);

// берем текущий шаблон
$cyr_tpl = $modx->resource->get('template'); 

// у меня функционал предполагал что пользователи авторизированные 
// являются авторами ресурсов, так что !$user = $modx->getAuthenticatedUser() 
// можно смело убрать если у Вас это не так
if(in_array($cyr_tpl, $tpls) && !$user = $modx->getAuthenticatedUser()){

    // проверка на то чтобы от одного пользователя учитывался только один просмотр
    // вообще элементарная - просто складывать айдишники в переменную сессии
    if (!isset($_SESSION['count_hits'])) $_SESSION['count_hits'] = array();

    // если Id текущего ресурса не встречается, то увеличиваем счетчик
    if (!in_array($modx->resource->get('id'), $_SESSION['count_hits'])) {
        $hits = $resource->getTVValue('count_hits');
        $resource->setTVValue('count_hits', ++$hits);
        $_SESSION['count_hits'][] = $modx->resource->get('id');
    }
}
Комментарий отредактирован 2013-02-23 09:37:20 пользователем vasia123
avatar
у каждого свои цели :), здесь на ЛС тоже минус огромный? или никто не замечает?
Для такой статистики есть сервисы, а меня лично интересует, на сколько интерем вызвал ресурс, не а если и нужна такая статистика вам, то ваше право. Я предложил свой вариант, да и название вроде соответствует цели ru.wikipedia.org/wiki/Хит_(Интернет).
Так-что одному нравиться, другому не нравиться… всем не угодишь :)
Комментарий отредактирован 2013-02-23 14:06:03 пользователем artdevue
avatar
Хм, ну если так подходить к вопросу то да, у нас немного разные цели, и соответственно названия — у меня считаются посещения, а у Вас просмотры.
avatar
ну а допилять под свои нужды снипет, думаю не есть проблема. Тут на мой взгляд более интерестно отдача результата в ленте, т.е. одним запросом в полностью закэшируемом ресурсе, плюс я не дёргаю за ненадобностью плагином каждый ресурс.
avatar
Ну у меня тоже не каждый ресурс дергается а только те, шаблоны которых указаны, и в случае если ресурс был уже посещен то проходит всего 3 if'а, а это не сильно затратно по ресурсам. Небольшая задержка(и то не факт что большая) только при первом посещении, и то в дальнейшем она не повторяется.
Комментарий отредактирован 2013-02-23 11:13:33 пользователем vasia123
avatar
я за ленту говорю, там где вы выводите сразу у несколько ресурсов счётчик.
hitspage.artdevue.com/ru/demo-hitspage/
как вы выводите в таком случае?
avatar
Поскольку все делается через тв, то можно использовать всё что угодно, например getResources тоже справится за одни запрос.
avatar
:) вы попробуйте, потом скажите :) У вас бубт выводиться не актуальные данные, так как не будут обновляться параметр. Или, нужно вызывать всё не кэшированное, что не легко на ресурс, как вам кажеться на первый взгляд.
Ради интереса покрутите по свободе. потом поймёте о чём я говорю.
avatar
Ах вот Вы о чем… Да… Действительно, не знаю как оно себя поведет при обновлении, но тогда может пригодиться Ваш плагин. А если составить решение из моего плагина и Вашего, то получится вообще довольно близкий к идеалу вариант :)
avatar
Как будет считать просмотры страниц ваше решение если я отключу у себя куки в браузере?
А я знаю как!
Комментарий отредактирован 2013-02-23 11:40:13 пользователем vanchelo
avatar
Угу, именно так, а теперь расскажите сколько пользователей на реальном сайте отключат куки ради того чтобы накрутить количество просмотров обычной новости? На самом деле этот вопрос можно решить, но тогда сложность реализации резко подскочит… А здесь основной упор делается какраз в сочетание простоты и удобности.
Комментарий отредактирован 2013-02-23 11:44:42 пользователем vasia123
avatar
Точно, нужно отдельную табличку делать где IP хранить) но это лишнее
avatar
Вот именно) Зачем заводить отдельную таблицу к которой потом надо будет делать каждый раз запрос когда можно все хранить в переменной сессии которая доступна как локальная?
avatar
Есть проблема:
у TV установлено значение по-умолчанию, но оно не подхватывается, т.к. оно не записывается в базу.
И поэтому для того, чтобы счетчик заработал, нужно вручную его прописывать и сохранять. Это доставляет неудобства.
avatar
не совсем понял, где вы прочитали, чтобы у TV устанавливать значение по умолчанию?
в TV будут писать копия с пропортиес.
И поэтому для того, чтобы счетчик заработал, нужно вручную его прописывать и сохранять. Это доставляет неудобства.
можете подробнее объяснить этот момент
avatar
Обновил до версии 2.0.3, исправил небольшой косяк, при записи в TV
avatar
А можно ли вызвать сниппет, чтобы он всего-лишь показывал количество просмотров не записывая новые?
Это нужно для админов, которые по многу раз могут обновлять страницу и накручивать счётчик.
avatar
Добрый день.
У меня возникает проблема при использовании: в ленте новостей, в чанке новости стоит:
[[HPCount]]{%hp-[[+id]]%}

При первом заходе на страницу — показываются просмотры, при обновлении этой же страницы, вместо цифр видно только "{%hp-[[+id]]%}".

на странице самой новости (в общем шаблоне) стоит:
[[*parent:is=`23`:then=`<div class="views mb20">[[!HitsPage]]</div>`]]


В чем может быть причина?
avatar
Добрый день, с кэша не срабатывает видимо плагин.
Какой тип кэша используете? Какая версия php? (не ниже 5,3 должно).
Или сбросьте доступ в ЛК, я гляну, чтобы не гадать на кофейной гуще.
avatar
я не нашол нигде вызова
[[!HPCount]]
hitspage.artdevue.com/ru/help.html, поэтому поставил вывод передв выводом пагинации в ресурсе с id 23 (Новости).
И всё заработало.
avatar
Спасибо. :)

[[HPCount]] стоял в чанке превью новости (newsBit). но без!
avatar
кстати он считает по 2 единицы за 1 просмотр. Можно исправить в снипете HitsPage вот это:
<code>
$tvn = $modx->newObject('modTemplateVarResource');
            $tvn->set('tmplvarid',$tv->id);
            $tvn->set('contentid',$page->get('id'));
            $tvn->set('value',1);
            if($tvn->save()) $view = 1;
</code>
на
<code>
$tvn = $modx->newObject('modTemplateVarResource');
            $tvn->set('tmplvarid',$tv->id);
            $tvn->set('contentid',$page->get('id'));
            $tvn->set('value',1);
            if($tvn->save()) $view = 0;
</code>
$view = 0;
тогда будет считать 1 единицу за один просмотр.
Комментарий отредактирован 2013-09-11 13:29:38 пользователем Electrica
avatar
Доброго всем здоровица.
Пару вопросов по этому модулю.
При установки данного плагина на сервер, я использовал Тотал Коммандер, скачав с github.com/, я залил содержимое папки (docs и elements ) в core/components, поидее затем один файл должен появится в сниппетах, другой в плагинах, но этого не произошло?
Тогда я сам создал сниппеты, скопировав содержимое из core/components/hitspage/elements/snippet и точно также из папки с плагином, затем установил в плагине Системные события-OnWebPagePrerender.
В чанке, который выводит новости из страниц с комментариями(там где расположена сама новость) на главной странице прописал данный плагин в нужное мне место
[[!hpCount]](пробовал и без !)
{%hp-[[+id]]%}

Вопрос: Почему данный модуль не встал у меня сам, а мне пришлось прописывать в ручную
2.И почему не происходит подсчёт просмотренных страниц
Сайт:http://www.timelapseart.com/
Большое сенкс за ваши ответы.
avatar
1)Потому… ну, если вы не можете установить с репо, тогда нужно было скачать установочный пакет modx.com/extras/package/hitspage
забросить его в пакеты core/packages, и установить его локально.
2) вроде происходит, по крайней мере сейчас
avatar
Спасибо за вашу помощь. С первым пунктом я разобрался, действительно, скачав по указанной ссылке, и залив как вы указали, и плагин и снипеты появились в Элементах. А вот подсчитывать колличество просмотров, пока ни как:
Я в чанке:main-news, прописал:
[[!HPCount]]
[[%hitspage]]{%hp-[[+id]]%}
показывает лишь {%hp-[[+id]]%}, если прописывать так:
[[!HitsPage? &saveTv=`true`]]
то идёт подсчёт по порядку каждой новости, т.е там ик семь например первая-1, вторая два и т.д и при обновлении страницы, к первой добовляется плюс 7, т.е уже она начибается с восьми. Может, я что-то упустил, и надо ещё где-то прописывать?
И снова большое спасибо.
avatar
Перерыв весь интернет, даже звонил Билу, типо Гейцу, получилось!!!
вот код:
[[!HPCount]]
[[AjaxSnippet?
&snippet=`getResources`
&parents=``
&tpl=`rating-lst`
&showHidden=`0`
&includeTVs=`LikeDislike`
&tvPrefix=``
&sortbyTVType=`integer`
&sortbyTV=`LikeDislike`
&limit=`5`
&as_mode=`onload`
]]
[[+MyPlaceholder]]
[[%hitspage]][[!+properties.hitspage.hitts]]

в HPCount изменил на это:
<?php
$output = $modx->getPlaceholder('MyPlaceholder');
if (preg_match_all ("/{%hp-(.*?)%}/",$output, $hp_list)) {
// If the array is not empty, choose the number of comments on the resource id (column rid)
if (is_array($hp_list)) {
array_walk($hp_list[1], 'intval');
$hp = $modx->newQuery('modResource', array('id:IN' => $hp_list[1]));
$hp->select(array('modResource.id','modResource.properties'));
if ($hp->prepare() && $hp->stmt->execute()) {
$resultsHp = $hp->stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($resultsHp as $rHp) {
$objHP = json_decode($rHp['properties']);
if (in_array($rHp['id'],$hp_list[1])) {
$hp_list[1][array_search($rHp['id'],$hp_list[1])] = intval($objHP->hitspage->hitts);
}
}
}
}
// Replace all your templates in the resource to the correct values
$output = str_replace($hp_list[0], $hp_list[1], $output);
$modx->setPlaceholder('MyPlaceholder',$output);
}
avatar
modx revo! (вместо здравствуйте)
не могу определиться возможен ли счетчик посещений сайта. именно сайта, а не отдельных страниц.если это возможно подскажите название счетчик или принцип подсчета
avatar
Принцип подсчета — проверять наличие куки у посетителя. Если куки нет — выдавать и увеличивать счетчик; иначе ничего не делать. Реализовать можно плагином, а можно сниппетом, как в топике.
avatar
Без проверки куки применяются те же плагины сниппеты?
avatar
Н-дя. Тгда такой вопрос: hitspage для каждой страницы имет результат посещений.
возможно-лт суммировать эти результаты. И как это сделать
avatar
можно — сохраняет в tv параметр документа
[[!HitsPage? &saveTv=`true`]]
тут же в статье и написано
Нужно создать TVпараметр HitsPage самому
А по сабжу — спасибо автору!
Комментарий отредактирован 2015-09-03 18:31:39 пользователем sanch0ss
avatar
А будет ли работать дополнение для Galery? пытаюсь выводить количество просмотров альбомов, увы не получается(( пишет 0.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.