Вывод фотографий в обратном порядке

Материал из Umicms
Версия от 09:18, 28 августа 2019; Vitaliks (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Актуально для версии 20

Задача

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

Решение

Для реализации данной задачи необходимо переопределить макрос album из файла /classes/components/photoalbum/macros.php в файле /classes/components/photoalbum/customMacros.php добавив к нему возможность сортировки.

1. Добавим к макросу album параметр $sort = 'asc', которым сможет принимать значения 'asc' для сортировки по умолчанию, 'desc' для вывода в обратном порядке, 'rand' для вывода в случайном порядке.

В итоге первая строка определения функции будет такой:

public function album($path = false, $template = 'default', $limit = false, $ignore_paging = false, $sort = 'asc') {

2. Добавляем в макрос конструкцию switch case для вывода фотографий в соответствии с указанным способом сортировки:

$photos->types('hierarchy-type')->name('photoalbum', 'photo');
// Сортировка			
switch ($sort) {
	case 'asc':
		$photos->order('ord')->asc();
		break;
	case 'desc':
		$photos->order('ord')->desc();
		break;
	case 'rand':
		$$photos->order('rand');
		break;
}

3. В итоге код макроса в файле /classes/components/photoalbum/customMacros.php должен получиться такой:

<?php

	/** Класс пользовательских макросов */
	class PhotoAlbumCustomMacros {

		/** @var photoalbum $module */
		public $module;
		
		/**
		 * Возвращает фотографии заданного фотоальбома
		 * @param bool|int|string $path идентификатор или адрес фотоальбома
		 * @param string $template имя шаблона (для tpl)
		 * @param bool|int $limit ограничение на количество выводимых элементов
		 * @param bool $ignore_paging игнорировать пагинацию
		 * @return mixed
		 * @throws ErrorException
		 * @throws coreException
		 * @throws publicException
		 * @throws selectorException
		 */
		public function album($path = false, $template = 'default', $limit = false, $ignore_paging = false, $sort = 'asc') {
			$curr_page = (int) getRequest('p');
			$per_page = $limit ?: $this->module->per_page;

			$element_id = $this->module->analyzeRequiredPath($path);

			if ($element_id === false && $path != KEYWORD_GRAB_ALL) {
				throw new publicException(getLabel('error-page-does-not-exist', null, $path));
			}

			list($template_block, $template_block_empty, $template_line) = photoalbum::loadTemplates(
				'photoalbum/' . $template,
				'album_block',
				'album_block_empty',
				'album_block_line'
			);

			$photos = new selector('pages');
			$photos->types('hierarchy-type')->name('photoalbum', 'photo');
			// Сортировка			
			switch ($sort) {
				case 'asc':
					$photos->order('ord')->asc();
					break;
				case 'desc':
					$photos->order('ord')->desc();
					break;
				case 'rand':
					$$photos->order('rand');
					break;
			}

			if ($path != KEYWORD_GRAB_ALL) {
				$photos->where('hierarchy')->page($element_id);
			}

			$photos->option('load-all-props')->value(true);
			$this->module->setAlbumListLimit($photos, $curr_page, $per_page, $ignore_paging);
			$result = $photos->result();
			$total = $photos->length();

			$block_arr = [];
			$block_arr['id'] = $block_arr['void:album_id'] = $element_id;

			if ($total == 0) {
				return photoalbum::parseTemplate($template_block_empty, $block_arr, $element_id);
			}

			$lines = [];
			$umiLinksHelper = umiLinksHelper::getInstance();

			foreach ($result as $photo) {
				$line_arr = [];

				if (!$photo instanceof iUmiHierarchyElement) {
					continue;
				}

				$photo_element_id = $photo->getId();
				$line_arr['attribute:id'] = $photo_element_id;
				$line_arr['attribute:link'] = $umiLinksHelper->getLinkByParts($photo);
				$line_arr['xlink:href'] = 'upage://' . $photo_element_id;
				$line_arr['node:name'] = $photo->getName();

				photoalbum::pushEditable('photoalbum', 'photo', $photo_element_id);
				$lines[] = photoalbum::parseTemplate($template_line, $line_arr, $photo_element_id);
			}

			$block_arr['subnodes:items'] = $block_arr['void:lines'] = $lines;
			$block_arr['total'] = $total;
			$block_arr['per_page'] = $per_page;
			$block_arr['link'] = umiHierarchy::getInstance()->getPathById($element_id);
			return photoalbum::parseTemplate($template_block, $block_arr, $element_id);
		}
	}

Теперь в макросе album можно использовать пятый, необязательный параметр, устанавливая его в значение 'asc', 'desc' или 'rand'.

Вызов в PHP:

$albums = $this->macros('photoalbum', 'album', [$page->getId(),null,null,null,'desc']);

Вызов в XSLT:

<xsl:variable name="albums" select="document('udata://photoalbum/album/47////desc/')/udata" />

Вызов в TPL:

%photoalbum album('47',0,0,0,'desc')%