Собственно задача простая.
Есть 2 инфоблока.
У элементов инфоблока 1 есть свойство типа привязка к элементам инфоблока 2.
В списке элементов инфоблока 2 нужно пометить элементы, к которым есть привязка.
Вроде бы всё просто, использую ctalog комплексный и в шаблоне catalog.section создал result_modifier.php в который сложил логику. Ибо дурак, попытаюсь объяснить что делал последовательно (код избыточен, ибо вытащил его из другого компонента, где нужны были проверки и слегка адаптировал:
Если тут вывести содержимое переменной $arLinkId, то увидим полный список ИД элементов инфоблока 2 на странице. ЭТО ХОРОШО! В том числе 2 элемента, к которым есть привязка из инфоблока 1.
Если на этом этапе вывести содержимое $res, то там всё ОЧЕНЬ ПЛОХО И НЕПОНЯТНО. Какая-то какашка. =)
Если тут в конце вывести $arResult["LINKED"], то обнаружится 2 вещи:
1) у массива нет ключей (хотя я думал туда передать ИД инфоблока 2, которые = свойству инфоблока 1)
2) в массиве находится только 1 элемент. Хотя их должно быть по крайней мере 2.
Очевидно, что где-то совершена не то что ошибка... ГЛУПОСТЬ...
Но честно говоря мозга не хватает победить.
Есть 2 инфоблока.
У элементов инфоблока 1 есть свойство типа привязка к элементам инфоблока 2.
В списке элементов инфоблока 2 нужно пометить элементы, к которым есть привязка.
Вроде бы всё просто, использую ctalog комплексный и в шаблоне catalog.section создал result_modifier.php в который сложил логику. Ибо дурак, попытаюсь объяснить что делал последовательно (код избыточен, ибо вытащил его из другого компонента, где нужны были проверки и слегка адаптировал:
| Код |
|---|
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?><?
//Массив, в который мы соберем ID связанных элементов
//т.е. элементов того инфоблока в котором находимся, но по которым будем фильтровать инфоблок со слайдером
$arLinkId = array();
//Обойдем все элементы и соберем ID связанных элементов
foreach ($arResult["ITEMS"] as $arItem) {
//Получим ID связанного элемента
$linkId = IntVal($arItem['ID']);
//Если свойство было заполнено ЧИСЛОМ, то ID будет положительно
//Поскольку это ИД, то он не может быть строкой или пустым. Проверка на >0 не нужна.
//Занесем его в массив
$arLinkId[$linkId] = $linkId;
//Мы указываем в качестве ключа массива ID связанного элемента на случай,
//если несколько элементов имеют один и тот же связанный элемент.
//В этом случае массив $arLinkId не будет содержать дублей
}
|
| Код |
|---|
//Если после обхода у нас имеются ID связанных элементов (больше 0 элементов)
if (count($arLinkId) > 0) {
//То подключаем модуль инфоблоков (не будет лишним убедиться, что он подключен)
if (CModule::IncludeModule("iblock")) {
//Фильтр
$arFilter = array(
"IBLOCK_ID" => 1,
"ACTIVE" => "Y", //Выбирем только активные элементв
"PROPERTY_TOVLINK" => $arLinkId, //Указываем, что мы хотим выбрать только элементы, имеющиеся связь с нашими
);
//Поля, которые хотим выбрать
$arSelect = array(
"PROPERTY_TOVLINK",
"ID",
);
//Сортируем по PROPERTY_TOVLINK по возрастанию
$arSort = array(
"PROPERTY_TOVLINK" => "ASC",
);
//Делаем запрос
$res = CIBlockElement::GetList($arSort, $arFilter, false, false, $arSelect); |
| Код |
|---|
//Проходим по результату запроса и сохраняем массивы связанных элементов в $arResult
$arResult["LINKED"] = array();
while($arLinkElement = $res->GetNext()) {
$arResult["LINKED"][$arLinkElement['PROPERTY_TOVLINK']] = $arLinkElement;
}
}
}
?>
|
1) у массива нет ключей (хотя я думал туда передать ИД инфоблока 2, которые = свойству инфоблока 1)
2) в массиве находится только 1 элемент. Хотя их должно быть по крайней мере 2.
Очевидно, что где-то совершена не то что ошибка... ГЛУПОСТЬ...
Но честно говоря мозга не хватает победить.
вот такой я дурачок невезучий... =(