Drupal 7 - счетчик гостей онлайн. Доработка модуля User.

Вид измененного блока "Сейчас на сайте":

Drupal 7 счетчик гостей

Небольшое предисловие

Итак, как я выяснил, более внимательно приглядевшись к стандартному блоку "Сейчас на сайте", он показывает лишь количество авторизованных пользователей. Потому далее я покажу пример доработки стандартного блока путем добавления счетчиков для поисковых роботов, включая роботов Яндекса и Google, а также счетчиков гостей онлайн. Принцип действия: из системных друпаловских таблиц  SQL-запросами вытягиваются данные о хостах.

Модуль и ссылка для скачивания условно-готового варианта

Править код ядра ручками мы не будем, т.к. это немного противоречит основным идеологическим, да  техническим особенностям системы. Потому напишем отдельный модуль. Скачать получившийся далее модуль все читатели моего бложика могут вот здесь.

<?php
/*
 * Ставим hook_block_view_MODULE_DELTA_alter()
 */
function guestscounter_block_view_user_online_alter(&$data, $block) {
	$data['content'].=GuestsCounter_users_online();
} 

/*
 * Собственно, счетчик гостей онлайн
 */
function GuestsCounter_users_online() {
	// Список поисковых роботов-индексаторов
	$irobots = array('google',
					 'yandex',
					 'bing',
					 'yahoo',
					 'fatlens',
					 'baidu',
					 'spider',					 
					 'thefind', 
					 'altavista',
					 'bot',  
					 'crawl');
	
	// Вычисляем временной интервал по истечении, которого данные будут пересчитаны
	$interval = REQUEST_TIME - variable_get('user_block_seconds_online', 900);

	$result='<br />';
	// Максимальное количество хостов к показу, данные берутся из стандартных настроек блока
	$max_users = variable_get('user_block_max_list_count', 10);

	// Собственно, считаем сколько же у нас посетителей сейчас на сайте. Выводим их IP-адреса
	$guest_count = db_query("SELECT COUNT(DISTINCT s.hostname) FROM {sessions} s WHERE s.timestamp >= :timestamp", array(':timestamp' => $interval))->fetchField();
	$result.="Всего гостей: $guest_count";
	$sData=array(); $gData=array();
	if ($guest_count && $max_users) {
		$items = db_query_range('SELECT DISTINCT s.hostname, MAX(s.timestamp) AS max_timestamp FROM {sessions} s WHERE s.timestamp >= :interval ORDER BY max_timestamp DESC', 0, 10000000, array(':interval' => $interval))->fetchAll();
		$i=0;
		for ($i=0;$i<count($items);$i++){
			$ips[$i]=$items[$i]->hostname;
		}
		$ips=array_unique($ips);
		foreach ($ips as $ip){
			$host=preg_replace('/[^a-zA-Z\.]/', '', gethostbyaddr($ip));
			if ($host=="...") $host="Хост не определен.";
			$spider=0;
			foreach ($irobots as $spider){
				if (strpos($host, $spider)!==false){
					$spider=1;
					break;
				}
			}
			if ($spider==1){
				$sData[]=array('ip'=>$ip, 'host'=>$host);
			} else{
				$gData[]=array('ip'=>$ip, 'host'=>$host);
			}
		}
	}
	$result.="<p>Поисковики:";
	if (isset($sData) && count($sData)>0){
		$i=0;
		$result.="<ul>";
		foreach ($sData as $d){
			$result.="<li>".$d['host'].", ".$d['ip']."</li>";
			if ($i>$max_users){ break; }
			$i++;
		}
		$result.="</ul></p>";
	} else {
		$result.=" нет.</p>";
	}
	return $result;
}

После активации модуля (он будет в группе модулей ядра админки) ничего настраивать не требуется. Разумеется за искючением того, что вам придется закинуть дефолтный "Who is online" в интересующий вас регион.

Основной код реализации взят с сайта http://www.phpcodester.com/2011/04/drupal-7-block-for-whos-online-with-guests/. Я всего лишь убрал функционал, дублирующий стандартные возможности Drupal 7, а также поставил хук на показ вышеупомянутого блока. Претензии не принимаются, информация представлена в виде "как есть", т.е. исключающим всякую ответственность. Модуль тестировал пока только на localhost.





© 2012-2014 Druweb.ru. Вы можете спокойно копировать любые материалы сайта только при наличии обратной ссылки.