home chevron_right
Уровни: сайт → раздел → страница → пользователь

Наследование: настройки задаются на уровне сайта и могут переопределяться в разделе, на странице и на уровне пользователя (приоритет снизу вверх)link

Логика наследования в 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.

Пример: собрать “эффективные” настройки страницы с учётом наследованияlink

<?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
);