Битрикс как добавить переменные в component_epilog из result_modifier

К сожалению (а быть может к счастью) в эпилог компонента падает не весь массив с параметрами. Ниже вы узнаете как добавить в массив переменные, без дополнительных запросов

Как добавить данные из $arResult в component_epilog.php

Без долгих вступлений, начнем. Вам понадобится любой компонент, и 2 файла относящиеся к этому компоненту result_modifier.php и component_epilog.php . Если их еще нет, создайте. В самом конце резалт модифаера пишем следующий код:

// result
$cp = $this->__component; // объект компонента

if (is_object($cp))
{
   // добавим в arResult компонента поля
   $cp->arResult['SPECIAL_LOGO_SRC'] = $arResult['PREVIEW_PICTURE']['SRC'];
   $cp->arResult['SPECIAL_SLIDER_SRC'] = $arResult['DETAIL_PICTURE']['SRC'];
   $cp->arResult['SPECIAL_DESCR'] = $arResult['PREVIEW_TEXT'];
   $cp->SetResultCacheKeys(array('SPECIAL_LOGO_SRC','SPECIAL_SLIDER_SRC', 'SPECIAL_DESCR'));

   // сохраним их в копии arResult, с которой работает шаблон
   $arResult['SPECIAL_LOGO_SRC'] = $cp->arResult['SPECIAL_LOGO_SRC'];
   $arResult['SPECIAL_SLIDER_SRC'] = $cp->arResult['SPECIAL_SLIDER_SRC'];
   $arResult['SPECIAL_DESCR'] = $cp->arResult['SPECIAL_DESCR'];
}

Что мы делаем? Записываем из массива $arResult, который уже содержит все необходимые свойства со значениями, свои уникальные для эпилога.

Теперь, они доступны как в самом template.php так и в эпилоге:

//epilog
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>

<?
$APPLICATION->SetPageProperty('SPECIAL_LOGO_SRC', $arResult['SPECIAL_LOGO_SRC']);
$APPLICATION->SetPageProperty('SPECIAL_SLIDER_SRC', $arResult['SPECIAL_SLIDER_SRC']);
$APPLICATION->SetPageProperty('SPECIAL_DESCR', $arResult['SPECIAL_DESCR']);

Мне пригодилось это при использовании SetPageProperty, который потом используется в header.php . Что делать с футером сайта (footer.php вашего шаблона) вы уже знаете по этой статье.

Если бы не эта возможность, пришлось бы по $arResult[‘ID’] вытаскивать всю необходимую информацию, которые мы и так уже получили.

На этом всё. Всем удачи и терпения 🙂 .

UPDATE Обратите внимание на комментарии

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

3 коментаря

  1. Ну прям костыль какой-то. Если Вы сдавали экзамены по Битрикс или хотя бы готовились, то Вам должно быть известно о такой функции компонента как SetResultCacheKeys(), который принимает массив ключей, которые и будут “прокинуты” в некешируемые части компонента (конкретно в нашем случае – component_epilog.php )

    Для “проброса” из файла компонента:
    $this->SetResultCacheKeys([
    ‘TOTAL_FOR_EXAMPLE’,
    ]);

    Для “проброса” из файла result_modifier:
    $this->__component->SetResultCacheKeys([
    ‘TOTAL_FOR_EXAMPLE’
    ]);

    1. перечитал документацию, действительно работает и так и так, ссылка на эту главу
      https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2975&LESSON_PATH=3913.4565.2975

      Дополню ваш пример для полноты, перед вашим кодом необходимо добавить в массив значение
      $arResult[‘TEST’] = ‘test_value’;
      а затем Для «проброса» из файла result_modifier:
      $this->__component->SetResultCacheKeys([
      ‘TEST’
      ]);

      Благодарю за конструктив 🙂

      1. Работает, но если поменять значение TEST в result_modifier, то оно срабатывает только после сброса кэша, а должно насколько я понял всегда, конкретно в шаблоне catalog.section пробовал. Судя по всему нужно еще и в component.php/class.php лезть, хз.

Залишити коментар до Alex Скасувати коментар