14.04.2018 04:30:09 pm
Я создал тему: Last-Modified - время последнего изменения записи, теперь я хочу рассказать, как я данный код прикрутил к движку phpFox, я это сделал в виде библиотеки phpFox. Значит, я создал файл "header.class.php" и залил его в папку: "include/library/phpfox/seo/", содержимое файла:
Теперь остается подключиться к методу lastModified с разных модификаций движка, давайте начнем:
Открываем (Модуль Блог): "module/blog/include/component/controller/view.class.php", находим:
Ниже добавляем:
Далее открываем (Модуль Форум): "module/forum/include/component/controller/thread.class.php", находим:
Ниже добавляем:
Внимание: будьте внимательны при поиске и замене кода, мои переменные отличаются от переменных, что были написаны в движке разработчиками. Я изменяю внешний вид переменных.
<?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
Внимание: будьте внимательны при поиске и замене кода, мои переменные отличаются от переменных, что были написаны в движке разработчиками. Я изменяю внешний вид переменных.
- Жалоба
11.05.2018 12:24:07 pm
Переделал у себя обработку последнего изменения страницы. Переименовал папку "seo" в "header", собственно название класса тоже сменилось на
Сам класс выглядит так:
Все строки в разных контролерах теперь не нужны, их следует удалить. Тут достаточно добавить одну строчку кода в "index.php", что находится в корне сайта:
Строку следует размещать над:
Таким образом, если браузер имеет самую свежею версию документа, функция run() не стартанет.
Для добавления модов для работы с заголовком, добавляйте по аналогии поля модификаций:
Внимание: работа с заголовком происходит только если посетитель сайта является гостем (неавторизованный пользователь).
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');
}
Внимание: работа с заголовком происходит только если посетитель сайта является гостем (неавторизованный пользователь).
11.05.2018 06:46:28 pm
Класс переписан, тут совмещено с: Обновление статических файлов на стороне клиента в 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
}
11.02.2024 09:36:21 am
Поправил метод, теперь он выглядит так:
В модулях: Опрос, Фото и Видео, не оказалось в их таблицах поля
// Last Modified
public function lastModified()
{
if (phpfox::isUser())
{
return false;
}
$request = phpfox::getLib('request');
if (!$module = $request->get('req1'))
{
return false;
}
if (in_array($module, ['blog', 'photo', 'poll', 'video']))
{
$table = $module;
$field = $module . '_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
В модулях: Опрос, Фото и Видео, не оказалось в их таблицах поля
time_update
, мне пришлось их добавить и доработать сценарий обновления записи в БД.