Битрикс, вставка компонентов внутри элементов инфоблока в новом визуальном редакторе

Дата публикации: 8 февраля 2018, Категория: 1С-Битрикс

Внимание! Автор не рекомендует так делать. Подумайте еще раз, зачем вам вставлять вызов компонентов внутрь элементов инфоблока битрикса? 

Скорее всего, у вас что то не так с архитектурой проекта. Но если выбора нет, то вот несколько решений:

Первое решение

Изначально при редактировании детального описания элемента инфоблока битрикс не подгружает компонеты и более того, запрещает вставлять 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 и обрабатывать вывод всей страницы... 

Второе решение

Просто поставить мой модуль из маркетплейса битрикса: Подключение компонентов внутри элементов инфоблока

Мой модуль Подключение компонентов внутри элементов инфоблока использует другую реализацию, вы можете посмотреть исходники после установки модуля.....

Комментарии

Ничего не найдено.

Добавить комментарий