Когда вы используете API в CMS Битрикс, очень часто вы не видите всех значений у свойства список. Или же, вы видите в цикле один и тот же товар, и сразу несколько выбранных значений, что тоже не очень удобно.
Как вывести все значения у множественного типа Список в Битриксе
В данном примере речь пойдет именно о множественном свойстве, с обычными свойствами таких проблем не возникает обычно. Что говорит нам документация для метода CIBlockElement::GetProperty :
$VALUES = array(); $res = CIBlockElement::GetProperty(IKSO_CUSTOM::$IBLOCKS['brands'], $BRAND_ID, "sort", "asc", array("CODE" => "BRAND_CLASS")); while ($ob = $res->GetNext()) { $VALUES[] = $ob['VALUE']; }
Давайте немного изменим код во 2 строке, чтобы было более понятнее:
$res = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, array("sort"=>"asc"), array("CODE" => "COLORS"));
Вот, теперь более понятно. Первый параметр ID инфоблока, затем ID элемента, далее массив с сортировкой и наконец самый важный параметр – массив с фильтром.
Выбирать можно не только по символьному коду свойства, еще есть такие вот варианты:
NAME - название свойства (можно использовать маску %|_), ID - код свойства, ACTIVE - активность (Y|N), SEARCHABLE - участвует в поиске или нет (Y|N), PROPERTY_TYPE - тип свойства, CODE - символьный код свойства, EMPTY - пустота свойства (Y|N).
Рассмотрим код немного сложнее. Сразу скажу, что он не претендует на премию “вау, как круто написано” :).
Чуть ниже я объясню что мы делаем и зачем:
$VALUES = array(); $res = CIBlockElement::GetProperty(1, $arResult['ID'], "sort", "asc", array("CODE" => "COLORS")); $b = 0; while ($ob = $res->GetNext()) { $my_elements = CIBlockElement::GetList ( Array("ID" => "ASC"), Array("IBLOCK_ID" => 19, "NAME" => $ob['DESCRIPTION']), false, false, Array('ID', 'PREVIEW_PICTURE') ); if ($ar_fields = $my_elements->GetNext()) { $VALUES[$b]['BG'] = CFile::GetPath($ar_fields['PREVIEW_PICTURE']); } $VALUES[$b]['IMG'] = CFile::GetPath($ob['VALUE']); $VALUES[$b]['DESC'] = $ob['DESCRIPTION']; $b++; }
У нас есть инфоблок с заполненными названиями и картинками, в моем случае это цвет автомобиля.
Тут внимательней, можно легко запутаться. $ob[‘DESCRIPTION’] – описание для картинки товара, и по этому описанию ищем элемент, который подходит по имени – “NAME” => $ob[‘DESCRIPTION’].
Дальше проще, используем CFile::GetPath – уже знакомую вам из данной статьи.
Ссылка на документацию для самых опытных и любопытных: https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getproperty.php
Т.е. вы пихаете GetList в цикл и называете это “вау” кодом ? Это действительно так, только с абсолютно обратным эффектом.
Вы правы, в идеале все значения из цикла нужно добавить в массив, и только потом запустить CIBlockElement::GetList. Но если у вас есть вариант кода еще лучше, буду рад его увидеть 🙂
Вау эффект будет, когда все это говно в автокеширование закинут.
Извиняюсь за некро-постинг, просто уже в печенках сидит код битрикса. Уже очень надоело разгребать страницы, на которых 800+ запросов к базе.
А потом после этого еще натыкаешься на пример, где внутри одного цикла, еще один getlist и автор такой “если у вас есть код лучше – буду рад его увидеть”. Да любой код будет лучше где нет геометрического роста запросов к базе! А у вас там еще CFile::GetPath – что тоже породит запрос. А потом на странице выводится 20 новостей и получается 200 запросов.
Я понимаю, что API битрикса это просто говно (да даже их D7 это лютое говно). Каждый раз мне кажется, что они ненавидят разработчиков лютой ненавистью.
У меня такие мысли возникают когда я смотрю на новый код оформления заказа или корзины 🙂 . Использовать шаблонизатор mustache и битрикс JS.. Вся логика оформления это JS, без слёз на этот код не взглянешь.