Задать вопрос
@Smirator

Как передать значение из компонента в result_modifier шаблона, где компонент вызывается?

Приветствую всех! Есть компонент, в котором получаю количество элементов, это количество элементов нужно передать на вкладку, которая создается в result_modifier страницы, где используется компонент.
Проблема в том, что компонент подключается уже после создания вкладки.
Я пробовал:

1. Первая попытка была передачи через глобальную переменную. В компоненте результатов считаем количество, в глобальную укладываем и передаем. Не работает. Значение складывается в переменную уже после того, как вкладка создана. На вкладке всегда будет 0.
2. Вторая попытка была через передачу параметра в arResult. Вот так: $count_questions = isset($arResult['COUNT_QUESTIONS']) ? $arResult['COUNT_QUESTIONS'] : 0;. Ситуация такая же.
3. Была мысль обратиться к arResult['Questions'], не сработало. На странице нет доступа к нему.
4. Последний вариант пробовал с кешированием, он ниже.

Код:

Компонент:
$count_questions = count($processedQuestion);

$cache = \Bitrix\Main\Data\Cache::createInstance();
$cacheTime = 10; // Время жизни кэша (например, 1 час)
$cacheId = 'count_questions_faq_product'; // Уникальный идентификатор кэша
$cacheDir = '/form_faq_product/';

$count_questions = count($processedQuestion); // Ваш существующий код для подсчета вопросов

// Начинаем кэширование
if ($cache->startDataCache($cacheTime, $cacheId, $cacheDir)) {
    $cache->endDataCache(['COUNT_QUESTIONS' => $count_questions]);
}


result_modifier.php (сюда надо передать):
$cache = \Bitrix\Main\Data\Cache::createInstance();
$cacheId = 'count_questions_faq_product'; // Используем тот же идентификатор кэша
$cacheDir = '/form_faq_product/';

if ($cache->initCache(10, $cacheId, $cacheDir)) {
    $cachedData = $cache->getVars();
    $count_questions = $cachedData['COUNT_QUESTIONS'];
} else {
    $count_questions = 0; // Значение по умолчанию, если кэша нет
}



// Добавляем вкладку с количеством вопросов
$arResult['PROPERTIES']['TABS'][] = array(
    'CODE' => 'FAQ',
    'TITLE' => 'Вопросы о товаре ' . $count_questions, // Отображаем количество вопросов
    'VALUE' => 'FAQ_FORM' // Временное значение
);


Значение, разумеется в компоненте есть. Это проверено. Но во вкладке всегда 0, т.к. не получаем значение.
  • Вопрос задан
  • 78 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 1
не очень подробно описано, поэтому остаётся гадать. Я предполагаю 2 варианта:
1) попроще: где-то вызов компонента С1, в шаблоне которого упомянутый result_modifier.php . Затем, ниже первого вызова, идёт вызов компонента С2, от которого нужны данные.
Тогда просто перенесите вызов компонента С2 выше вызова С1 и оберните:
<?php
ob_start();
$APPLICATION->IncludeComponent( "C2" ...);
$APPLICATION->AddViewContent("view2",  ob_get_clean() );
// там, где компонент был раньше, ставите:
$APPLICATION->ShowViewContent("view2");

Соответственно, в component_epilog.php компонента С2 засовываете нужные значения в $APPLICATION->SetPageProperty() или просто в $GLOBALS

2) Посложнее: компонент С2 вызывается в template.php того же шаблона, которому принадлежит result_modifier.php. Тогда в result_modifier.php будет:
<?php
$arResult['PROPERTIES']['TABS'][] = array(
    'CODE' => 'FAQ',
    'TITLE' => 'Вопросы о товаре #COUNT#', // Отображаем количество вопросов
    'VALUE' => 'FAQ_FORM' // Временное значение
);
, а в template.php выше вывода вкладок:
<?php
$this->SetViewTarget("view2");
$APPLICATION->IncludeComponent( "C2" ...);
$this->EndViewTarget();
// передача значения - аналогично первому варианту. Допустим, через $GLOBALS
// где-то ниже при выводе заголовка таба
$tab['TITLE'] = str_replace('#COUNT#', $GLOBALS['count'], $tab['TITLE']);
// и ещё ниже, где был компонент:
?>
<?$APPLICATION->ShowViewContent("view2")?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы