Сниппет вывода изображений из альбома компонента Gallery с разбивкой на ''мультиплейсхолдеры''
Для начала создадим новый тип TV вот по этой инструкции — community.modx-cms.ru/blog/tips_and_tricks/8733.html
Далее создаём сниппет, который будет выводить наши изображения из альбома заполненного в TV поле ресурса:
Вызывать его будем например так:
[[!getGalleryImages? &album=`[[*objectPhotos]]`&tpl=`tpl.list.hotelGalleryImages`&toPlaceholder=`objectImages`&multiPlaceholder=`1`]]
[[*hotelPhotos]] — это TV с id альбома Gallery (с тем новым типом TV, который мы создали по инструкции выше)
«objectImages» — это плейсхолдер, который мы получим после выполнения сниппета
multiPlaceholder — это параметр, который отвечает за то, будет ли наш указанный плейсхолдер разбит на части, так сказать. К примеру если нам надо получить помимо цельного плейсхолдера "objectImages" ещё и плейсхолдеры, которые будут хранить в себе изображения по отдельности, то указав этот параметр мы получим что-то вроде этого: первая картинка альбома: [[+objectImages-0]], вторая картинка альбома: [[+objectImages-1]], третья картинка альбома: [[+objectImages-2]] и т.д.
Далее создаём сниппет, который будет выводить наши изображения из альбома заполненного в TV поле ресурса:
<?php
// Сниппет вывода изображений из альбома по шаблону чанка. Пример: [[!getGalleryImages? &album=`[[*hotelPhotos]]`&tpl=`tpl.chunkGalleryImages`&toPlaceholder=`hotelImages`&multiPlaceholder=`1`]], hotelPhotos - это TV с id альбома Gallery
// Подключаем pdoTools для работы с инлайновыми чанками
$pdo = $modx->getService('pdoTools');
$album = $modx->getOption('album', $scriptProperties, '1'); // проверяем, указан ли id альбома.. (по умолчанию - id альбома = 1)
$tpl = $modx->getOption('tpl', $scriptProperties, '@INLINE array(\'id\'=>\'[[+id]]\', \'name\'=>\'[[+name]]\', \'filename\'=>\'[[+filename]]\', \'description\'=>\'[[+description]]\'); '); // шаблон вывода изображений
$toPlaceholder = $modx->getOption('toPlaceholder', $scriptProperties, ''); // в плейсхолдер
$multiPlaceholder = $modx->getOption('multiPlaceholder', $scriptProperties, ''); // разбить изображения на плейсхолдеры вида "toPlaceholder-{num}", где {num} - номер изображения начиная от "0"
$where=array();
$where['album'] = $album;
$q = $modx->newQuery("galAlbumItem");
$q->where($where);
$total = $modx->getCount("galAlbumItem", $q);
$totalVar = $modx->getOption('totalVar', $scriptProperties, 'total');
$modx->setPlaceholder($totalVar, $total);
$limit = $modx->getOption('limit', $scriptProperties, 0);
$offset = $modx->getOption('offset', $scriptProperties, 0);
$q->limit($limit, $offset);
$sort = $modx->getOption('sort',$scriptProperties,'rank');
$dir = $modx->getOption('dir',$scriptProperties,'ASC');
$q->sortby($sort, $dir);
$gAlbumItemArray = $modx->getCollection("galAlbumItem", $q );
// Проверяем, получили ли мы результат.. проще говоря - есть ли изображения в альбоме
if(is_array($gAlbumItemArray) AND count($gAlbumItemArray)) {
$return='';
foreach($gAlbumItemArray as $gAlbumItemObj)
{
$gItemObj = $modx->getObject("galItem", array('id' => $gAlbumItemObj->get('item')) );
$pathToImage = '/assets/gallery/' . $gItemObj->get('filename');
//print_r($gItemObj->toArray()); die;
$params = array();
$params = array(
'id' => $gItemObj->get('id'),
'name' => $gItemObj->get('name'),
'filename' => '/assets/gallery/' . $gItemObj->get('filename'),
'description' => $gItemObj->get('description'),
);
if($toPlaceholder!='' AND $multiPlaceholder) {
$ph[] = $pdo->getChunk($tpl, $params);
}
$return .= $pdo->getChunk($tpl, $params);
}
if($toPlaceholder!='') {
if($multiPlaceholder) {
for($i=0; $i<count($ph); $i++)
{
$modx->setPlaceholder($toPlaceholder.'-'.$i, $ph[$i]);
}
}
$modx->setPlaceholder($toPlaceholder, $return);
} else {
return $return;
}
}
Вызывать его будем например так:
[[!getGalleryImages? &album=`[[*objectPhotos]]`&tpl=`tpl.list.hotelGalleryImages`&toPlaceholder=`objectImages`&multiPlaceholder=`1`]]
[[*hotelPhotos]] — это TV с id альбома Gallery (с тем новым типом TV, который мы создали по инструкции выше)
«objectImages» — это плейсхолдер, который мы получим после выполнения сниппета
multiPlaceholder — это параметр, который отвечает за то, будет ли наш указанный плейсхолдер разбит на части, так сказать. К примеру если нам надо получить помимо цельного плейсхолдера "objectImages" ещё и плейсхолдеры, которые будут хранить в себе изображения по отдельности, то указав этот параметр мы получим что-то вроде этого: первая картинка альбома: [[+objectImages-0]], вторая картинка альбома: [[+objectImages-1]], третья картинка альбома: [[+objectImages-2]] и т.д.
Комментарии: 2
Код же под кат надо прятать((
Спрятал.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.