G-Drive. Быстрый старт

G-Drive представляет собой программный каркас, позволяющий выполняться разрозненному коду приложения в едином окружении и берущий на себя выполнение ряда рутинных действий, таких как роутинг и выборка требуемых для запрашиваемой страницы данных из базы данных. Разработчик может добавлять код к отдельным страницам на каждом из следующих четырех этапов:

  1. Выполнение в контексте открытого соединения с базой данных.
  2. Выполнение заголовочного файла.
  3. Выполнение вложенного шаблона в контексте открытого в памяти буфера вывода.
  4. Выполнение общего шаблона, т.е. общего финального обработчика.

Возможность выполнения кода на каждом из первых трех этапов определяется значением соответствующего бита поля bits.

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

  • разместить полный шаблон в заголовочном файле и добавить в его конец код завершения приложения (команду exit);
  • разместить полный шаблон в заголовочном файле, оставив в файле общего шаблона только код завершения приложения или полностью очистив его;
  • разместить полный шаблон в файле вложенного шаблона, оставив в файле общего шаблона только код для вывода результата выполнения вложенного шаблона, т.е. значения $page['content'].

Для создания страницы, доступной по адресу /page, нужно создать одноименную запись в таблице site_categories (поместить в поле id значение page), обнулив при этом поле bits. И далее в любом порядке при необходимости создать файл вложенного шаблона page.php с нужным содержимым и установить бит 4 поля bits, создать заголовочный файл page.h.php с нужным содержимым и установить бит 5 поля bits, создать файл для работы «в контексте открытого первичного соединения с базой данных» page.d.php с нужным содержимым и установить бит 6 поля 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>

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

  1. Всеволод

    Мне нужно добавить дополнительный общий шаблон, но так чтобы можно было работать с вложенными шаблонами, как и раньше.

    Вы написали, что можно изменить код движка, но как именно? Я могу это сделать и сам, но хотелось бы увидеть ваши рекомендации.

  2. Админ

    Укажите в последней строке кода движка в качестве имени шаблона не 'index.php', а, например, $extra.'index.php' (вместо использования $extra можете определить специальную переменную для этих целей – смотрите начало кода движка и начало функции error) и изменяйте в коде модуля значение переменной $extra, добавляя в нее нужный префикс имени файла альтернативного шаблона.

    Если требуется только один альтернативный шаблон, можно использовать для его подключения установленный бит 7 поля bits. Назначение данного бита не строго регламентировано в описании, к тому же можно совместить его предполагаемое назначение и его использование в качестве селектора шаблона, если вы хотите использовать альтернативный шаблон для какого-то закрытого раздела сайта. Примеры формирования имени шаблона:

    // 0.php или 1.php (если не установлены биты старше 7-го)
    include(PATH.($r0['bits']>>7).'.php');
    
    // 0.php или 128.php
    include(PATH.($r0['bits']&128).'.php');
    
  3. Михаил

    Если вернуться к разговору об использовании полных шаблонов, то в последней строке кода движка вместо 'index.php' можно написать $r0['module'].'.php' и отказаться от использования вложенных шаблонов (можно даже удалить код для работы с вложенными шаблонами, расположенный перед последней строкой кода движка), заменив их полными.

  4. Админ

    Начиная с версии 3.08, для добавления префикса имени файла альтернативного шаблона вместо переменной $extra следует использовать одноименную функцию, например:

    extra('template-prefix','my_');
    

    Эта же функция позволяет получить установленное значение, причем беспокоиться о «неопределенности значения» не нужно, даже если его установка не происходит, например:

    require(PATH.extra('template-prefix').'index.php');
    
  5. Админ

    Тем, кто плохо знаком с двоичной системой счисления, будет полезно описанное ниже правило.

    Значение поля bits может быть получено путем арифметического или поразрядного логического сложения (операция «логическое ИЛИ») чисел, являющихся степенями числа 2, для установленных битов в соответствии со следующей таблицей:

    Т.к. биты 0 и 1 обычно рассматриваются совместно, вместо суммы соответствующих им слагаемых можно использовать просто номер режима разрешений для объекта.

    Например, если вы хотите для данной категории разрешить использование адресов только с пустым абстрактным объектом (режим 0), присутствие в адресе параметра p для пустого объекта (за это отвечает бит 2) и вызывать файл вложенного шаблона (за это отвечает бит 4), включите в сложение соответственно слагаемые 0, 4 и 16. Сумма этих слагаемых (число 20) и будет значением поля bits.

  6. Habina

    Как подставлять в шаблон документа данные из бд по указанному id?

  7. Админ

    Вы можете это делать так, как описано в статье, указывая в поле bits значение 16, а в поле module – основное имя файла шаблона, например page (чтобы не заполнять данные поля вручную одними и теми же значениями для каждой новой записи, можно указать их в качестве значений по умолчанию для данных полей).

    Для числовых идентификаторов, особенно если они автоинкрементальные, следует использовать не корневую, а специально созданную для хранения ваших данных таблицу с именем, состоящим из префикса site_ и слага категории, который будет использоваться в адресах страниц, формируемых на основе вашего шаблона (если по каким-то причинам нет возможности задать имя таблицы в соответствии с этими правилами, можно использовать представление, хотя это и не так эффективно). При этом добавлять поля bits и module в данную таблицу не нужно.

    Например, для адресов наподобие /page/1, где 1 – это значение id, таблица (или представление) должна называться site_page. Для доступности страниц по указанным адресам нужно создать категорию page в таблице site_categories, указав в поле bits значение 19. При этом нет необходимости что-либо указывать в поле module или даже создавать данное поле. Если этого не сделать, в качестве основного имени файла шаблона будет использован слаг созданной категории, т.е. значение page.

  8. Михаил

    Вчера на серче появилась тема, в которой спрашивали про простой фреймворк для формирования однотипных станиц на основе шаблонного файла, в который бы «вносились тайтл, текст и фотка». Я посоветовал использовать для этого G-Drive и какую-нибудь оболочку для работы с БД, а для загрузки фото – файл-менеджер хостинг-панели, чтобы не писать CRUD, загрузку файлов и авторизацию (Gency я не предлагал). В вопросе также говорилось о необходимости создания статического html-файла после первоначального ввода упомянутых выше данных. Я предложил заменить последнюю строку основного файла движка на такой код:

    ob_start();
    require(PATH.'index.php');
    file_put_contents(ROOT_PATH.$page['id'],$file=ob_get_clean());
    
    echo $file;
    

    Или вынести данный код в финальный обработчик (при этом, естественно, следует использовать другое имя шаблонного файла).

    В вопросе говорилось о том, что корректировать html-файл пользователь уже будет вручную. Но я предложил просто удалять этот файл, а редактировать данные в БД, чтобы обновленный файл создавался повторно и его содержимое соответствовало данным в БД.

  9. Михаил

    Вариант без использования переменной $file:

    ob_start();
    require(PATH.'index.php');
    file_put_contents(ROOT_PATH.$page['id'],ob_get_contents());
    
    echo ob_get_clean();
    

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

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