Сниппет вывода изображений из альбома компонента Gallery с разбивкой на ''мультиплейсхолдеры''

Для начала создадим новый тип TV вот по этой инструкции — community.modx-cms.ru/blog/tips_and_tricks/8733.html

Далее создаём сниппет, который будет выводить наши изображения из альбома заполненного в 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]] и т.д.
Пашок
01 ноября 2014, 09:11
modx.pro
1
3 551
+1

Комментарии: 2

Виктор
01 ноября 2014, 13:05
+1
Код же под кат надо прятать((
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2