Last-Modified - время последнего изменения записи для phpFox

Я создал тему на странице PHP: Last-Modified - время последнего изменения записи, теперь я хочу рассказать, как я данный код прикрутил к движку phpFox, я это сделал в виде библиотеки phpFox. Значит, я создал файл "header.class.php" и залил его в папку: "include/library/phpfox/seo/", содержимое файла:
<?php
class Phpfox_Seo_Header
{
	// Last Modified
	public function lastModified($timeUpdate)
	{
		if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE']))
		{
			$ifModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
			if (!empty($ifModifiedSince) && $ifModifiedSince >= $timeUpdate)
			{
				header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
				exit;
			}
		}

		$lastModified = gmdate('D, d M Y H:i:s \G\M\T', $timeUpdate);
		header('Last-Modified: ' . $lastModified);
	} // Last Modified End
}

Теперь остается подключиться к методу lastModified с разных модификаций движка, давайте начнем:
Открываем (Модуль Блог): "module/blog/include/component/controller/view.class.php", находим:
		if ((empty($item['blog_id'])) || (isset($item['module_id']) && Phpfox::isModule($item['module_id']) != true))
		{			
			return Phpfox_Error::display(Phpfox::getPhrase('blog.blog_not_found'));
		}

Ниже добавляем:
		// Last Modified
		if (!empty($item['total_comment']))
		{
			$timeUpdate = Phpfox::getLib('database')
				->select('time_stamp')
				->from(Phpfox::getT('comment'))
				->where('type_id = \'blog\' AND item_id = ' . $item['blog_id'])
				->order('comment_id DESC')
				->execute('getSlaveField');

			if ($item['time_update'] > $timeUpdate)
			{
				$timeUpdate = $item['time_update'];
			}
		}
		else
		{
			$timeUpdate = !empty($item['time_update']) ? $item['time_update'] : $item['time_stamp'];
		}

		Phpfox::getLib('seo.header')->lastModified($timeUpdate);
		// Last Modified End

Далее открываем (Модуль Форум): "module/forum/include/component/controller/thread.class.php", находим:
		if (empty($thread['thread_id']))
		{
			return Phpfox_Error::display(Phpfox::getPhrase('forum.not_a_valid_thread'));
		}

Ниже добавляем:
		// Last Modified
		$countPosts = count($thread['posts']);
		if ($countPosts > 1)
		{
			$timeUpdate = $thread['posts'][$countPosts - 1]['time_stamp'];

			$timeStamp = Phpfox::getLib('database')
				->select('time_stamp')
				->from(Phpfox::getT('forum_post'))
				->where('thread_id = ' . $threadId . ' AND time_stamp > ' . $timeUpdate)
				->execute('getSlaveField');

			if (!empty($timeStamp))
			{
				$timeUpdate = $timeStamp;
			}
		}
		else
		{
			$timeUpdate = !empty($thread['time_update']) ? $thread['time_update'] : $thread['time_stamp'];
		}

		Phpfox::getLib('seo.header')->lastModified($timeUpdate);
		// Last Modified End

Внимание: будьте внимательны при поиске и замене кода, мои переменные отличаются от переменных, что были написаны в движке разработчиками. Я изменяю внешний вид переменных.
Переделал у себя обработку последнего изменения страницы. Переименовал папку "seo" в "header", собственно название класса тоже сменилось на Phpfox_Header. Сам класс переписал, теперь по коду он гораздо больше, добавился один запрос, но я думаю, что такой подход, снизит нагрузку на сервер еще на несколько процентов, так как раньше до отдачи|проверки заголовка выполнение кода доходило до файлов контролера, теперь, если файлы страницы актуальной версии имеются в кэше браузера, то до кода контролера PHP интерпретатор не дойдет.

Сам класс выглядит так:
<?php
class Phpfox_Header
{
	// Last Modified
	public function lastModified()
	{
		if (Phpfox::isUser())
		{
			return false;
		}

		$request = Phpfox::getLib('request');
		if (!$module = $request->get('req1'))
		{
			return false;
		}

		if ($module == 'blog')
		{
			$table = 'blog';
			$field = 'blog_id';
			$id = $request->get('req2');
		}
		else if ($module == 'forum')
		{
			$table = 'forum_thread';
			$field = 'thread_id';
			$id = $request->get('req3');
		}

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

		$row = Phpfox::getLib('database')
			->select('time_stamp, time_update')
			->from(Phpfox::getT($table))
			->where($field . ' = ' . (int) $id)
			->execute('getSlaveRow');

		$timeUpdate = !empty($row['time_update']) ? $row['time_update'] : $row['time_stamp'];

		if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE']))
		{
			$ifModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
			if (!empty($ifModifiedSince) && $ifModifiedSince >= $timeUpdate)
			{
				header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
				exit;
			}
		}

		$lastModified = gmdate('D, d M Y H:i:s \G\M\T', $timeUpdate);
		header('Last-Modified: ' . $lastModified);
	} // Last Modified End
}

Все строки в разных контролерах теперь не нужны, их следует удалить. Тут достаточно добавить одну строчку кода в "index.php", что находится в корне сайта:
Phpfox::getLib('header')->lastModified();

Строку следует размещать над:
Phpfox::run();

Таким образом, если браузер имеет самую свежею версию документа, функция run() не стартанет.

Для добавления модов для работы с заголовком, добавляйте по аналогии поля модификаций:
		else if ($module == 'forum')
		{
			$table = 'forum_thread';
			$field = 'thread_id';
			$id = $request->get('req3');
		}

Внимание: работа с заголовком происходит только если посетитель сайта является гостем (неавторизованный пользователь).
Класс переписан, тут совмещено с: Обновление статических файлов на стороне клиента в phpFox.
<?php
class Phpfox_Header
{
	// Last Modified
	public function lastModified()
	{
		if (Phpfox::isUser())
		{
			return false;
		}

		$request = Phpfox::getLib('request');
		if (!$module = $request->get('req1'))
		{
			return false;
		}

		if ($module == 'blog')
		{
			$table = 'blog';
			$field = 'blog_id';
			$id = $request->get('req2');
		}
		else if ($module == 'forum')
		{
			$table = 'forum_thread';
			$field = 'thread_id';
			$id = $request->get('req3');
		}

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

		$row = Phpfox::getLib('database')
			->select('time_stamp, time_update')
			->from(Phpfox::getT($table))
			->where($field . ' = ' . (int) $id)
			->execute('getSlaveRow');

		$timeUpdate = !empty($row['time_update']) ? $row['time_update'] : $row['time_stamp'];
		$staticVersion = (int) Phpfox::getLib('template')->getStaticVersion();

		if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE']))
		{
			$ifModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5));
			if (isset($ifModifiedSince) && $ifModifiedSince >= $timeUpdate && $ifModifiedSince >= $staticVersion)
			{
				header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');
				exit;
			}
		}

		$time = max($staticVersion, $timeUpdate);
		$lastModified = gmdate('D, d M Y H:i:s \G\M\T', $time);
		header('Last-Modified: ' . $lastModified);
	} // Last Modified End
}