/ Проверка значения свойства на уникальность при добавлении нового элемента в инфоблок

Проверка значения свойства на уникальность при добавлении нового элемента в инфоблок

22 Мар 2021
Дмитрий М.
113

У Вас есть интернет магазин, в нём представлены товары от разных поставщиков. Для идентификации товара или торгового предложения обычно добавляют свойство "Артикул". Чтобы не было неоднозначности - Артикул должен быть уникальным значением.

При добавлении нового товара или торгового предложения менеджер может ошибиться и добавить уже имеющийся Артикул.

Чтобы такого не происходило, напишем обработчик событий, который при добавлении или изменении товара или торгового предложения будет проверять на уникальность значение свойства Артикул.

Для отслеживания добавления или изменения элемента инфоблока воспользуемся встроенными системными событиями для модуля инфоблоков iblock.

 OnBeforeIBlockElementAdd событие вызывается перед добавлением нового элемента инфоблока
 OnBeforeIBlockElementUpdate событие вызывается перед изменением уже существующего элемента инфоблока

Так-как нам необходимо проверять уникальность значения перед добавлением/изменением элемента - поэтому используем события, которые вызываются перед соответствующими действиями.

Добавление свойства Артикул для товаров и торговых предложений

Заходим в админку сайта, выбираем вкладку в меню "Контент". В подменю контента необходимо выбрать: Инфоблоки ( пункт со звёздочкой ) -> Типы инфоблоков -> Выбрать тип с каталогом товаров.

1.jpg

Сперва добавим свойство Артикул для инфоблока Каталог товаров. Для этого заходим в настройки инфоблока Каталог товаров, переходим на вкладку Свойства, заполняем данные свойства: Название - Артикул, Тип свойства - Строка, Символьный код - VENDOR. Нажимаем внизу страницы ПРИМЕНИТЬ после этого у свойства появится ID необходимо запомнить это значение.

Аналогичным образом добавляем свойство Артикул для инфоблока Торговых предложений. Так же требуется запомнить ID созданного свойства.

2.jpg

Настройка обработчика событий

Теперь в файле /bitrix/php_interface/init.php добавим код нашего обработчика событий.

// Код необходимо добавить в файл /bitrix/php_interface/init.php

AddEventHandler("iblock", "OnBeforeIBlockElementAdd", "checkVendor");
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", "checkVendor");

function checkVendor($arFields){
    /**
     * Массив $arFields содержит данные добавляемого/изменяемого элемента инфоблока. 
     * Значение свойства элемента хранится в массиве - $arFields['PROPERTY_VALUES']['ID_свойства']['n0']['VALUE'].
     * n0 - порядковый номер значения свойства. В случаи если свойство - множественное, перечисление идёт n0, n1, n2 и т.д
     * Если свойство не множественное тогда всегда n0.
     */
    /**
     * Условие которое проверяет заполнено при изменении или добавлении элемента заполнено свойство VENDOR.
     * Так как уникальность Артикула необходимо проверять и среди товаров и среди торговых предложений то проверяется оба свойства.
     * Свойство определяется по его ID - для Товаров ID свойства - 2, для Торговых предложений ID свойства - 3.
     */
    if(
        (isset(current($arFields['PROPERTY_VALUES']['2'])['VALUE']) && !empty(current($arFields['PROPERTY_VALUES']['2'])['VALUE'])) ||
        (isset(current($arFields['PROPERTY_VALUES']['3'])['VALUE']) && !empty(current($arFields['PROPERTY_VALUES']['3'])['VALUE'])) 
    ):
        /**
         * Записываем в переменную $vendor значение свойства - или свойства товара или свойства торгового предложения.
         * Одновременно свойство и товара и торгового предложения передаваться не может.
         */ 
        if(CModule::IncludeModule('main')):
            $vendor = (current($arFields['PROPERTY_VALUES']['2'])['VALUE']) ? current($arFields['PROPERTY_VALUES']['2'])['VALUE'] : current($arFields['PROPERTY_VALUES']['3'])['VALUE'];
            AddMessage2Log($vendor);
            $arSelect = Array("IBLOCK_ID", "IBLOCK_TYPE", "ID", "NAME");
            $arFilter = Array(
                "IBLOCK_TYPE"=> 'catalog', //Указываем тип инфоблоков, обычно все Каталоги товаров и Торговых предложений принадлежат одному типу инфоблоков.
                //Если разные типы инфоблока, тогда следует убрать. Но в таком случаи поиск будет происходить только по Символьному коду свойства.
                //В этом случаи необходимо чтобы свойства с символьным кодом VENDOR не было в "не товарных" инфоблоках.
                "!ID" => $arFields['ID'], // Из выборки сразу исключаем изменяемый элемент ( чтобы мы могли сохранять изменения при редактировании какого-нибудь элемента)
                "PROPERTY_VENDOR" => $vendor
            );
            $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
            // Если выбока значений $res не пустая выводим сообщение об ошибке и прерываем сохранение элемента.
            if ($arElement = $res->getNext()):
                global $APPLICATION;
                $APPLICATION->throwException("Свойство Артикул уже есть у элемента ".$arElement['NAME'].". Свойство Артикул должно быть уникально!");
                return false; // Возвращаем false тем самым прерывая сохранение элемента.
            endif;
        endif;
    endif;
}

В итоге при попытке сохранить товар/торговое предложение с Артикулом который уже есть у товара или торгового предложения - Вы получите предупреждение:

3.jpg

Статья была полезна? Поблагодарите автора.

Самые читаемые
#1С Битрикс, #Bitrix CMS, #.htaccess, #настройка редиректов
4 Авг 2019
#Хлебные крошки, #1С Битрикс, #Bitrix CMS, #bitrix:breadcrumbs, #component_epilog, #кэширование
1 Окт 2018
#bitrix, #robots.txt, #sitemap.xml, #поддомены, #мультисайтовость
16 Окт 2018
#ресайз изображений, #1С Битрикс, #Bitrix CMS
3 Мар 2019
#bitrix, #bitrix:catalog.section, #скидки, #товары со скидкой, #страница скидок, #страница со скидками
4 Окт 2018
#Bitrix CMS, #breadcrumb, #bitrix:breadcrumbs, #хлебные крошки, #настройка
13 Фев 2019
#bitrix, #пользовательские свойства, #тип свойств, #привязка к элементам
27 Ноя 2019
#bitrix, #свойства элементов, #обработчик событий, #OnBeforeIBlockElementUpdate, #OnIBlockElementSetPropertyValues
21 Июл 2020