home chevron_right
Шаблон структуры `/.property.php`

Где лежит и как читаетсяlink

/.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 и pagelink

Файл — обычный 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.

Приоритеты и наследование без путаницыlink

Когда SF4 собирает итоговые значения, общий ожидаемый порядок такой:

  1. Сайт: {site_dir}/simai.data/.site.property.php
  2. Разделы: наследование по пути через Section::getRecursionArray(<dir>)
  3. Страница: Page::getArray(<file>)
  4. Пользователь: сессионные переопределения через Property (часто storageId = "user")

Критическая деталь по разделам: Section::getRecursionArray() проходит путь директории “сверху вниз” и мерджит массивы section из каждого найденного /.property.php. Поэтому если, например, в /ru/.property.php задан layout_type, он автоматически станет базовым для всех вложенных разделов, пока где-то ниже он не будет переопределён.

Практический паттерн организации /.property.phplink

Чтобы конфигурация оставалась читаемой и управляемой:

  • В section держите “политику раздела”: раскладку, показ сайдбаров, базовые заголовки, параметры грида/области, общие модификаторы.
  • В page держите только “точечные отклонения”: особый title для одной страницы, отключение хлебных крошек на landing-странице, отдельный layout_type для 404 и т.п.
  • Если вы видите, что одинаковые параметры начинают повторяться в десятках page[... ], почти всегда лучше поднять их в section и оставить в page только различия.

Пример: как собрать “эффективные” значения для страницы (site + section + page + user)link

Ниже — рабочий паттерн сборки, который используется в админ-сценариях: сначала берём 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);