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

Материал из Umicms
Перейти к:навигация, поиск
(Обновлено)
Строка 1: Строка 1:
'''Актуально для версии 2.9'''
+
'''Актуально для версии 20'''
  
Для того, чтобы макросом photoalbum album() фотографии выводились в обратном порядке немного изменим функцию album. Данная функция находится в системном классе (/classes/modules/photoalbum/class.php). Вам необходимо её скопировать в файл __custom.php, изменить название, например на photo_conversely и дополнить в соответствии с данной инструкцией. <br>
+
== Задача ==
1.Добавим параметр к функции album примерно вот такого вида $sort_photo = 1
+
 
 +
Выводить фотографии фотоальбома в обратном или случайном порядке.
 +
 
 +
== Решение ==
 +
 
 +
Для реализации данной задачи необходимо переопределить макрос album из файла /classes/components/photoalbum/macros.php в файле /classes/components/photoalbum/customMacros.php добавив к нему возможность сортировки.
 +
 
 +
1. Добавим к макросу album параметр $sort = 'asc', которым сможет принимать значения 'asc' для сортировки по умолчанию, 'desc' для вывода в обратном порядке, 'rand' для вывода в случайном порядке.
 +
 
 +
В итоге первая строка определения функции будет такой:
 
<source lang="php">
 
<source lang="php">
public function album($path = false, $template = "default", $sort_photo = 1, $limit = false, $ignore_paging = false) {
+
public function album($path = false, $template = 'default', $limit = false, $ignore_paging = false, $sort = 'asc') {
 
</source>
 
</source>
2. Заменяем везде слово self:: на $this->
+
2. Добавляем в макрос конструкцию switch case для вывода фотографий в соответствии с указанным способом сортировки:
3. Спускаемся в самый низ функции и перед кодом
 
 
<source lang="php">
 
<source lang="php">
return self::parseTemplate($template_block, $block_arr, $element_id); // Заменяем self:: на $this->
+
$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;
 +
}
 +
 
 
</source>
 
</source>
вставляем вот такой код
+
 
<source lang="php">
+
3. В итоге код макроса в файле /classes/components/photoalbum/customMacros.php должен получиться такой:
if (1 == $sort_photo){
 
$block_arr['void:lines'] = array_reverse($block_arr['void:lines']);
 
$block_arr['subnodes:items'] = $block_arr['void:lines'];
 
    }
 
</source>
 
Незабываем, что результат действий необходимо сохранить в файле __custom.php незабыв переименовать саму функцию из album в photo_conversely, и добавить права на выполнение макроса в permissions.custom.php:
 
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
$permissions = Array(
+
 
'albums' => Array('photo_conversely')
+
/** Класс пользовательских макросов */
);
+
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);
 +
}
 +
}
 +
 
 
</source>
 
</source>
  
Теперь в нашем кастомном макросе мы можем использовать третий, необязательный параметр, ставя его в значение 1 или 0.
+
Теперь в макросе album можно использовать пятый, необязательный параметр, устанавливая его в значение 'asc', 'desc' или 'rand'.
http://example.com/udata://photoalbum/photo_conversely/47/0/1
 
  
Вызов в TPL: %photoalbum photo_conversely('27','default',1)%
+
Вызов в PHP:
 +
<source lang="php">
 +
$albums = $this->macros('photoalbum', 'album', [$page->getId(),null,null,null,'desc']);
 +
</source>
 +
Вызов в XSLT:
 +
<source lang="xml">
 +
<xsl:variable name="albums" select="document('udata://photoalbum/album/47////desc/')/udata" />
 +
</source>
 +
Вызов в TPL:  
 +
<source lang="tpl">
 +
%photoalbum album('47',0,0,0,'desc')%
 +
</source>
  
Работа проверена на версии 2.8.6.1
 
 
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Написание кастомных макросов]][[Категория:Модуль Фотогалереи]]
 
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Написание кастомных макросов]][[Категория:Модуль Фотогалереи]]

Версия 10:11, 31 мая 2019

Актуально для версии 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')%