Как вывести значение множественных свойств в битриксе
У меня есть список ID товаров
$strValue = '123, 125, 158, 967, 667';
Мне нужно пройтись по каждому товару и получить значения двух свойств Свойств с ID=1137 и ID=1138
И получить в результате такую конструкцию:
<interLinkingParam name="[Название свойства]">
<interLinkingParamValue value="[значение свойства ID1137]" color="[значение свойства ID1138]" imageUrl="https://site.ru/[значение свойства ID1138].jpg" groupId="64599" />
<interLinkingParamValue value="[значение свойства ID1137]" color="[значение свойства ID1138]" imageUrl="https://site.ru/[значение свойства ID1138].jpg" groupId="[ID товара из которого вытянули значение]" />
</interLinkingParam>
Меня хватило на то чтоб написать такой код:
$arElementIds = explode(',', $strValue); // Разбиваем строку на массив ID элементов
$propertyId1 = 1137; // ID первого свойства
$propertyId2 = 1138; // ID второго свойства
$resultString = ''; // Строка для хранения результата
foreach ($arElementIds as $elementId) {
$arFilter = ['ID' => $elementId];
$arSelect = ['ID', 'PROPERTY_'.$propertyId1, 'PROPERTY_'.$propertyId2];
$rsElement = CIBlockElement::GetList([], $arFilter, false, false, $arSelect);
if ($arElement = $rsElement->GetNext()) {
$propertyValue1 = $arElement['PROPERTY_'.$propertyId1.'_VALUE'];
$propertyValue2 = $arElement['PROPERTY_'.$propertyId2.'_VALUE'];
$imageUrl = "https://site.ru/{$propertyValue2}.jpg";
$resultString .= "<interLinkingParamValue value='{$propertyValue1}' color='{$propertyValue1}' imageUrl='{$imageUrl}' groupId='{$elementId}'/>\n";
}
}
// Выводим результат
echo $resultString;
и получаю такой результат:
<interLinkingParamValue value='White | Белый 6000 K' color='White | Белый 6000 K' imageUrl='https://site.ru/#f2fafb.jpg' groupId='210580'/>
<interLinkingParamValue value='White | Белый 6000 K' color='White | Белый 6000 K' imageUrl='https://site.ru/#f2fafb.jpg' groupId='210373'/>
<interLinkingParamValue value='White | Белый 6000 K' color='White | Белый 6000 K' imageUrl='https://site.ru/#f2fafb.jpg' groupId='202392'/>
<interLinkingParamValue value='White | Белый 6000 K' color='White | Белый 6000 K' imageUrl='https://site.ru/#f2fafb.jpg' groupId='201818'/>
И вроде бы все хорошо, для товаров у которых одно значение записано в поле свойства. Но никак не могу понять как вывести все значения когда и больше?
В примере выше, это вывод значений из товаров в которых оно множественное, тип строка. в админке выглядит так:
А в моем коде выводит только первое значение.
Помогите понять что не так делаю и как вывести все значения свойств в одну строку. Чтоб было так:
<interLinkingParamValue value='White | Белый 6000 K,Warm | Тёплый 2700 K' color='White | Белый 6000 K,Warm | Тёплый 2700 K' imageUrl='https://site.ru/#f2fafb#f8c077.jpg' groupId='210580'/>
<interLinkingParamValue value='White | Белый 6000 K,Warm | Тёплый 2700 K' color='White | Белый 6000 K,Warm | Тёплый 2700 K' imageUrl='https://site.ru/#f2fafb#f8c077.jpg' groupId='210373'/>
<interLinkingParamValue value='White | Белый 6000 K,Warm | Тёплый 2700 K' color='White | Белый 6000 K,Warm | Тёплый 2700 K' imageUrl='https://site.ru/#f2fafb#f8c077.jpg' groupId='202392'/>
<interLinkingParamValue value='White | Белый 6000 K,Warm | Тёплый 2700 K' color='White | Белый 6000 K,Warm | Тёплый 2700 K' imageUrl='https://site.ru/#f2fafb#f8c077.jpg' groupId='201818'/>
Ответы (1 шт):
Рекомендую использовать для этого функции из D7, получится всего один запрос. Не забудьте поменять символьные коды свойств и ID инфоблока на нужные
// ID элементов
$strValue = '250428, 250427';
$arElementIds = explode(',', $strValue);
$result = [];
// Получаем класс для работы с инфоблоком
$iblockClass = \Bitrix\Iblock\Iblock::wakeUp(73)->getEntityDataClass(); // ID инфоблкоа
// Получаем список элементов с указанными ID
$elements = $iblockClass::getList([
'filter' => ['ID' => $arElementIds],
'select' => ['COLOR_WAVE_LENGTH', 'COLOR_HEX'], // Коды свойств
]);
// Идем по элементам
while ($element = $elements->fetchObject()) {
// Получаем ID элемента
$id = $element->getId();
// Получаем в массив все значения множественного свойства
$waveLength = array_map(static function ($value) {
return $value->getValue();
}, $element->get('COLOR_WAVE_LENGTH')?->getAll());
// Аналогично
$hex = array_map(static function ($value) {
return $value->getValue();
}, $element->get('COLOR_HEX')?->getAll());
// Бежим по полученным значениям и записываем строки в массив $result
array_walk($waveLength, static function ($item, $index) use (&$result, $hex, $id) {
$result[] = sprintf(
'<interLinkingParamValue value="%s" color="%1$s" imageUrl="https://site.ru/%s.jpg" groupId="%d" />',
$item,
$hex[$index],
$id
);
});
}
// Выводим массив как строку, склеив переносами строк
echo implode(PHP_EOL, $result);