Дата публикации : 2024.01.05
Автор:Виноградов Александр
Рейтинг статьи:
Создание компонента для выборки элементов по произвольным полям «Битрикс»
Скачать компонент:
https://disk.yandex.ru/d/aDPMpGQL0lpe8A
Что делает компонент:
- Выводит изображения из произвольного поля GALERY_IMAGES элемента инфоблока [Изображения элемента ифоблока на рис. ниже]
- Выводит 1 элемент инфоблока по свойству PROPERTY _GALERY_IBLOCK_ID
- Или, если параметр указан, то выводит 1 элемент инфоблока по свойству PROPERTY _GALERY_SECTION_ID
- Если PROPERTY _GALERY_SECTION_ID не указан, выводится элемент по свойству PROPERTY_GALERY_IBLOCK_ID
Параметры фильтрации:
- PROPERTY_GALERY_IBLOCK_ID - инфоблок, к которому привязан элемент инфоблока
- PROPERTY_GALERY_SECTION_ID - секция инфоблока к которой привязан элемент инфоблока
Свойства фильтруемых элементов инфоблока:
Структура нашего компонента
Файл help.php является необязательным и служит подсказкой о том, как использовать компонент
Файлы не являются частью архитектуры Битрикс, а являются сторонними плагинами jQuery, которые используются в нашем компоненте для вывода картинок в виде карусели во фронтальной части.
Список сторонних файлов:
- owlcarusel.js
- owlcarusel.css
- owlcaruseltheme.css
Класс компонента class.php
Подробнее в документации Битрикс
<?php
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\SystemException;
use Bitrix\Main\Loader;
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
class SectionGalery extends CBitrixComponent
{
protected $errors = array();
public function onIncludeComponentLang()
{
Loc::loadMessages(__FILE__);
}
/*обрабатываем входящие в компонент параметры*/
public function onPrepareComponentParams($arParams)
{
if( !isset( $arParams["CACHE_TIME"] ) )
$arParams["CACHE_TIME"] = 36000000;
if( !isset( $arParams["GALERY_IBLOCK_ID"] ) )
throw new SystemException('Установите GALERY_IBLOCK_ID');
if( !isset($arParams["GALERY_SECTION_ID"]) )
$arParams["GALERY_SECTION_ID"]=-1;
return $arParams;
}
public function executeComponent()
{
try
{
$this->checkModules();
$this->getResult();
/*если выборка не пустая подключаем компонент*/
if (sizeof($this->arResult)>0)
{
$this->IncludeComponentTemplate();
}
}
catch (SystemException $e)
{
}
}
protected function checkModules()
{
if (!Loader::includeModule('iblock'))
throw new SystemException(Loc::getMessage( 'CPS_MODULE_NOT_INSTALLED', array('#NAME#' => 'iblock')) );
}
/*основная логика компонента */
protected function getResult()
{
if ($this->StartResultCache())
{
$arResult = [];
$arParams = $this->arParams;
/*Если в инфоблоке выполненные работы указан только IBLOCK_ID то
ищем инфоблок галереи с IBLOCK_ID , если есть раздел SECTION_ID то ищем с IBLOCK_ID и с SECTION_ID */
//IBLOCK_ID и ID обязательно должны быть указаны, см. описание arSelectFields выше
$arSelect = Array("ID", "IBLOCK_ID", "NAME", "DATE_ACTIVE_FROM", "PROPERTY_*");
//IBLOCK_ID - id инфоблока, в котором хранится нужный элемент
$arFilter = Array("IBLOCK_ID" =>16 , "ACTIVE_DATE" => "Y", "ACTIVE" => "Y",
"PROPERTY_GALERY_IBLOCK_ID" => $arParams['GALERY_IBLOCK_ID'],
/* выбираем элементы с пустым значением =>false и со значением =>$arParams['GALERY_SECTION_ID'] */
//предполагается, что в админ панели делается связка один к одному
//в любом случае будет выведен 1 элемент, даже если это предположение ложно
array("LOGIC" => "OR",
array("PROPERTY_GALERY_SECTION_ID" => $arParams['GALERY_SECTION_ID'] ), array("PROPERTY_GALERY_SECTION_ID" => false) ));
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize" => 2), $arSelect);
// echo '<pre>';
//print_r($arParams);
while ($ob = $res->GetNextElement())
{
$arFields = $ob->GetFields();
//print_r($arFields);
$arProps = $ob->GetProperties();
//print_r($arProps);
$galery_images_array=[];
if (isset($arProps['GALERY_IMAGES']['VALUE']) and is_array($arProps['GALERY_IMAGES']['VALUE']))
{
/*выбираем изображения из пользовательского свойства и формируем из них массив, который ниже пойдет в $arResult*/
foreach ($arProps['GALERY_IMAGES']['VALUE'] as $galery_image):
$galery_images_array[$galery_image]['THUMB'] =
CFile::ResizeImageGet( $galery_image, array('width' => 450, 'height' => 400 ), BX_RESIZE_IMAGE_EXACT , true)['src'];
$galery_images_array[$galery_image]['FULL'] =
CFile::GetFileArray( $galery_image )['SRC'];
endforeach;
}
$arResult[$arFields['ID']]['FIELDS']=$arFields;
$arResult[$arFields['ID']]['PROPS']=$arProps;
$arResult[$arFields['ID']]['IMAGES']=$galery_images_array;
/*если есть элемент с $arProps['GALERY_SECTION_ID']['VALUE'] = $arParams['GALERY_SECTION_ID'] */
/*обнуляем $arResult и возвращаем этот элемент, так как нам нужен только 1 элемент с изображениями в пользовательском свойстве*/
/*т.е приоритет у элементов с указанным GALERY_SECTION_ID */
if ($arProps['GALERY_SECTION_ID']['VALUE'] == $arParams["GALERY_SECTION_ID"])
{
$arResult=[];
$arResult[$arFields['ID']]['FIELDS']=$arFields;
$arResult[$arFields['ID']]['PROPS']=$arProps;
$arResult[$arFields['ID']]['IMAGES']=$galery_images_array;
break;
}
}
$this->arResult = $arResult;
$this->EndResultCache();
}
}
}
Шаблон компонента template.php
Подробнее в документации Битрикс
<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();?>
<?php
//эти файлы можно подключить в header.php вашего шаблона, в случае если возникают проблемы со включенным кэшированием
$this->addExternalCss("/local/components/vin/sectiongalery/templates/.default/style.css");
$this->addExternalCss("/local/components/vin/sectiongalery/templates/.default/owlcarusel.css");
$this->addExternalCss("/local/components/vin/sectiongalery/templates/.default/owlcaruseltheme.css");
$this->addExternalJS("/local/components/vin/sectiongalery/templates/.default/owlcarusel.js");
?>
<?php
//var_dump($arResult);
?>
<?php foreach ($arResult as $item): ?>
<?php $images=$item['IMAGES']; ?>
<?php endforeach; ?>
<?php if (sizeof($images)>0): ?>
<div class="row our-works-container" style="margin-left: 0; margin-right: 0; margin-top: 100px;">
<div class="our-works-ul owl-carousel owl-theme">
<?php foreach ($images as $image): ?>
<a style="background:url('<?php echo $image['THUMB']; ?>') no-repeat top center;" class="item"
href="<?php echo $image['FULL']; ?>" data-caption="Наши работы" data-fancybox="gallery-fotogalereya">
</a>
<?php endforeach; ?>
</div>
</div>
<?php unset($item,$images); ?>
<script>
$(document).ready(function()
{
$('.owl-carousel').owlCarousel({
loop:false,
dots:true,
nav:true,
responsive:{
0:{
items:1
},
600:{
items:1
},
1000:{
items:2
},
1500:{
items:3
}
}
})
});
</script>
<?php endif; ?>
<?php
//echo '<pre>';
//var_dump($arResult);
//echo '</pre>';
Вызов компонента на страницах сайта
<?php
/*вызов компонента*/
$APPLICATION->IncludeComponent(
"vin:sectiongalery",
"",
Array(
/*выводим элемент имеющий свойство PROPERTY_GALERY_IBLOCK_ID = 6 */
"GALERY_IBLOCK_ID" =>6,
/* Если указан этот параметр, то выводятся элемент привязанный к свойству PROPERTY_GALERY_SECTION_ID */
'GALERY_SECTION_ID'=>10
));
Файл описания компонента .description
Подробнее в документации Битрикс
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arComponentDescription = array(
"NAME" => "Галерея категорий",
"DESCRIPTION" => "Галерея категорий",
"ICON" => "/images/icon.gif",
"SORT" => 10,
"CACHE_PATH" => "Y",
"PATH" => array(
"ID" => "vin",
),
"COMPLEX" => "N",
);
Файл параметров компонента .parameters
Подробнее в документации Битрикс
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arComponentParameters = array(
"GROUPS" => array(
),
"PARAMETERS" => array(
),
);
Файл component_epilog.php оставим пустым
Подробнее в документации Битрикс
<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); ?>