Стандартные компоненты 1С-Битрикс расположены по адресу
/bitrix/components/bitrix/
Свои компоненты надо создавать тут:
/bitrix/components/<свое имя>/
или
/local/components/<свое имя>/
Файлы компонента
.parameters.php - формирование окна настроек .description.php - описание компонента и служебные данные component.php - основной файл компонента class.php - сюда выводим класс компонента /lang/ - языковые файлы /help/tooltips.php - файлы с подсказками /images/ - папка с ресурсами /templates/ - шаблоны компонента ... template.php - основной файл шаблона ... result_modifier.php - файл кастомизации результатов работы компонента ... component_epilog.php - файл подключается после отработки шаблона (не кешируется) ... style.css - стили шаблона ... .parameters.php - дополнительные настройки (присущие шаблону)
Шаблоны компонента
/local/templates/<шаблон сайта>/components/ если шаблон в папке /bitrix/templates/ /bitrix/templates/<шаблон сайта>/components/
далее в папке .default размещается шаблон компонента по умолчанию.
Комплексный компонент
В структуре файлов простого и сложного компонентов отличий нет, а есть только внутри шаблона.
Отличие комплексного компонента:
- Объединяет простые компоненты (например, список разделов, список элементов, детальная страница элемента)
- Формирует раздел и поддерживает ЧПУ
- Общая форма для параметров
Файл component.php
- Проверяем используется ЧПУ или нет
- Задаем значения переменным по умолчанию
- Разбираем переменные из URL
- Смотрим какой файл шаблона подключить
- Получаем значения переменных
- Подключаем шаблон
Пример кода
.description
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arComponentDescription = array( "NAME" => GetMessage("IBLOCK_NEWS_NAME"), "DESCRIPTION" => GetMessage("IBLOCK_NEWS_DESCRIPTION"), "ICON" => "/images/news_all.gif", "COMPLEX" => "Y", "PATH" => array( "ID" => "content", "CHILD" => array( "ID" => "news", "NAME" => GetMessage("T_IBLOCK_DESC_NEWS"), "SORT" => 10, "CHILD" => array( "ID" => "news_cmpx", ), ), ), );
.parameters.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"]; } $arSorts = Array("ASC"=>GetMessage("T_IBLOCK_DESC_ASC"), "DESC"=>GetMessage("T_IBLOCK_DESC_DESC")); $arSortFields = Array( "ID"=>GetMessage("T_IBLOCK_DESC_FID"), "NAME"=>GetMessage("T_IBLOCK_DESC_FNAME"), "ACTIVE_FROM"=>GetMessage("T_IBLOCK_DESC_FACT"), "SORT"=>GetMessage("T_IBLOCK_DESC_FSORT"), "TIMESTAMP_X"=>GetMessage("T_IBLOCK_DESC_FTSAMP") ); $arProperty_LNS = array(); $rsProp = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$arCurrentValues["IBLOCK_ID"])); while ($arr=$rsProp->Fetch()) { $arProperty[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"]; if (in_array($arr["PROPERTY_TYPE"], array("L", "N", "S", "E"))) { $arProperty_LNS[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"]; } } $arComponentParameters = array( "PARAMETERS" => array( "VARIABLE_ALIASES" => Array( "SECTION_ID" => Array("NAME" => GetMessage("BN_P_SECTION_ID_DESC")), "ELEMENT_ID" => Array("NAME" => GetMessage("NEWS_ELEMENT_ID_DESC")), ), "SEF_MODE" => Array( "news" => array( "NAME" => GetMessage("T_IBLOCK_SEF_PAGE_NEWS"), "DEFAULT" => "", "VARIABLES" => array(), ), "section" => array( "NAME" => GetMessage("T_IBLOCK_SEF_PAGE_NEWS_SECTION"), "DEFAULT" => "", "VARIABLES" => array("SECTION_ID"), ), "detail" => array( "NAME" => GetMessage("T_IBLOCK_SEF_PAGE_NEWS_DETAIL"), "DEFAULT" => "#ELEMENT_ID#/", "VARIABLES" => array("ELEMENT_ID", "SECTION_ID"), ), ), "IBLOCK_TYPE" => array( "PARENT" => "BASE", "NAME" => GetMessage("BN_P_IBLOCK_TYPE"), "TYPE" => "LIST", "VALUES" => $arIBlockType, "REFRESH" => "Y", ), "IBLOCK_ID" => array( "PARENT" => "BASE", "NAME" => GetMessage("BN_P_IBLOCK"), "TYPE" => "LIST", "VALUES" => $arIBlock, "REFRESH" => "Y", "ADDITIONAL_VALUES" => "Y", ), "NEWS_COUNT" => Array( "PARENT" => "BASE", "NAME" => GetMessage("T_IBLOCK_DESC_LIST_CONT"), "TYPE" => "STRING", "DEFAULT" => "20", ), "SORT_BY1" => Array( "PARENT" => "DATA_SOURCE", "NAME" => GetMessage("T_IBLOCK_DESC_IBORD1"), "TYPE" => "LIST", "DEFAULT" => "ACTIVE_FROM", "VALUES" => $arSortFields, "ADDITIONAL_VALUES" => "Y", ), "SORT_ORDER1" => Array( "PARENT" => "DATA_SOURCE", "NAME" => GetMessage("T_IBLOCK_DESC_IBBY1"), "TYPE" => "LIST", "DEFAULT" => "DESC", "VALUES" => $arSorts, "ADDITIONAL_VALUES" => "Y", ), "SORT_BY2" => Array( "PARENT" => "DATA_SOURCE", "NAME" => GetMessage("T_IBLOCK_DESC_IBORD2"), "TYPE" => "LIST", "DEFAULT" => "SORT", "VALUES" => $arSortFields, "ADDITIONAL_VALUES" => "Y", ), "SORT_ORDER2" => Array( "PARENT" => "DATA_SOURCE", "NAME" => GetMessage("T_IBLOCK_DESC_IBBY2"), "TYPE" => "LIST", "DEFAULT" => "ASC", "VALUES" => $arSorts, "ADDITIONAL_VALUES" => "Y", ), "LIST_ACTIVE_DATE_FORMAT" => CIBlockParameters::GetDateFormat(GetMessage("T_IBLOCK_DESC_ACTIVE_DATE_FORMAT"), "LIST_SETTINGS"), ), ); CIBlockParameters::AddPagerSettings( $arComponentParameters, GetMessage("T_IBLOCK_DESC_PAGER_NEWS"), //$pager_title true, //$bDescNumbering true, //$bShowAllParam true, //$bBaseLink $arCurrentValues["PAGER_BASE_LINK_ENABLE"]==="Y" //$bBaseLinkEnabled ); CIBlockParameters::Add404Settings($arComponentParameters, $arCurrentValues);
component.php
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); /** @var CBitrixComponent $this */ /** @var array $arParams */ /** @var array $arResult */ /** @var string $componentPath */ /** @var string $componentName */ /** @var string $componentTemplate */ /** @global CDatabase $DB */ /** @global CUser $USER */ /** @global CMain $APPLICATION */ if($arParams["USE_FILTER"]=="Y") { if($arParams["FILTER_NAME"] == '' || !preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["FILTER_NAME"])) $arParams["FILTER_NAME"] = "arrFilter"; } else $arParams["FILTER_NAME"] = ""; $arDefaultUrlTemplates404 = array( "news" => "", "search" => "search/", "rss" => "rss/", "rss_section" => "#SECTION_ID#/rss/", "detail" => "#ELEMENT_ID#/", "section" => "", ); $arDefaultVariableAliases404 = array(); $arDefaultVariableAliases = array(); $arComponentVariables = array( "SECTION_ID", "SECTION_CODE", "ELEMENT_ID", "ELEMENT_CODE", ); if($arParams["SEF_MODE"] == "Y") { $arVariables = array(); $arUrlTemplates = CComponentEngine::makeComponentUrlTemplates($arDefaultUrlTemplates404, $arParams["SEF_URL_TEMPLATES"]); $arVariableAliases = CComponentEngine::makeComponentVariableAliases($arDefaultVariableAliases404, $arParams["VARIABLE_ALIASES"]); CComponentEngine::initComponentVariables($componentPage, $arComponentVariables, $arVariableAliases, $arVariables); $arResult = array( "FOLDER" => $arParams["SEF_FOLDER"], "URL_TEMPLATES" => $arUrlTemplates, "VARIABLES" => $arVariables, "ALIASES" => $arVariableAliases, ); } else { $arVariableAliases = CComponentEngine::makeComponentVariableAliases($arDefaultVariableAliases, $arParams["VARIABLE_ALIASES"]); CComponentEngine::initComponentVariables(false, $arComponentVariables, $arVariableAliases, $arVariables); $arResult = array( "FOLDER" => "", "URL_TEMPLATES" => array( "news" => htmlspecialcharsbx($APPLICATION->GetCurPage()), "section" => htmlspecialcharsbx($APPLICATION->GetCurPage()."?".$arVariableAliases["SECTION_ID"]."=#SECTION_ID#"), "detail" => htmlspecialcharsbx($APPLICATION->GetCurPage()."?".$arVariableAliases["ELEMENT_ID"]."=#ELEMENT_ID#"), "search" => htmlspecialcharsbx($APPLICATION->GetCurPage()), "rss" => htmlspecialcharsbx($APPLICATION->GetCurPage()."?rss=y"), "rss_section" => htmlspecialcharsbx($APPLICATION->GetCurPage()."?".$arVariableAliases["SECTION_ID"]."=#SECTION_ID#&rss=y"), ), "VARIABLES" => $arVariables, "ALIASES" => $arVariableAliases ); } $this->includeComponentTemplate($componentPage);
Отправьте заявку нашим специалистам