Вывод фотографий в обратном порядке — различия между версиями
Velross (обсуждение | вклад) |
Vitaliks (обсуждение | вклад) |
||
(не показаны 4 промежуточные версии 3 участников) | |||
Строка 1: | Строка 1: | ||
− | + | '''Актуально для версии 20''' | |
− | 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 = | + | public function album($path = false, $template = 'default', $limit = false, $ignore_paging = false, $sort = 'asc') { |
</source> | </source> | ||
− | 2. | + | 2. Добавляем в макрос конструкцию switch case для вывода фотографий в соответствии с указанным способом сортировки: |
− | |||
<source lang="php"> | <source lang="php"> | ||
− | + | $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> | ||
− | + | ||
− | + | 3. В итоге код макроса в файле /classes/components/photoalbum/customMacros.php должен получиться такой: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<source lang="php"> | <source lang="php"> | ||
<?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); | ||
+ | } | ||
+ | } | ||
+ | |||
</source> | </source> | ||
− | Теперь в | + | Теперь в макросе album можно использовать пятый, необязательный параметр, устанавливая его в значение 'asc', 'desc' или 'rand'. |
− | |||
− | Вызов в TPL: %photoalbum | + | Вызов в 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="php"> | ||
+ | %photoalbum album('47',0,0,0,'desc')% | ||
+ | </source> | ||
− | + | [[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Написание кастомных макросов]][[Категория:Модуль Фотогалереи]] | |
− | [[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]] |
Текущая версия на 09:18, 28 августа 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')%