Модификация данных в компонентах

В решении есть класс \Astdesign\Marketpro\Components\Modifiers , методы которого подключаются в используемых компонентах. Данные методы позволяют модифицировать данные, которых приходят в шаблоны компонентов и которые эти шаблоны отдают.

Важно: методы должны возвращать обратно входящий массив.

Пример использования

Задача: нужно выводить артикул товара на детальной странице по другому принципу (не из свойства).

Реализация:

Создаём кастомный файл с модификаторами bitrix/modules/astdesign.marketpro/lib/custom/components/modifiers.php

<?php

namespace Astdesign\Marketpro\Custom\Components;

use Astdesign\Marketpro\Solution;

class Modifiers
{
    public static function catalogElement(&$arResult = [], $arParams = [])
    {
       
        $arResult['PROPERTIES']['ARTICUL']['VALUE'] = "#" . $arResult['XML_ID'];

        return $arResult;
    }
}

В данном случае метод catalogElement просто подменяет значение свойства ARTICUL (т.к. базово именно оно отвечает за вывод) на то, что нам нужно.

Ещё один пример

В данном случае метод catalogElementAfter изменяет значение количества бонусов, переопределяя стандартные расчёты решения.

<?php

namespace Astdesign\Marketpro\Custom\Components;

use Astdesign\Marketpro\Solution;

class Modifiers
{
    public static function catalogElementAfter(&$arResult = [], $arParams = [])
    {

        $arResult['JSON']['bonus'] = [
            'value' => round(($arResult['MIN_PRICE']['DISCOUNT_VALUE'] * 3) / 100),
            'description' => Solution::getOption("bonusDescription", "")
        ];

        return $arResult;
    }

}

Все точки, куда можно вклиниться

Методов-модификаторов десять. Пара «метод» и «метод + After» означает «до обработки решением» и «после неё»: в первом вы получаете данные, как их отдал компонент Битрикса, во втором — как их подготовило решение для витрины.

Метод

Что модифицирует

catalogSection

список товаров раздела, до обработки решением

catalogSectionAfter

тот же список после обработки — то, что уедет на витрину

catalogElement

карточка товара, до обработки

catalogElementAfter

карточка после обработки

catalogSmartFilter

умный фильтр, до обработки

catalogSmartFilterAfter

фильтр после обработки

modifyCatalogSectionParams

параметры запроса раздела, а не результат: этим меняют выборку до того, как товары получены

salePersonalOrderList

список заказов в личном кабинете

brandCatalogSections

разделы каталога на странице бренда

modifyBannersAfter

баннеры после обработки

Правила

Возвращайте массив. Решение подставляет возвращённое значение на место своего. Ничего не вернули — считается, что кастомизации нет, и ваши правки потеряются.

Не вызывайте оригинал без нужды. В отличие от других переопределяемых методов, здесь оригинальные модификаторы почти ничего не делают: они — точки расширения. Вызывать штатный метод из своего, как в других статьях, здесь обычно не требуется.

After — для того, что видит покупатель. Если правите то, что уже посчитало решение (цены, бонусы, лейблы, наличие), берите версию с After: иначе решение пересчитает данные после вас и перезапишет правку.

Файл кладётся в lib/custom, а эта папка исключается из пакета обновления — правки сохраняются. Как работает подстановка Custom в имя класса, описано в статье «Кастомизация (переопределение) методов решения».