Дата публикации : 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

Структура компонета Bitrix

Класс компонента 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(), $arFilterfalse, 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(); ?>







Комментарии
Наверх страницы