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

Извлечение значений свойств множественного типа Инфоблоки 2.0

00 голосов
6
Доброго времени суток, снова иду на форум в поисках ответа на возникающие вопросы ...

Имеется инфоблок, за которым закреплено свойство множественного типа (само свойство типа файл, но это не так важно, проверял на других типах - эффект тот же). Изначально инфоблок был стандартным и при выборке по полю свойства
Код
$wantedSelect = Array("PROPERTY_WANTED_PHOTO", "PROPERTY_FIRSTNAME", "PROPERTY_NAME", "PROPERTY_SECONDNAME", "PROPERTY_test" "NAME", "CODE");

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

- да не вопрос подумал я, так и сделаем. Что получилось в итоге?
код:
Код
while($ob = $wantedRes->GetNextElement()): 
  $arIBlockElement = $ob->GetFields(); 
  $props = $ob->GetProperties(); 
echo "<hr><pre>"; print_r($props); echo "</pre>";
//...
endwhile;

результат:
Код
[WANTED_PHOTO] => Array
        (
            [ID] => 9
            [TIMESTAMP_X] => 2011-04-03 02:26:55
            [IBLOCK_ID] => 22
            [NAME] => Фотография разыскиваемого
            [ACTIVE] => Y
            [SORT] => 500
            [CODE] => WANTED_PHOTO
            [DEFAULT_VALUE] => 
            [PROPERTY_TYPE] => F
            [ROW_COUNT] => 1
            [COL_COUNT] => 30
            [LIST_TYPE] => L
            [MULTIPLE] => Y
            [XML_ID] => 
            [FILE_TYPE] => jpg, gif, bmp, png, jpeg
            [MULTIPLE_CNT] => 1
            [TMP_ID] => 
            [LINK_IBLOCK_ID] => 0
            [WITH_DESCRIPTION] => N
            [SEARCHABLE] => N
            [FILTRABLE] => N
            [IS_REQUIRED] => N
            [VERSION] => 2
            [USER_TYPE] => 
            [USER_TYPE_SETTINGS] => 
            [VALUE] => 
            [DESCRIPTION] => 
            [~VALUE] => 
            [~DESCRIPTION] => 
        )

как можно наблюдать поле VALUE пусто, хотя для элементов не множественного типа все нормально (хотя с ними и так проблем не было).

Вопрос: что делаю не так?

Можно конечно использовать и стандартные инфоблоки, но тогда придется вводить условие фильтрации в цикле, так же нужно попробовать в стандартном инфоблоке извлечь свойства отдельно для элемента (чем сейчас и займусь), но почему не работает это - мне не понятно.

UPD:
Со стандартным блоком тоже весело.
Имея у элемента 3 значения 1ого множественного свойства и 4 значения 2ого множественного свойства получаем декартово произведения - т.е. 12 дубликатов, один из которых выглядит так:
Код
_CIBElement Object
(
    [fields] => Array
        (
            [PROPERTY_WANTED_PHOTO_VALUE] => 52
            [~PROPERTY_WANTED_PHOTO_VALUE] => 52
            [PROPERTY_WANTED_PHOTO_VALUE_ID] => 293
            [~PROPERTY_WANTED_PHOTO_VALUE_ID] => 293
            [PROPERTY_FIRSTNAME_VALUE] => Смирнов
            [~PROPERTY_FIRSTNAME_VALUE] => Смирнов
            [PROPERTY_FIRSTNAME_VALUE_ID] => 290
            [~PROPERTY_FIRSTNAME_VALUE_ID] => 290
            [PROPERTY_NAME_VALUE] => Олег
            [~PROPERTY_NAME_VALUE] => Олег
            [PROPERTY_NAME_VALUE_ID] => 291
            [~PROPERTY_NAME_VALUE_ID] => 291
            [PROPERTY_SECONDNAME_VALUE] => Михайлович
            [~PROPERTY_SECONDNAME_VALUE] => Михайлович
            [PROPERTY_SECONDNAME_VALUE_ID] => 292
     &
спросил 25 Фев, 13 от Blodrayne (220 баллов)

6 Ответы

00 голосов
Код
while($ob = $wantedRes->GetNextElement()):
  $props["NAME_OF_PROPERTY"] = $ob->GetPropertу("NAME_OF_PROPERTY");
  $arIBlockElement = $ob->GetFields();
echo "<hr><pre>"; print_r($props); echo "</pre>";
//...
endwhile;

GetPropertу("NAME_OF_PROPERTY");

попробуй так, тоже была такая проблема.
ответил 25 Фев, 13 от Lisica (900 баллов)
00 голосов
удалите сообщение

почему нельзя удалять свои сообщения? хотя бы в течение минуты после добавления?
ответил 15 Март, 13 от Lisica (900 баллов)
00 голосов
У GetList-а в arSelect-е должен присутствовать "ID"
ответил 18 Апр, 13 от dan97 (140 баллов)
00 голосов
Здравствуйте! Я бы хотел у вас спросить. У меня есть инфоблок "Здания". У этого инфоблока есть свойство множественного выбора "Метро". Свойство "Метро" - это список значений для всех элементов инфоблока. Мне нужно выгрузить в xml-файл этот список значений свойства "Метро". Не каждого элемента, а инфоблока в целом. Тут я смотрел и нашёл, что есть GetProperty у инфоблока если работать через php. Расскажите, пожалуйста поподробнее как с ним работать. А то я уже весь интернет облазил.
Заранее спасибо
ответил 12 Авг, 13 от MaxiM (220 баллов)
00 голосов
Документацию попробуйте посмотреть, там примеры есть:
http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockproperty/getlist.php
ответил 13 Ноя, 13 от Cyber (540 баллов)
00 голосов
Я решил эту проблему. Вот код, который я состряпал и который реально работает. Просто поставьте куда нужно свои данные:

Код
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Прямой вызов API Битрикса на странице");
?>
<?
if(!CModule::IncludeModule("iblock"))
   die('iblock module is not included!');


$property_enums = CIBlockPropertyEnum::GetList(Array("DEF"=>"DESC", "SORT"=>"ASC"), Array("IBLOCK_ID"=>3, "CODE"=>"METRO_2"));

$dom = new DomDocument('1.0','utf-8');
$contents = $dom->createElement("contents");
$dom->appendChild($contents);
while($enum_fields = $property_enums->GetNext())
{
  $par1 = $enum_fields["XML_ID"];
  $par2 = $enum_fields["VALUE"];
  print($par1."-".$par2."<br>");
 
  $new = $dom->createElement("item");
  
  $ParId = $new->appendChild($dom->createElement("id"));
  $ParName = $new->appendChild($dom->createElement("Name"));
  $ParId->appendChild($dom->createTextNode($par1));
  $ParName->appendChild($dom->createTextNode($par2));
  

  //$new->setAttribute("id",$par1);
  //$new->setAttribute("Name",$par2);
  $contents->appendChild($new);
  
}
$dom->formatOutput = true;
$dom->save('xml_id.xml');
?>
 
ответил 21 Фев, 14 от MaxiM (220 баллов)

Похожие вопросы

0 голосов
5 ответов
0 голосов
2 ответов
0 голосов
1 ответ
0 голосов
1 ответ
спросил 05 Апр, 14 от cRaNk (100 баллов)