Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

есть ли способ получить все значения свойств элементов инфоблока?

00 голосов
4
ну мне надо в фильтре седлать выпадающее свойство - где перечислины все страны.

как это можно красиво сделать, а не перебором всех элементов и выцеплением из них значения этого свойства?
спросил 27 Июль, 13 от FOOLKS (520 баллов)

4 Ответы

00 голосов
Например CIBlockProperty::GetList
ответил 27 Июль, 13 от NitroGeN (2,840 баллов)
00 голосов
Вопрос, я думаю в другом, и у меня такой же.
У меня элементы инфоблока имеют свойство бренда, нужно получить список всех брендов, встречающихся в этих элементах, причем без повторений.
Понятно, что можно брать элементы, и самим проходить, но если элементов очень много, то это совсем неправильно. С помощью API это сделать реально?
ответил 23 Сен, 13 от Dunja (140 баллов)
00 голосов
Я действовал от обратного: доставал все бренды, а потом просто искал в каталоге (те элементы, которые фильтруем) элементы, у которых есть данный бренд. Если находил хотя бы один, то оставлял бренд в списке.

Код
$brandRes = CIBlockElement::GetList(
   array(),
   array("IBLOCK_ID" => $brand)
);
$brands = array();
while($brandOb = $brandRes -> GetNext()){
   $res = CIBlockElement::GetList(
      array(),
      array(
         "IBLOCK_ID" => $catalog, 
         "SECTION_ID" => $_GET["SECTION_ID"],
         "ACTIVE" => "Y",
         "PROPERTY_BRAND" => $brandOb["ID"]
      ),
      false,
      array("nTopCount" => 1)
   );
   if($ob = $res->GetNext()) $brands[] = $brandOb["ID"];
} 

Понимаю, что много лишних запросов к базе, но, используя только API, ничего более подходящего не нашел. Ну, и не стоит забывать про кэш, так что особо сильного замедления не произошло.
ответил 22 Дек, 13 от KeiDen (400 баллов)
00 голосов
Нашел, как сделать изящно с помощью API

Код
$dbRes = CIBlockElement::GetList(array(), array("IBLOCK_CODE" => $arParams["CUR_IBLOCK_CODE"], "!PROPERTY_".$code => false), array("PROPERTY_".$code));
в итоге получим, что нужно.
По порядку:
  1. 2-ой массив - массив фильтров, интересен второй фильтр: он позволяет исключить из выборки пустое значение (те элементы, у которых значения не заданы будут сгруппированы как раз в эту группу)
  2. 3-ий массив - массив группировки: в нем-то и вся соль, он группирует элементы по указанному свойству. Плюс в результирующем массиве для каждого значения будет выдано количество элементов имеющих его.
В итоге получил DBResult вида

Код
Array
(
    [PROPERTY_BRAND_VALUE] => 133
    [~PROPERTY_BRAND_VALUE] => 133
    [CNT] => 3
    [~CNT] => 3
)



Код
Array
(
    [PROPERTY_BRAND_VALUE] => 135
    [~PROPERTY_BRAND_VALUE] => 135
    [CNT] => 1
    [~CNT] => 1
)



Код
Array
(
    [PROPERTY_BRAND_VALUE] => 138
    [~PROPERTY_BRAND_VALUE] => 138
    [CNT] => 1
    [~CNT] => 1
)
ответил 07 Апр, 14 от Dunja (140 баллов)