Раньше в редакции Старт для отображения фотографий (галерей/альбомов) мне приходилось использовать инфоблок и загружать в него фото "поштучно", что при большом объеме файлов было весьма длительно и неудобно. После появления функционала Медиабиблиотеки, а именно ее возможности множественной загрузки - возникла идея использовать ее способности для отображения фоток в публичной части. В блоге (http://dev.1c-bitrix.ru/community/blogs/vad/1363.php?commentId=9911&phrase_id=2321421#9268) указали где можно посмотреть код обращения и после некоторых манипуляций я смог написать вот такую конструкцию:
Код
$strSql = "SELECT
MI.*,MCI.COLLECTION_ID
FROM b_medialib_collection_item MCI
INNER JOIN b_medialib_item MI ON (MI.ID=MCI.ITEM_ID) WHERE MCI.COLLECTION_ID=".$_REQUEST[ID]*1;
$res = $DB->Query($strSql, false, $err_mess);
$arResult = Array();
while($arRes = $res->Fetch())
$arResult[]=$arRes;
Как несложно понять - я указываю через параметр ID номер альбома и достаю информацию о фотографиях в нем.
Чтобы достать id альбома - использую следующий код:
В принципе этих 2 конструкций достаточно, чтобы показать в публичной части список альбомов и их фотографии. Поделюсь, как это реализовал я: 1. Список альбомов. В моем случае - мне нужно выводить на разных страницах сайта разные альбомы. Чтобы была некая гибкость и удобство использования - я сделал следующее: я использовал возможность указания ключевых слов у альбомов медиабиблиотеки. Я ввожу условных код (например "photo1") в качестве ключевого слова у альбомов, список которых мне нужно показать на одной странице, и на этой странице вывода списка альбомов я задал доп. свойство страницы
Немного модифицируем наш код вывода списка альбомов:
Код
$strSql = "
SELECT
*
FROM
b_medialib_collection
WHERE KEYWORDS='".$APPLICATION->GetPageProperty("medialib")."'";
$res = $DB->Query($strSql, false, $err_mess.__LINE__);
$arResult = Array();
while($arRes = $res->Fetch())
$arResult[]=$arRes;
//далее мой вариант вывода информации
$cnt = count($arResult);
for ($i = 0; $i <= $cnt; $i++) {
echo "<p><b><a href='list.php?ID=".$arResult[$i][ID]."'>".$arResult[$i][NAME]."</a></b><br>".$arResult[$i][DESCRIPTION]."</p><br>";
}
И мы получаем список альбомов у которых в качестве ключевого слова указано "photo1". Нужно вывести на другой странице - другой список альбомов? Даже редактор без особых познаний сможет в визуальном режиме задать новое сочетание "свойство medialib у страницы списка - ключевое слово у альбомов" и вуаля.
2. В предыдущем пункте мы указали, что список фотографий будем показывать на странице list.php Вот мой вариант этой страницы:
Код
<?
//достаем информацию о выбранном альбоме
$strSql = "
SELECT
MLC.*
FROM
b_medialib_collection MLC
WHERE MLC.ID=".$_REQUEST[ID]*1;
$res = $DB->Query($strSql, false, $err_mess.__LINE__);
$arResult = Array();
while($arRes = $res->Fetch())
$arResult[]=$arRes;
?>
<?
//добавляем название альбома в цепочку навигации
$APPLICATION->AddChainItem($arResult[0][NAME]);
?>
<?//выводим название альбома и его описание?>
<p><b><?=$arResult[0][NAME]?></b><br>
<?=$arResult[0][DESCRIPTION]?></p>
<?
//достаем фотографии выбранного альбома
$strSql = "SELECT
MI.*,MCI.COLLECTION_ID
FROM b_medialib_collection_item MCI
INNER JOIN b_medialib_item MI ON (MI.ID=MCI.ITEM_ID) WHERE MCI.COLLECTION_ID=".$_REQUEST[ID]*1;
$res = $DB->Query($strSql, false, $err_mess);
$arResult = Array();
while($arRes = $res->Fetch())
$arResult[]=$arRes;
$cnt = count($arResult);
for ($i = 0; $i < $cnt; $i++) {
//показываем фотографии выбранного альбома (в моем случае ограничиваем размером 500x500)
echo "<p>".CFile::ShowImage($arResult[$i][SOURCE_ID], 500, 500, "border=0", "", false)."<div>".$arResult[$i][NAME]."</div></p>";
}
?>
Долго мучался и искал в БД - где хранятся превью картинок. Как оказалось в MySQL эта информация не хранится. Нужно просто изменить путь полноценной картинки - с "/upload/" на "/bitrix/tmp/". Т.е. если большая картинка лежит по адресу "/upload/medialibrary/7c1/ml10.jpg" - то ее миниатюра будет лежать здесь "/bitrix/tmp/medialibrary/7c1/ml10.jpg". В коде выглядит так:
Дальнейший путь думаю ясен - у jQuery много красивых и удобных галерей. Получив список фотографий (превью и основная картинка) - Вы сможете вывести фото не просто списком, а в удобном виде.
Вот собственно и все, чем могу поделиться. В моем варианте не используется возможность вложенности альбомов, т.е. все альбомы которые имеют ключевое слово "photo1" будут показаны одноуровневым списком.
Профи - пожалуйста сильно не ругайте, если видите явные косяки, либо недочеты - лучше поделитесь кодом и комментариями.