Меня всегда интересовала возможность использования простого формата данных, где на выходе можно получить обычный php-массив. Так уж получилось, что в процессе развития Albireo CMS этот синтаксис перерос в поля страниц. Визуально это близко к YAML, только намного проще и безопасней.
Поля записи
Поля записи представляют собой простые текстовые строки: одна строка — это одно поле. Например:
title: Заголовок записи description: Описание
Многострочные поля могут представлять собой обычный список:
links: - https://maxsite.org/ - https://maxsite.org/albireo - https://maxsite.org/berry
Или многострочный текст:
text: | текст на несколько строк.
Поля, которые содержат bool-значения могут оформляться так:
# это комментарий # выключено (=false) draft: - draft: 0 draft: false # включенное поле (=true) draft: + draft: 1 draft: вкл draft: on draft: любой текст
Есть еще замены полей, но это сейчас к дело не относится. По сути поля страницы безумно простой формат данных, который ни при каких обстоятельствах не приводит к ошибке парсинга. То есть, в отличие от того же YAML, где каждый символ требует экранирования и строгих отступов, в Albireo CMS можно использовать любое форматирование.
Функция fieldsParse()
Когда-то я выделил парсинг текста с полями в отдельную функцию fieldsParse(), чтобы иметь возможность использовать её не только для парсинга полей страниц, но и вообще произвольно.
Моя идея была в том, чтобы получить механизм получения обычного php-массива с данными в формате полей.
Например у нас есть файл конфигурации, который возвращает обычный массив. Это типовой вариант в Albireo CMS.
return [ # Заголовок/название сайта 'siteTitle' => 'Website on Albireo CMS', # Описание сайта 'siteDescription' => 'The best site', # Год создания сайта - используется в подвалах и т.п. 'siteYearCreation' => '2020', ];
Это массив на PHP, который прост и понятен. Но мы можем представить его в формате полей, например так:
$data = <<<DATA # Заголовок/название сайта siteTitle: Website on Albireo CMS # Описание сайта siteDescription: The best site # Год создания сайта - используется в подвалах и т.п. siteYearCreation: 2020 cacheFrozenDirs: - demo - landings - specific - demo10000 DATA; return fieldsParse($data);
Поскольку fieldsParse() принимает любой текст, то всё равно как именно он будет оформлен. В данном примере используется HEREDOC-синтаксис PHP.
На выходе получается стандартный php-массив:
Array
(
[siteTitle] => Website on Albireo CMS
[siteDescription] => The best site
[siteYearCreation] => 2020
[cacheFrozenDirs] => Array
(
[0] => demo
[1] => landings
[2] => specific
[3] => demo10000
)
)
Такой подход позволяет использовать самый простой (проще не бывает) формат данных для любых своих задач.
PHP в полях
Albireo CMS позволяет своим пользователям выполнять произвольный php-код. В полях это тоже возможно, причём в стандартном синтаксисе PHP. Например:
secretKey: <?= (LOCALHOST ? '' : md5(SITE_URL)) ?> my: <?=42?> debug: <?= intval(LOCALHOST) ?> cookieLifeTime: <?= 24 * 60 * 60 ?> timezone: <?= localtime(time(), true)['tm_isdst'] ? '+03:00' : '+02:00' ?> mybool: 1
Для bool-значений следует указывать числа 0 или 1, либо использовать функциюintval(), которая сама приведёт значение к нужной форме. Здесь есть ограничение по сравнению с обычными полями, посколькуtrueздесь будет воспринято как строка'true'(сfalseаналогично). Поэтому нужно использовать только числа.
У меня была мысль, для php-кода использовать какие-то специальные вставки, по типу tpl-шаблонизатора, но потом я понял, что это просто усложнит жизнь пользователям.
Что происходит, если в php-коде будет ошибка? Ничего страшного. Например если допустить ошибку в php-коде поля, то оно будет возвращено как исходный текст:
# делаем ошибку debug: <?= in tv al(LOCALHOST) ?>
В итоге получится так:
Array ( [debug] =><?= in tv al(LOCALHOST) ?> )
То есть исходный код возвращается в первозданном виде.
Такой подход наиболее отказоустойчивый, поскольку практически нет ситуаций, когда через поля, даже с php-кодом можно что-то сломать. Система будет работать как и прежде, даже если поле некорректное (то есть это уже проблема того, для чего это поле предназначено).
Итого
Возможность использования простого формата полей в Albireo CMS показывает, что даже минималистичный синтаксис может быть удобным и надёжным инструментом для хранения и обработки данных. Функция fieldsParse() делает работу с такими полями универсальной, а поддержка PHP-кода в них расширяет гибкость. При этом система остаётся отказоустойчивой и не ломается даже при ошибках в коде. Такой подход может быть полезен в проектах, где важна простота и предсказуемость формата.