Регистрируем количество просмотров в MODx

Нередко при разработке проектов на MODx возникает задача выводить в произвольном месте страницы количество просмотров. Казалось бы простая задача, но найти готовое полностью подходящее решение не удалось и было решено собрать собственный велосипед.

При постановке задачи были выбраны основные приоритеты:

  • Решение должно соответствовать стандартам MODx и учитывать настройки CMS отвечающие за регистрацию просмотров страниц
  • Решение должно быть максимально простым для установки и дальнейшего использования

MODx Evolution позволяет включать и отключать регистрацию посещений как для всего сайта в целом, так и для отдельной страницы. Для этого в настройках сайта существует пункт "Регистрировать посещения", точно такой же пункт есть в настройках каждого отдельного документа. Эти настройки мы обязательно учтем.

Для простоты и элегантности решения, данные о просмотре было решено записывать в таблицу site_content. Это решение позволит в дальнейшем выводить информацию о количестве просмотров текущей страницы в привычной форме [*hits*] и не потребует для этого дополнительных программных решений.

Что ж, приступим. Все что нам осталось, это написать плагин, который будет записывать посещения в табличку базы данных и повесить его на событие OnLogPageHit. Код того, что получилось привожу ниже.

/*
 Hits 1.0.3 by Yurik Dertlyan | yurik@unix.am
 Plugin for MODx Evolution to register and output page hits
 Installation:
 - Create plugin with name "Hits" and description "1.0.3"
 - Check OnLogPageHit event
 - Enable page hits logging in MODx settings page
 To output hits use [*hits*]
*/
$document = array(
 'id'=>$modx->documentIdentifier,
 'table'=>$modx->getFullTableName('site_content')
);
$sql = 'SELECT donthit,hits FROM '.$document['table'].' WHERE id='.$document['id'];
// MODx DBAPI is not recommended here
$r = mysql_query($sql);
if(!$r) {
 // Creating hits column
 mysql_query('ALTER TABLE '.$document['table'].' ADD COLUMN `hits` INT(10) UNSIGNED NOT NULL');
 $r = mysql_query($sql);
}
if(!$modx->db->getRecordCount($r)) return;
// Merging arrays of document data
$document = array_merge($document, $modx->db->getRow($r));
// Skip logging for manager hits
if($document['donthit'] == 1 || (isset($_SESSION['usertype']) && $_SESSION['usertype'] == 'manager')) return;
// Recording hit to database
$modx->db->update('hits=hits+1', $document['table'], 'id='.$document['id']);

Логика работы плагина достаточно проста:

  • Проверяем, есть ли в табличке site_content столбец hits
  • Если нет, создаем его
  • Проверяем, включен ли для текущей странички параметр "Регистрировать посещения"
  • Если да, и текущий пользователь не менеджер, увеличиваем в базе данных значение количества просмотров текущей странице на 1.

Код сниппета «hits», который выводит количество просмотров на кешируемой странице. Для вызова используйте [!hits!] или [!hits?id=`код документа`!].

<?php
$id = isset($id) ? $id : $modx->documentIdentifier;
return $modx->db->getValue($modx->db->select('hits',$modx->getFullTableName('site_content'),'id='.$id));
?>

Код phx-расширения «phx:hits» Для вызова используйте [*id:hits*], [+id:hits+] или [+phx:hits+].

<?php
$id = (isset($output) && $output!='&_PHX_INTERNAL_&') ? $output : $modx->documentIdentifier;
return $modx->db->getValue($modx->db->select('hits',$modx->getFullTableName('site_content'),'id='.$id));
?>

Количество просмотров данной страницы: 16875.

comments powered by Disqus