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

Медиабиблиотека

00 голосов
0
Доброго времени суток.

Раньше в редакции Старт для отображения фотографий (галерей/альбомов) мне приходилось использовать инфоблок и загружать в него фото "поштучно", что при большом объеме файлов было весьма длительно и неудобно.
После появления функционала Медиабиблиотеки, а именно ее возможности множественной загрузки - возникла идея использовать ее способности для отображения фоток в публичной части.
В блоге (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 альбома - использую следующий код:
Код
$strSql = "
SELECT
*
FROM
b_medialib_collection";

$res = $DB->Query($strSql, false, $err_mess.__LINE__);

$arResult = Array();
while($arRes = $res->Fetch())
$arResult[]=$arRes;


В принципе этих 2 конструкций достаточно, чтобы показать в публичной части список альбомов и их фотографии. Поделюсь, как это реализовал я:
1. Список альбомов.
В моем случае - мне нужно выводить на разных страницах сайта разные альбомы. Чтобы была некая гибкость и удобство использования - я сделал следующее: я использовал возможность указания ключевых слов у альбомов медиабиблиотеки. Я ввожу условных код (например "photo1") в качестве ключевого слова у альбомов, список которых мне нужно показать на одной странице, и на этой странице вывода списка альбомов я задал доп. свойство страницы
Код
$APPLICATION->SetPageProperty("medialib", "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".
В коде выглядит так:
Код
$img_full=CFile::GetPath($arResult[$i][SOURCE_ID]);
$img_preview=str_replace("upload", "bitrix/tmp", $img_full);


Дальнейший путь думаю ясен - у jQuery много красивых и удобных галерей. Получив список фотографий (превью и основная картинка) - Вы сможете вывести фото не просто списком, а в удобном виде.


Вот собственно и все, чем могу поделиться. В моем варианте не используется возможность вложенности альбомов, т.е. все альбомы которые имеют ключевое слово "photo1" будут показаны одноуровневым списком.

Профи - пожалуйста сильно не ругайте, если видите явные косяки, либо недочеты - лучше поделитесь кодом и комментариями.

С Новым Годом всех!
спросил 31 Авг, 13 от Kerri (120 баллов)

Ваш ответ

Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

Связанных вопросов не найдено