Обновление Albireo (Sqlite, PSR-4, PSR-3 и т.д.)

Сегодня выложил новую версию Albireo. Особый интерес будет представлять то, что я реализовал поддержку PSR-4 (автозагрузку php-классов) и классы для работы с PDO Sqlite.

На Sqlite я сделал несколько новых страниц. Первая — это обычный лог. Он сделал почти по PSR-3 (без наследования его интерфейсов). Вторая — это произвольные опции в виде «ключ-значение». И третья, самая сложная, — это блоки, которые я планирую чуть позже портировать в MaxSite CMS.

Теперь более подробно.

Логирование

Если нужно занести в лог какой-то текст, то делается так:

Logging\Log::alert('text');

Доступны уровни: emergency, alert, critical и т.д. Всё то, что есть в PSR-3. Просмотреть все логи можно на странице в админ-панели:

Когда логов много, то появится пагинация. Пока ещё не решил нужно ли делать удаление записей, по идее для логов этого не требуется. А если нужно очистить всю таблицу, то проще удалить весь sqlite-файл.

Опции

Любая опция состоит из ключа и значения. В какой-то мере можно сказать, что это аля-ушки.

Редактирование и удаление опций сделал через Ajax, поэтому всё работает красиво.

Смысл опций в том, чтобы вынести произвольную настройку или текст в админ-панель, а в теле страницы получать так:

$opt = Options\Options::get('top');
или
$opt = Options\Options::get('top', ['def']);

Поскольку одноимённых опций может быть несколько, то возвращается массив. Если нужно получить строку, то можно использовать implode():

echo implode(Options\Options::get('top'));
// если есть две опции «top»  
Array (
    [0] => 'A'
    [1] => 'B'
 )

Блоки

Теперь самая «вкусняшка». :-) Блоки состоят из основного контента, открывающего, закрывающего, дополнительных полей, а также списка замен.

Вначале выводится простой список. В нём две ссылки — одна на предпросмотр (на ID), другая для редактирования (на названии).

При редактировании доступны все поля и опции блока. В частности можно выбрать парсер блока — пока это только Simple. Можно выполнить PHP в виде нативного кода или шаблонизатора, а также поле order, где можно задать порядок блока для одноименных блоков.

Поле Content хранит основной код блока. Поля Start block и End block нужны для того, чтобы обрамить этот контент. Там можно подключать скрипты или стили. То есть расчёт на то, чтобы иметь возможность без редактирования основного кода, добавить что-то ещё.

Каждый блок можно предварительно посмотреть так, как он будет выглядеть на сайте.

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

У блока могут быть дополнительные параметры:

Есть 5 групп. Это условное деление, которое пригодится, если нужно будет организовать вывод блоков по группам. Пять полей, конечно, много, но это запас на будущее. Сложно сказать какие возникнут потребности, но лучше добавить лишнее поле, чем потом переделывать всю базу.

Поле Info — просто для какой-то дополнительной информации.

Если нужно выполнить замены в коде блока, то можно использовать поле Variables.

В нём указывается текст для замены и текст замены. Разделитель « = ». На скриншоте видно, что фраза «[link]» будет заменена на адрес, а «заголовок» на «Как дела?».

Такая возможность пригодится вебмастерам, которые делают сложные блоки: тексты для клиента можно вынести в виде замен. Это более надёжный способ, позволяющий клиенту не сломать код блока.

Вывод на странице может быть либ по имени блока (блоков), либо по его ID.

echo Blocks\Blocks::out('top'); // блок «top»
echo Blocks\Blocks::outID(7); // блок id 7

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

Автозагрузка php-классов

Здесь настоящий PSR-4. Namespace указывает на каталог «albireo-data» (DATA_DIR), либо на системный albireo/psr4.

Именно поэтому, когда указывается

echo Blocks\Blocks::out('top');

Альбирео найдет файл класса в albireo/psr4/Blocks/Blocks.php. Точно также можно разместить в «albireo-data» свои классы и они будут найдены.

Для случаев, когда класс сделан не по PSR-4, можно использовать карту классов (class map). Для этого используется функция addClassmap(), где указывается класс (или namespace) и путь к файлу или каталогу.

addClassmap('log\Model', __DIR__ . '/Model.php');
$m = new log\Model;

Здесь класс log\Modelразмещён в текущем каталоге в файле Model.php.

Либо можно указать только namespace и каталог:

addClassmap('admin\log', __DIR__);
$c = new admin\log\Controller; // admin/log/Controller.php
$m = new admin\log\Model; // admin/log/Model.php
$v = new admin\log\View; // admin/log/View.php

Альбирео сам определит, что указан каталог и автоматом проверит его по namespace и дальше подключит нужный файл класса.

Ну и бонусом — можно использовать Composer — это каталог vendorв базовом каталоге. Подключение автоматом — ничего делать не нужно. :-)

PDO и Sqlite

Все данные хранятся в базе Sqlite. Это обычные файлы, которые по умолчанию находятся в подкаталоге albireo-data/storage. Базы указываются в конфигурацииdbase.php.

Если меняете, то сохраните свой файл перед обновлением Albireo.

Работа с Sqlite происходит через PDO. Для этого я задействовал свою разработку — два класса: PdoConnectдля подключения к базе и PdoQueryдля SQL-запросов. Коннект к базе — это Singleton, поэтому можно не думать о множественных подключениях к одной базе.

SQL-запросы формируются через статичные методы и охватывают основные задачи: получение записей, удаление, вставка, обновление и т.д. Конечно же из коробки — все плюшки PDO. Также я сделал getPagination(), которая возвращает готовые данные для пагинации и sql-запроса с LIMIT/OFFSET.

Класс PdoConnectхорош тем, что возвращает самый обычный объект PDO, а значит не нужны никакие промежуточные абстракции.

Сама по себе работа с базой несложна, хотя и потребует каких-то начальных знаний. Скажем нужно понимать как стоить SQL-запросы. В файлах есть примеры использования.

MVC

Момент будет интересен тем, кто изучает эту концепцию в PHP. Посмотрите на модули blocks, options и log. Я специально их сделал немного разными, чтобы показать подходы к решению задач. Организация файлов может быть произвольной, но в целом все придерживаются «классической» MVC, где контролёр управляет всем, модель — непосредственной работой с базой, а вид — вывод данных. При этом страницы — это часть роутинга (так работает Альбирео), в котором подключается только контролёр, а тот уже рулит как нужно.

Вывод html-кода делается либо в view, либо в нём же через tpl-шаблоны. Это тоже «классический» подход, как например в CodeIgniter.

Куда дальше?

Какое-то время нужно на тестирование новой версии в боевых условиях. Пока задача выловить всех блох, после этого я займусь переносом блоков в MaxSite CMS. Попутно может возникнут другие идеи по Albireo. Так в принципе основные задумки уже реализованы. :-)

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

Комментарий будет опубликован после проверки. Вы соглашаетесь с правилами сайта.

(обязательно)