+7 495 008 8452 пн.-пт. 10:00 – 17:00
Загрузка...
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Привязка свойств к разделам и умный фильтр (API)

Выполняя задачу, связанную с обработкой свойств привязанных к разделам и умным фильтром, столкнулся с недостатком информации. Первым делом обратился к справке битрикса, не найдя там ответов на вопросы, пошел к поисковикам с запросом “CIBlockSectionPropertyLink”, обнаружил почти пустую выдачу. Дальше началось исследование с помощью “Живого описания АПИ”, изучения кода методов и экспериментов, результатами которого я и хочу поделиться в данном посте.

С помощью живого апи, в модуле инфоблоков были найдены следующие методы:

CIBlockSectionPropertyLink::Add($SECTION_ID, $PROPERTY_ID, $arLink = array())
CIBlockSectionPropertyLink::Delete($SECTION_ID, $PROPERTY_ID)
CIBlockSectionPropertyLink::DeleteByIBlock($IBLOCK_ID)
CIBlockSectionPropertyLink::DeleteByProperty($PROPERTY_ID)
CIBlockSectionPropertyLink::DeleteBySection($SECTION_ID)
CIBlockSectionPropertyLink::GetArray($IBLOCK_ID, $SECTION_ID = 0, $bNewSection = false)

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

Так как методы найдены в модуле инфоблоков, то перед их использованием, требуется его подключить: CModule::IncludeModule("iblock");

1. CIBlockSectionPropertyLink::Add($SECTION_ID, $PROPERTY_ID, $arLink = array())
Метод добавляет связь между разделом и свойством инфоблока.

Параметры:
$SECTION_ID - идентификатор раздела, либо 0, если требуется привязать свойство ко всему инфоблоку.
$PROPERTY_ID - идентификатор свойства.
Требуются именно идентификаторы, символьные коды не подойдут.

$arLink - в данный момент может содержать 2 ключа, это IBLOCK_ID и SMART_FILTER.
В свою очередь $arLink = array(‘SMART_FILTER’ => ‘Y’)  - включить свойство в умный фильтр, если свойство в умный фильтр включать не требуется, можно просто не указывать SMART_FILTER, либо $arLink = array(‘SMART_FILTER’ => ‘N’).

2. CIBlockSectionPropertyLink::Delete($SECTION_ID, $PROPERTY_ID)
Метод позволяет отвязать свойство от раздела или инфоблока.

$SECTION_ID - идентификатор раздела, либо 0, если требуется отвязать свойство от инфоблока.
$PROPERTY_ID - идентификатор свойства.

Отвязать свойство от инфоблока, может потребоваться, если данное свойство не должно быть привязанным ко всем разделам инфоблока. Т.е. после или до привязки свойств к разделам с помощью CIBlockSectionPropertyLink::Add, требуется выполнить CIBlockSectionPropertyLink::Delete(0, $PROPERTY_ID), чтобы отвязать от инфоблока и не выводить их во всех разделах.

3. CIBlockSectionPropertyLink::DeleteByIBlock($IBLOCK_ID)
Метод отвязывает все свойства от разделов в инфоблоке и выключает возможность привязывать их (свойство инфоблока “SECTION_PROPERTY” становится равным “N”).

$IBLOCK_ID - идентификатор инфоблока в котором требуется отвязать все свойства от разделов.

4. CIBlockSectionPropertyLink::DeleteByProperty($PROPERTY_ID)
Метод отвязывает свойство с идентификатором $PROPERTY_ID от всех разделов.

5. CIBlockSectionPropertyLink::DeleteBySection($SECTION_ID)
Метод отвязывает все свойства от раздела с идентификатором $SECTION_ID

6. CIBlockSectionPropertyLink::GetArray($IBLOCK_ID, $SECTION_ID = 0, $bNewSection = false)

$IBLOCK_ID
- идентификатор инфоблока,
$SECTION_ID - идентификатор раздела, либо 0 - будут собраны свойства инфоблока,
$bNewSection - не совсем понял или совсем не понял, на что влияет :)

Метод возвращает массив с параметрами свойств, выводимые в порядке увеличения сортировки:

Array
(
    [33] => Array
     (
         [PROPERTY_ID] => 33
         [SMART_FILTER] => N
         [INHERITED] => Y
         [INHERITED_FROM] => 0
         [SORT] => 10
     )
…
)


Где PROPERTY_ID - идентификатор свойства, равен индексу первого уровня в данном массиве,
SMART_FILTER - включено свойство в умный фильтр или нет,
INHERITED- наследуется это свойство или привязано непосредственно к разделу
INHERITED_FROM - откуда наследуется, если 0, то от инфоблока, если значение отличное от нуля - то это идентификатор раздела, от которого унаследовано свойство.
SORT - сортировка.


Тонкости и примеры использования

1. В случае если свойства не привязываются к разделу (или в админке у разделов нет вкладки "Свойства элементов"), нужно установить у инфоблока "SECTION_PROPERTY" => "Y":


$ib = new CIBlock;
$res = $ib->Update($iblock_id, array(
   "SECTION_PROPERTY" => "Y",
));

Подробнее об CIBlock::Update: http://dev.1c-bitrix.ru/api_help/iblo...update.php


2. Включаем свойство в умный фильтр:

$arFields = Array('SMART_FILTER' => 'Y', 'IBLOCK_ID' => $arProp['IBLOCK_ID']) ; 
$ibp = new CIBlockProperty();
$ibp->Update($PROPERTY_ID, $arFields) ;

Подробнее об CIBlockProperty::Update: http://dev.1c-bitrix.ru/api_help/iblo...update.php

3. Скрипт для постепенного перевода сайта на умный фильтр:
Например можно разместить в result_modifier.php у комплексного компонента catalog, и по мере посещения ваших каталогов, свойства будут включены в умный фильтр на основе текущих настроек компонента.

if(COption::GetOptionString("to_smart_filter", "smart_filter_{$arParams['IBLOCK_ID']}", 'N') != ‘Y’)
{
   $error_convert_to_smart = false ;
   foreach ($arParams['FILTER_PROPERTY_CODE'] as $prop_code)
   {
      if(strlen($prop_code) && $arParams['IBLOCK_ID'])
      {
         $arProp = CIBlockProperty::GetByID($prop_code, $arParams['IBLOCK_ID'])->Fetch() ;
         if($arProp['ID'] && $arProp['CODE'] == $prop_code && $arProp['SMART_FILTER'] != 'Y')
         {
            $arFields = Array('SMART_FILTER' => 'Y', 'IBLOCK_ID' => $arProp['IBLOCK_ID']) ; 
            $ibp = new CIBlockProperty();
            if(!$ibp->Update($arProp['ID'], $arFields))
            {
               if($USER->IsAdmin()) { echo '<br/>'.$ibp->LAST_ERROR;  }
               $error_convert_to_smart= true ;
            }
         }
      }
   }
   if(!$error_convert_to_smart)
   {
      COption::SetOptionString("to_smart_filter", "smart_filter_{$arParams['IBLOCK_ID']}", 'Y');
   }
}


Полезные ссылки:
1. Slyshkina Anna, “Настраиваем зависимость свойств товаров от категорий (умный фильтр)”: http://dev.1c-bitrix.ru/community/blo...filter.php
2. Модуль “Живое описание АПИ”: http://marketplace.1c-bitrix.ru/solut...x.liveapi/

Разбираться помогал  Денис Зимин из ROMZA

P.S. Если где-то что-то упустил, не так понял, допустил неточности или ошибки, пишите - внесу исправления. В листинге могут быть косяки, т.к. правил уже после вставки в блог, в попытке выровнять и т.д.

Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...