Добавить все свойства инфоблока в умный фильтр одним разом

Просмотров: 3206 | Комментариев: 4

Если у вас достаточно много свойств, например: больше 1000-и, после интеграции с 1С или импорта из файлов. И необходимо добавить все свойства в умный фильтр. Поможет эта заметка.

Получаем все свойства и добавляем в умный фильтр

Добавлять большое количество свойств, в ручную, не вариант. Даже если нужны не все- проще снять чекбокс с ненужных, нежели прокликивать вручную... 50-100 и более свойств

Используем CIBlockProperty::GetList и CIBlockProperty::Update:

if (CModule::IncludeModule('iblock')) {
    $properties = CIBlockProperty::GetList(
        Array("sort" => "asc", "name" => "asc"),
        Array("ACTIVE" => "Y", "IBLOCK_ID" => 1)
    );
    while ($prop_fields = $properties->GetNext()) {

        $propId = $prop_fields['~ID'];

        $arFields = Array('SMART_FILTER' => 'Y', 'IBLOCK_ID' => 1);
        $addToSmart = new CIBlockProperty();
        if(!$addToSmart->Update($propId, $arFields))
            echo $addToSmart->LAST_ERROR;
    }
}

CIBlockProperty::GetList - вернул нам список всех свойств инфоблока (в моем случае с ID=1). Можете распечатать массив $prop_fields - если нужны все параметры и информация о свойствах этого инфоблока. Мне же, нужны только ID свойств: я загнал их в переменную $propId

Далее, методом CIBlockProperty::Update обновил параметр SMART_FILTER указав ему значение "Y"- тем самым добавив все свойства инфоблока в умный фильтр. Обратите внимание, что в $arFields я снова указал ID нужного инфоблока (1-ый, в моем случае)- это обязательно иначе метод не сработает

В общем-то и все. Получая и обновляя нужные параметры можете менять режим отображения, для разных типов свойств- получая их в массиве $prop_fields:
DISPLAY_TYPE- вид в умном фильтре
DISPLAY_EXPANDED- показывать / не показывать развернутым

Расширенный пример

Добавление в умный фильтр свойств с параметрами: Вид в фильтре: Выдающий список, Показывать развернутым: да

if (CModule::IncludeModule('iblock')) {
    $properties = CIBlockProperty::GetList(
        Array("sort" => "asc", "name" => "asc"),
        Array("ACTIVE" => "Y", "IBLOCK_ID" => 5)
    );
    while ($prop_fields = $properties->GetNext()) {

        $propId = $prop_fields['~ID'];

        $arFields = Array('SMART_FILTER' => 'Y', 'DISPLAY_TYPE' => "P", 'DISPLAY_EXPANDED' => "Y",  'IBLOCK_ID' => 5);
        $addToSmart = new CIBlockProperty();
        if(!$addToSmart->Update($propId, $arFields))
            echo $addToSmart->LAST_ERROR;
    }
}
Необходимо войти что бы оставить комментарий:
Алексей Хасянов
Здравствуйте, Михаил.
А как в эти условия добавить исключения свойств ?
Есть свойства которые не нужны в умном фильтре.
Михаил Базаров
Вот по этому методу почитайте
https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockproperty/getlist.php
Можно использовать поля свойств в фильтре.
Например: PROPERTY_TYPE => array(S, L)
Тогда, для добавления в фильтр отберутся только с типом "Строка" и "Список"

Доп запросом, можно получить параметр HINT (описание свойства) что-то написать в это поле, у не нужных свойств и исключить их условием
if (empty($arProperty['HINT']))  
Алексей Хасянов
У нас 1500 свойств и все типа строка и список (прилетают из 1с). С отбором property_type=>arrays(S,L) не получится, а описания свойств почему то затираются при обмене. А ваш метод в статье хотел использовать чтобы при очередном обмене не выставлять потом для новых свойств признак присутствия в фильтре
Алексей Хасянов
сделал вот так:
Код
//Выводим свойства в умный фильтр

if (CModule::IncludeModule('iblock')) {
    $properties = CIBlockProperty::GetList(
        Array("sort" => "asc", "name" => "asc"),
        Array("ACTIVE" => "Y", "IBLOCK_ID" => ID-инфоблока)
    );
    while ($prop_fields = $properties->GetNext()) {
      $propId = $prop_fields['~ID'];
//проверяем заполнение описания свойства для исключения из списка фильтра
      if(!empty($prop_fields['HINT'])):
        $arFields = Array('SMART_FILTER' => 'N', 'IBLOCK_ID' => ID-инфоблока);
      else:
        $arFields = Array('SMART_FILTER' => 'Y', 'IBLOCK_ID' => ID-инфоблока);
      endif;

      $addToSmart = new CIBlockProperty();
      $addToSmart->Update($propId, $arFields);
    }
}

Авторизация

На сайте работает вход через социальные сети. Просто, выберите наиболее удобную сеть и авторизация произойдет автоматически: Проходя авторизацию, Вы безоговорочно принимаете условия политики конфеденциальности