Регистрируем количество просмотров в MODx
Нередко при разработке проектов на MODx возникает задача выводить в произвольном месте страницы количество просмотров. Казалось бы простая задача, но найти готовое полностью подходящее решение не удалось и было решено собрать собственный велосипед.
При постановке задачи были выбраны основные приоритеты:
- Решение должно соответствовать стандартам MODx и учитывать настройки CMS отвечающие за регистрацию просмотров страниц
- Решение должно быть максимально простым для установки и дальнейшего использования
MODx Evolution позволяет включать и отключать регистрацию посещений как для всего сайта в целом, так и для отдельной страницы. Для этого в настройках сайта существует пункт "Регистрировать посещения", точно такой же пункт есть в настройках каждого отдельного документа. Эти настройки мы обязательно учтем.
Для простоты и элегантности решения, данные о просмотре было решено записывать в таблицу site_content. Это решение позволит в дальнейшем выводить информацию о количестве просмотров текущей страницы в привычной форме [*hits*] и не потребует для этого дополнительных программных решений.
Что ж, приступим. Все что нам осталось, это написать плагин, который будет записывать посещения в табличку базы данных и повесить его на событие OnLogPageHit. Код того, что получилось привожу ниже.
PHP
/*
Hits 1.0.2 by Yurik Dertlyan | yurik@unix.am
Plugin for MODx Evo to register and output page hits
Installation:
- Create plugin with name "Hits" and description "<b>1.0.2</b>"
- 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
$r = mysql_query($sql);
if($r == FALSE){
// Creating hits column
mysql_query('ALTER TABLE '.$document['table'].' ADD COLUMN `hits` INT(10) UNSIGNED NOT NULL');
$r = mysql_query($sql);
}
// 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
<?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
<?php
$id = (isset($output) && $output!='&_PHX_INTERNAL_&') ? $output : $modx->documentIdentifier;
return $modx->db->getValue($modx->db->select('hits',$modx->getFullTableName('site_content'),'id='.$id));
?>
Количество просмотров данной страницы: 2194.