Часть 7. Регистрация своих визуальных компонентов
Фактически, код компонентов у нас уже есть – это файлы
«/ix_guestbook/install/templates/ix_guestbook/index.php» и «/ix_guestbook/install/templates/ix_guestbook/edit_record.php»
Осталось только описать их таким образом, чтобы ядро БУС распознавало в них компоненты. Для этого нам надо создать файл
«/ix_guestbook/install/templates/ix_guestbook/.description.php»:
<?
IncludeTemplateLangFile(__FILE__);
$sSectionName = GetMessage("T_IX_GB_DESC_NAME");
$arTypes = Array();
if(CModule::IncludeModule("iblock")):
$db_iblock_type = CIBlockType::GetList(Array("SORT"=>"ASC"));
while($arRes = $db_iblock_type->Fetch())
if($arIBType = CIBlockType::GetByIDLang($arRes["ID"], LANG))
$arTypes[$arRes["ID"]] = $arIBType["NAME"];
$arIBlocks=Array();
$db_iblock = CIBlock::GetList(Array("SORT"=>"ASC"), Array("SITE_ID"=>$_REQUEST["site"]));
while($arRes = $db_iblock->Fetch())
$arIBlocks[$arRes["ID"]] = $arRes["NAME"];
$arSorts = Array("ASC"=>GetMessage("T_IX_GB_DESC_ASC"), "DESC"=>GetMessage("T_IX_GB_DESC_DESC"));
$arSortFields = Array(
"NAME"=>GetMessage("T_IX_GB_DESC_FNAME"),
"ACTIVE_FROM"=>GetMessage("T_IX_GB_DESC_FACT"),
"SORT"=>GetMessage("T_IX_GB_DESC_FSORT"),
"TIMESTAMP_X"=>GetMessage("T_IX_GB_DESC_FTSAMP")
);
$arSectSortFields = Array(
"NAME"=>GetMessage("T_IX_GB_DESC_FNAME"),
"SORT"=>GetMessage("T_IX_GB_DESC_FSORT"),
"TIMESTAMP_X"=>GetMessage("T_IX_GB_DESC_FTSAMP")
);
$arTemplateDescription =
Array(
".separator" =>
Array(
"NAME" => GetMessage("T_IX_GB_DESC_GB"),
"DESCRIPTION" => "",
"SEPARATOR" => "Y",
),
"index.php" =>
Array(
"NAME" => GetMessage("T_IX_GB_DESC_REC_LIST"),
"DESCRIPTION" => GetMessage("T_IX_GB_DESC_REC_LIST_DESC"),
"ICON" => "/bitrix/images/iblock/comp_list.gif",
"PARAMS" =>
Array(
"ID" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBID"), "TYPE"=>"LIST", "VALUES"=>$arIBlocks, "DEFAULT"=>"", "MULTIPLE"=>"N", "ADDITIONAL_VALUES"=>"N"),
"IBLOCK_TYPE" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBTYPE"), "TYPE"=>"LIST", "VALUES"=>$arTypes, "DEFAULT"=>"guestbook", "MULTIPLE"=>"N", "ADDITIONAL_VALUES"=>"N"),
"NEWS_COUNT" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBCNT"), "TYPE"=>"STRING", "DEFAULT"=>"5", "COLS"=>"3"),
"SORT_BY1" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBORD1"), "TYPE"=>"LIST", "DEFAULT"=>"ACTIVE_FROM", "VALUES"=>$arSortFields, "ADDITIONAL_VALUES"=>"N"),
"SORT_ORDER1" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBBY1"), "TYPE"=>"LIST", "MULTIPLE"=>"N", "DEFAULT"=>"DESC", "VALUES"=>$arSorts, "ADDITIONAL_VALUES"=>"N"),
"SORT_BY2" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBORD2"), "TYPE"=>"LIST", "DEFAULT"=>"SORT", "VALUES"=>$arSortFields, "ADDITIONAL_VALUES"=>"N"),
"SORT_ORDER2" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBBY2"), "TYPE"=>"LIST", "DEFAULT"=>"ASC", "VALUES"=>$arSorts, "ADDITIONAL_VALUES"=>"N"),
"edit_url" => Array("NAME"=>GetMessage("T_IX_GB_DESC_EDITURL"), "TYPE"=>"STRING", "DEFAULT"=>'={$APPLICATION->GetCurPage()}', "COLS"=>"20"),
"return_url" => Array("NAME"=>GetMessage("T_IX_GB_DESC_RETURNURL"), "TYPE"=>"STRING", "DEFAULT"=>'={$APPLICATION->GetCurPage()}', "COLS"=>"20")
)
),
"edit_record.php" =>
Array(
"NAME" => GetMessage("T_IX_GB_DESC_EDIT"),
"DESCRIPTION" => GetMessage("T_IX_GB_DESC_EDIT_DESC"),
"ICON" => "/bitrix/images/iblock/comp_detail.gif",
"PARAMS" =>
Array(
"type" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBTYPE"), "TYPE"=>"LIST", "VALUES"=>$arTypes, "DEFAULT"=>"guestbook", "MULTIPLE"=>"N", "ADDITIONAL_VALUES"=>"N"),
"ID" => Array("NAME"=>GetMessage("T_IX_GB_DESC_ID"), "TYPE"=>"STRING", "DEFAULT"=>'={$ID}', "MULTIPLE"=>"N", "ADDITIONAL_VALUES"=>"N"),
"IBLOCK_ID" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBID"), "TYPE"=>"LIST", "VALUES"=>$arIBlocks, "DEFAULT"=>"", "MULTIPLE"=>"N", "ADDITIONAL_VALUES"=>"N"),
"del_id" => Array("NAME"=>GetMessage("T_IX_GB_DESC_DEL_ID"), "TYPE"=>"STRING", "DEFAULT"=>'={$del_id}', "MULTIPLE"=>"N", "ADDITIONAL_VALUES"=>"N"),
"return_url" => Array("NAME"=>GetMessage("T_IX_GB_DESC_RETURNURL"), "TYPE"=>"STRING", "DEFAULT"=>'={$APPLICATION->GetCurPage()}', "COLS"=>"20")
)
)
);
endif;
?>
Необходимые файлы со строковыми константами находятся в файле «/ix_guestbook/install/templates/lang/ru/ix_guestbook/.description.php»:
<?
$MESS ['T_IX_GB_DESC_NAME'] = "Гостевые книги";
$MESS ['T_IX_GB_DESC_ASC'] = "По возрастанию";
$MESS ['T_IX_GB_DESC_DESC'] = "По убыванию";
$MESS ['T_IX_GB_DESC_FNAME'] = "Название";
$MESS ['T_IX_GB_DESC_FACT'] = "Дата начала активности";
$MESS ['T_IX_GB_DESC_FSORT'] = "Сортировка";
$MESS ['T_IX_GB_DESC_FTSAMP'] = "Дата последнего изменения";
$MESS ['T_IX_GB_DESC_GB'] = "Гостевые книги";
$MESS ['T_IX_GB_DESC_REC_LIST'] = "Список записей";
$MESS ['T_IX_GB_DESC_REC_LIST_DESC'] = "Показывает список записей книги";
$MESS ['T_IX_GB_DESC_IBID'] = "Идентификатор информационного блока";
$MESS ['T_IX_GB_DESC_EDITURL'] = "URL для формы редактирования записи";
$MESS ['T_IX_GB_DESC_SAVEURL'] = "URL страницы для сохранения записи";
$MESS ['T_IX_GB_DESC_RETURNURL'] = "URL для возвращения к списку записей";
$MESS ['T_IX_GB_DESC_IBTYPE'] = "Тип информационных блоков";
$MESS ['T_IX_GB_DESC_IBSORT'] = "Поле для cортировки информационных блоков";
$MESS ['T_IX_GB_DESC_SORT'] = "Cортировка";
$MESS ['T_IX_GB_DESC_ID'] = "Идентификатор";
$MESS ['T_IX_GB_DESC_IBSORTBY'] = "Направление для сортировки информационных блоков";
$MESS ['T_IX_GB_DESC_IBCNT'] = "Количество записей на странице";
$MESS ['T_IX_GB_DESC_IBORD1'] = "Поле для первой сортировки записей";
$MESS ['T_IX_GB_DESC_IBBY1'] = "Направление для первой сортировки записей";
$MESS ['T_IX_GB_DESC_IBORD2'] = "Поле для второй сортировки записей";
$MESS ['T_IX_GB_DESC_IBBY2'] = "Направление для второй сортировки записей";
$MESS ['T_IX_GB_DESC_EDIT'] = "Добавить/Редактировать";
$MESS ['T_IX_GB_DESC_EDIT_DESC'] = "Форма для добавления или редактирования записи";
$MESS ['T_IX_GB_DESC_SAVE'] = "Сохранить/Удалить";
$MESS ['T_IX_GB_DESC_SAVE_DESC'] = "Страница для сохранения/удаления записи";
$MESS ['T_IX_GB_DESC_DEL_ID'] = "Идентификатор записи для удаления";
?>
Собственно регистрация компонентов заключается в заполнении массива $arTemplateDescription. Первый элемент массива служит в качестве разделителя, остальные представляют собой описания компонентов. Рассмотрим подробнее компонент «список записей книги»:
"index.php" =>
Array(
"NAME" => GetMessage("T_IX_GB_DESC_REC_LIST"),
"DESCRIPTION" => GetMessage("T_IX_GB_DESC_REC_LIST_DESC"),
"ICON" => "/bitrix/images/iblock/comp_list.gif",
"PARAMS" =>
Array(
"ID" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBID"), "TYPE"=>"LIST", "VALUES"=>$arIBlocks, "DEFAULT"=>"", "MULTIPLE"=>"N", "ADDITIONAL_VALUES"=>"N"),
"IBLOCK_TYPE" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBTYPE"), "TYPE"=>"LIST", "VALUES"=>$arTypes, "DEFAULT"=>"guestbook", "MULTIPLE"=>"N", "ADDITIONAL_VALUES"=>"N"),
"NEWS_COUNT" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBCNT"), "TYPE"=>"STRING", "DEFAULT"=>"5", "COLS"=>"3"),
"SORT_BY1" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBORD1"), "TYPE"=>"LIST", "DEFAULT"=>"ACTIVE_FROM", "VALUES"=>$arSortFields, "ADDITIONAL_VALUES"=>"N"),
"SORT_ORDER1" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBBY1"), "TYPE"=>"LIST", "MULTIPLE"=>"N", "DEFAULT"=>"DESC", "VALUES"=>$arSorts, "ADDITIONAL_VALUES"=>"N"),
"SORT_BY2" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBORD2"), "TYPE"=>"LIST", "DEFAULT"=>"SORT", "VALUES"=>$arSortFields, "ADDITIONAL_VALUES"=>"N"),
"SORT_ORDER2" => Array("NAME"=>GetMessage("T_IX_GB_DESC_IBBY2"), "TYPE"=>"LIST", "DEFAULT"=>"ASC", "VALUES"=>$arSorts, "ADDITIONAL_VALUES"=>"N"),
"edit_url" => Array("NAME"=>GetMessage("T_IX_GB_DESC_EDITURL"), "TYPE"=>"STRING", "DEFAULT"=>'={$APPLICATION->GetCurPage()}', "COLS"=>"20"),
"return_url" => Array("NAME"=>GetMessage("T_IX_GB_DESC_RETURNURL"), "TYPE"=>"STRING", "DEFAULT"=>'={$APPLICATION->GetCurPage()}', "COLS"=>"20")
)
),
Первые три параметра служат для описания компонента в HTML-редакторе. Последний параметр - массив PARAMS - описывает синтаксис вызова компонента и привязывает к свойствам компонента визуальные элементы, в которых пользователь сможет вводить значения.
Например, свойство $ID с идентификатором инфоблока гостевой книги, описывается как список ("TYPE"=>"LIST"), который заполняется названиями доступных инфоблоков ("VALUES"=>$arIBlocks) с запретом множественного выбора ("MULTIPLE"=>"N"). Обратите внимание на синтаксис вызова PHP кода в качестве значения параметра по умолчанию ("DEFAULT"):
"edit_url" => Array("NAME"=>GetMessage("T_IX_GB_DESC_EDITURL"), "TYPE"=>"STRING", "DEFAULT"=>'={$APPLICATION->GetCurPage()}', "COLS"=>"20")
Мы можем добавлять неограниченное количество своих компонентов в данном файле, описывая их параметры, указывая их тип, значения и элементы редактирования. В результате HTML-редактор позволит нам вставлять при помощи механизма drag&drop код, аналогичный следующему:
<P><?$APPLICATION->IncludeFile("ix_guestbook/index.php", Array(
"ID" => "11", // Идентификатор информационного блока
"IBLOCK_TYPE" => "guestbook", // Тип информационных блоков
"NEWS_COUNT" => "5", // Количество записей на странице
"SORT_BY1" => "ACTIVE_FROM", // Поле для первой сортировки записей
"SORT_ORDER1" => "DESC", // Направление для первой сортировки записей
"SORT_BY2" => "SORT", // Поле для второй сортировки записей
"SORT_ORDER2" => "ASC", // Направление для второй сортировки записей
"edit_url" => $APPLICATION->GetCurPage(), // URL для формы редактирования записи
"return_url" => $APPLICATION->GetCurPage(),// URL для возвращения к списку записей
)
);?></P>
Иными словами, чтобы сделать компонент для своего модуля БУС мы должны:
- Создать файл с некоторым кодом компонента;
- Продумать параметры, которые будут управлять нашим компонентом;
- Описать вызов компонента и его параметры в соответствующем файле .description.php.
Рис. 5. HTML-редактор с компонентами гостевой книги