Блок как единица вывода: выбор по коду, размещение в grid/block
В SF4 блок — это повторно используемая единица вывода, которая подключается по коду (а не по ID). Блоки лежат в проектном слое сайта в каталоге:
{site_dir}/simai.data/grid/block/<section>/<block_code>/
Где <section> — логическая секция (например header, sidebar, main), а <block_code> — код конкретного блока (например custom.button). Такой формат удобен тем, что блоки:
- легко переносить между средами вместе с проектом;
- можно переопределять без правок ядра;
- можно подключать в разных местах через разные
VIEW, передавая им разные параметры.
На практике “правильный” вопрос при диагностике всегда один: какой код блока указан в view и существует ли для него реализация в grid/block.
Area-шаблоны внутри view: ...AREA_*_TEMPLATE (например page.title, menu.sidebar)
Внутри VIEW (в grid/view/.../<view_code>/template.php) блоки подключаются через area-шаблоны. Это задаётся параметрами вида:
ROW_<row>_COL_<col>_AREA_<n>_TEMPLATE
Значение такого параметра — код area-шаблона (например page.title, menu.sidebar, banner.list, custom.button). Смысл такой:
VIEWописывает композицию (строки/колонки/какие блоки где стоят),- а конкретная реализация блока находится в
grid/block/....
То есть ...AREA_*_TEMPLATE — это “ссылка” на блок по коду, а не сама вёрстка.
Прокидывание параметров в area-шаблоны: __AREA_CODE__PARAM (например PAGE_TITLE, BANNER_LIST)
VIEW не только выбирает, какой блок вывести, но и передаёт в него параметры. Технически эти параметры приходят в блок в виде массива свойств ($arBlockProperty), и блок сам читает их по ключам.
Важный практический момент SF4: префикс параметров задаётся реализацией блока. Поэтому самый надёжный способ понять, как правильно передавать параметры в конкретный блок — смотреть, какие ключи возвращает файл параметров блока и какие ключи читает template.php.
Эталонный пример из проекта — блок:
{site_dir}/simai.data/grid/block/header/custom.button
Он вычисляет префикс параметров так:
$nameTemplate = strtoupper(basename(__DIR__)); // CUSTOM.BUTTON
И ожидает ключи вида:
CUSTOM.BUTTON__BUTTON_LINKCUSTOM.BUTTON__BUTTON_TEXTCUSTOM.BUTTON__BUTTON_TARGET__BLANKCUSTOM.BUTTON__BUTTON_MODIFIER
Сам вывод блока — обычная ссылка, целиком управляемая этими параметрами:
<a
class="<?=$arBlockProperty[$nameTemplate . "__BUTTON_MODIFIER"]?>"
href="<?=$arBlockProperty[$nameTemplate . "__BUTTON_LINK"]?>"
target="<?=$arBlockProperty[$nameTemplate . "__BUTTON_TARGET__BLANK"] == "Y" ? "_blank" : "_self" ?>"
>
<?=htmlspecialcharsBack($arBlockProperty[$nameTemplate . "__BUTTON_TEXT"])?>
</a>
Как это выглядит при подключении из VIEW: вы ставите custom.button как ...AREA_*_TEMPLATE и рядом задаёте параметры с префиксом CUSTOM.BUTTON:
"BLOCK_SECTION" => "header",
"ROW_0_COL_0_AREA_0_TEMPLATE" => "custom.button",
"ROW_0_COL_0_AREA_0__CUSTOM.BUTTON__BUTTON_TEXT" => "Подать заявку",
"ROW_0_COL_0_AREA_0__CUSTOM.BUTTON__BUTTON_LINK" => "/apply/",
"ROW_0_COL_0_AREA_0__CUSTOM.BUTTON__BUTTON_TARGET__BLANK" => "N",
"ROW_0_COL_0_AREA_0__CUSTOM.BUTTON__BUTTON_MODIFIER" => "btn btn-outline-primary",
Такой подход делает VIEW “оркестратором”, а блок — переиспользуемым кирпичиком: один и тот же блок можно подключать в разных областях, меняя только параметры.
Переопределение блоков: проектная версия в simai.data, ядро не трогать
Правило разработки решений на SF4: ядро и системные реализации не правим, изменения делаем в проектном слое.
Типовой сценарий переопределения блока выглядит так:
- Определить код блока, который используется в
VIEW(значение...AREA_*_TEMPLATE). - Создать/изменить реализацию блока в
{site_dir}/simai.data/grid/block/...(тот же код и секция). - Если блоку нужны настраиваемые параметры — описать их в
.parameters.phpблока (чтобы они появились в UI редактирования) и читать их вtemplate.phpчерез$arBlockProperty. - Стили и скрипты блока добавлять проектно (обычно через
{site_dir}/simai.data/templateили через конфигурацию ассетов проекта — в зависимости от принятой у вас схемы подключения).
Эта модель хорошо сочетается с обновлениями SF4: вы обновляете платформу, а проектные блоки остаются вашими и продолжают работать, потому что завязаны на коды и проектные артефакты.