У заказчика куча цветов (около 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); } } |