Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Обработчик, чтобы был обобщенный цвет для фильтра и детальной страницы



У заказчика куча цветов (около 5000шт) в 1С
Задача:
А на сайте в фильтре и деталке надо около 20 (обобщенные)
Решение:

Цвета выгружаются из 1С в highload-блоки (ID 2)

1. Добавили еще 1 highload-блок обобщенных цветов (ID 3)

2. В первом справочнике добавили 2 пользовательских свойства типа привязка к элементам второго справочника:
  • цвет главный - немножественное
  • цвет дополнительный-немножественное

3. В инфблоке тоже завели 2 свойства типа привязка к элементам второго справочника
Цвет для фильтра - множественное, показывается в умном фильтре
Цвет для детальной - немножественное, показывается в детальной странице

4. сделали обработчик, который заполняет свойства в инфоблоке автоматом

init.php
AddEventHandler( "iblock", "OnBeforeIBlockElementAdd", "MyOnBeforeIBlockElementAdd");
AddEventHandler( "iblock", "OnBeforeIBlockElementUpdate", "MyOnBeforeIBlockElementUpdate");
use Bitrix\Highloadblock\HighloadBlockTable as HLBT;

function GetEntityDataClass($HlBlockId){
    if (empty($HlBlockId) || $HlBlockId < 1 || !CModule::IncludeModule('highloadblock')){
        return false;
    }

    $hlblock = HLBT::getById($HlBlockId)->fetch();
    $entity = HLBT::compileEntity($hlblock);
    $entity_data_class = $entity->getDataClass();
    return $entity_data_class;
}
function SetGeneralColors(&$arFields){    
    $arColorProps = [
        //iblock man
        9 =>[
            "TCVET" => 336,
            "COLOR_FILTER" => 507,
            "COLOR_DETAIL" => 508
        ],
        //iblock_woman
        10 =>[
            "TCVET" => 369,
            "COLOR_FILTER" => 503,
            "COLOR_DETAIL" => 504
        ],
        //offers man
        13 =>[
            "TCVET" => 415,
            "COLOR_FILTER" => 505,
            "COLOR_DETAIL" => 506
        ],
        //offers woman
        14 =>[
            "TCVET" => 458,
            "COLOR_FILTER" => 501,
            "COLOR_DETAIL" => 502
        ],
    ];
    $arCurrentColors = $arColorProps[$arFields["IBLOCK_ID"]];
    $color1C = false;
    $arFields['PROPERTY_VALUES'][$arCurrentColors["COLOR_DETAIL"]] = [];
    $arFields['PROPERTY_VALUES'][$arCurrentColors["COLOR_FILTER"]] = [];

    foreach($arFields["PROPERTY_VALUES"][$arCurrentColors["TCVET"]] as $arProp){
        if(isset($arProp["VALUE"])){                
            $color1C = trim($arProp["VALUE"]);           
            break;
        }        
    }   
    if($color1C){
        $entity_data_class = GetEntityDataClass(2);
        $rsData = $entity_data_class::getList(array(
           'select' => array('UF_COLOR_GENERAL', 'UF_COLOR_ADDITIONAL'),
           'order' => array('UF_NAME' => 'ASC'),
           'limit' => '1',//ограничиваем выборку 1 элем
           'filter' => array('UF_XML_ID' => $color1C)
        ));
        if($el = $rsData->fetch()){
            $colorGeneral = $el["UF_COLOR_GENERAL"];
            $colorAdditional = $el["UF_COLOR_ADDITIONAL"];
            if(!empty($colorGeneral)){
                $arColorsFilter = [$colorGeneral];
                if(!empty($colorAdditional)){
                    $arColorsFilter[] = $colorAdditional;                    
                }
                $entity_data_class = GetEntityDataClass(3);
                $rsData = $entity_data_class::getList(array(
                   'select' => array('UF_XML_ID', 'ID'),
                   'order' => array('ID' => 'ASC'),
                   'limit' => '2',//ограничиваем выборку 2 элементами
                   'filter' => array('ID' =>$arColorsFilter)
                ));
                $arNewColors = [];
                while($el1 = $rsData->fetch()){
                    $arNewColors[$el1["ID"]] = $el1["UF_XML_ID"];
                }
                if(isset($arNewColors[$colorGeneral])){
                    $arFields['PROPERTY_VALUES'][$arCurrentColors["COLOR_DETAIL"]]=[
                        ["VALUE" => $arNewColors[$colorGeneral]]  
                    ];
                    $arFields['PROPERTY_VALUES'][$arCurrentColors["COLOR_FILTER"]]=[
                        ["VALUE" => $arNewColors[$colorGeneral]]  
                    ];
                    if(!empty($colorAdditional) && isset($arNewColors[$colorAdditional])){
                        $arFields['PROPERTY_VALUES'][$arCurrentColors["COLOR_FILTER"]][] = ["VALUE" => $arNewColors[$colorAdditional]];  
                    }
                }

                //AddMessage2Log($arNewColors);


            }
        }
    } 
    //AddMessage2Log($color1C);

}

function MyOnBeforeIBlockElementAdd(&$arFields){
    $arCatalogID = array(9, 10); //9-man, 10-woman
    $arOfferID = array(13, 14); //13-man, 14-woman
    if((in_array($arFields['IBLOCK_ID'], $arCatalogID)||in_array($arFields['IBLOCK_ID'], $arOfferID)) && isset($arFields["PROPERTY_VALUES"])){
        SetGeneralColors($arFields);
    }
}

function MyOnBeforeIBlockElementUpdate(&$arFields){   
    $arCatalogID = array(9, 10); //9-man, 10-woman
    $arOfferID = array(13, 14); //13-man, 14-woman
    if((in_array($arFields['IBLOCK_ID'], $arCatalogID)||in_array($arFields['IBLOCK_ID'], $arOfferID)) && isset($arFields["PROPERTY_VALUES"])){        
        SetGeneralColors($arFields);
    }
}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!