В сайтах на основе Простой модели могут автоматически выводиться страницы объектов коллекции. Это связано с тем, что каркасный код таких сайтов обычно автоматически выводит страницы объектов стандартных коллекций (категорий, имеющих режим разрешений 2 или 3). Но подобные страницы нужны не всегда, например для «микроблога» может быть достаточно вывода сообщений только в ленте сообщений. Разберем этот случай на примере коллекции info и ее объекта с идентификатором 1.
Конечно, в этом случае проще всего прямо в контроллере вызвать обработчик ошибки 404 или пробросить соответствующее исключение, например в G-Drive контроллер коллекции info можно дополнить следующим кодом:
if (isset($r1)) { error(404); return; }
Но для Gency такой способ имеет один недостаток, если в ней нужна функция просмотра объектов коллекции в пользовательском представлении, потому что данная функция реализуется при поддержке «головной» части сайта. Если это необходимо, просмотр объекта должен быть обеспечен при запросе по адресу /info/1 к «головной» части сайта. По данному адресу можно непосредственно выводить страницу объекта или выполнять перенаправление. Допустим, такая функция нужна.
Вместо отключения страниц объектов коллекции обычно достаточно запретить их индексацию. Для этого в файле robots.txt можно использовать следующую директиву:
Disallow: /info/
Данный запрет не затрагивает страницу по адресу /info, поэтому на ней можно разместить, например, ленту сообщений «микроблога». (Но если используется адресация с завершающим слешем, то страница по адресу /info/ уже попадает под действие этой директивы, так же как и /info/1.)
Адресам страниц объектов коллекции можно найти и полезное применение. Например, их можно использовать для перенаправления на соответствующие сообщения ленты сообщений. Для многостраничной ленты сообщений от этого будет наибольшая польза: адрес /info/1 будет постоянным, а адрес /info#1 со временем может меняться на /info?p=2#1 и т.д. В G-Drive такая функция может быть реализована следующим образом:
<?php // G Drive Pi or greater is required. require INCLUDE_PATH.'redirect.php'; require INCLUDE_PATH.'pagelink.php'; require PATH.'include/pnbyid.php'; if (isset($r1)) { if ($page['active']) { rotation01(1); // в адресе первой страницы не должно быть "?p=1" redirect(pagelink(pnbyid($page['id']), '').'#'.$page['id']); } else { error(404); } return; } // здесь можно разместить код для ленты сообщений
Пример реализации функции pnbyid, позволяющей получить номер страницы ленты сообщений, на которой находится сообщение, по идентификатору этого сообщения:
<?php require_once INCLUDE_PATH.'query.php'; function pnbyid($id, $pp = 10) { $table = 'table'; $result = query("SELECT COUNT(*) DIV $pp + 1 FROM `{$table('info')}` WHERE `active` AND `id`>$id"); list($pn) = $result->fetch_row(); $result->free(); return $pn; }
Подобное перенаправление лучше использовать совместно с показанной выше директивой файла robots.txt.
Категория ленты сообщений может отличаться от коллекционной, например лента сообщений может размещаться в пустой категории. В этом случае для отключения страниц по адресам наподобие /info можно использовать режим разрешений 3 (и не создавать пустой объект в коллекции info).
Демонстрация работы перенаправления на примере одностраничной «ленты»: https://p20.ru/features/parking (обратите внимание, как меняется адрес).