Дата последнего изменения: 09.11.2023
Задача не частая, но встречающаяся: разместить в теле элемента информационного блока какой-либо компонент. Например, опрос. Попробуем реализовать эту задачу.
#VOTE_ID_XX#
, где XX это ID нужного нам опроса. Этот маркер вставьте в тело новости в нужное место:
result_modifier.php такого содержания:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <?$this->__component->SetResultCacheKeys(array("CACHED_TPL"));?>component_epilog.php такого:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <? echo preg_replace_callback( "/#VOTE_ID_([\d]+)#/is".BX_UTF_PCRE_MODIFIER, function ($matches) { ob_start(); /*component here*/ $retrunStr = @ob_get_contents(); ob_get_clean(); return $retrunStr; }, $arResult["CACHED_TPL"]); ?>
/*component here*/
в component_epilog.php вставьте вызов нашего компонента (для большей наглядности этот код пишем отдельно от общего кода):
$GLOBALS["APPLICATION"]->IncludeComponent( "bitrix:voting.current", "main_page", Array( "CHANNEL_SID" => "ANKETA", "VOTE_ID" => $matches[1], "CACHE_TYPE" => "A", "CACHE_TIME" => "3600", "AJAX_MODE" => "N", "AJAX_OPTION_SHADOW" => "Y", "AJAX_OPTION_JUMP" => "Y", "AJAX_OPTION_STYLE" => "Y", "AJAX_OPTION_HISTORY" => "N", ) );
$APPLICATION
написано $GLOBALS["APPLICATION"]
. Так надо для видимости объекта внутри временной функции. В остальном это полностью код компонента bitrix:voting.current.
И обратите внимание на $matches[1]
. Это единственный динамический параметр в вызываемом компоненте. Динамический в том плане, что он будет зависеть от того какой маркер мы меняем. Для #VOTE_ID_1#
он будет равен 1, для #VOTE_ID_2#
2 и так далее.
<?ob_start();?>а в самом конце:
<? $this->__component->arResult["CACHED_TPL"] = @ob_get_contents(); ob_get_clean(); ?>
Манипуляции с component_epilog.php сделаны чтобы обойти кеширование.
Что получили в итоге:
В этом примере от файла $component->SetResultCacheKeys(array("CACHED_TPL"));
можно добавить прямо в файл template.php. Здесь result_modifier.php был создан только для следования академическим правилам написания кода в Bitrix Framework.