Знакомьтесь: 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 определяют режим разрешений для объекта: 002 (0) – пустой абстрактный объект, 012 (1) – пустой или непустой абстрактный объект, 102 (2) – пустой абстрактный объект или непустой объект БД, 112 (3) – пустой или непустой объект БД;
  • бит 2 – разрешить присутствие параметра p для пустого объекта;
  • бит 3 – разрешить присутствие параметра p для непустого объекта;
  • биты 4, 5* определяют режим подключения файлов прикладных модулей: 002 (0) – не подключать вспомогательные файлы; 012 (1) – подключать вложенный шаблон, по умолчанию именуемый mods/категория.php*** (выводимая в этом шаблоне информация сохраняется в $page['content']); 102 (2) – подключать заголовочный файл, по умолчанию именуемый mods/категория.h.php***, затем вложенный шаблон; 112 (3) – подключать файл с кодом в контексте открытого первичного соединения с базой данных, по умолчанию именуемый mods/категория.d.php*** (объект, представляющий собой соединение с базой данных, содержится в глобальной переменной $link), затем вложенный шаблон. В любом режиме после подключения вспомогательных файлов будет подключен основной шаблон, если перед его подключением не выполнить выход из приложения;
  • биты 6, 7** зарезервированы для использования в многопользовательских сайтах, но они могут быть использованы программистом и в каких-либо других целях.

* В версиях 3.04-3.08 биты 4, 5 определяли соответственно подключение вложенного шаблона и заголовочного файла, а в версии 3.03 наоборот.

** В версиях 3.03-3.08 бит 6 определял подключение файла с кодом в контексте открытого первичного соединения с базой данных.

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

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

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

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

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

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

Основной шаблон вынесен из основного файла движка в файл, по умолчанию именуемый mods/index.php, при этом, начиная с версии 3.12, его основное имя можно менять динамически при помощи переменной реестра extra('layout') (по умолчанию имеется extra('layout', 'index'), что позволяет использовать прежнее имя mods/index.php).

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

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

  1. Юлия

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

  2. Юлия

    В версии 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 будет достаточно определить константу.

  3. Юлия

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

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

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

    Отвечая на поступающие вопросы, хочу сказать, что, несмотря на либерализацию лицензии, наш способ распространения движка остается прежним – рассылка для тестеров. Приглашение потенциальному тестеру мы отправляем по собственной инициативе. Возможна и платная подписка.

    Тестеров прошу не заниматься активным распространением движка в период его апробации (обычно в течение 1-6 мес. с момента получения), если в предыдущей версии не было обнаружено критических ошибок.

  5. Админ

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

    modeнепустой объект (notempty)сумма mode и notemptyнеобходимость запроса
    0нет (0)0нет
    1нет (0)1нет
    2нет (0)2нет
    3нет (0)3да
    0да (1)1нет
    1да (1)2нет
    2да (1)3да
    3да (1)4да

    Как видно из таблицы, вместо условия

    mode*2 + notempty > 4
    

    можно использовать условие

    mode + notempty > 2
    

    При сдвиге все суммы были бы различны, но в данном случае это несущественно.

  6. Админ

    Фрагмент -./0-9 в описании множества допустимых символов пути можно сократить до --9, т.к. символы дефис (знак минуса), точка, слеш и ноль расположены в кодовой таблице ASCII последовательно друг за другом.

  7. Михаил

    Т.к. в движке используется только один GET-параметр, можно не использовать фрагмент p= и получать значение $pn, просто обращаясь к $_SERVER['QUERY_STRING'].

  8. Михаил

    «Пустое/непустое поле module» – это в терминах PHP, т.е. поле module с нулем тоже считается пустым в данном случае.

  9. Юлия

    Первые два замечания учтены. Кто хочет получить pre-версию, пишите.

    Миш, тоже очень ценные замечания, спасибо. Что касается строки параметров, ради совместимости и возможности расширения пока не буду менять формат адреса. Под строкой параметров все-таки подразумевается выборочный набор параметров без учета порядка, а не строгая иерархия. Получать значение $pn в общем-то можно и из $_GET['p'].

  10. Юлия

    Добавлена новая услуга «Подписка на рассылку G-Drive и получасовая консультация по установке или настройке» (в названии указано суммарное время на подготовку ответов по почте) – 300 руб. Предзаказ можно сделать через форму обратной связи, указав в тексте сообщения фразу «Интересует пакет №13».

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

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