Документация Битрикс |
|
/local/components/nikaverro/mycomponent/
---class.php
---ajax.php - может быть
---.description.php
---.parameters.php
---/lang/ - ланги
---templates/.default/ - папка с шаблоном
------personal.php
------second.php
------template.php
Пример
.description.php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arComponentDescription = array( "NAME" => GetMessage("COMPONENT_NAME"), "DESCRIPTION" => GetMessage("COMPONENT_DESCRIPTION"), "COMPLEX" => "N", "PATH" => array( "ID" => GetMessage("COMPONENT_PATH"), ), "ICON" => "/images/icon.gif", ); |
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); if(!CModule::IncludeModule("iblock") || !CModule::IncludeModule("catalog")) 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"]; } $dbProductDiscounts = CCatalogDiscount::GetList( array("SORT" => "ASC"), array(), false, false, array("ID", "NAME") ); while ($arr = $dbProductDiscounts->Fetch()){ $arDiscountID[$arr['ID']] = "[".$arr["ID"]."] ".$arr["NAME"]; } $dbPriceType = CCatalogGroup::GetList( array("SORT" => "ASC"), array() ); while ($arPriceType = $dbPriceType->Fetch()){ $arPriceCode[$arPriceType["NAME"]] = $arPriceType["NAME"]; } $arComponentParameters = array( "GROUPS" => array(), "PARAMETERS" => array( "IBLOCK_TYPE" => array( "PARENT" => "BASE", "NAME" => GetMessage("IBLOCK_TYPE"), "TYPE" => "LIST", "VALUES" => $arIBlockType, "REFRESH" => "Y", ), "IBLOCK_ID" => array( "PARENT" => "BASE", "NAME" => GetMessage("IBLOCK_ID"), "TYPE" => "LIST", "VALUES" => $arIBlock, "REFRESH" => "N", ), "DISCOUNT_ID" => array( "PARENT" => "BASE", "NAME" => GetMessage("DISCOUNTS"), "MULTIPLE" => "Y", "TYPE" => "LIST", "VALUES" => $arDiscountID, "REFRESH" => "N", ), "FILTER_NAME" => array( "PARENT" => "BASE", "NAME" => GetMessage("FILTER_NAME"), "REFRESH" => "N", "DEFAULT" => "arrFilter", ), "PRICE_CODE" => array( "PARENT" => "BASE", "NAME" => GetMessage("PRICE_CODE"), "MULTIPLE" => "Y", "TYPE" => "LIST", "VALUES" => $arPriceCode, "REFRESH" => "N" ), "CACHE_TIME" => array("DEFAULT"=>3600) ), ); |
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); //@var array $arParams //@var array $arResult $arParams["FILTER_NAME"] = trim($arParams["FILTER_NAME"]); if ($arParams["FILTER_NAME"] === '' || !preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["FILTER_NAME"])){ $arParams["FILTER_NAME"] = "arrFilter"; } global ${$arParams['FILTER_NAME']}; $arrFilter = &${$arParams['FILTER_NAME']}; if ($this->StartResultCache()){ if(!CModule::IncludeModule("catalog")) { $this->AbortResultCache(); ShowError("CATALOG_MODULE_NOT_INSTALLED"); return false; } if(!CModule::IncludeModule("iblock")) { $this->AbortResultCache(); ShowError("IBLOCK_MODULE_NOT_INSTALLED"); return false; } ///наша логика, наполняем $arResult $arResult['DISCOUNT_FILTER'] = $arrFilter; $this -> EndResultCache(); } else{ $arrFilter = $arResult['DISCOUNT_FILTER']; } $this->IncludeComponentTemplate(); |
Как отличить быстро старый компонент от нового:
- component.php - старый
- class.php - новый
Переменные, доступные в компоненте - документация Битрикс раньше была проблема. что в component_epilog.php НЕТ arResult, arParams, мучались с templateData. теперь они доступны. |
<?=$component->GetPath()?>/component.php <?=$this->GetFolder()?>/ajax.php //обращение из template.php к файлу ajax.php в папке шаблона |
CBitrixComponent
код классов: CBitrixComponent CBitrixComponentTemplate |
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); class CTest extends CBitrixComponent{ public function onPrepareComponentParams($arParams){ //переопределяем проверку-подготовку параметров $result = array( "CACHE_TYPE" => $arParams["CACHE_TYPE"], "CACHE_TIME" => isset($arParams["CACHE_TIME"]) ?$arParams["CACHE_TIME"]: 36000000, "X" => intval($arParams["X"]), ); return $result; } public function executeComponent(){ //переопределяем выполнение компонента if($this->startResultCache()){ $this->arResult["Y"] = $this->sqr($this->arParams["X"]); $this->includeComponentTemplate(); } return $this->arResult["Y"]; } public function sqr($x){ //наш метод return $x * $x; } } |
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); use Bitrix\Main\Engine\Contract\Controllerable; use Bitrix\Main\Engine\ActionFilter\Csrf; use Bitrix\Main\Engine\ActionFilter\HttpMethod; use \Bitrix\Main\Application; class CTest extends CBitrixComponent implements Controllerable{ public function configureActions() { return [ //для каждого action свой 'calcSqrt' => [ 'prefilters' => [ new HttpMethod( array(HttpMethod::METHOD_POST) ), new Csrf(), ], 'postfilters' => [] ], ]; } public function onPrepareComponentParams($arParams){ //переопределяем проверку-подготовку параметров global $USER; $result = array( "CACHE_TYPE" => $arParams["CACHE_TYPE"], "CACHE_TIME" => isset($arParams["CACHE_TIME"]) ?$arParams["CACHE_TIME"]: 36000000, "X" => intval($arParams["X"]), "IS_ADMIN" => $USER->IsAdmin()? "Y" : "N" //кеш будет разный для админов и неадминов ); return $result; } public function executeComponent(){ //переопределяем выполнение компонента if($this->startResultCache()){ $this->arResult["Y"] = $this->sqr($this->arParams["X"]); $myTemplate = ($this->arParams["IS_ADMIN"]=="Y")? "testtemplate" : ""; $this->includeComponentTemplate($myTemplate); //если не админ, то запустится template.php, если админ, то запустится testtemplate.php } return $this->arResult["Y"]; } public function sqr($x){ //наш метод return $x * $x; } public function calcSqrtAction($number,$sessid){ //для контроллера if (!check_bitrix_sessid()) { throw new \Exception("SESSION_EXPIRED", 1); } return $this->sqr($number); } } |
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); //вывод того, что посчитали executeComponent ?> <?=$arParams["X"]?>*<?=$arParams["X"]?> = <?=$arResult["Y"]?><br> <pre> <? print_r($arParams); print_r($arResult); ?> </pre> //а это предлагаем рассчитать тут же для любого числа <input type="text" id="number"><button id="calc">рассчитать квадрат</button> <br> <div id="result"></div> <script> $(document).ready(function() { $(document).on('click', '#calc', function(e) { e.preventDefault(); if($('#number').val()===""){ $('#result').html("не заполнено поле"); } else if($('#number').val()*1 != $('#number').val()){ $('#result').html("введено НЕ число"); } else{ //по фиг на порядок, главное назвать также как и описано в calcSqrtAction($number, $sessid) var data = { sessid: BX.message('bitrix_sessid'), number: $('#number').val(), }; var request = BX.ajax.runComponentAction("test:mycomponent", "calcSqrt", { mode: "class", data: data }); //ловим ошибки request.catch(function(response) { console.log(response); }); //получаем ответ request.then(function(response) { console.log(response); if (response.status == "success") { $('#result').html(response.data); } }); } }); }); </script> |
$APPLICATION->IncludeComponent("test:mycomponent","",[ "X"=>3, ]); |
CBitrixComponent запускает
- onPrepareComponentParams
- executeComponent
includeComponentTemplate подключит
- $this->__template класса CBitrixComponentTemplate который подключит result_modifier.php, template.php (или другой файл. который указан) - кешируются
- component_epilog.php - исполняется на каждом хите
пусть компонент запущен с шаблоном mytemplate, тогда
$this->IncludeComponentTemplate($s); |
$s - пустая строка
запустится /templates/mytemplate/template.php
$s - непустая строка. Например, 'list'
запустится /templates/mytemplate/list.php