@alexander_chn

Как в Битрикс вывести множественное свойство через API?

Здравствуйте! В битрикс есть множественное свойство типа список с такими параметрами:
5da1f2f316ce1877961142.png
Вот код которым я вывожу это свойство:
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

$iblock_id  = 2;
$section_id = 34;

$arSelect = Array(
	"ID", 
	"NAME",
	"PROPERTY_ACTION");

$arFilter = Array( "IBLOCK_ID"=>$iblock_id, "SECTION_ID"=>$section_id, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y" );
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"), $arFilter, false, false, $arSelect);

while($ob = $res->GetNextElement()) :
	$arFields = $ob->GetFields();
	echo $arFields['PROPERTY_ACTION_VALUE'] . '<hr>';
endwhile;

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Выводится такое:
5da1f312c6b23489358615.png
В этом разделе есть 7 товаров, и только один товар с заполненым значением. В этом товаре присутствуют все значения.
Выводится странно, то есть при каждом проходе цикла выводит по одному значению этого множественного свойства.
Как вывести его нормально?
  • Вопрос задан
  • 2565 просмотров
Решения вопроса 1
alex-1917
@alex-1917
Если ответ помог, отметь решением
этот код внутри твоего цикла будет, это битрикс, увы и ах
$VALUES = array();
$res = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, Array("sort"=>"asc"), array("CODE" => "UF_NOTE_USER"));
    while ($ob = $res->GetNext())
    {
        $VALUES[] = $ob['VALUE'];
    }
}


Или другой варик - если ты включаешь множественное в arSelect, то у тебя будет вот такой нюанс, в доках описан:
Примечание 1: если в массиве используются свойство, являющееся множественным, то для элементов, где используются несколько значений этого свойства, будет возвращено несколько записей вместо одной. Для решения этой проблемы инфоблоки нужно перевести в Режим хранения свойств в отдельных таблицах, в этом случае для свойства будет отдаваться массив значений. Либо можно не указывать свойства в параметрах выборки, а получать их значения на каждом шаге перебора выборки с помощью _CIBElement::GetProperties().

Я делаю так - в арселект включаю множественное, но дальшее в php отсекаю повторы, в массиве останутся первые по сортировке значения множественных полей.
Это битрикс, детка,это битрикс.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Craftmoorg
Внутри цикла ничего не нужно размещать, это не правильно. Есть метод CIBlockElement::GetPropertyValues для получения множественных свойств нескольких элементов. Для примера взял свойство Реквизиты.
$iblockId = 1;
$iblockCode = 'catalog';
$productIds = [123, 1234, 1235];
$propertyCode = 'CML2_TRAITS';
// Получим ID свойства которое нам нужно по его символьному коду
$propertyId = \CIBlockProperty::GetByID("CML2_TRAITS", false, $iblockCode)->Fetch()['ID'];
// Далле уже получаем по ID свойства его значения. 
$rsPropertyValues = \CIBlockElement::GetPropertyValues($iblockId, ['ID' => $productIds], true, ['ID' => $propertyId]);
while ($arPropertyValue = $rsPropertyValues->Fetch()){
    foreach ($arPropertyValue['DESCRIPTION'][$propertyId] as $key => $value){
        if ($value == 'Вес'){
          // Ваш код...
        }
        if ($value == 'Объем'){
            // Ваш код...
        }
        if ($value == 'Штрихкод'){
            // Ваш код...
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы