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

Свойство инфоблока типа файл

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

Код
<?if($arProperty['CODE']=="COM_MODS"):?> 
   <?foreach($arProperty['VALUE'] as $value) 
      { 
         $props=CIBlockElement::GetProperty($arProperty['LINK_IBLOCK_ID'], $value,"sort", "asc", Array("CODE"=>"MOD_IMG")); 
         $pic=$props->fetch(); 
      }?>

где COM_MODS - связанный инфоблок, MOD_IMG - свойство с картинкой

в итоге я получаю массив заданного свойства, заданного инфоблока, но в нем нет ссылки на файл или чего-нибудь подобного.
В чем может быть причина и есть ли более изящное решение?
спросил 22 Апр, 14 от KeiDen (400 баллов)

2 Ответы

00 голосов
мало ли кому пригодится. в предыдущем примере я получил id файла, который хранится на сервере(в моем случае это изображение). id хранится в массиве под ключом VALUE. Чтобы получить свойства файла по id использовал CFile::GetFileArray() итого:
Код
<?foreach($arResult["DISPLAY_PROPERTIES"] as $pid=>$arProperty):?>
    <?if($arProperty['CODE']=="COM_MODS"):?>
      <?foreach($arProperty['VALUE'] as $value)
         {
            $props=CIBlockElement::GetProperty($arProperty['LINK_IBLOCK_ID'], $value,"sort", "asc", Array("CODE"=>"MOD_IMG"));
            $pic_id=$props->fetch();
            $pic=CFile::GetFileArray($pic_id['VALUE']);
            echo'<img src="'.$pic['SRC'].'">';
            echo $arProperty["DISPLAY_VALUE"];
         }?>                     
   <?endif?>
<?endforeach?>

Теперь в детальном выводе элемента каталога отображаются изображения всех связанных элементов и ссылки на них.

Не знаю насколько правильным или удачным можно считать такое решение, но иного пути я не нашел
ответил 05 Дек, 14 от KeiDen (400 баллов)
00 голосов
Лучше все программные модификации производить не в самом шаблоне, а в result_modifier.php в папке шаблона.
Если нужен только путь к файлу, то можно использовать CFile::GetPath().

Возможно лучше не делать отдельный запрос для каждого значения COM_MODS. Можно попробовать сделать один запрос CIBlockElement::GetList(), передав в фильтр массив COM_MODS, т.е. например (требует отладки):

Код
$arFilter = Array("IBLOCK_ID"=>$arProperty["LINK_IBLOCK_ID"], ID=>$arResult["PROPERTIES"]["COM_MODS"]["VALUE"]);
$arSelect = Array("IBLOCK_ID", "PROPERTY_MOD_IMG")

$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $res->GetNext(false,false))
   $arResult["MOD_IMG"][] = CFile::GetPath($ob["PROPERTY_MOD_IMG_VALUE"]);
ответил 29 Март, 15 от smileplz (8,020 баллов)