Знакомьтесь: G-Drive DBE 3

Движком G-Drive DBE теперь буду заниматься я! Все началось около пяти лет назад, когда одному из нас пришла идея создать предельно аскетичный движок, что сразу же и было сделано. С тех пор движок не сильно изменился. Я тоже пока не собираюсь вносить каких-то кардинальных изменений, но кое-что уже успела сделать. Все внесенные изменения и исправления, начиная с версии 3.00, – это дело моих рук. Итак, все по порядку...

В движке в качестве родной реализована ЧПУ-адресация. Адрес имеет следующий формат:

/категория[/объект][?p=натуральное_число]

Путь состоит из двух частей, причем вторая часть может отсутствовать. Если отсутствует вторая часть, то объект считается пустым, т.е. его имя состоит из пустой строки. В этом случае категория также может быть пустой (пустая категория обычно используется для главной страницы сайта).

Имя категории и имя объекта доступны программисту соответственно в строковых переменных $p0 и $p1. Путь доступен в строковой переменной $p, путь без начального и заключительного слешей – в строковой переменной $px. Значение параметра p доступно в целочисленной переменной $pn. Если параметр p отсутствует, переменная $pn будет иметь нулевое значение. Движок позволяет разрешить или запретить присутствие необязательных частей адреса, причем в отдельности для каждой категории.

Суффикс DBE в названии движка говорит о том, что в основе его работы лежит использование базы данных. В G-Drive DBE используются таблицы двух уровней: на одном уровне находится таблица категорий, на другом – таблицы объектов (в некоторых сайтах и административных панелях может быть реализован подход, при котором таблица категорий одновременно является таблицей обоих уровней).

Таблица категорий называется site_categories. Обязательными полями данной таблицы являются символьное поле id и целочисленное поле bits. В поле id хранятся имена категорий в том виде, в котором они должны быть представлены в адресе. В поле bits хранятся флаги разрешений и другая важная для категорий информация:

  • биты 0, 1 определяют режим разрешений для объекта: 00 (0) – пустой абстрактный объект, 01 (1) – пустой или непустой абстрактный объект, 10 (2) – пустой абстрактный объект или непустой объект БД, 11 (3) – пустой или непустой объект БД;
  • бит 2 – разрешить присутствие параметра p для пустого объекта;
  • бит 3 – разрешить присутствие параметра p для непустого объекта;
  • бит 4* – вызывать файл вложенного шаблона, по умолчанию именуемый mods/категория.php***. Вызов файла происходит до начала вывода страницы, однако выводимая в нем информация может быть включена в текст страницы путем вывода в основном шаблоне сайта значения $page['content'], которое будет обновляться в результате установки данного бита;
  • бит 5* – вызывать заголовочный файл, по умолчанию именуемый mods/категория.h.php***. Вызов файла происходит до вызова файла вложенного шаблона;
  • бит 6** – вызывать файл с кодом, работающим в контексте открытого первичного соединения с базой данных, по умолчанию именуемый mods/категория.d.php***. Вызов файла происходит до вызова заголовочного файла;
  • бит 7 зарезервирован для использования в многопользовательских сайтах, однако он может быть использован программистом и в каких-либо других целях.

* Начиная с версии 3.04, в которой биты 4, 5 обменялись своими значениями.

** Начиная с версии 3.03. Объект, представляющий собой соединение с базой данных, содержится в глобальной переменной $link.

*** mods/модуль.php, mods/модуль.h.php, mods/модуль.d.php при наличии в таблице категорий непустого поля module.

Размер поля id и разрядность поля bits при необходимости могут быть изменены программистом.

Для каждой категории, имеющей режим разрешений 2 или 3, необходимо создать таблицу или представление с именем site_категория (дефисы в имени категории будут заменены на символы подчеркивания). Обязательным для данной таблицы или представления является поле id, которое может иметь как символьный, так и целочисленный тип. В этом поле хранятся имена объектов в том виде, в котором они должны быть представлены в адресе. Особо следует отметить, что имя объекта может содержать в том числе и слеш, но только не в начальной и не в заключительной позициях.

В таблицах обоих уровней также рекомендуется разместить текстовые поля name и content.

Все поля таблицы категорий для присутствующей в адресе категории непосредственно доступны программисту в ассоциативном массиве $r0. Все поля таблицы объектов для присутствующего в адресе объекта (непустого объекта категории, имеющей режим разрешений 2, либо пустого или непустого объекта категории, имеющей режим разрешений 3) также непосредственно доступны программисту в ассоциативном массиве $r1. Для абстрактных объектов массив $r1 не создается.

Начиная с версии 3.01, в движок добавлен псевдоним $page, связанный либо с массивом $r1 (если $r1 присутствует), либо с массивом $r0 (если $r1 отсутствует). Это нововведение позволяет избавиться от множества совершенно ненужных ветвлений в коде прикладных модулей.

Основной шаблон сайта вынесен из основного файла движка в файл, по умолчанию именуемый mods/index.php, однако при необходимости программист может объединить эти два файла. Также при необходимости программист может перенести содержимое файлов mods/error.php и mods/include/dbconfig.php непосредственно в основной файл движка (в функцию error и в функцию mysqli_open соответственно).

Ну, вот в общем-то и все. Жду ваших вопросов и комментариев.

Комментарии: 8

  1. Сергей

    Привет. А где можно ознакомиться с движком? Думаю, прежде чем читать об изменениях, нужно иметь хоть какое-то представление о функционале движка.

  2. Юлия

    Весь функционал описан в статье. Единственное существенное на данный момент нововведение, которое не отражено в статье, – это возможность подключения к каждому модулю файла с кодом, работающим в контексте открытого первичного соединения с базой данных. За это отвечает бит 6 поля bits.

  3. Михаил

    Псевдоним $content сейчас не работает внутри заголовочных файлов. Возможно, в будущем он не будет работать и внутри вложенных шаблонов, а только в основном.

  4. Юлия

    Убрала совсем псевдоним $content. При необходимости команду его создания можно поместить на прежнее место:

    $content=&$page['content'];
    

    Только напоминаю, что в контексте открытого первичного соединения с базой данных псевдоним $content не был доступен никогда. В случае размещения команды создания псевдонима перед кодом включения заголовочного файла аналогичную команду нужно также поместить и во все функции обработки ошибок. В последней версии (3.06) таковой является только функция error, а notfound и прочие подобные функции – теперь лишь ее обертки (при желании программист может полностью их изъять из кода движка и выполнять обращения к функции error напрямую, например: error(404)).

    Рассылку версии 3.06 запущу сегодня или в один из ближайших дней.

  5. Юлия

    Статья обновлена.

    Сайт – тоже. Добавила ожидание подтверждения при отправке комментариев для противодействия спаму, а также постоянные ссылки на последние комментарии, например постоянная ссылка на данный комментарий выглядит так: /article/g-drive-dbe-3?p=1#26 (пока текущая страница является последней, должно происходить временное перенаправление).

  6. Юлия

    Вышла версия 3.07. В описании изменений из рассылки забыла упомянуть, что требование версии PHP 5.4.0 обусловлено использованием не только функции http_response_code, но и короткого синтаксиса определения массива.

  7. Админ

    Внимание! При изменении функции error не меняйте (не используйте) глобальную переменную $res. Также не забывайте о глобальной переменной $link.

    Для справки: переменная $res используется в двух местах в коде G-Drive до и после вызова error(404). Возможно, эта паразитная зависимость будет устранена в одной из следующих версий, о чем будет сообщено отдельно.

  8. Юлия

    Исправлено. Также сделана одна важная оптимизация, касающаяся выборки из БД. Кто хочет получить pre-версию, пишите.

Отправить комментарий

Ваш адрес E-mail не будет опубликован.