Complex Component - uniqcle/Bitrix GitHub Wiki

- Все в одном месте
- Связь между простыми компонентами
- Единые параметры
- ЧПУ и другое

Structure Complex Component

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

.parameters.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",
    ),

);

lang

В файле template.php без локализации:

<?echo "Торговый каталог";?>

В файле template.php с локализацией:

<?echo GetMessage(“CATALOG”)?>

В этом случае в файле /lang/ru/template.php пишем:

<?$MESS["CATALOG"] = "Торговый каталог";?>

component.php

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
⚠️ **GitHub.com Fallback** ⚠️