Минималистичный формат данных в Albireo CMS

15-09-2026Время чтения ~ 4 мин.Albireo CMS 4

Меня всегда интересовала возможность использования простого формата данных, где на выходе можно получить обычный 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-кода в них расширяет гибкость. При этом система остаётся отказоустойчивой и не ломается даже при ошибках в коде. Такой подход может быть полезен в проектах, где важна простота и предсказуемость формата.

Похожие записи
Оставьте комментарий!