Где лежит и как читается
/.property.php — это файл значений, который лежит внутри конкретной директории сайта (в корне раздела или вложенной папки). И Section, и Page читают один и тот же файл /.property.php, но берут из него разные ветки данных:
SIMAI\Main\Configuration\Sectionработает по пути директории и использует веткуsection.SIMAI\Main\Configuration\Pageработает по пути файла страницы (например,/ru/auth/index.php) и использует веткуpage[<имя_файла>].
Физический путь строится одинаково: DOCUMENT_ROOT + <dir> + "/.property.php".
Как устроен файл: section и page
Файл — обычный PHP, который возвращает массив. Внутри поддерживаются две независимые “секции”:
section— настройки раздела (распространяются на весь раздел и наследуются вложенными директориями).page— настройки отдельных страниц внутри этой директории, ключом выступает имя файла (index.php,404.php,detail.phpи т.п.).
Обе секции могут отсутствовать, если для уровня нечего задавать. На практике встречаются файлы только с section (для раздела) или только с page (для конкретных страниц). Также допустим вариант, когда в одном /.property.php живут обе секции одновременно — это прямо следует из того, как Section и Page читают данные из одного массива.
Ниже — рекомендуемый “универсальный” шаблон, который покрывает оба случая:
<?php
return [
'section' => [
// Общие значения для раздела
'title' => 'Авторизация',
'layout_type' => 'wide-fixed',
'sidebar_show' => 'none',
],
'page' => [
// Переопределения под конкретные файлы в этой директории
'index.php' => [
'title' => 'Вход в личный кабинет',
'show_breadcrumb' => 'N',
],
'404.php' => [
'title' => '404 ошибка. Страница не найдена',
'layout_type' => 'wide-fluid',
],
],
];
Смысл простой: всё, что относится “ко всему разделу”, держим в section, а точечные исключения — в page.
Приоритеты и наследование без путаницы
Когда SF4 собирает итоговые значения, общий ожидаемый порядок такой:
- Сайт:
{site_dir}/simai.data/.site.property.php - Разделы: наследование по пути через
Section::getRecursionArray(<dir>) - Страница:
Page::getArray(<file>) - Пользователь: сессионные переопределения через
Property(часто storageId ="user")
Критическая деталь по разделам: Section::getRecursionArray() проходит путь директории “сверху вниз” и мерджит массивы section из каждого найденного /.property.php. Поэтому если, например, в /ru/.property.php задан layout_type, он автоматически станет базовым для всех вложенных разделов, пока где-то ниже он не будет переопределён.
Практический паттерн организации /.property.php
Чтобы конфигурация оставалась читаемой и управляемой:
- В
sectionдержите “политику раздела”: раскладку, показ сайдбаров, базовые заголовки, параметры грида/области, общие модификаторы. - В
pageдержите только “точечные отклонения”: особыйtitleдля одной страницы, отключение хлебных крошек на landing-странице, отдельныйlayout_typeдля 404 и т.п. - Если вы видите, что одинаковые параметры начинают повторяться в десятках
page[... ], почти всегда лучше поднять их вsectionи оставить вpageтолько различия.
Пример: как собрать “эффективные” значения для страницы (site + section + page + user)
Ниже — рабочий паттерн сборки, который используется в админ-сценариях: сначала берём site-level значения, затем добавляем наследуемые значения раздела, затем накладываем page-level, и в конце — пользовательские переопределения из сессии.
<?php
declare(strict_types=1);
use SIMAI\Main\Configuration\Page;
use SIMAI\Main\Configuration\Section;
use SIMAI\Main\Configuration\Property;
$dirSite = SF_SITE_DIR; // например "/ru"
$dir = '/ru/auth/'; // директория раздела
$pageFile = '/ru/auth/index.php'; // конкретная страница
// 1) Site-level values (файл значений сайта)
$sitePropertyFile = $_SERVER['DOCUMENT_ROOT'] . $dirSite . '/simai.data/.site.property.php';
$siteValues = file_exists($sitePropertyFile) ? (array) include $sitePropertyFile : [];
// 2) Section inheritance (наследование по пути)
$sectionValues = (array) Section::getRecursionArray($dir);
// 3) Page overrides
$pageValues = (array) Page::getArray($pageFile);
// 4) User overrides (session)
$userValues = (array) Property::getArray('user');
// Итог: нижние уровни перекрывают верхние
$effective = array_merge($siteValues, $sectionValues, $pageValues, $userValues);