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