Наследование: настройки задаются на уровне сайта и могут переопределяться в разделе, на странице и на уровне пользователя (приоритет снизу вверх)
Логика наследования в SF4 практическая и “файловая”: чем ближе настройка к месту применения (странице/пользователю), тем выше её приоритет.
Что подтверждается реализациями конфигурационных классов:
-
Раздел (section) поддерживает наследование по пути через
Section::getRecursionArray($dir): метод проходит директории от корня до целевой и мерджит массивы секционных настроек. Это и есть основной механизм “наследования разделов”. -
Страница (page) хранит значения отдельно по имени файла внутри той же
.property.phpдиректории. Для страницы в типовом сценарии вы берёте:- наследованные значения раздела:
Section::getRecursionArray($dir) - и накладываете значения страницы:
Page::getArray($filePath)
- наследованные значения раздела:
-
Сайт (site) хранит значения в отдельном файле
.site.property.phpи предоставляет API точечного чтения/записиSite::getValue()/setValue(). -
Пользователь (user) в SF4 представлен сессионным хранилищем
Configuration\Property: это быстрые переопределения “на текущего пользователя/сеанс” (storageId чаще всего"user"). Такие значения не пишутся в файловые конфиги и живут, пока живёт сессия.
Важно: сам факт приоритета “снизу вверх” (user → page → section → site) является ожидаемым паттерном системы, но “единый сборщик”, который делает это объединение автоматически одним вызовом, в доступной реализации явно не выделен как единый публичный метод. На практике итоговый массив обычно собирается в коде решения/редактора именно через комбинацию Site/Section/Page/Property.
Пример: собрать “эффективные” настройки страницы с учётом наследования
<?php
declare(strict_types=1);
use SIMAI\Main\Configuration\Page;
use SIMAI\Main\Configuration\Section;
use SIMAI\Main\Configuration\Site;
use SIMAI\Main\Configuration\Property;
$siteId = SF_SITE_DIR; // например "/"
$pageFile = '/catalog/index.php'; // путь к файлу страницы от корня сайта
$pageDir = dirname($pageFile) . '/';
// 1) Сайт (точечное чтение нужных ключей)
$siteSettings = [
'organization_name' => Site::getValue($siteId, 'organization_name'),
];
// 2) Раздел (наследование по пути)
$sectionSettings = Section::getRecursionArray($pageDir) ?? [];
// 3) Страница (настройки по конкретному файлу в текущей директории)
$pageSettings = Page::getArray($pageFile) ?? [];
// 4) Пользователь (сессионные переопределения; storageId "user" — принятый паттерн)
$userOverrides = Property::getArray('user') ?? [];
// Итог: нижние уровни перекрывают верхние
$effectiveSettings = array_merge(
$siteSettings,
$sectionSettings,
$pageSettings,
$userOverrides
);