Битрикс, вставка компонентов внутри элементов инфоблока в новом визуальном редакторе
Внимание! Автор не рекомендует так делать. Подумайте еще раз, зачем вам вставлять вызов компонентов внутрь элементов инфоблока битрикса?
Скорее всего, у вас что то не так с архитектурой проекта. Но если выбора нет, то вот несколько решений:
Первое решение
Изначально при редактировании детального описания элемента инфоблока битрикс не подгружает компонеты и более того, запрещает вставлять PHP код.
При редактировании элементов в админке битрикса, идет запрос к файлу:
\bitrix\modules\iblock\admin\iblock_element_edit.php
он строит страничку редактирования элемента. В нем на 2434 строке, вызывается код построения визуального редактора:
<?CFileMan::AddHTMLEditorFrame(
"DETAIL_TEXT",
$str_DETAIL_TEXT,
"DETAIL_TEXT_TYPE",
$str_DETAIL_TEXT_TYPE,
array(
'height' => 450,
'width' => '100%'
),
"N",
0,
"",
"",
$arIBlock["LID"],
true, // менять на false
false, // менять на true
array(
'toolbarConfig' => CFileMan::GetEditorToolbarConfig("iblock_".(defined('BX_PUBLIC_MODE') && BX_PUBLIC_MODE == 1 ? 'public' : 'admin')),
'saveEditorKey' => $IBLOCK_ID,
'hideTypeSelector' => $arIBlock["FIELDS"]["DETAIL_TEXT_TYPE_ALLOW_CHANGE"]["DEFAULT_VALUE"] === "N",
)
);
?>
Если в этом вызове поменять 2 параметра(пометил комментами), то можно вставлять компоненты. Подробней о CFileMan::AddHTMLEditorFrame().
НО, мы не будем редактировать ядро битрикса!
Вместо этого мы подцепимся на событие OnAdminTabControlBegin.
<?
AddEventHandler("main", "OnAdminTabControlBegin", "MyOnAdminTabControlBegin");
function MyOnAdminTabControlBegin(&$form)
{
//проверяем чтомы на странице редактирования элемента
if($GLOBALS["APPLICATION"]->GetCurPage() == "/bitrix/admin/iblock_element_edit.php")
{
$form->tabs[] = array("DIV" => "my_edit", "TAB" => "Дополнительно", "ICON"=>"main_user_edit", "TITLE"=>"Дополнительные параметры", "CONTENT"=>
'<tr id="tr_DETAIL_TEXT_EDITOR">
<td colspan="2" align="center">
<?CFileMan::AddHTMLEditorFrame(
"DETAIL_TEXT",
$str_DETAIL_TEXT,
"DETAIL_TEXT_TYPE",
$str_DETAIL_TEXT_TYPE,
array(
'height' => 450,
'width' => '100%'
),
"N",
0,
"",
"",
$arIBlock["LID"],
false, // изменили
true, // изменили
array(
'toolbarConfig' => CFileMan::GetEditorToolbarConfig("iblock_".(defined('BX_PUBLIC_MODE') && BX_PUBLIC_MODE == 1 ? 'public' : 'admin')),
'saveEditorKey' => $IBLOCK_ID,
'hideTypeSelector' => $arIBlock["FIELDS"]["DETAIL_TEXT_TYPE_ALLOW_CHANGE"]["DEFAULT_VALUE"] === "N",
)
);
?></td>
</tr>'
);
}
}
?>
Этим кодом мы добавим новую вкладку на страницу редактирования элемента инфоблока битрикса. И на ней уже вызываем визуальный редактор с компонентами. Все, код вызова компонентов будет сохранятся.
Нам остается обработать вывозов компонентов. Например в шаблоне, компонента детальной страницы:
$new_string = preg_replace_callback(
'/<\?(php)?[\s+?\n?\s+]*(\$APPLICATION->IncludeComponent\(.*)\?>/uUs',
function ($matches) {
global $APPLICATION;
ob_start();
eval($matches[2]);
return ob_get_clean();
},
$buffer
);
echo $new_string;
Так же можно подключится на событие OnEndBufferContent и обрабатывать вывод всей страницы...
Второе решение
Просто поставить мой модуль из маркетплейса битрикса: Подключение компонентов внутри элементов инфоблока
Мой модуль Подключение компонентов внутри элементов инфоблока использует другую реализацию, вы можете посмотреть исходники после установки модуля.....
Комментарии
Добавить комментарий