Откуда пришёл пользователь на сайт

Ради эксперимента добавил блок - Откуда пришел пользователь, видный только администратору сайта. В блоке выводится IP пользователя и рефферер. Сейчас расскажу, как я делал.

Первым делам создаем новую таблицу в БД - phpfox_user_entered, у меня префикс phpfox_, если у вас другой, следует его изменить. В таблице четыре поля:
  • enter_id тип: int(11) Дополнительно: AUTO_INCREMENT
  • user_ip тип: varchar(25)
  • referrer тип: text
  • time_stamp тип: int(15)

Создаю файл: shadowing.class.php с таким содержимым:
<?php
class User_Service_Shadowing extends Phpfox_Service
{
	// Запись: Откуда пришел гость
	public function entered()
	{
		$request = Phpfox::getLib('request');

		$referrer = $request->getServer('HTTP_REFERER');
		if (!Phpfox::isUser() && $referrer && parse_url($referrer, PHP_URL_HOST) != Phpfox::getParam('core.host'))
		{
			$ip   = $request->getIp();
			$time = PHPFOX_TIME - 86400;

			$enterId = $this->database()
				->select('enter_id')
				->from(Phpfox::getT('user_entered'))
				->where('user_ip = \'' . $ip . '\' AND time_stamp > ' . (int) $time)
				->execute('getSlaveField');

			if (empty($enterId))
			{
				$this->database()
					->insert(Phpfox::getT('user_entered'), array(
						'user_ip'    => $ip,
						'referrer'   => $referrer,
						'time_stamp' => PHPFOX_TIME
					)
				);
			}
		}
	} // Запись: Откуда пришел гость END

	// Получение: Откуда пришел гость
	public function getEntered()
	{
		$rows = $this->database()
			->select('*')
			->from(Phpfox::getT('user_entered'))
			->order('enter_id DESC')
			->limit(5)
			->execute('getSlaveRows');

		if (empty($rows) && !count($rows))
		{
			return null;
		}

		$count = count($rows);
		for ($i = 0; $i < $count; $i++)
		{
			$rows[$i]['link'] = '<a href="' . $rows[$i]['referrer'] . '" title="' . $rows[$i]['referrer'] . '" class="row_sub_link" target="_blank">' . (mb_strlen($rows[$i]['referrer']) > 28 ? mb_substr($rows[$i]['referrer'], 0, 28) . '...' : $rows[$i]['referrer']) . '</a>';
		}

		return $rows;
	} // Получение: Откуда пришел гость END
}

И закидываю его в папку: module/user/include/service/.

Создаю файл: entered.class.php с содержимым:
<?php
class User_Component_Block_Entered extends Phpfox_Component
{
	public function process()
	{
		if (!Phpfox::isAdmin())
		{
			return false;
		}

		$rows = Phpfox::getService('user.shadowing')->getEntered();

		if (empty($rows))
		{
			return false;
		}

		$this->template()
			->assign(array(
				'sHeader' => Phpfox::getPhrase('track.recently_viewed_by'),
				'rows'    => $rows
			)
		);

		return 'block';
	}
}

Закидываю сюда: module/user/include/component/block/.

Создаю файл: entered.html.php с содержимым:
{foreach from=$rows item=row}
<div style="width: 175px; margin: 0 0 7px 0">
	{$row.link}
	<div class="extra_info">
		<div style="width: 45%; float: left; text-align: left;">
			<a href="http://ipgeobase.ru/?address={$row.user_ip}" target="_blank">{$row.user_ip}</a>
		</div>
		<div style="width: 55%; float: right; text-align: right;">
			{$row.time_stamp|convert_time}
		</div>
	</div>
	<div class="clear"></div>
</div>
{/foreach}

Закидываю сюда: module/user/template/default/block/.

Далее в файле: include/library/phpfox/phpfox/phpfox.class.php, в конце функции: run() добавил строчку:
		Phpfox::getService('user.shadowing')->entered();

Теперь создаем новый компонент "entered" и в Менеджере блоков добавляю новый блок с такими параметрами:
Продукт: Core
Модуль: User
Заголовок: Откуда пришел гость
Контролер: --core.index-member
Компонент: --entered
Место: Block 1
Can Drag/Drop: Нет
Активность: Да
И в "User Group Access" ставим галочку только на против администратора.
Вот и все.

В блоке будет отображено пять последних переходов со сторонних сайтов. Переходы с поисковой выдачи Google будут выводится такого вида: https://www.google.com/.