Знакомьтесь: 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 соответственно).

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

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

  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-версию, пишите.

  9. Юлия

    В версии 3.08 появится «реестр». Это будет третья независимая функция в движке и единственная, которую будет официально запрещено изменять. Мы долго не хотели включать данную функцию в G-Drive, руководствуясь принципом минимализма, но использование переменных $ext и $extra, показывающее предлагаемый механизм введения дополнительных данных, выглядит слишком неопрятно. Кроме того, этот механизм требует внесения правок в основной файл движка при увеличении состава переменных, что тоже не очень хорошо. Поэтому я все же решила включить реестр в G-Drive. Функция скорее всего будет называться extra, чтобы подчеркнуть ее связь с упомянутыми переменными, которые, естественно, будут изъяты из кода движка, но для совместимости вы можете их оставить. Примерный код функции:

    function extra($k=null,$v=null)
    {
      static $a=[];
      if (isset($k))
        if (isset($v)) $a[$k]=$v;
        else return isset($a[$k])?$a[$k]:null;
      else $a=[];
    }
    

    Реестр было решено не адаптировать под хранение строк, потому что в оригинале он представляет собой более универсальное решение. К тому же в строковых операциях и при выводе значение null представляется в виде пустой строки.

    Функция в зависимости от числа передаваемых параметров может выполнять три разных действия:

    1. extra($key,$value) – установка значения, связанного с указанным ключом;
    2. extra($key) – получение значения, связанного с указанным ключом;
    3. extra() – очистка всех значений (очистка реестра).

    Во избежание «смешения действий» крайне не рекомендуется передавать в функцию в любом из параметров значение null.

    Функция не позволяет очистить отдельно взятое значение, но позволяет заменить его любым другим значением, отличным от null.

    Действие по очистке реестра очень похоже на то, которое по умолчанию происходит с переменными $ext и $extra внутри функции error. Соответственно в функцию error будет добавлен вызов extra() вместо действия с упомянутыми переменными.

    Для установки какого-нибудь общего для всех модулей значения вместо основного файла движка можно использовать файл mods/include/dbconfig.php, при этом после вызова функции error, если он случится, это значение в числе всех прочих значений реестра по умолчанию будет очищено. В редких случаях, когда функция mysqli_open вызывается повторно после функции error, будет происходить повторная установка значения. Если очистка значения не требуется и функция mysqli_open используется однократно, внутри файла mods/include/dbconfig.php будет достаточно определить константу.

  10. Юлия

    Вышла версия 3.08 под лицензией MIT. Теперь G-Drive – Open Source!

    Кроме упомянутых выше изменений также добавлена константа INCLUDE_PATH для подключения файлов из отдельного каталога со значением по умолчанию в виде пустой строки, позволяющим использовать список каталогов, указанный в директиве include_path. Предполагаемое использование константы:

    include(INCLUDE_PATH.'краткое имя подключаемого файла');
    

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

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