Дополнительный урок по интеграции адаптивного Bootstrap шаблона сайта в 1С-Битрикс - 10+


В рамках этого урока мы создадим простой компонент-болванку. Он не будет содержать особой логики и даже не будет иметь особенного шаблона - его задача будет вызывать 2 других компонента и передавать в них определённые параметры. Мы реализуем 2-х колоночный список с возможностью выбора типа выводимых данных для каждой колонки: элементы и/или разделы инфоблока.


Каркас нового компонента 1С-Битрикс

Для начала создадим собственное пространство имён компонентов. Для этого в папке /bitrix/components/ создадим папку coffeediz (название папки и будет пространством имён).

Теперь в папке пространства имён компонентов /bitrix/components/coffeediz/ создадим папку с названием нашего нового компонента elements_and_categories.list.

В папке компонента /bitrix/components/coffeediz/elements_and_categories.list/ создаём файл .description.php следующего содержания:

<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$arComponentDescription = array(
"NAME" => GetMessage("ELEMENTS_AND_CATEGORIES_LIST"), //Название компонента
"DESCRIPTION" => GetMessage("ELEMENTS_AND_CATEGORIES_LIST_DESC"), //Описание
"ICON" => "/images/elements_and_categories_list.gif", //Иконка компонента для виз редактора
"SORT" => 70, //индекс сортировки, задающий положение компонента в конечной ветки дерева
"CACHE_PATH" => "Y",
"PATH" => array( //расположение в дереве компонентов визуального редактора
"ID" => "content", //Код ветки дерева "Контент"
"CHILD" => array(
"ID" => "news", //Код ветки дерева "Статьи и Новости" в ветке "Контент"
"NAME" => GetMessage("T_IBLOCK_DESC_NEWS"),
"SORT" => 10,
),
),
);

?>

В папку /bitrix/components/coffeediz/elements_and_categories.list/images/ мы положим картинку, которую будем использовать в качестве иконки в виз редакторе (как можно видеть выше в .description.php можно вызвать файл с любым именем в качестве иконки) - elements_and_categories_list.gif.

иконка для визуального редактора 1С-Битрикс компонента 2-х колоночного списка элементов/разделов инфоблока

Размер и вид иконки могут быть любыми, однако, мы рекомендуем придерживаться стилистики дефолтных иконок 1С-Битрикс.

Не забудем о необходимости создать языковые файлы (подключаются автоматически при размещении в папке компонента /lang/ИД_языка/ файлов с таким же названием как и те, где используются языковые фразы.

Для русского языка (/bitrix/components/coffeediz/elements_and_categories.list/lang/ru/.description.php):

<?
$MESS ['ELEMENTS_AND_CATEGORIES_LIST'] = "2-х колоночный список";
$MESS ['ELEMENTS_AND_CATEGORIES_LIST_DESC'] = "2-х колоночный список, выводящий в каждой колонке список элементов/разделов инфоблока на выбор";
$MESS ['T_IBLOCK_DESC_NEWS'] = "Статьи и новости";
?>

Для английского языка (/bitrix/components/coffeediz/elements_and_categories.list/lang/en/.description.php):

<?
$MESS ['ELEMENTS_AND_CATEGORIES_LIST'] = "2 column list";
$MESS ['ELEMENTS_AND_CATEGORIES_LIST_DESC'] = "2 column list of elements/categories of Infoblock";
$MESS ['T_IBLOCK_DESC_NEWS'] = "News";
?>

Поскольку файл component.php (файл с ЛОГИКОЙ) является обязательным согласно архитектуре 1С-Битрикс, то наш компонент не появится в визуальном редакторе до тех пор, пока мы его не создадим.

Однако поскольку наша задумка не предполагает никакой логики (мы просто передадим параметры нашего компонента в шаблон к вызываемым там компонентам), то мы оставим его ПУСТЫМ.Это может показаться странным (и кто-то из бывалых возможно нас осудит), но далее мы увидим, что это оправдано!

В результате увидим такую картинку в визуальном редакторе 1С-Битрикс:

компонент 2-х колоночного списка элементов/разделов инфоблока в визуальном редакторе 1С-Битрикс


Параметры нового компонента 1С-Битрикс

Создадим файл /bitrix/components/coffeediz/elements_and_categories.list/.parameters.php с параметрами компонента.

Поскольку у нас планируется работа с инфоблоками необходимо (сразу после проверки пролога) поставить проверку наличия в системе модуля инфоблоков:

if(!CModule::IncludeModule("iblock"))
return;

Далее считаем в переменную данные о всех типах инфоблоков:

$arTypesEx = CIBlockParameters::GetIBlockTypes(Array("-"=>" "));

Далее в отдельную переменную считаем данные об инфоблоках в системе.

Поскольку мы будем использовать архитектурное решение, аналогичное компонента bitrix:news.list, то тип инфоблока будет только справочным значением, которое будет использоваться для фильтрафии списка инфоблоков в целях упрощения работы администратора при изменении параметров компонента. Поэтому мы не просто считаем данные об инфоблоках и выберем ID, а скорректируем их в зависимости от выбранного в параметре "Тип инфоблока" значения:

$arIBlocks1col=Array();
$db_iblock = CIBlock::GetList(Array("SORT"=>"ASC"), Array("SITE_ID"=>$_REQUEST["site"], "TYPE" => ($arCurrentValues["1COLUMN_IBLOCK_TYPE"]!="-"?$arCurrentValues["1COLUMN_IBLOCK_TYPE"]:"")));
while($arRes = $db_iblock->Fetch())
$arIBlocks1col[$arRes["ID"]] = $arRes["NAME"];

Как видите в ряде переменных мы используем идентификатор 1 - он указывает на то, что мы выбираем ID инфоблока для 1й (левой колонки). Аналогичный код, но с 2 будет выбирать ID инфоблока для 2й колонки.

Теперь зададим сами параметры.

В отличие от шаблона компонента параметры самого компонента хранятся в виде массива в другой переменной - $arComponentParameters.

Во-первых, зададим 2 дополнительные группы параметров (мы будем хранить отдельно основные параметры и параметры, характерные для каждой из колонок для того, чтобы их удобнее было редактировать):

"GROUPS" => array(
"1COLUMN" => array(
"NAME" => GetMessage("1COLUMN_PARAMETERS")
),
"2COLUMN" => array(
"NAME" => GetMessage("2COLUMN_PARAMETERS")
),
),

Во-вторых, зададим массив основных параметров, идентичным тем, что мы использовали в 10 уроке (Заголовок списка, текст перед списком и ссылка после списка) в массиве PARAMETERS:

"2_COL_TITLE" => Array(
"PARENT" => "BASE",
"NAME" => GetMessage("2_COL_TITLE"),
"TYPE" => "HTML",
"DEFAULT" => "Наши Возможности",
),
"2_COL_INTRO_TEXT" => Array(
"PARENT" => "BASE",
"NAME" => GetMessage("2_COL_INTRO_TEXT"),
"TYPE" => "HTML",
"DEFAULT" => "В данном двухколоночном списке представлены возможности данного шаблона, которые вы можете штатно использовать без дополнительных доработок.",
),
"2_COL_MORE_NAME" => Array(
"PARENT" => "BASE",
"NAME" => GetMessage("2_COL_MORE_NAME"),
"TYPE" => "HTML",
"DEFAULT" => "Ещё",
),
"2_COL_MORE_LINK" => Array(
"PARENT" => "BASE",
"NAME" => GetMessage("2_COL_MORE_LINK"),
"TYPE" => "HTML",
"DEFAULT" => "#",
),

В-третьих (так же в массиве PARAMETERS) зададим выбор типа для колонки.

Мы предусмотрим для каждой из колонок 2 типа: элементы или разделы инфоблока.

Не забудем и о том, что после изменения значения каждого из этих свойств необходимо будет перезагрузить список параметров компонента (в зависимости от типа может меняться набор параметров для каждой конкретной колонки). За это отвечает параметр "REFRESH" => "Y".

Соответственно, реализацию мы сделаем через свойства типа "список" с 2 предопределёнными значениями, которые зададим в виде массива в свойстве VALUES:

"1COLUMN_TYPE" => array(
"PARENT" => "BASE",
"NAME" => GetMessage("1COLUMN_TYPE"),
"TYPE" => "LIST",
"VALUES" => array(
"COLUMN_TYPE_ELEMENT" => GetMessage("COLUMN_TYPE_ELEMENT"),
"COLUMN_TYPE_CATEGORY" => GetMessage("COLUMN_TYPE_CATEGORY")
),
"REFRESH" => "Y"
),
"2COLUMN_TYPE" => array(
"PARENT" => "BASE",
"NAME" => GetMessage("2COLUMN_TYPE"),
"TYPE" => "LIST",
"VALUES" => array(
"COLUMN_TYPE_ELEMENT" => GetMessage("COLUMN_TYPE_ELEMENT"),
"COLUMN_TYPE_CATEGORY" => GetMessage("COLUMN_TYPE_CATEGORY")
),
"REFRESH" => "Y"
),

И, наконец, в-четвёртых, зададим параметры типа и ID инфоблока для каждой из колонок. Мы сделаем это сейчас в общем списке параметров потому, что вне зависимости от типа (элементы или разделы инфоблока) данных в колонке знать ID инфоблока нам необходимо.

Значения типа и ID инфоблоков из системы мы получили выше, так что код будет выглядеть даже проще, чем задание списка типов колонок:

"1COLUMN_IBLOCK_TYPE" => Array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_IBLOCK_TYPE"),
"TYPE" => "LIST",
"VALUES" => $arTypesEx,
"DEFAULT" => "news",
"REFRESH" => "Y",
),
"1COLUMN_IBLOCK_ID" => Array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_IBLOCK_ID"),
"TYPE" => "LIST",
"VALUES" => $arIBlocks1col,
"DEFAULT" => '={$_REQUEST["ID"]}',
"ADDITIONAL_VALUES" => "Y",
"REFRESH" => "Y",
),


"2COLUMN_IBLOCK_TYPE" => Array(
"PARENT" => "2COLUMN",
"NAME" => GetMessage("2COLUMN_IBLOCK_TYPE"),
"TYPE" => "LIST",
"VALUES" => $arTypesEx,
"DEFAULT" => "news",
"REFRESH" => "Y",
),
"2COLUMN_IBLOCK_ID" => Array(
"PARENT" => "2COLUMN",
"NAME" => GetMessage("2COLUMN_IBLOCK_ID"),
"TYPE" => "LIST",
"VALUES" => $arIBlocks2col,
"DEFAULT" => '={$_REQUEST["ID"]}',
"ADDITIONAL_VALUES" => "Y",
"REFRESH" => "Y",
),

На этом мы пока закончим работу с массивом PARAMETERS (возможно мы вернёмся к нему, задав какие-то параметры далее, общие для компонента вне зависимости от типа выводимых данных, например тип и время кеширования).

Теперь зададим необходимые параметры для каждой из колонок.

Для этого нам необходимо понимать, что возможны 4 вариант вывода данных в нашем списке:

  • 1-я колонка - элементы инфоблока, 2-я колонка - элементы инфоблока;
  • 1-я колонка - элементы инфоблока, 2-я колонка - разделы инфоблока;
  • 1-я колонка - разделы инфоблока, 2-я колонка - элементы инфоблока; 
  • 1-я колонка - разделы инфоблока, 2-я колонка - разделы инфоблока.

В зависимости от значения параметра с типом для каждой из колонок мы можем вывести одну из 2 групп параметров для данной колонки с помощью простого кода:

if ($arCurrentValues["1COLUMN_TYPE"] == "COLUMN_TYPE_ELEMENT")
{

}
else
{

}


if ($arCurrentValues["2COLUMN_TYPE"] == "COLUMN_TYPE_ELEMENT")
{

}
else
{

}

Компонент списка новостей поддерживает возможность указания количества выводимых элементов, поэтому в параметрах компонентов необходимо задать это значение. Воспользуемся для этого указанной выше логикой, позволяющей задать параметры при установке переключателя в положение тип колонки = элементы:

$arComponentParameters["PARAMETERS"]["1COLUMN_NEWS_COUNT"] = array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_NEWS_COUNT"),
"TYPE" => "STRING",
"DEFAULT" => "5",
);

Синим выделены параметры, относящие переменные к 1 колонке. Для второй колонки используем аналогичную конструкцию с 2.

Для компонента списка разделов инфоблока мы так же зададим 2 специфичных параметра: глубина вложенности разделов инфоблока и флаг вывода количества элементов в разделе.

$arComponentParameters["PARAMETERS"]["1COLUMN_COUNT_ELEMENTS"] = array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_COUNT_ELEMENTS"),
"TYPE" => "CHECKBOX",
"DEFAULT" => 'Y',
);

$arComponentParameters["PARAMETERS"]["1COLUMN_TOP_DEPTH"] = array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_TOP_DEPTH"),
"TYPE" => "STRING",
"DEFAULT" => '2',
);

И вновь мы выделили цветом принадлежность к 1 (левой) колонке. Для правой колонки везде должно быть 2.

Мы специально не рассматриваем реализацию других параметров (их и так уже немало), чтобы не усложнять излишне урок!

Вы можете самостоятельно скопировать шаблон компонента в шаблон сайта и дополнить .parameters.php другими параметрами, которые умеют принимать компоненты списка разделов и списка новостей.

Результирующий вид /bitrix/components/coffeediz/elements_and_categories.list/.parameters.php:

<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();


if(!CModule::IncludeModule("iblock"))
return;

$arTypesEx = CIBlockParameters::GetIBlockTypes(Array("-"=>" "));


$arIBlocks1col=Array();
$db_iblock = CIBlock::GetList(Array("SORT"=>"ASC"), Array("SITE_ID"=>$_REQUEST["site"], "TYPE" => ($arCurrentValues["1COLUMN_IBLOCK_TYPE"]!="-"?$arCurrentValues["1COLUMN_IBLOCK_TYPE"]:"")));
while($arRes = $db_iblock->Fetch())
$arIBlocks1col[$arRes["ID"]] = $arRes["NAME"];

$arIBlocks2col=Array();
$db_iblock = CIBlock::GetList(Array("SORT"=>"ASC"), Array("SITE_ID"=>$_REQUEST["site"], "TYPE" => ($arCurrentValues["2COLUMN_IBLOCK_TYPE"]!="-"?$arCurrentValues["2COLUMN_IBLOCK_TYPE"]:"")));
while($arRes = $db_iblock->Fetch())
$arIBlocks2col[$arRes["ID"]] = $arRes["NAME"];



$arComponentParameters = array(
"GROUPS" => array(
"1COLUMN" => array(
"NAME" => GetMessage("1COLUMN_PARAMETERS")
),
"2COLUMN" => array(
"NAME" => GetMessage("2COLUMN_PARAMETERS")
),
),
"PARAMETERS" => array(
"2_COL_TITLE" => Array(
"PARENT" => "BASE",
"NAME" => GetMessage("2_COL_TITLE"),
"TYPE" => "HTML",
"DEFAULT" => "Наши Возможности",
),
"2_COL_INTRO_TEXT" => Array(
"PARENT" => "BASE",
"NAME" => GetMessage("2_COL_INTRO_TEXT"),
"TYPE" => "HTML",
"DEFAULT" => "В данном двухколоночном списке представлены возможности данного шаблона, которые вы можете штатно использовать без дополнительных доработок.",
),
"2_COL_MORE_NAME" => Array(
"PARENT" => "BASE",
"NAME" => GetMessage("2_COL_MORE_NAME"),
"TYPE" => "HTML",
"DEFAULT" => "Ещё",
),
"2_COL_MORE_LINK" => Array(
"PARENT" => "BASE",
"NAME" => GetMessage("2_COL_MORE_LINK"),
"TYPE" => "HTML",
"DEFAULT" => "#",
),
"1COLUMN_TYPE" => array(
"PARENT" => "BASE",
"NAME" => GetMessage("1COLUMN_TYPE"),
"TYPE" => "LIST",
"VALUES" => array(
"COLUMN_TYPE_ELEMENT" => GetMessage("COLUMN_TYPE_ELEMENT"),
"COLUMN_TYPE_CATEGORY" => GetMessage("COLUMN_TYPE_CATEGORY")
),
"REFRESH" => "Y"
),
"2COLUMN_TYPE" => array(
"PARENT" => "BASE",
"NAME" => GetMessage("2COLUMN_TYPE"),
"TYPE" => "LIST",
"VALUES" => array(
"COLUMN_TYPE_ELEMENT" => GetMessage("COLUMN_TYPE_ELEMENT"),
"COLUMN_TYPE_CATEGORY" => GetMessage("COLUMN_TYPE_CATEGORY")
),
"REFRESH" => "Y"
),

"CACHE_TIME" => Array("DEFAULT"=>36000000),
"CACHE_FILTER" => array(
"PARENT" => "CACHE_SETTINGS",
"NAME" => GetMessage("IBLOCK_CACHE_FILTER"),
"TYPE" => "CHECKBOX",
"DEFAULT" => "N",
),
"CACHE_GROUPS" => array(
"PARENT" => "CACHE_SETTINGS",
"NAME" => GetMessage("CP_BNL_CACHE_GROUPS"),
"TYPE" => "CHECKBOX",
"DEFAULT" => "Y",
),

"1COLUMN_IBLOCK_TYPE" => Array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_IBLOCK_TYPE"),
"TYPE" => "LIST",
"VALUES" => $arTypesEx,
"DEFAULT" => "news",
"REFRESH" => "Y",
),
"1COLUMN_IBLOCK_ID" => Array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_IBLOCK_ID"),
"TYPE" => "LIST",
"VALUES" => $arIBlocks1col,
"DEFAULT" => '={$_REQUEST["ID"]}',
"ADDITIONAL_VALUES" => "Y",
"REFRESH" => "Y",
),



"2COLUMN_IBLOCK_TYPE" => Array(
"PARENT" => "2COLUMN",
"NAME" => GetMessage("2COLUMN_IBLOCK_TYPE"),
"TYPE" => "LIST",
"VALUES" => $arTypesEx,
"DEFAULT" => "news",
"REFRESH" => "Y",
),
"2COLUMN_IBLOCK_ID" => Array(
"PARENT" => "2COLUMN",
"NAME" => GetMessage("2COLUMN_IBLOCK_ID"),
"TYPE" => "LIST",
"VALUES" => $arIBlocks2col,
"DEFAULT" => '={$_REQUEST["ID"]}',
"ADDITIONAL_VALUES" => "Y",
"REFRESH" => "Y",
),

)
);





if ($arCurrentValues["1COLUMN_TYPE"] == "COLUMN_TYPE_ELEMENT")
{

$arComponentParameters["PARAMETERS"]["1COLUMN_NEWS_COUNT"] = array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_NEWS_COUNT"),
"TYPE" => "STRING",
"DEFAULT" => "5",
);

}
else
{


$arComponentParameters["PARAMETERS"]["1COLUMN_COUNT_ELEMENTS"] = array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_COUNT_ELEMENTS"),
"TYPE" => "CHECKBOX",
"DEFAULT" => 'Y',
);

$arComponentParameters["PARAMETERS"]["1COLUMN_TOP_DEPTH"] = array(
"PARENT" => "1COLUMN",
"NAME" => GetMessage("1COLUMN_TOP_DEPTH"),
"TYPE" => "STRING",
"DEFAULT" => '2',
);

}


if ($arCurrentValues["2COLUMN_TYPE"] == "COLUMN_TYPE_ELEMENT")
{

$arComponentParameters["PARAMETERS"]["2COLUMN_NEWS_COUNT"] = array(
"PARENT" => "2COLUMN",
"NAME" => GetMessage("2COLUMN_NEWS_COUNT"),
"TYPE" => "STRING",
"DEFAULT" => "5",
);

}
else
{


$arComponentParameters["PARAMETERS"]["2COLUMN_COUNT_ELEMENTS"] = array(
"PARENT" => "2COLUMN",
"NAME" => GetMessage("2COLUMN_COUNT_ELEMENTS"),
"TYPE" => "CHECKBOX",
"DEFAULT" => 'Y',
);

$arComponentParameters["PARAMETERS"]["2COLUMN_TOP_DEPTH"] = array(
"PARENT" => "2COLUMN",
"NAME" => GetMessage("2COLUMN_TOP_DEPTH"),
"TYPE" => "STRING",
"DEFAULT" => '2',
);

}



?>

Не забудем так же про языковые файлы:

  • /bitrix/components/coffeediz/elements_and_categories.list/lang/ru/.parameters.php
  • /bitrix/components/coffeediz/elements_and_categories.list/lang/en/.parameters.php

<?
$MESS ["2_COL_TITLE"] = "Заголовок блока";
$MESS ['2_COL_INTRO_TEXT'] = "Текстовый блок перед списком";
$MESS ['2_COL_MORE_LINK'] = "Ссылка под писком";
$MESS ['2_COL_MORE_NAME'] = "Текст ссылки под списком";
$MESS ['1COLUMN_PARAMETERS'] = "Параметры для 1-й (левой) колонки";
$MESS ['2COLUMN_PARAMETERS'] = "Параметры для 2-й (правой) колонки";
$MESS ['1COLUMN_TYPE'] = "Тип данных для 1й (левой) колонки";
$MESS ['2COLUMN_TYPE'] = "Тип данных для 2й (правой) колонки";
$MESS ['COLUMN_TYPE_ELEMENT'] = "Элементы инфоблока";
$MESS ['COLUMN_TYPE_CATEGORY'] = "Разделы инфоблока";
$MESS ['1COLUMN_IBLOCK_TYPE'] = "ТИП инфоблока для 1й колонки";
$MESS ['1COLUMN_IBLOCK_ID'] = "ID инфоблока для 1й колонки";
$MESS ['2COLUMN_IBLOCK_TYPE'] = "ТИП инфоблока для 2й колонки";
$MESS ['2COLUMN_IBLOCK_ID'] = "ID инфоблока для 2й колонки";
$MESS ['1COLUMN_NEWS_COUNT'] = "количество элементов инфоблока в 1й колонке";
$MESS ['2COLUMN_NEWS_COUNT'] = "количество элементов инфоблока во 2й колонке";
$MESS ['IBLOCK_CACHE_FILTER'] = "Кешировать при установленном фильтре";
$MESS ['CP_BNL_CACHE_GROUPS'] = "Учитывать права доступа";
$MESS ['1COLUMN_COUNT_ELEMENTS'] = "Показывать количество элементов в разделе";
$MESS ['1COLUMN_TOP_DEPTH'] = "Максимальная отображаемая глубина разделов";
$MESS ['2COLUMN_COUNT_ELEMENTS'] = "Показывать количество элементов в разделе";
$MESS ['2COLUMN_TOP_DEPTH'] = "Максимальная отображаемая глубина разделов";
?>



Component.php

В нашем компоненте не предполагается никакой логики кроме передачи параметров и вызова компонентов списка для каждой из колонок, поэтому в обязательно (с архитектурной точки зрения) component.php вы только передадим данные в шаблон (после обязательной проверки пролога):

<? if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

$this->IncludeComponentTemplate();
?>


Шаблон компонента

В шаблоне компонента для начала выведем параметры, задающие оформление списка (заголовок, описание перед списком и ссылку) с проверкой на их пустоту, аналогично тому, как мы это делали в уроке 10. В /bitrix/components/coffeediz/elements_and_categories.list/templates/.default/template.php:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>

<?if (!empty($arParams["2_COL_TITLE"])):?><h4 class="indent-1"><?=$arParams['2_COL_TITLE']?>:</h4><?endif?>
<?if (!empty($arParams["2_COL_INTRO_TEXT"])):?><p class="lead"><?=$arParams['2_COL_INTRO_TEXT']?></p><?endif?>



<?if (!empty($arParams["2_COL_MORE_LINK"]) && !empty($arParams["2_COL_MORE_NAME"])):?><a href="<?=$arParams['2_COL_MORE_LINK']?>" class="link"><?=$arParams['2_COL_MORE_NAME']?></a><?endif?>

Осуществим проверку на тип для каждой из колонки для вывода данных:

<?if ($arCurrentValues["1COLUMN_TYPE"] == "COLUMN_TYPE_ELEMENT"):?>
//1 - разделы
<?else:?>
//1 - элементы
<?endif?>

<?if ($arCurrentValues["2COLUMN_TYPE"] == "COLUMN_TYPE_ELEMENT"):?>
//2 - разделы
<?else:?>
//2 - элементы
<?endif?>

Теперь для каждой из колонок (для соответствующего типа) вызовем компонент:

  • bitrix:news.list - для элементов инфоблока
  • bitrix:catalog.section.list - для разделов инфоблока

И создадим шаблоны 1 колоночного списка для каждого из них.

Формально нам следовало бы сделать комплексный компонент, а не отдельные шаблоны, поскольку так при использовании другого шаблона сайта (без копирования шаблонов компонентов) функционал перестанет работать. Но так мы потеряем возможность получать обновления штатных компонентов.

Можно было бы скопировать наши 1 колоночные шаблоны в компоненты системы (т.е. в ядро), однако это претит нашей идеологии.


Шаблон 1 колоночного списка элементов инфоблока (на основе компонента списка новостей 1С-Битрикс)

Создадим шаблон 1_column компонента bitrix:news.list в шаблоне сайта.

Сам шаблон будет практически идентичен тому, что мы создали в 10 уроке и будет содержать лишь 1 дополнительный параметр - флаг принадлежности к левой (1й) колонке:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
?>



<div class="span4<?if ($arParams["COL_TYPE_LEFT"] == Y):?> left-0<?endif?>">
<ul class="list"><?foreach($arResult["ITEMS"] as $arItem):?>
<?
$this->AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_EDIT"));
$this->AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM')));
?>
<li id="<?=$this->GetEditAreaId($arItem['ID']);?>"><a href="<?echo $arItem["DETAIL_PAGE_URL"]?>"><?echo $arItem["NAME"]?></a></li>
<?endforeach;?></ul>
</div>

Теперь осталось поместить вызов этого шаблона в шаблоне компонента 2-х колоночного списка.

Мы оставим только необходимый минимум параметров компонента (и сразу поставим вызов ID инфоблока из параметров родительского компонента 2-х колоночного списка):

<?$APPLICATION->IncludeComponent("bitrix:news.list", "1_column", array(
"IBLOCK_ID" => $arParams["1COLUMN_IBLOCK_ID"],
"NEWS_COUNT" => $arParams["1COLUMN_NEWS_COUNT"],
"FILTER_NAME" => "\$arrFilter1",
"CACHE_TYPE" => $arParams["CACHE_TYPE"],
"CACHE_TYPE" => $arParams["CACHE_TIME"],
"CACHE_TYPE" => $arParams["CACHE_FILTER"],
"CACHE_TYPE" => $arParams["CACHE_GROUPS"],
"SET_TITLE" => "N",
"COL_TYPE_LEFT" => "Y",
),
false
);?>

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

Синим выделены идентификаторы в переменных, относящихся к 1й (левой) колонке. Для правой они должны быть изменены на 2.

Зелёным выделена строка, устанавливающая параметр разметки, характерный для левой колонки. Для правой колонки этот параметр должен быть равен N.

Шаблон компонента списка разделов инфоблока

Аналогично списку новостей создадим шаблон 1_column компонента catalog.section.list в шаблоне сайта.

Несмотря на общее сходство с шаблоном 1 колоночного списка элементов (и с шаблоном 2-х колоночного списка разделов из урока 10) есть и важное отличие. Мы сохраним древовидную структуру шаблона .default!

Тогда шаблон будет выглядеть:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<div class="span4<?if ($arParams["COL_TYPE_LEFT"] == Y):?> left-0<?endif?>">
<?
$TOP_DEPTH = $arResult["SECTION"]["DEPTH_LEVEL"];
$CURRENT_DEPTH = $TOP_DEPTH;

foreach($arResult["SECTIONS"] as $arSection)
{
$this->AddEditAction($arSection['ID'], $arSection['EDIT_LINK'], CIBlock::GetArrayByID($arSection["IBLOCK_ID"], "SECTION_EDIT"));
$this->AddDeleteAction($arSection['ID'], $arSection['DELETE_LINK'], CIBlock::GetArrayByID($arSection["IBLOCK_ID"], "SECTION_DELETE"), array("CONFIRM" => GetMessage('CT_BCSL_ELEMENT_DELETE_CONFIRM')));
if($CURRENT_DEPTH < $arSection["DEPTH_LEVEL"])
{
echo "\n",str_repeat("\t", $arSection["DEPTH_LEVEL"]-$TOP_DEPTH),'<ul class="list">';
}
elseif($CURRENT_DEPTH == $arSection["DEPTH_LEVEL"])
{
echo "</li>";
}
else
{
while($CURRENT_DEPTH > $arSection["DEPTH_LEVEL"])
{
echo "</li>";
echo "\n",str_repeat("\t", $CURRENT_DEPTH-$TOP_DEPTH),"</ul>","\n",str_repeat("\t", $CURRENT_DEPTH-$TOP_DEPTH-1);
$CURRENT_DEPTH--;
}
echo "\n",str_repeat("\t", $CURRENT_DEPTH-$TOP_DEPTH),"</li>";
}

echo "\n",str_repeat("\t", $arSection["DEPTH_LEVEL"]-$TOP_DEPTH);
?><li id="<?=$this->GetEditAreaId($arSection['ID']);?>"><a href="<?=$arSection["SECTION_PAGE_URL"]?>"><?=$arSection["NAME"]?><?if($arParams["COUNT_ELEMENTS"]):?>&nbsp;(<?=$arSection["ELEMENT_CNT"]?>)<?endif;?></a><?

$CURRENT_DEPTH = $arSection["DEPTH_LEVEL"];
}

while($CURRENT_DEPTH > $TOP_DEPTH)
{
echo "</li>";
echo "\n",str_repeat("\t", $CURRENT_DEPTH-$TOP_DEPTH),"</ul>","\n",str_repeat("\t", $CURRENT_DEPTH-$TOP_DEPTH-1);
$CURRENT_DEPTH--;
}
?>
</div>

Не забудем про параметр COL_TYPE_LEFT, отвечающий за принадлежность колонки к типу "левая".

Осталось только вызвать компонент 1 колоночного списка разделов в шаблоне 2-х колоночного списка, передав в него параметры:

<?$APPLICATION->IncludeComponent("bitrix:catalog.section.list", "1_column", array(
"IBLOCK_ID" => $arParams["1COLUMN_IBLOCK_ID"],
"COUNT_ELEMENTS" => $arParams["1COLUMN_COUNT_ELEMENTS"],
"TOP_DEPTH" => $arParams["1COLUMN_TOP_DEPTH"],
"CACHE_TYPE" => $arParams["CACHE_TYPE"],
"CACHE_TYPE" => $arParams["CACHE_TIME"],
"CACHE_TYPE" => $arParams["CACHE_FILTER"],
"CACHE_TYPE" => $arParams["CACHE_GROUPS"],
"ADD_SECTIONS_CHAIN" => "N",
"COL_TYPE_LEFT" => "Y"
),
false
);?>

Синим вновь выделены идентификаторы в переменных, относящихся к 1й (левой) колонке. Для правой они должны быть изменены на 2.

Зелёным выделена строка, устанавливающая параметр разметки, характерный для левой колонки. Для правой колонки этот параметр должен быть равен N.

Итоговый код шаблона:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>

<?if (!empty($arParams["2_COL_TITLE"])):?><h4 class="indent-1"><?=$arParams['2_COL_TITLE']?>:</h4><?endif?>
<?if (!empty($arParams["2_COL_INTRO_TEXT"])):?><p class="lead"><?=$arParams['2_COL_INTRO_TEXT']?></p><?endif?>

<div class="lists">
<?if ($arParams["1COLUMN_TYPE"] == "COLUMN_TYPE_ELEMENT"):?>
<?$APPLICATION->IncludeComponent("bitrix:news.list", "1_column", array(
"IBLOCK_ID" => $arParams["1COLUMN_IBLOCK_ID"],
"NEWS_COUNT" => $arParams["1COLUMN_NEWS_COUNT"],
"FILTER_NAME" => "\$arrFilter1",
"CACHE_TYPE" => $arParams["CACHE_TYPE"],
"CACHE_TYPE" => $arParams["CACHE_TIME"],
"CACHE_TYPE" => $arParams["CACHE_FILTER"],
"CACHE_TYPE" => $arParams["CACHE_GROUPS"],
"SET_TITLE" => "N",
"COL_TYPE_LEFT" => "Y",
),
false
);?>
<?else:?>
<?$APPLICATION->IncludeComponent("bitrix:catalog.section.list", "1_column", array(
"IBLOCK_ID" => $arParams["1COLUMN_IBLOCK_ID"],
"COUNT_ELEMENTS" => $arParams["1COLUMN_COUNT_ELEMENTS"],
"TOP_DEPTH" => $arParams["1COLUMN_TOP_DEPTH"],
"CACHE_TYPE" => $arParams["CACHE_TYPE"],
"CACHE_TYPE" => $arParams["CACHE_TIME"],
"CACHE_TYPE" => $arParams["CACHE_FILTER"],
"CACHE_TYPE" => $arParams["CACHE_GROUPS"],
"ADD_SECTIONS_CHAIN" => "N",
"COL_TYPE_LEFT" => "Y"
),
false
);?>
<?endif?>

<?if ($arParams["2COLUMN_TYPE"] == "COLUMN_TYPE_ELEMENT"):?>
<?$APPLICATION->IncludeComponent("bitrix:news.list", "1_column", array(
"IBLOCK_ID" => $arParams["2COLUMN_IBLOCK_ID"],
"NEWS_COUNT" => $arParams["2COLUMN_NEWS_COUNT"],
"FILTER_NAME" => "\$arrFilter2",
"CACHE_TYPE" => $arParams["CACHE_TYPE"],
"CACHE_TYPE" => $arParams["CACHE_TIME"],
"CACHE_TYPE" => $arParams["CACHE_FILTER"],
"CACHE_TYPE" => $arParams["CACHE_GROUPS"],
"SET_TITLE" => "N",
"COL_TYPE_LEFT" => "N",
),
false
);?>
<?else:?>
<?$APPLICATION->IncludeComponent("bitrix:catalog.section.list", "1_column", array(
"IBLOCK_ID" => $arParams["2COLUMN_IBLOCK_ID"],
"COUNT_ELEMENTS" => $arParams["2COLUMN_COUNT_ELEMENTS"],
"TOP_DEPTH" => $arParams["2COLUMN_TOP_DEPTH"],
"CACHE_TYPE" => $arParams["CACHE_TYPE"],
"CACHE_TYPE" => $arParams["CACHE_TIME"],
"CACHE_TYPE" => $arParams["CACHE_FILTER"],
"CACHE_TYPE" => $arParams["CACHE_GROUPS"],
"ADD_SECTIONS_CHAIN" => "N",
"COL_TYPE_LEFT" => "N"
),
false
);?>
<?endif?>
</div>

<?if (!empty($arParams["2_COL_MORE_LINK"]) && !empty($arParams["2_COL_MORE_NAME"])):?><a href="<?=$arParams['2_COL_MORE_LINK']?>" class="link"><?=$arParams['2_COL_MORE_NAME']?></a><?endif?>


Заключение

В рамках этого урока мы разработали свой первый компонент. Он довольно прост и его задача - вызвать пару системных компонентов с нашими шаблонами, передав им набор параметров.

Так же в качестве бонуса мы разработали 2 простых шаблона компонентов.

В результате структура нашего компонента выглядеть следующим образом:

структура компонента 2-х колоночного списка элементов/разделов инфоблоков 1С-Битрикс

В публичной части это будет выглядеть следующим образом:

2-х колоночный смешанный список элементов/разделов инфоблока 1С-Битрикс на широком мониторе

2-х колоночный смешанный список элементов/разделов инфоблока 1С-Битрикс на узком мониторе или мобильном устройстве


Результаты данного урока вы, как всегда, можете найти в нашем репозитории на GitHub.


Дополнительный урок по интеграции адаптивного Bootstrap шаблона сайта в 1С-Битрикс - 10+

<p>В рамках этого урока мы создадим простой компонент-болванку. Он не будет содержать особой логики и даже не будет иметь особенного шаблона - его задача будет вызывать 2 других компонента и передавать в них определённые параметры. Мы реализуем 2-х колоночный список с возможностью выбора типа выводимых данных для каждой колонки: элементы и/или разделы инфоблока.</p> <p> <br /> </p> <h2>Каркас нового компонента 1С-Битрикс</h2> <p>Для начала создадим собственное пространство имён компонентов. Для этого в папке /bitrix/components/ создадим папку coffeediz (название папки и будет пространством имён).</p> <p>Теперь в папке пространства имён компонентов /bitrix/components/coffeediz/ создадим папку с названием нашего нового компонента elements_and_categories.list.</p> <p>В папке компонента /bitrix/components/coffeediz/elements_and_categories.list/ создаём файл .description.php следующего содержания:</p> <div style="border: 1px solid; padding: 10px;"><code class="PHP">&lt;? <br /> if (!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true) die(); <br /> <br /> $arComponentDescription = array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;ELEMENTS_AND_CATEGORIES_LIST&quot;), <font color="#00a650">//Название компонента</font> <br /> &quot;DESCRIPTION&quot; =&gt; GetMessage(&quot;ELEMENTS_AND_CATEGORIES_LIST_DESC&quot;), <font color="#00a650">//Описание</font> <br /> &quot;ICON&quot; =&gt; &quot;/images/elements_and_categories_list.gif&quot;, <font color="#00a650">//Иконка компонента для виз редактора</font> <br /> &quot;SORT&quot; =&gt; 70, <font color="#00a650">//индекс сортировки, задающий положение компонента в конечной ветки дерева</font> <br /> &quot;CACHE_PATH&quot; =&gt; &quot;Y&quot;, <br /> &quot;PATH&quot; =&gt; array( <font color="#00a650">//расположение в дереве компонентов визуального редактора</font> <br /> &quot;ID&quot; =&gt; &quot;content&quot;, <font color="#00a650">//Код ветки дерева &quot;Контент&quot;</font> <br /> &quot;CHILD&quot; =&gt; array( <br /> &quot;ID&quot; =&gt; &quot;news&quot;, <font color="#00a650">//Код ветки дерева &quot;Статьи и Новости&quot; в ветке &quot;Контент&quot;</font> <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;T_IBLOCK_DESC_NEWS&quot;), <br /> &quot;SORT&quot; =&gt; 10, <br /> ), <br /> ), <br /> ); <br /> <br /> ?&gt;</code></div> <p>В папку /bitrix/components/coffeediz/elements_and_categories.list/images/ мы положим картинку, которую будем использовать в качестве иконки в виз редакторе (как можно видеть выше в .description.php можно вызвать файл с любым именем в качестве иконки) - <span style="font-family: monospace;">elements_and_categories_list.gif.</span></p> <p><img src="/upload/medialibrary/89d/89dff4863d574b68aeccdabced3f82ad.gif" title="иконка для визуального редактора 1С-Битрикс компонента 2-х колоночного списка элементов/разделов инфоблока" hspace="5" vspace="5" border="0" alt="иконка для визуального редактора 1С-Битрикс компонента 2-х колоночного списка элементов/разделов инфоблока" width="32" height="16" /></p> <p> Размер и вид иконки могут быть любыми, однако, мы рекомендуем придерживаться стилистики дефолтных иконок 1С-Битрикс. </p> <p>Не забудем о необходимости создать языковые файлы (подключаются автоматически при размещении в папке компонента /lang/ИД_языка/ файлов с таким же названием как и те, где используются языковые фразы.</p> <p>Для русского языка (/bitrix/components/coffeediz/elements_and_categories.list/lang/ru/.description.php):</p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;? <br /> $MESS ['ELEMENTS_AND_CATEGORIES_LIST'] = &quot;2-х колоночный список&quot;; <br /> $MESS ['ELEMENTS_AND_CATEGORIES_LIST_DESC'] = &quot;2-х колоночный список, выводящий в каждой колонке список элементов/разделов инфоблока на выбор&quot;; <br /> $MESS ['T_IBLOCK_DESC_NEWS'] = &quot;Статьи и новости&quot;; <br /> ?&gt;</code></div> <p>Для английского языка (/bitrix/components/coffeediz/elements_and_categories.list/lang/en/.description.php):</p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;? <br /> $MESS ['ELEMENTS_AND_CATEGORIES_LIST'] = &quot;2 column list&quot;; <br /> $MESS ['ELEMENTS_AND_CATEGORIES_LIST_DESC'] = &quot;2 column list of elements/categories of Infoblock&quot;; <br /> $MESS ['T_IBLOCK_DESC_NEWS'] = &quot;News&quot;; <br /> ?&gt;</code></div> <p> <b>Поскольку файл component.php (файл с ЛОГИКОЙ) является обязательным согласно архитектуре 1С-Битрикс, то наш компонент не появится в визуальном редакторе до тех пор, пока мы его не создадим.</b> </p> <p>Однако поскольку наша задумка не предполагает никакой логики (мы просто передадим параметры нашего компонента в шаблон к вызываемым там компонентам), то мы оставим его ПУСТЫМ.Это может показаться странным (и кто-то из бывалых возможно нас осудит), но далее мы увидим, что это оправдано!</p> <p>В результате увидим такую картинку в визуальном редакторе 1С-Битрикс:</p> <p><img src="/upload/medialibrary/397/3979d54fcbac607d6a74c59ca9ff87cd.png" title="компонент 2-х колоночного списка элементов/разделов инфоблока в визуальном редакторе 1С-Битрикс" hspace="5" vspace="5" border="0" alt="компонент 2-х колоночного списка элементов/разделов инфоблока в визуальном редакторе 1С-Битрикс" width="696" height="666" /></p> <p> <br /> </p> <h2>Параметры нового компонента 1С-Битрикс</h2> <p>Создадим файл /bitrix/components/coffeediz/elements_and_categories.list/.parameters.php с параметрами компонента.</p> <p>Поскольку у нас планируется работа с инфоблоками необходимо (сразу после проверки пролога) поставить проверку наличия в системе модуля инфоблоков:</p> <div style="border: 1px solid; padding: 10px;"><code class="php">if(!CModule::IncludeModule(&quot;iblock&quot;)) <br /> return;</code></div> <p> Далее считаем в переменную данные о всех типах инфоблоков: </p> <div style="border: 1px solid; padding: 10px;"><code class="php">$arTypesEx = CIBlockParameters::GetIBlockTypes(Array(&quot;-&quot;=&gt;&quot; &quot;));</code></div> <p>Далее в отдельную переменную считаем данные об инфоблоках в системе. </p> <p>Поскольку мы будем использовать архитектурное решение, аналогичное компонента bitrix:news.list, то тип инфоблока будет только справочным значением, которое будет использоваться для фильтрафии списка инфоблоков в целях упрощения работы администратора при изменении параметров компонента. Поэтому мы не просто считаем данные об инфоблоках и выберем ID, а скорректируем их в зависимости от выбранного в параметре &quot;Тип инфоблока&quot; значения:</p> <div style="border: 1px solid; padding: 10px;"><code class="php">$arIBlocks<span style="background-color: rgb(0, 174, 239);">1</span>col=Array(); <br /> $db_iblock = CIBlock::GetList(Array(&quot;SORT&quot;=&gt;&quot;ASC&quot;), Array(&quot;SITE_ID&quot;=&gt;$_REQUEST[&quot;site&quot;], &quot;TYPE&quot; =&gt; ($arCurrentValues[&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_IBLOCK_TYPE&quot;]!=&quot;-&quot;?$arCurrentValues[&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_IBLOCK_TYPE&quot;]:&quot;&quot;))); <br /> while($arRes = $db_iblock-&gt;Fetch()) <br /> $arIBlocks<span style="background-color: rgb(0, 174, 239);">1</span>col[$arRes[&quot;ID&quot;]] = $arRes[&quot;NAME&quot;]; <br /> </code></div> <p> Как видите в ряде переменных мы используем идентификатор 1 - он указывает на то, что мы выбираем ID инфоблока для 1й (левой колонки). Аналогичный код, но с 2 будет выбирать ID инфоблока для 2й колонки. </p> <p>Теперь зададим сами параметры.</p> <p>В отличие от шаблона компонента параметры самого компонента хранятся в виде массива в другой переменной - $arComponentParameters.</p> <p>Во-первых, зададим 2 дополнительные группы параметров (мы будем хранить отдельно основные параметры и параметры, характерные для каждой из колонок для того, чтобы их удобнее было редактировать):</p> <div style="border: 1px solid; padding: 10px;"><code class="php">&quot;GROUPS&quot; =&gt; array( <br /> &quot;1COLUMN&quot; =&gt; array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_PARAMETERS&quot;) <br /> ), <br /> &quot;2COLUMN&quot; =&gt; array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_PARAMETERS&quot;) <br /> ), <br /> ),</code></div> <p> Во-вторых, зададим массив основных параметров, идентичным тем, что мы использовали в 10 уроке (Заголовок списка, текст перед списком и ссылка после списка) в массиве PARAMETERS: </p> <div style="border: 1px solid; padding: 10px;"><code class="php">&quot;2_COL_TITLE&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2_COL_TITLE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;Наши Возможности&quot;, <br /> ), <br /> &quot;2_COL_INTRO_TEXT&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2_COL_INTRO_TEXT&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;В данном двухколоночном списке представлены возможности данного шаблона, которые вы можете штатно использовать без дополнительных доработок.&quot;, <br /> ), <br /> &quot;2_COL_MORE_NAME&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2_COL_MORE_NAME&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;Ещё&quot;, <br /> ), <br /> &quot;2_COL_MORE_LINK&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2_COL_MORE_LINK&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;#&quot;, <br /> ),</code></div> <p> В-третьих (так же в массиве PARAMETERS) зададим выбор типа для колонки.</p> <p>Мы предусмотрим для каждой из колонок 2 типа: элементы или разделы инфоблока. </p> <p>Не забудем и о том, что после изменения значения каждого из этих свойств необходимо будет перезагрузить список параметров компонента (в зависимости от типа может меняться набор параметров для каждой конкретной колонки). За это отвечает параметр &quot;REFRESH&quot; =&gt; &quot;Y&quot;.</p> <p> Соответственно, реализацию мы сделаем через свойства типа &quot;список&quot; с 2 предопределёнными значениями, которые зададим в виде массива в свойстве VALUES: </p> <div style="border: 1px solid; padding: 10px;"><code class="php">&quot;1COLUMN_TYPE&quot; =&gt; array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_TYPE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; array( <br /> &quot;COLUMN_TYPE_ELEMENT&quot; =&gt; GetMessage(&quot;COLUMN_TYPE_ELEMENT&quot;), <br /> &quot;COLUMN_TYPE_CATEGORY&quot; =&gt; GetMessage(&quot;COLUMN_TYPE_CATEGORY&quot;) <br /> ), <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot; <br /> ), <br /> &quot;2COLUMN_TYPE&quot; =&gt; array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_TYPE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; array( <br /> &quot;COLUMN_TYPE_ELEMENT&quot; =&gt; GetMessage(&quot;COLUMN_TYPE_ELEMENT&quot;), <br /> &quot;COLUMN_TYPE_CATEGORY&quot; =&gt; GetMessage(&quot;COLUMN_TYPE_CATEGORY&quot;) <br /> ), <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot; <br /> ),</code></div> <p> И, наконец, в-четвёртых, зададим параметры типа и ID инфоблока для каждой из колонок. Мы сделаем это сейчас в общем списке параметров потому, что вне зависимости от типа (элементы или разделы инфоблока) данных в колонке знать ID инфоблока нам необходимо. </p> <p>Значения типа и ID инфоблоков из системы мы получили выше, так что код будет выглядеть даже проще, чем задание списка типов колонок:</p> <div style="border: 1px solid; padding: 10px;"><code class="php">&quot;1COLUMN_IBLOCK_TYPE&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;1COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_IBLOCK_TYPE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; $arTypesEx, <br /> &quot;DEFAULT&quot; =&gt; &quot;news&quot;, <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot;, <br /> ), <br /> &quot;1COLUMN_IBLOCK_ID&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;1COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_IBLOCK_ID&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; $arIBlocks1col, <br /> &quot;DEFAULT&quot; =&gt; '={$_REQUEST[&quot;ID&quot;]}', <br /> &quot;ADDITIONAL_VALUES&quot; =&gt; &quot;Y&quot;, <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot;, <br /> ), <br /> <br /> <br /> &quot;2COLUMN_IBLOCK_TYPE&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;2COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_IBLOCK_TYPE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; $arTypesEx, <br /> &quot;DEFAULT&quot; =&gt; &quot;news&quot;, <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot;, <br /> ), <br /> &quot;2COLUMN_IBLOCK_ID&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;2COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_IBLOCK_ID&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; $arIBlocks2col, <br /> &quot;DEFAULT&quot; =&gt; '={$_REQUEST[&quot;ID&quot;]}', <br /> &quot;ADDITIONAL_VALUES&quot; =&gt; &quot;Y&quot;, <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot;, <br /> ),</code></div> <p>На этом мы пока закончим работу с массивом PARAMETERS (возможно мы вернёмся к нему, задав какие-то параметры далее, общие для компонента вне зависимости от типа выводимых данных, например тип и время кеширования).</p> <p> Теперь зададим необходимые параметры для каждой из колонок. </p> <p>Для этого нам необходимо понимать, что возможны 4 вариант вывода данных в нашем списке:</p> <p> </p> <ul> <li>1-я колонка - элементы инфоблока, 2-я колонка - элементы инфоблока;</li> <li>1-я колонка - элементы инфоблока, 2-я колонка - разделы инфоблока;</li> <li>1-я колонка - разделы инфоблока, 2-я колонка - элементы инфоблока; </li> <li>1-я колонка - разделы инфоблока, 2-я колонка - разделы инфоблока.</li> </ul> <p></p> <p>В зависимости от значения параметра с типом для каждой из колонок мы можем вывести одну из 2 групп параметров для данной колонки с помощью простого кода:</p> <div style="border: 1px solid; padding: 10px;"><code class="php">if ($arCurrentValues[&quot;1COLUMN_TYPE&quot;] == &quot;COLUMN_TYPE_ELEMENT&quot;) <br /> { <br /> <br /> } <br /> else <br /> { <br /> <br /> } <br /> <br /> <br /> if ($arCurrentValues[&quot;2COLUMN_TYPE&quot;] == &quot;COLUMN_TYPE_ELEMENT&quot;) <br /> { <br /> <br /> } <br /> else <br /> { <br /> <br /> } <br /> </code></div> <p> Компонент списка новостей поддерживает возможность указания количества выводимых элементов, поэтому в параметрах компонентов необходимо задать это значение. Воспользуемся для этого указанной выше логикой, позволяющей задать параметры при установке переключателя в положение тип колонки = элементы: </p> <div style="border: 1px solid; padding: 10px;"><code class="php">$arComponentParameters[&quot;PARAMETERS&quot;][&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_NEWS_COUNT&quot;] = array( <br /> &quot;PARENT&quot; =&gt; &quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_NEWS_COUNT&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;STRING&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;5&quot;, <br /> );</code></div> <p> Синим выделены параметры, относящие переменные к 1 колонке. Для второй колонки используем аналогичную конструкцию с 2. </p> <p> Для компонента списка разделов инфоблока мы так же зададим 2 специфичных параметра: глубина вложенности разделов инфоблока и флаг вывода количества элементов в разделе. </p> <div style="border: 1px solid; padding: 10px;"><code class="php">$arComponentParameters[&quot;PARAMETERS&quot;][&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_COUNT_ELEMENTS&quot;] = array( <br /> &quot;PARENT&quot; =&gt; &quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_COUNT_ELEMENTS&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;CHECKBOX&quot;, <br /> &quot;DEFAULT&quot; =&gt; 'Y', <br /> ); <br /> <br /> $arComponentParameters[&quot;PARAMETERS&quot;][&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_TOP_DEPTH&quot;] = array( <br /> &quot;PARENT&quot; =&gt; &quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_TOP_DEPTH&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;STRING&quot;, <br /> &quot;DEFAULT&quot; =&gt; '2', <br /> );</code></div> <p> И вновь мы выделили цветом принадлежность к 1 (левой) колонке. Для правой колонки везде должно быть 2. </p> <p><b><font color="#ff0000">Мы специально не рассматриваем реализацию других параметров (их и так уже немало), чтобы не усложнять излишне урок!</font></b></p> <p><i>Вы можете самостоятельно скопировать шаблон компонента в шаблон сайта и дополнить .parameters.php другими параметрами, которые умеют принимать компоненты списка разделов и списка новостей.</i></p> <p>Результирующий вид /bitrix/components/coffeediz/elements_and_categories.list/.parameters.php:</p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;? <br /> if (!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true) die(); <br /> <br /> <br /> if(!CModule::IncludeModule(&quot;iblock&quot;)) <br /> return; <br /> <br /> $arTypesEx = CIBlockParameters::GetIBlockTypes(Array(&quot;-&quot;=&gt;&quot; &quot;)); <br /> <br /> <br /> $arIBlocks1col=Array(); <br /> $db_iblock = CIBlock::GetList(Array(&quot;SORT&quot;=&gt;&quot;ASC&quot;), Array(&quot;SITE_ID&quot;=&gt;$_REQUEST[&quot;site&quot;], &quot;TYPE&quot; =&gt; ($arCurrentValues[&quot;1COLUMN_IBLOCK_TYPE&quot;]!=&quot;-&quot;?$arCurrentValues[&quot;1COLUMN_IBLOCK_TYPE&quot;]:&quot;&quot;))); <br /> while($arRes = $db_iblock-&gt;Fetch()) <br /> $arIBlocks1col[$arRes[&quot;ID&quot;]] = $arRes[&quot;NAME&quot;]; <br /> <br /> $arIBlocks2col=Array(); <br /> $db_iblock = CIBlock::GetList(Array(&quot;SORT&quot;=&gt;&quot;ASC&quot;), Array(&quot;SITE_ID&quot;=&gt;$_REQUEST[&quot;site&quot;], &quot;TYPE&quot; =&gt; ($arCurrentValues[&quot;2COLUMN_IBLOCK_TYPE&quot;]!=&quot;-&quot;?$arCurrentValues[&quot;2COLUMN_IBLOCK_TYPE&quot;]:&quot;&quot;))); <br /> while($arRes = $db_iblock-&gt;Fetch()) <br /> $arIBlocks2col[$arRes[&quot;ID&quot;]] = $arRes[&quot;NAME&quot;]; <br /> <br /> <br /> <br /> $arComponentParameters = array( <br /> &quot;GROUPS&quot; =&gt; array( <br /> &quot;1COLUMN&quot; =&gt; array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_PARAMETERS&quot;) <br /> ), <br /> &quot;2COLUMN&quot; =&gt; array( <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_PARAMETERS&quot;) <br /> ), <br /> ), <br /> &quot;PARAMETERS&quot; =&gt; array( <br /> &quot;2_COL_TITLE&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2_COL_TITLE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;Наши Возможности&quot;, <br /> ), <br /> &quot;2_COL_INTRO_TEXT&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2_COL_INTRO_TEXT&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;В данном двухколоночном списке представлены возможности данного шаблона, которые вы можете штатно использовать без дополнительных доработок.&quot;, <br /> ), <br /> &quot;2_COL_MORE_NAME&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2_COL_MORE_NAME&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;Ещё&quot;, <br /> ), <br /> &quot;2_COL_MORE_LINK&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2_COL_MORE_LINK&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;HTML&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;#&quot;, <br /> ), <br /> &quot;1COLUMN_TYPE&quot; =&gt; array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_TYPE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; array( <br /> &quot;COLUMN_TYPE_ELEMENT&quot; =&gt; GetMessage(&quot;COLUMN_TYPE_ELEMENT&quot;), <br /> &quot;COLUMN_TYPE_CATEGORY&quot; =&gt; GetMessage(&quot;COLUMN_TYPE_CATEGORY&quot;) <br /> ), <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot; <br /> ), <br /> &quot;2COLUMN_TYPE&quot; =&gt; array( <br /> &quot;PARENT&quot; =&gt; &quot;BASE&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_TYPE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; array( <br /> &quot;COLUMN_TYPE_ELEMENT&quot; =&gt; GetMessage(&quot;COLUMN_TYPE_ELEMENT&quot;), <br /> &quot;COLUMN_TYPE_CATEGORY&quot; =&gt; GetMessage(&quot;COLUMN_TYPE_CATEGORY&quot;) <br /> ), <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot; <br /> ), <br /> <br /> &quot;CACHE_TIME&quot; =&gt; Array(&quot;DEFAULT&quot;=&gt;36000000), <br /> &quot;CACHE_FILTER&quot; =&gt; array( <br /> &quot;PARENT&quot; =&gt; &quot;CACHE_SETTINGS&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;IBLOCK_CACHE_FILTER&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;CHECKBOX&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;N&quot;, <br /> ), <br /> &quot;CACHE_GROUPS&quot; =&gt; array( <br /> &quot;PARENT&quot; =&gt; &quot;CACHE_SETTINGS&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;CP_BNL_CACHE_GROUPS&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;CHECKBOX&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;Y&quot;, <br /> ), <br /> <br /> &quot;1COLUMN_IBLOCK_TYPE&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;1COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_IBLOCK_TYPE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; $arTypesEx, <br /> &quot;DEFAULT&quot; =&gt; &quot;news&quot;, <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot;, <br /> ), <br /> &quot;1COLUMN_IBLOCK_ID&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;1COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_IBLOCK_ID&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; $arIBlocks1col, <br /> &quot;DEFAULT&quot; =&gt; '={$_REQUEST[&quot;ID&quot;]}', <br /> &quot;ADDITIONAL_VALUES&quot; =&gt; &quot;Y&quot;, <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot;, <br /> ), <br /> <br /> <br /> <br /> &quot;2COLUMN_IBLOCK_TYPE&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;2COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_IBLOCK_TYPE&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; $arTypesEx, <br /> &quot;DEFAULT&quot; =&gt; &quot;news&quot;, <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot;, <br /> ), <br /> &quot;2COLUMN_IBLOCK_ID&quot; =&gt; Array( <br /> &quot;PARENT&quot; =&gt; &quot;2COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_IBLOCK_ID&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;LIST&quot;, <br /> &quot;VALUES&quot; =&gt; $arIBlocks2col, <br /> &quot;DEFAULT&quot; =&gt; '={$_REQUEST[&quot;ID&quot;]}', <br /> &quot;ADDITIONAL_VALUES&quot; =&gt; &quot;Y&quot;, <br /> &quot;REFRESH&quot; =&gt; &quot;Y&quot;, <br /> ), <br /> <br /> ) <br /> ); <br /> <br /> <br /> <br /> <br /> <br /> if ($arCurrentValues[&quot;1COLUMN_TYPE&quot;] == &quot;COLUMN_TYPE_ELEMENT&quot;) <br /> { <br /> <br /> $arComponentParameters[&quot;PARAMETERS&quot;][&quot;1COLUMN_NEWS_COUNT&quot;] = array( <br /> &quot;PARENT&quot; =&gt; &quot;1COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_NEWS_COUNT&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;STRING&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;5&quot;, <br /> ); <br /> <br /> } <br /> else <br /> { <br /> <br /> <br /> $arComponentParameters[&quot;PARAMETERS&quot;][&quot;1COLUMN_COUNT_ELEMENTS&quot;] = array( <br /> &quot;PARENT&quot; =&gt; &quot;1COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_COUNT_ELEMENTS&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;CHECKBOX&quot;, <br /> &quot;DEFAULT&quot; =&gt; 'Y', <br /> ); <br /> <br /> $arComponentParameters[&quot;PARAMETERS&quot;][&quot;1COLUMN_TOP_DEPTH&quot;] = array( <br /> &quot;PARENT&quot; =&gt; &quot;1COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;1COLUMN_TOP_DEPTH&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;STRING&quot;, <br /> &quot;DEFAULT&quot; =&gt; '2', <br /> ); <br /> <br /> } <br /> <br /> <br /> if ($arCurrentValues[&quot;2COLUMN_TYPE&quot;] == &quot;COLUMN_TYPE_ELEMENT&quot;) <br /> { <br /> <br /> $arComponentParameters[&quot;PARAMETERS&quot;][&quot;2COLUMN_NEWS_COUNT&quot;] = array( <br /> &quot;PARENT&quot; =&gt; &quot;2COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_NEWS_COUNT&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;STRING&quot;, <br /> &quot;DEFAULT&quot; =&gt; &quot;5&quot;, <br /> ); <br /> <br /> } <br /> else <br /> { <br /> <br /> <br /> $arComponentParameters[&quot;PARAMETERS&quot;][&quot;2COLUMN_COUNT_ELEMENTS&quot;] = array( <br /> &quot;PARENT&quot; =&gt; &quot;2COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_COUNT_ELEMENTS&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;CHECKBOX&quot;, <br /> &quot;DEFAULT&quot; =&gt; 'Y', <br /> ); <br /> <br /> $arComponentParameters[&quot;PARAMETERS&quot;][&quot;2COLUMN_TOP_DEPTH&quot;] = array( <br /> &quot;PARENT&quot; =&gt; &quot;2COLUMN&quot;, <br /> &quot;NAME&quot; =&gt; GetMessage(&quot;2COLUMN_TOP_DEPTH&quot;), <br /> &quot;TYPE&quot; =&gt; &quot;STRING&quot;, <br /> &quot;DEFAULT&quot; =&gt; '2', <br /> ); <br /> <br /> } <br /> <br /> <br /> <br /> ?&gt;</code></div> <p>Не забудем так же про языковые файлы:</p> <p> </p> <ul> <li>/bitrix/components/coffeediz/elements_and_categories.list/lang/ru/.parameters.php</li> <li>/bitrix/components/coffeediz/elements_and_categories.list/lang/en/.parameters.php</li> </ul> <p></p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;? <br /> $MESS [&quot;2_COL_TITLE&quot;] = &quot;Заголовок блока&quot;; <br /> $MESS ['2_COL_INTRO_TEXT'] = &quot;Текстовый блок перед списком&quot;; <br /> $MESS ['2_COL_MORE_LINK'] = &quot;Ссылка под писком&quot;; <br /> $MESS ['2_COL_MORE_NAME'] = &quot;Текст ссылки под списком&quot;; <br /> $MESS ['1COLUMN_PARAMETERS'] = &quot;Параметры для 1-й (левой) колонки&quot;; <br /> $MESS ['2COLUMN_PARAMETERS'] = &quot;Параметры для 2-й (правой) колонки&quot;; <br /> $MESS ['1COLUMN_TYPE'] = &quot;Тип данных для 1й (левой) колонки&quot;; <br /> $MESS ['2COLUMN_TYPE'] = &quot;Тип данных для 2й (правой) колонки&quot;; <br /> $MESS ['COLUMN_TYPE_ELEMENT'] = &quot;Элементы инфоблока&quot;; <br /> $MESS ['COLUMN_TYPE_CATEGORY'] = &quot;Разделы инфоблока&quot;; <br /> $MESS ['1COLUMN_IBLOCK_TYPE'] = &quot;ТИП инфоблока для 1й колонки&quot;; <br /> $MESS ['1COLUMN_IBLOCK_ID'] = &quot;ID инфоблока для 1й колонки&quot;; <br /> $MESS ['2COLUMN_IBLOCK_TYPE'] = &quot;ТИП инфоблока для 2й колонки&quot;; <br /> $MESS ['2COLUMN_IBLOCK_ID'] = &quot;ID инфоблока для 2й колонки&quot;; <br /> $MESS ['1COLUMN_NEWS_COUNT'] = &quot;количество элементов инфоблока в 1й колонке&quot;; <br /> $MESS ['2COLUMN_NEWS_COUNT'] = &quot;количество элементов инфоблока во 2й колонке&quot;; <br /> $MESS ['IBLOCK_CACHE_FILTER'] = &quot;Кешировать при установленном фильтре&quot;; <br /> $MESS ['CP_BNL_CACHE_GROUPS'] = &quot;Учитывать права доступа&quot;; <br /> $MESS ['1COLUMN_COUNT_ELEMENTS'] = &quot;Показывать количество элементов в разделе&quot;; <br /> $MESS ['1COLUMN_TOP_DEPTH'] = &quot;Максимальная отображаемая глубина разделов&quot;; <br /> $MESS ['2COLUMN_COUNT_ELEMENTS'] = &quot;Показывать количество элементов в разделе&quot;; <br /> $MESS ['2COLUMN_TOP_DEPTH'] = &quot;Максимальная отображаемая глубина разделов&quot;; <br /> ?&gt;</code></div> <p> <br /> </p> <p> <br /> </p> <h2>Component.php</h2> <p>В нашем компоненте не предполагается никакой логики кроме передачи параметров и вызова компонентов списка для каждой из колонок, поэтому в обязательно (с архитектурной точки зрения) component.php вы только передадим данные в шаблон (после обязательной проверки пролога):</p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;? if(!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true)die(); <br /> <br /> $this-&gt;IncludeComponentTemplate(); <br /> ?&gt;</code></div> <p> <br /> </p> <h2>Шаблон компонента</h2> <p>В шаблоне компонента для начала выведем параметры, задающие оформление списка (заголовок, описание перед списком и ссылку) с проверкой на их пустоту, аналогично тому, как мы это делали в уроке 10. В /bitrix/components/coffeediz/elements_and_categories.list/templates/.default/template.php:</p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;?if(!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true)die();?&gt; <br /> <br /> &lt;?if (!empty($arParams[&quot;2_COL_TITLE&quot;])):?&gt;&lt;h4 class=&quot;indent-1&quot;&gt;&lt;?=$arParams['2_COL_TITLE']?&gt;:&lt;/h4&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;2_COL_INTRO_TEXT&quot;])):?&gt;&lt;p class=&quot;lead&quot;&gt;&lt;?=$arParams['2_COL_INTRO_TEXT']?&gt;&lt;/p&gt;&lt;?endif?&gt; <br /> <br /> <br /> <br /> &lt;?if (!empty($arParams[&quot;2_COL_MORE_LINK&quot;]) &amp;&amp; !empty($arParams[&quot;2_COL_MORE_NAME&quot;])):?&gt;&lt;a href=&quot;&lt;?=$arParams['2_COL_MORE_LINK']?&gt;&quot; class=&quot;link&quot;&gt;&lt;?=$arParams['2_COL_MORE_NAME']?&gt;&lt;/a&gt;&lt;?endif?&gt;</code></div> <p>Осуществим проверку на тип для каждой из колонки для вывода данных: </p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;?if ($arCurrentValues[&quot;1COLUMN_TYPE&quot;] == &quot;COLUMN_TYPE_ELEMENT&quot;):?&gt; <br /> <font color="#00a650">//1 - разделы</font> <br /> &lt;?else:?&gt; <br /> <font color="#00a650">//1 - элементы</font> <br /> &lt;?endif?&gt; <br /> <br /> &lt;?if ($arCurrentValues[&quot;2COLUMN_TYPE&quot;] == &quot;COLUMN_TYPE_ELEMENT&quot;):?&gt; <br /> <font color="#00a650">//2 - разделы</font> <br /> &lt;?else:?&gt; <br /> <font color="#00a650">//2 - элементы</font> <br /> &lt;?endif?&gt;</code></div> <p> Теперь для каждой из колонок (для соответствующего типа) вызовем компонент: </p> <p> </p> <ul> <li>bitrix:news.list - для элементов инфоблока</li> <li>bitrix:catalog.section.list - для разделов инфоблока</li> </ul> <p></p> <p>И создадим шаблоны 1 колоночного списка для каждого из них.</p> <p><i>Формально нам следовало бы сделать комплексный компонент, а не отдельные шаблоны, поскольку так при использовании другого шаблона сайта (без копирования шаблонов компонентов) функционал перестанет работать. Но так мы потеряем возможность получать обновления штатных компонентов.</i></p> <p><i>Можно было бы скопировать наши 1 колоночные шаблоны в компоненты системы (т.е. в ядро), однако это претит нашей идеологии.</i></p> <p> <br /> </p> <h3>Шаблон 1 колоночного списка элементов инфоблока (на основе компонента списка новостей 1С-Битрикс)</h3> <p>Создадим шаблон 1_column компонента bitrix:news.list в шаблоне сайта.</p> <p>Сам шаблон будет практически идентичен тому, что мы создали в 10 уроке и будет содержать лишь 1 дополнительный параметр - флаг принадлежности к левой (1й) колонке:</p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;?if(!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true)die(); <br /> ?&gt; <br /> <br /> <br /> <br /> &lt;div class=&quot;span4&lt;?if ($arParams[&quot;COL_TYPE_LEFT&quot;] == Y):?&gt; left-0&lt;?endif?&gt;&quot;&gt; <br /> &lt;ul class=&quot;list&quot;&gt;&lt;?foreach($arResult[&quot;ITEMS&quot;] as $arItem):?&gt; <br /> &lt;? <br /> $this-&gt;AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], CIBlock::GetArrayByID($arItem[&quot;IBLOCK_ID&quot;], &quot;ELEMENT_EDIT&quot;)); <br /> $this-&gt;AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], CIBlock::GetArrayByID($arItem[&quot;IBLOCK_ID&quot;], &quot;ELEMENT_DELETE&quot;), array(&quot;CONFIRM&quot; =&gt; GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM'))); <br /> ?&gt; <br /> &lt;li id=&quot;&lt;?=$this-&gt;GetEditAreaId($arItem['ID']);?&gt;&quot;&gt;&lt;a href=&quot;&lt;?echo $arItem[&quot;DETAIL_PAGE_URL&quot;]?&gt;&quot;&gt;&lt;?echo $arItem[&quot;NAME&quot;]?&gt;&lt;/a&gt;&lt;/li&gt; <br /> &lt;?endforeach;?&gt;&lt;/ul&gt; <br /> &lt;/div&gt; <br /> </code></div> <p>Теперь осталось поместить вызов этого шаблона в шаблоне компонента 2-х колоночного списка. </p> <p>Мы оставим только необходимый минимум параметров компонента (и сразу поставим вызов ID инфоблока из параметров родительского компонента 2-х колоночного списка):</p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;?$APPLICATION-&gt;IncludeComponent(&quot;bitrix:news.list&quot;, &quot;1_column&quot;, array( <br /> &quot;IBLOCK_ID&quot; =&gt; $arParams[&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_IBLOCK_ID&quot;], <br /> &quot;NEWS_COUNT&quot; =&gt; $arParams[&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_NEWS_COUNT&quot;], <br /> &quot;FILTER_NAME&quot; =&gt; &quot;\$arrFilter<span style="background-color: rgb(0, 174, 239);">1</span>&quot;, <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TYPE&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TIME&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_FILTER&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_GROUPS&quot;], <br /> &quot;SET_TITLE&quot; =&gt; &quot;N&quot;, <br /> <span style="background-color: rgb(57, 183, 120);"> &quot;COL_TYPE_LEFT&quot; =&gt; &quot;Y&quot;,</span> <br /> ), <br /> false <br /> );?&gt;</code></div> <p> Как видите, мы задали переменную для фильтрации, таким образом при необходимости можно скопировать шаблон компонента 2-х колоночного списка в своё пространство имён и разместить перед компонентом каждой из колонок нужны фам фильтр! <i>Мы не делаем этого потому, что различных комбинаций и типов фильтров может быть бесчисленное множество.</i> </p> <p>Синим выделены идентификаторы в переменных, относящихся к 1й (левой) колонке. Для правой они должны быть изменены на 2.</p> <p>Зелёным выделена строка, устанавливающая параметр разметки, характерный для левой колонки. Для правой колонки этот параметр должен быть равен N.</p> <h3>Шаблон компонента списка разделов инфоблока</h3> <p>Аналогично списку новостей создадим шаблон 1_column компонента catalog.section.list в шаблоне сайта.</p> <p>Несмотря на общее сходство с шаблоном 1 колоночного списка элементов (и с шаблоном 2-х колоночного списка разделов из урока 10) есть и важное отличие. <b>Мы сохраним древовидную структуру шаблона .default!</b></p> <p> Тогда шаблон будет выглядеть: </p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;?if(!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true)die();?&gt; <br /> &lt;div class=&quot;span4&lt;?if ($arParams[&quot;COL_TYPE_LEFT&quot;] == Y):?&gt; left-0&lt;?endif?&gt;&quot;&gt; <br /> &lt;? <br /> $TOP_DEPTH = $arResult[&quot;SECTION&quot;][&quot;DEPTH_LEVEL&quot;]; <br /> $CURRENT_DEPTH = $TOP_DEPTH; <br /> <br /> foreach($arResult[&quot;SECTIONS&quot;] as $arSection) <br /> { <br /> $this-&gt;AddEditAction($arSection['ID'], $arSection['EDIT_LINK'], CIBlock::GetArrayByID($arSection[&quot;IBLOCK_ID&quot;], &quot;SECTION_EDIT&quot;)); <br /> $this-&gt;AddDeleteAction($arSection['ID'], $arSection['DELETE_LINK'], CIBlock::GetArrayByID($arSection[&quot;IBLOCK_ID&quot;], &quot;SECTION_DELETE&quot;), array(&quot;CONFIRM&quot; =&gt; GetMessage('CT_BCSL_ELEMENT_DELETE_CONFIRM'))); <br /> if($CURRENT_DEPTH &lt; $arSection[&quot;DEPTH_LEVEL&quot;]) <br /> { <br /> echo &quot;\n&quot;,str_repeat(&quot;\t&quot;, $arSection[&quot;DEPTH_LEVEL&quot;]-$TOP_DEPTH),'&lt;ul class=&quot;list&quot;&gt;'; <br /> } <br /> elseif($CURRENT_DEPTH == $arSection[&quot;DEPTH_LEVEL&quot;]) <br /> { <br /> echo &quot;&lt;/li&gt;&quot;; <br /> } <br /> else <br /> { <br /> while($CURRENT_DEPTH &gt; $arSection[&quot;DEPTH_LEVEL&quot;]) <br /> { <br /> echo &quot;&lt;/li&gt;&quot;; <br /> echo &quot;\n&quot;,str_repeat(&quot;\t&quot;, $CURRENT_DEPTH-$TOP_DEPTH),&quot;&lt;/ul&gt;&quot;,&quot;\n&quot;,str_repeat(&quot;\t&quot;, $CURRENT_DEPTH-$TOP_DEPTH-1); <br /> $CURRENT_DEPTH--; <br /> } <br /> echo &quot;\n&quot;,str_repeat(&quot;\t&quot;, $CURRENT_DEPTH-$TOP_DEPTH),&quot;&lt;/li&gt;&quot;; <br /> } <br /> <br /> echo &quot;\n&quot;,str_repeat(&quot;\t&quot;, $arSection[&quot;DEPTH_LEVEL&quot;]-$TOP_DEPTH); <br /> ?&gt;&lt;li id=&quot;&lt;?=$this-&gt;GetEditAreaId($arSection['ID']);?&gt;&quot;&gt;&lt;a href=&quot;&lt;?=$arSection[&quot;SECTION_PAGE_URL&quot;]?&gt;&quot;&gt;&lt;?=$arSection[&quot;NAME&quot;]?&gt;&lt;?if($arParams[&quot;COUNT_ELEMENTS&quot;]):?&gt;&amp;nbsp;(&lt;?=$arSection[&quot;ELEMENT_CNT&quot;]?&gt;)&lt;?endif;?&gt;&lt;/a&gt;&lt;? <br /> <br /> $CURRENT_DEPTH = $arSection[&quot;DEPTH_LEVEL&quot;]; <br /> } <br /> <br /> while($CURRENT_DEPTH &gt; $TOP_DEPTH) <br /> { <br /> echo &quot;&lt;/li&gt;&quot;; <br /> echo &quot;\n&quot;,str_repeat(&quot;\t&quot;, $CURRENT_DEPTH-$TOP_DEPTH),&quot;&lt;/ul&gt;&quot;,&quot;\n&quot;,str_repeat(&quot;\t&quot;, $CURRENT_DEPTH-$TOP_DEPTH-1); <br /> $CURRENT_DEPTH--; <br /> } <br /> ?&gt; <br /> &lt;/div&gt;</code></div> <p> Не забудем про параметр COL_TYPE_LEFT, отвечающий за принадлежность колонки к типу &quot;левая&quot;. </p> <p>Осталось только вызвать компонент 1 колоночного списка разделов в шаблоне 2-х колоночного списка, передав в него параметры: </p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;?$APPLICATION-&gt;IncludeComponent(&quot;bitrix:catalog.section.list&quot;, &quot;1_column&quot;, array( <br /> &quot;IBLOCK_ID&quot; =&gt; $arParams[&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_IBLOCK_ID&quot;], <br /> &quot;COUNT_ELEMENTS&quot; =&gt; $arParams[&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_COUNT_ELEMENTS&quot;], <br /> &quot;TOP_DEPTH&quot; =&gt; $arParams[&quot;<span style="background-color: rgb(0, 174, 239);">1</span>COLUMN_TOP_DEPTH&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TYPE&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TIME&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_FILTER&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_GROUPS&quot;], <br /> &quot;ADD_SECTIONS_CHAIN&quot; =&gt; &quot;N&quot;, <br /> <span style="background-color: rgb(57, 183, 120);"> &quot;COL_TYPE_LEFT&quot; =&gt; &quot;Y&quot;</span> <br /> ), <br /> false <br /> );?&gt;</code></div> <p>Синим вновь выделены идентификаторы в переменных, относящихся к 1й (левой) колонке. Для правой они должны быть изменены на 2.</p> <p> </p> <p>Зелёным выделена строка, устанавливающая параметр разметки, характерный для левой колонки. Для правой колонки этот параметр должен быть равен N.</p> <p><b>Итоговый код шаблона:</b></p> <div style="border: 1px solid; padding: 10px;"><code class="php">&lt;?if(!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true)die();?&gt; <br /> <br /> &lt;?if (!empty($arParams[&quot;2_COL_TITLE&quot;])):?&gt;&lt;h4 class=&quot;indent-1&quot;&gt;&lt;?=$arParams['2_COL_TITLE']?&gt;:&lt;/h4&gt;&lt;?endif?&gt; <br /> &lt;?if (!empty($arParams[&quot;2_COL_INTRO_TEXT&quot;])):?&gt;&lt;p class=&quot;lead&quot;&gt;&lt;?=$arParams['2_COL_INTRO_TEXT']?&gt;&lt;/p&gt;&lt;?endif?&gt; <br /> <br /> &lt;div class=&quot;lists&quot;&gt; <br /> &lt;?if ($arParams[&quot;1COLUMN_TYPE&quot;] == &quot;COLUMN_TYPE_ELEMENT&quot;):?&gt; <br /> &lt;?$APPLICATION-&gt;IncludeComponent(&quot;bitrix:news.list&quot;, &quot;1_column&quot;, array( <br /> &quot;IBLOCK_ID&quot; =&gt; $arParams[&quot;1COLUMN_IBLOCK_ID&quot;], <br /> &quot;NEWS_COUNT&quot; =&gt; $arParams[&quot;1COLUMN_NEWS_COUNT&quot;], <br /> &quot;FILTER_NAME&quot; =&gt; &quot;\$arrFilter1&quot;, <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TYPE&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TIME&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_FILTER&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_GROUPS&quot;], <br /> &quot;SET_TITLE&quot; =&gt; &quot;N&quot;, <br /> &quot;COL_TYPE_LEFT&quot; =&gt; &quot;Y&quot;, <br /> ), <br /> false <br /> );?&gt; <br /> &lt;?else:?&gt; <br /> &lt;?$APPLICATION-&gt;IncludeComponent(&quot;bitrix:catalog.section.list&quot;, &quot;1_column&quot;, array( <br /> &quot;IBLOCK_ID&quot; =&gt; $arParams[&quot;1COLUMN_IBLOCK_ID&quot;], <br /> &quot;COUNT_ELEMENTS&quot; =&gt; $arParams[&quot;1COLUMN_COUNT_ELEMENTS&quot;], <br /> &quot;TOP_DEPTH&quot; =&gt; $arParams[&quot;1COLUMN_TOP_DEPTH&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TYPE&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TIME&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_FILTER&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_GROUPS&quot;], <br /> &quot;ADD_SECTIONS_CHAIN&quot; =&gt; &quot;N&quot;, <br /> &quot;COL_TYPE_LEFT&quot; =&gt; &quot;Y&quot; <br /> ), <br /> false <br /> );?&gt; <br /> &lt;?endif?&gt; <br /> <br /> &lt;?if ($arParams[&quot;2COLUMN_TYPE&quot;] == &quot;COLUMN_TYPE_ELEMENT&quot;):?&gt; <br /> &lt;?$APPLICATION-&gt;IncludeComponent(&quot;bitrix:news.list&quot;, &quot;1_column&quot;, array( <br /> &quot;IBLOCK_ID&quot; =&gt; $arParams[&quot;2COLUMN_IBLOCK_ID&quot;], <br /> &quot;NEWS_COUNT&quot; =&gt; $arParams[&quot;2COLUMN_NEWS_COUNT&quot;], <br /> &quot;FILTER_NAME&quot; =&gt; &quot;\$arrFilter2&quot;, <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TYPE&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TIME&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_FILTER&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_GROUPS&quot;], <br /> &quot;SET_TITLE&quot; =&gt; &quot;N&quot;, <br /> &quot;COL_TYPE_LEFT&quot; =&gt; &quot;N&quot;, <br /> ), <br /> false <br /> );?&gt; <br /> &lt;?else:?&gt; <br /> &lt;?$APPLICATION-&gt;IncludeComponent(&quot;bitrix:catalog.section.list&quot;, &quot;1_column&quot;, array( <br /> &quot;IBLOCK_ID&quot; =&gt; $arParams[&quot;2COLUMN_IBLOCK_ID&quot;], <br /> &quot;COUNT_ELEMENTS&quot; =&gt; $arParams[&quot;2COLUMN_COUNT_ELEMENTS&quot;], <br /> &quot;TOP_DEPTH&quot; =&gt; $arParams[&quot;2COLUMN_TOP_DEPTH&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TYPE&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_TIME&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_FILTER&quot;], <br /> &quot;CACHE_TYPE&quot; =&gt; $arParams[&quot;CACHE_GROUPS&quot;], <br /> &quot;ADD_SECTIONS_CHAIN&quot; =&gt; &quot;N&quot;, <br /> &quot;COL_TYPE_LEFT&quot; =&gt; &quot;N&quot; <br /> ), <br /> false <br /> );?&gt; <br /> &lt;?endif?&gt; <br /> &lt;/div&gt; <br /> <br /> &lt;?if (!empty($arParams[&quot;2_COL_MORE_LINK&quot;]) &amp;&amp; !empty($arParams[&quot;2_COL_MORE_NAME&quot;])):?&gt;&lt;a href=&quot;&lt;?=$arParams['2_COL_MORE_LINK']?&gt;&quot; class=&quot;link&quot;&gt;&lt;?=$arParams['2_COL_MORE_NAME']?&gt;&lt;/a&gt;&lt;?endif?&gt; <br /> </code></div> <p> <br /> </p> <h2> Заключение </h2> <p>В рамках этого урока мы разработали свой первый компонент. Он довольно прост и его задача - вызвать пару системных компонентов с нашими шаблонами, передав им набор параметров.</p> <p>Так же в качестве бонуса мы разработали 2 простых шаблона компонентов.</p> <p>В результате структура нашего компонента выглядеть следующим образом:</p> <p> <img src="/upload/medialibrary/68c/68c1a5bc21b9b584f626a09d2c885d98.png" title="структура компонента 2-х колоночного списка элементов/разделов инфоблоков 1С-Битрикс" hspace="5" vspace="5" border="0" alt="структура компонента 2-х колоночного списка элементов/разделов инфоблоков 1С-Битрикс" width="500" height="500" /> </p> <p>В публичной части это будет выглядеть следующим образом:</p> <p><img src="/upload/medialibrary/808/80885ab0ac7d4c0e49c1f52c2fb3b607.png" title="2-х колоночный смешанный список элементов/разделов инфоблока 1С-Битрикс на широком мониторе" hspace="5" vspace="5" border="0" alt="2-х колоночный смешанный список элементов/разделов инфоблока 1С-Битрикс на широком мониторе" width="700" height="425" /></p> <p><img src="/upload/medialibrary/6fa/6faf5d4d182ee9300e206f15d3d8cacd.png" title="2-х колоночный смешанный список элементов/разделов инфоблока 1С-Битрикс на узком мониторе или мобильном устройстве" hspace="5" vspace="5" border="0" alt="2-х колоночный смешанный список элементов/разделов инфоблока 1С-Битрикс на узком мониторе или мобильном устройстве" width="421" height="728" /></p> <p> <br /> </p> <p>Результаты данного урока вы, как всегда, можете найти в нашем репозитории на GitHub.</p> <div style="text-align: right;"><a href="http://plus.google.com/+АлексейЗадойный?rel=author" target="_blank">Задойный А.В.</a></div>

Возврат к списку

Яндекс.Метрика