В этой заметке расскажу как красиво вывести множественное свойство типа файл в инфоблоке 1С-Битрикс. С показом оригинального названия файла, его транслитированной версии, размера файла в килобайтах и, само собой, ссылкой на скачивание.
Исходные данные для вывода файлов
Итак, в инфоблоке каталога сайта имеем стандартное, множественное свойство "типа файл" с кодом "FILES".

Если мы его выведем, штатным способом, через вывод свойств- как оно задумано в Битрикс изначально. Выглядеть это будет не казисто и не интересно

Абсолютно не интересно и самое главное не информативно. В моем случае, в данное свойство загружаются документы. Причем они в разных форматах и разного размера. Пользователь должен видеть и название документа и его размер с форматом. Например вот так:

Выводим свойство файл через API Битрикс- получая все данные о файлах
Все достаточно просто, так как множественные свойства это обычные массивы. Мы можем получить все данные о каждом файле, просто зная код свойства, в моем случае "FILES". Выглядеть foreach будет следующим образом.
<?foreach($arResult["DISPLAY_PROPERTIES"]['FILES']['FILE_VALUE'] as $pid=>$arProperty):?>
<?
//echo '<pre>';print_r($arProperty);echo '</pre>';
echo $arProperty['FILE_SIZE']; //размер файла в байтах
echo $arProperty['FILE_NAME']; //Транслитированное название файла
echo $arProperty['ORIGINAL_NAME']; //Оригинальное название файла
echo $arProperty['SRC']; //Ссылка на скачивание
>
<?endforeach?>
Расскоментировав строку
// echo '<pre>';print_r($arProperty);echo '</pre>';
Вы сможете увидеть все данные о каждом файле, доступные для вывода. По мимо основных, там есть и дата загрузки и тип файла.
В принципе и все. Конкретно в моем случае, в примере выше, результат вывода выглядет следующим образом:
<? foreach ($arResult["DISPLAY_PROPERTIES"]['FILES']['FILE_VALUE'] as $pid => $arProperty): ?>
<a
href="<? echo $arProperty['SRC']; ?>"
title="Скачать <? echo $arProperty['FILE_NAME']; ?>">
<strong>
<? echo $arProperty['ORIGINAL_NAME']; ?>
<span> —
<?
$strKb = $arProperty['FILE_SIZE']/1024;
echo round($strKb) . ' Кб';
?>
</span>
</strong>
<i>
<? echo $arProperty['FILE_NAME']; ?>
</i>
</a>
<? endforeach ?>
Несколько полезных моментов
Байты в килобаты (размер файла), я привратил, обычной php функцией округления в большую сторону round. Предварительно приведя байты в килобаты. просто разделив $arProperty['FILE_SIZE'] на 1024 (смотри в коде выше).
Иконки для разных типов файлов, назначил через CSS - тут простая стилизация. Зная расширение файла, а точнее расширенеие на которое заканчивается ссылка, просто прописал background для каждой разновидности ссылки. Вот так:
a[href$=".doc"],
a[href$=".docx"],
a[href$=".rtf"] {
background: url("img/doc.png");
}
a[href$=".pdf"] {
background: url("img/pdf.png");
}
a[href$=".xls"],
a[href$=".xlsx"] {
background: url("img/exl.png");
}
Дополнено: вывод файла для catalog.element
Так как в компоненте и шаблоне catalog.element доступна информация, только для ID файла - те же самые данные (из текста выше), мы можем получить методом CFile::GetFileArray(). Просто передав в него ID файла.
Пример:
foreach ($arResult["PROPERTIES"]['FILES']['VALUE'] as $pid => $arProperty):
$arFile = CFile::GetFileArray($arProperty);
print_r($arFile);// Распечатка всего массива
endforeach

У меня почему в цикле foreach не чего не происходит, совсем, хотя свойства передаются и файл прикреплен.
<?foreach($arResult["DISPLAY_PROPERTIES"]['FILES']['FILE_VALUE'] as $pid=>$arProperty):?>
<?
echo $arProperty['FILE_SIZE']; //размер файла в байтах
echo $arProperty['FILE_NAME']; //Транслитированное название файла
echo $arProperty['ORIGINAL_NAME']; //Оригинальное название файла
echo $arProperty['SRC']; //Ссылка на скачивание
?>
<?endforeach?>
Пытаюсь вывести файл в каталоге для скачивания.
Каталог не основной.

Цитата |
---|
Eugene Eugene написал: Такая же история, абсолютно не рабочий код. Пытаюсь вывести в catalog.element, никакой реакции системы нет. 1С-Битрикс: Управление сайтом 20.200.0 . |
Только что проверил на одном проекте - все работает
Код |
---|
echo '<pre>'; print_r($arResult["DISPLAY_PROPERTIES"]); echo '</pre>'; |
Цитата |
---|
Eugene Eugene пишет: Такая же история, абсолютно не рабочий код. Пытаюсь вывести в catalog.element, никакой реакции системы нет. [URL=http://www.1c-bitrix.ru/]1С-Битрикс: Управление сайтом 20.200.0[/URL] . |
Цитата |
---|
виталий бовкун написал: Здравствуйте. У меня почему в цикле foreach не чего не происходит, совсем, хотя свойства передаются и файл прикреплен. <?foreach($arResult["DISPLAY_PROPERTIES"]['FILES']['FILE_VALUE'] as $pid=>$arProperty):?> <? echo $arProperty['FILE_SIZE']; //размер файла в байтах echo $arProperty['FILE_NAME']; //Транслитированное название файла echo $arProperty['ORIGINAL_NAME']; //Оригинальное название файла echo $arProperty['SRC']; //Ссылка на скачивание ?> <?endforeach?> Пытаюсь вывести файл в каталоге для скачивания. Каталог не основной. |

Цитата |
---|
Денис Кулеба пишет: [QUOTE][URL=/club/user/13838/]виталий бовкун[/URL] написал: Здравствуйте. У меня почему в цикле foreach не чего не происходит, совсем, хотя свойства передаются и файл прикреплен. $arProperty):?> echo $arProperty['FILE_SIZE']; //размер файла в байтах echo $arProperty['FILE_NAME']; //Транслитированное название файла echo $arProperty['ORIGINAL_NAME']; //Оригинальное название файла echo $arProperty['SRC']; //Ссылка на скачивание ?> Пытаюсь вывести файл в каталоге для скачивания. Каталог не основной. [/QUOTE] Скажите, а нашлось решение проблемы. Очень надо. |
Цитата |
---|
Михаил Базаров пишет: [QUOTE][URL=/club/user/14132/]Денис Кулеба[/URL] пишет: [QUOTE][URL=/club/user/13838/]виталий бовкун[/URL] написал: Здравствуйте. У меня почему в цикле foreach не чего не происходит, совсем, хотя свойства передаются и файл прикреплен. $arProperty):?> echo $arProperty['FILE_SIZE']; //размер файла в байтах echo $arProperty['FILE_NAME']; //Транслитированное название файла echo $arProperty['ORIGINAL_NAME']; //Оригинальное название файла echo $arProperty['SRC']; //Ссылка на скачивание ?> Пытаюсь вывести файл в каталоге для скачивания. Каталог не основной. [/QUOTE] Скажите, а нашлось решение проблемы. Очень надо.[/QUOTE] Самый последний абзац- добавлен недели 2-е назад. |

Что бы это сделать можно воспользоваться методом
CFile::GetFileArray
В параметр передаем ID нужного файла или переменную с нужным ID и классом DateTime
приводим к строке:
Код |
---|
<? $arItem = 123; // ID нужного файла $rsFile = CFile::GetFileArray($arItem); echo $rsFile['TIMESTAMP_X']->toString(); ?> |
Распечатываем массив
Код |
---|
<? print_r($rsFile); ?> |