Complex Component - uniqcle/Bitrix GitHub Wiki
- Все в одном месте
- Связь между простыми компонентами
- Единые параметры
- ЧПУ и другое
local-components-uniqcle
complex.component
lang
ru
.description.php
.parameters.php
templates
.default
bitrx/
.parameters.php
news.php
section.php
detail.php
.description.php
.parameters.php
component.php
для настройка простых компонентов и ЧПУ. В файле формируется массив $arComponentParameters
, который состоит из двух ключей: GROUPS
и PARAMETERS
.
В GROUPS
задаются массивы, описывающие разделы (группы) настроек.
$arComponentParameters = array(
"GROUPS" => array(
"LIST" => array(
"NAME" => "Мои личные списки",
"SORT" => "300",
),
),
"PARAMETERS" => array(
...
Ключ GROUPS
По умолчанию, в любом компоненте присутствуют следующие группы:
-
ADDITIONAL_SETTINGS
- появляется при указании SET_TITLE; -
CACHE_SETTINGS
- настройки кэша, появляется при указании CACHE_TIME; -
SEF_MODE
- настройки ЧПУ; -
URL_TEMPLATES
- шаблоны ссылок; -
VISUAL
- настройки внешнего вида; -
DATA_SOURCE
- источник данных, ID и TYPE инфоблока; -
BASE
- основные параметры; -
AJAX_SETTINGS
- настройки AJAX.
Значением ключа PARAMETERS
является массив параметров компонента.
"код параметра" => array(
"PARENT" => "код группы", // если пустое - ставится ADDITIONAL_SETTINGS
"NAME" => " название параметра на текущем языке", //рекомендуется подключение из lang файлов с помощью GetMessage(),
"TYPE" => "тип элемента управления, в котором будет устанавливаться параметр",
"REFRESH" => "перегружать настройки или нет после выбора (N/Y)",
"MULTIPLE" => "одиночное/множественное значение (N/Y)",
"VALUES" => "массив значений для списка ('TYPE' = 'LIST')",
"ADDITIONAL_VALUES" => "показывать поле для значений, вводимых вручную (Y/N)",
"SIZE" => "число строк для списка (если нужен не выпадающий список)",
"DEFAULT" => "значение по умолчанию",
"COLS" => "ширина поля в символах",
),
Ключ TYPE
Ключ TYPE может принимать одно из следующих значений:
-
LIST
для списка -
STRING
для поля ввода -
CHECKBOX
для чекбокса -
CUSTOM
для своих элементов управления
В некоторых случаях требуется заполнять списки значениями из инфоблоков, в этом случае можно использовать средства API и формировать массивы для VALUES
до определения массива $arComponentParameters
. В следующем примере для параметров IBLOCK_TYPE
и IBLOCK_ID
формируются массивы $paramIBlockTypes
и $paramIBlocks
соответственно.
Заполнение списка значениями из ИБ
<?php
/*
* Файл local/components/tokmakov/iblock.element/.parameters.php
*/
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();
// проверяем, установлен ли модуль «Информационные блоки»; если да — то подключаем его
if (!CModule::IncludeModule('iblock')) {
return;
}
/*
* Получаем массив всех типов инфоблоков — для возможности выбора
*/
$arIBlockType = CIBlockParameters::GetIBlockTypes();
/*
* Получаем массив инфоблоков — для возможности выбора; фильтруем их по
* выбранному типу и по активности
*/
$arInfoBlocks = array();
$arFilter = array('ACTIVE' => 'Y');
// если уже выбран тип инфоблока, выбираем инфоблоки только этого типа
if (!empty($arCurrentValues['IBLOCK_TYPE'])) {
$arFilter['TYPE'] = $arCurrentValues['IBLOCK_TYPE'];
}
$rsIBlock = CIBlock::GetList(
array('SORT' => 'ASC'),
$arFilter
);
while($iblock = $rsIBlock->Fetch()) {
$arInfoBlocks[$iblock['ID']] = '['.$iblock['ID'].'] '.$iblock['NAME'];
}
/*
* Настройки компонента
*/
$arComponentParameters = array(
'GROUPS' => array( // кроме групп по умолчанию, добавляем свою группу настроек
'SEO_SETTINGS' => array(
'NAME' => 'Настройки SEO',
'SORT' => 800
),
),
'PARAMETERS' => array(
// выбор типа инфоблока
'IBLOCK_TYPE' => array(
'PARENT' => 'BASE',
'NAME' => 'Выберите тип инфоблока',
'TYPE' => 'LIST',
'VALUES' => $arIBlockType,
'REFRESH' => 'Y',
),
// выбор самого инфоблока
'IBLOCK_ID' => array(
'PARENT' => 'BASE',
'NAME' => 'Выберите инфоблок',
'TYPE' => 'LIST',
'VALUES' => $arInfoBlocks,
),
// идентификатор элемента получать из $_REQUEST["ELEMENT_ID"]
'ELEMENT_ID' => array(
'PARENT' => 'BASE',
'NAME' => 'Идентификатор элемента',
'TYPE' => 'STRING',
'DEFAULT' => '={$_REQUEST["ELEMENT_ID"]}',
),
// символьный код элемента получать из $_REQUEST["ELEMENT_CODE"]
'ELEMENT_CODE' => array(
'PARENT' => 'BASE',
'NAME' => 'Символьный код элемента',
'TYPE' => 'STRING',
'DEFAULT' => '={$_REQUEST["ELEMENT_CODE"]}',
),
// использовать символьный код вместо ID; если отмечен этот checkbox,
// в визуальном редакторе надо будет обязательно изменить SECTION_URL
// и ELEMENT_URL, чтобы вместо #SECTION_ID# и #ELEMENT_ID# в шаблонах
// ссылок использовались #SECTION_CODE# и #ELEMENT_CODE#
'USE_CODE_INSTEAD_ID' => array(
'PARENT' => 'URL_TEMPLATES',
'NAME' => 'Использовать символьный код вместо ID',
'TYPE' => 'CHECKBOX',
'DEFAULT' => 'N',
),
// шаблон ссылки на страницу раздела
'SECTION_URL' => array(
'PARENT' => 'URL_TEMPLATES',
'NAME' => 'URL, ведущий на страницу с содержимым раздела',
'TYPE' => 'STRING',
'DEFAULT' => 'category/id/#SECTION_ID#/'
),
// шаблон ссылки на страницу элемента
'ELEMENT_URL' => array(
'PARENT' => 'URL_TEMPLATES',
'NAME' => 'URL, ведущий на страницу с содержимым элемента',
'TYPE' => 'STRING',
'DEFAULT' => 'item/id/#ELEMENT_ID#/'
),
// SEO-настройки
'SET_PAGE_TITLE' => array(
'PARENT' => 'SEO_SETTINGS',
'NAME' => 'Устанавливать заголовок страницы',
'TYPE' => 'CHECKBOX',
'DEFAULT' => 'Y',
),
'SET_BROWSER_TITLE' => array(
'PARENT' => 'SEO_SETTINGS',
'NAME' => 'Устанавливать заголовок окна браузера',
'TYPE' => 'CHECKBOX',
'DEFAULT' => 'Y',
),
'SET_META_KEYWORDS' => array(
'PARENT' => 'SEO_SETTINGS',
'NAME' => 'Устанавливать мета-тег keywords',
'TYPE' => 'CHECKBOX',
'DEFAULT' => 'Y',
),
'SET_META_DESCRIPTION' => array(
'PARENT' => 'SEO_SETTINGS',
'NAME' => 'Устанавливать мета-тег description',
'TYPE' => 'CHECKBOX',
'DEFAULT' => 'Y',
),
// включать раздел в цепочку навигации?
'ADD_SECTIONS_CHAIN' => Array(
'PARENT' => 'ADDITIONAL_SETTINGS',
'NAME' => 'Включать раздел в цепочку навигации',
'TYPE' => 'CHECKBOX',
'DEFAULT' => 'Y',
),
// настройки кэширования
'CACHE_TIME' => array('DEFAULT'=>3600),
'CACHE_GROUPS' => array(
'PARENT' => 'CACHE_SETTINGS',
'NAME' => 'Учитывать права доступа',
'TYPE' => 'CHECKBOX',
'DEFAULT' => 'Y',
),
),
);
// добавляем еще одну настройку — на случай, если элемент инфоблока не найден
CIBlockParameters::Add404Settings($arComponentParameters, $arCurrentValues);
.parameters.php
<?php if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
if(!CModule::IncludeModule("iblock"))
return;
$arIBlockType = CIBlockParameters::GetIBlockTypes();
$arIBlock=array();
$rsIBlock = CIBlock::GetList(Array("sort" => "asc"), Array("TYPE" => $arCurrentValues["IBLOCK_TYPE"], "ACTIVE"=>"Y"));
while($arr=$rsIBlock->Fetch())
{
$arIBlock[$arr["ID"]] = "[".$arr["ID"]."] ".$arr["NAME"];
}
$arUGroupsEx = Array();
$dbUGroups = CGroup::GetList($by = "c_sort", $order = "asc");
while($arUGroups = $dbUGroups -> Fetch())
{
$arUGroupsEx[$arUGroups["ID"]] = $arUGroups["NAME"];
}
//формирование массива параметров
$arComponentParameters = array(
"GROUPS" => array(
"LIST" => array(
"NAME" => "Мои личные списки",
"SORT" => "300",
),
),
"PARAMETERS" => array(
"IBLOCK_TYPE" => array(
"PARENT" => "BASE",
"NAME" => 'IBLOCK TYPE',
"TYPE" => "LIST",
"VALUES" => $arIBlockType,
"REFRESH" => "Y",
),
"IBLOCK_ID" => array(
"PARENT" => "BASE",
"NAME" => 'IBLOCK ID',
"TYPE" => "LIST",
"VALUES" => $arIBlock,
"REFRESH" => "Y",
"ADDITIONAL_VALUES" => "Y",
),
"VARIABLE_ALIASES" => Array(
"ELEMENT_ID" => Array("NAME" => 'Название элемента'),
),
"SEF_MODE" => Array(
"afisha" => array(
"NAME" => 'Название афиши',
"DEFAULT" => "",
"VARIABLES" => array(),
),
"film" => array(
"NAME" => 'Название фильма',
"DEFAULT" => "#ELEMENT_ID#/",
"VARIABLES" => array("ELEMENT_ID"),
),
"add_film" => array(
"NAME" => 'Добавление фильма',
"DEFAULT" => "add_film/",
"VARIABLES" => array(),
),
),
"AJAX_MODE" => array(),
"STRING" => array(
"PARENT" => "BASE",
"NAME" => "Строка",
"TYPE" => "STRING",
"DEFAULT" => "Значение по умолчанию"
),
"CHECKBOX" => array(
"PARENT" => "BASE",
"NAME" => "Одиночный чекбокс",
"TYPE" => "CHECKBOX",
),
"LIST_SINGLE" => array(
"PARENT" => "LIST",
"NAME" => "Список",
"TYPE" => "LIST",
"VALUES" => array(
"1" => "Первый",
"2" => "Второй",
"3" => "Третий",
),
"MULTIPLE" => "N",
),
"USE_REVIEW" => Array(
"PARENT" => "REVIEW_SETTINGS",
"NAME" => 'Название обзоров',
"TYPE" => "CHECKBOX",
"DEFAULT" => "N",
"REFRESH" => "Y",
),
"LIST_MULTIPLE" => array(
"PARENT" => "LIST",
"NAME" => "Множественный список",
"TYPE" => "LIST",
"VALUES" => array(
"1" => "Первый",
"2" => "Второй",
"3" => "Третий",
),
"MULTIPLE" => "Y",
),
"LIST_MULTIPLE_ADD" => array(
"PARENT" => "LIST",
"NAME" => "Множественный список",
"TYPE" => "LIST",
"VALUES" => array(
"1" => "Первый",
"2" => "Второй",
"3" => "Третий",
),
"MULTIPLE" => "Y",
"ADDITIONAL_VALUES" => "Y"
),
"DATE_FORMAT" => CIBlockParameters::GetDateFormat("NTC", "LIST"),
"SET_TITLE" => Array(),
"ADD_GROUP_PERMISSIONS" => Array(
"PARENT" => "ADDITIONAL_SETTINGS",
"NAME" => GetMessage("T_IBLOCK_DESC_GROUP_PERMISSIONS"),
"TYPE" => "LIST",
"VALUES" => $arUGroupsEx,
"DEFAULT" => Array(1),
"MULTIPLE" => "Y",
),
"CACHE_TIME" => Array("DEFAULT"=>36000000),
),
);
if(!IsModuleInstalled("forum"))
{
unset($arComponentParameters["GROUPS"]["REVIEW_SETTINGS"]);
unset($arComponentParameters["PARAMETERS"]["USE_REVIEW"]);
}
elseif($arCurrentValues["USE_REVIEW"]=="Y")
{
$arForumList = array();
if(CModule::IncludeModule("forum"))
{
$rsForum = CForumNew::GetList();
while($arForum=$rsForum->Fetch())
$arForumList[$arForum["ID"]]=$arForum["NAME"];
}
$arComponentParameters["PARAMETERS"]["MESSAGES_PER_PAGE"] = Array(
"PARENT" => "REVIEW_SETTINGS",
"NAME" => GetMessage("F_MESSAGES_PER_PAGE"),
"TYPE" => "STRING",
"DEFAULT" => intVal(COption::GetOptionString("forum", "MESSAGES_PER_PAGE", "10"))
);
$arComponentParameters["PARAMETERS"]["USE_CAPTCHA"] = Array(
"PARENT" => "REVIEW_SETTINGS",
"NAME" => GetMessage("F_USE_CAPTCHA"),
"TYPE" => "CHECKBOX",
"DEFAULT" => "Y"
);
$arComponentParameters["PARAMETERS"]["REVIEW_AJAX_POST"] = Array(
"PARENT" => "REVIEW_SETTINGS",
"NAME" => GetMessage("F_REVIEW_AJAX_POST"),
"TYPE" => "CHECKBOX",
"DEFAULT" => "Y"
);
$arComponentParameters["PARAMETERS"]["PATH_TO_SMILE"] = Array(
"PARENT" => "REVIEW_SETTINGS",
"NAME" => GetMessage("F_PATH_TO_SMILE"),
"TYPE" => "STRING",
"DEFAULT" => "/bitrix/images/forum/smile/",
);
$arComponentParameters["PARAMETERS"]["FORUM_ID"] = Array(
"PARENT" => "REVIEW_SETTINGS",
"NAME" => GetMessage("F_FORUM_ID"),
"TYPE" => "LIST",
"VALUES" => $arForumList,
"DEFAULT" => "",
);
$arComponentParameters["PARAMETERS"]["URL_TEMPLATES_READ"] = Array(
"PARENT" => "REVIEW_SETTINGS",
"NAME" => 'Прочитать шаблон',
"TYPE" => "STRING",
"DEFAULT" => "",
);
}
Заметьте, что при использовании "REFRESH" => "Y"
, значения выбранных свойств можно получить из массива $arCurrentValues
. Таким образом можно реализовать сложную логику зависимостей между параметрами.
Помимо .parameters.php
, хранящегося в папке компонента, стандартные настройки можно дополнять, создавая одноименные файлы в папке шаблона. Описанные в этом файле параметры будут отображаться только если выбран соответствующий шаблон компонента. Структура файла:
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$arTemplateParameters = array(
"PROP" => array(
"NAME" => "Параметр из template",
"TYPE" => "STRING",
"DEFAULT" => "N",
),
);
В файле template.php без локализации:
<?echo "Торговый каталог";?>
В файле template.php с локализацией:
<?echo GetMessage(“CATALOG”)?>
В этом случае в файле /lang/ru/template.php
пишем:
<?$MESS["CATALOG"] = "Торговый каталог";?>
http://academy.1c-bitrix.ru/education/index.php?COURSE_ID=66&LESSON_ID=5890&LESSON_PATH=5863.5890
https://bxnotes.ru/conspect/lib/bitrix/rasshireniye-tipovykh-vozmozhnostey/komponenty/
https://dev.1c-bitrix.ru/api_help/main/reference/ccomponentengine/makecomponenturltemplates.php
https://tokmakov.msk.ru/blog/item/193
https://tokmakov.msk.ru/blog/item/195
https://qna.habr.com/q/544093