G-Drive представляет собой программный каркас, позволяющий выполняться разрозненному коду приложения в едином окружении и берущий на себя выполнение ряда рутинных действий, таких как роутинг и выборка требуемых для запрашиваемой страницы данных из базы данных. Разработчик может вносить изменения в код каркаса или добавлять код к отдельным страницам на каждом из следующих трех этапов:
- Выполнение файла в контексте открытого соединения с базой данных. В версиях 3.09-3.13 в качестве альтернативы можно было запускать на выполнение файл в контексте закрытого соединения с базой данных.
- Выполнение вложенного шаблона в контексте открытого в памяти буфера вывода.
- Выполнение общего шаблона, т.е. общего финального обработчика.
Возможность выполнения кода на первых двух этапах определяется значениями битов 4 и 5 поля bits, а также действиями на предыдущем этапе по отношению к последующему.
Выполнение кода на последнем этапе происходит независимо от каких-либо дополнительных условий. Если необходимо прервать выполнение приложения до начала выполнения общего шаблона, рекомендуется сделать это на первом этапе, предварительно закрыв соединение с базой данных при помощи вызова db_close($link)
или $link->close()
. Изначально в каркасе используется один общий шаблон для всех страниц сайта, включая страницы ошибок. Если нужно использовать разные общие шаблоны, следует изменить код каркаса или код единого общего шаблона, либо, начиная с версии 3.12, изменить на одном из предварительных этапов переменную extra('layout')
, в которой хранится имя общего шаблона по умолчанию ('index'
).
Для создания страницы, доступной по адресу /page, необходимо создать соответствующую запись в таблице site_categories, поместив значение 'page'
в поле id и обнулив поле bits. Для добавления к странице дополнительного программного кода необходимо создать соответствующий набор файлов в каталоге mods и установить требуемые биты в поле bits, например можно создать файл вложенного шаблона page.php и установить бит 4 в поле bits.
Для работы со значениями полей таблицы можно использовать ссылки вида $page['имя поля'], например вложенный шаблон страницы может иметь следующий вид:
<h1><?= $page['name'] ?></h1> <?= $page['content'] ?>
Результат выполнения вложенного шаблона сохраняется в $page['content'], заменяя исходное значение этой переменной, и становится доступным для использования в общем шаблоне, например общий шаблон страниц может иметь следующий вид:
<!DOCTYPE html> <html> <head> <title><?= $page['name'] ?> | Site</title> </head> <body> <?= $page['content'] ?> </body> </html>
В результате будет сформирована такая страница: /page (в данном примере HTML-код общего шаблона может незначительно отличаться от показанного выше, например в нем могут присутствовать теги meta, но тег h1 обязательно берется из вложенного шаблона).
Для создания «модульных» страниц, например страницы со списком объектов, хранящихся в таблице базы данных, вместе с шаблонами нужно подключать и контроллер (файл, выполняемый на первом этапе). Этому будет посвящена отдельная статья.
Тем, кто плохо знаком с двоичной системой счисления, будет полезно описанное ниже правило.
Значение поля bits может быть получено путем арифметического или поразрядного логического сложения (операция «логическое ИЛИ») чисел, являющихся степенями числа 2, для установленных битов в соответствии со следующей таблицей:
Т.к. биты 0 и 1 обычно рассматриваются совместно, вместо суммы соответствующих им слагаемых можно использовать просто номер режима разрешений для объекта.
Например, если вы хотите для данной категории разрешить использование адресов только с пустым абстрактным объектом (режим 0), присутствие в адресе параметра p для пустого объекта (за это отвечает бит 2) и подключить файл вложенного шаблона (за это отвечает бит 4 почти во всех версиях), включите в сложение соответственно слагаемые 0, 4 и 16. Сумма этих слагаемых (число 20) и будет значением поля bits.
Как подставлять в шаблон документа данные из бд по указанному id?
Вы можете это делать так, как описано в статье, указывая в поле bits значение 16, а в поле module – основное имя файла шаблона, например page (чтобы не заполнять данные поля вручную одними и теми же значениями для каждой новой записи, можно указать их в качестве значений по умолчанию для данных полей).
Для числовых идентификаторов, особенно если они автоинкрементальные, следует использовать не корневую, а специально созданную для хранения ваших данных таблицу с именем, состоящим из префикса site_ и слага категории, который будет использоваться в адресах страниц, формируемых на основе вашего шаблона (если по каким-то причинам нет возможности задать имя таблицы в соответствии с этими правилами, можно использовать представление, хотя это и не так эффективно). При этом добавлять поля bits и module в данную таблицу не нужно.
Например, для адресов наподобие /page/1, где 1 – это значение id, таблица (или представление) должна называться site_page. Для доступности страниц по указанным адресам нужно создать категорию page в таблице site_categories, указав в поле bits значение 19. При этом нет необходимости что-либо указывать в поле module или даже создавать данное поле. Если этого не сделать, в качестве основного имени файла шаблона будет использован слаг созданной категории, т.е. значение
'page'
.Наглядный пример, показанный ранее на php-форуме:
Создаем шаблон users.php следующего содержания:
Создаем категорию users и пользователя с идентификатором 1 (при наличии автоинкремента идентификатор пользователя указывать в запросе не нужно; ниже он указан исключительно для наглядности):
В итоге получаем страницу по ссылке /users/1.
Таблица пользователей была создана заранее, но ее можно было создать и прямо перед созданием категории users или даже после создания категории users.
Да, я тоже несколько раз показывал подобное на одном форуме, включая создание таблицы объектов.
Поясню для тех, кто не знаком с G-Drive. Фронт-контроллер самостоятельно выполняет дополнительный сценарий, не вызывая контроллер. Т.е. создавать отдельный контроллер не нужно, достаточно подготовить шаблон и данные.
Еще один пример (второй пример там же взяла из данной статьи, дополнив его показом запроса для добавления страницы прямо в таблицу категорий).
Пример с форума:
edit page.php
mysql hyde_db
Готово: http://hyde.pageshop.ru/about
Естественно, страницы можно создавать не только из командной строки, но и, например, в Gency или в phpMyAdmin.
Значения служебных полей (последние два в примере) можно объявить значениями по умолчанию и полностью их скрыть при помощи представления. Также можно использовать двухуровневые адреса (/page/about), тогда в таблице страниц служебные поля будут не нужны.
Код page.php – это не упрощение. Содержимое, дополненное находящимися в нем тегами, будет вставлено в общий шаблон таким же способом ($page['content'] будет содержать результат обработки page.php):
Полный код шаблона с дампом таблицы site_categories можно найти в приложении к статье Создаем простой блоговый шаблон.