Как вывести фотографии из нескольких альбомов с возможностью сортировки по дате создания — различия между версиями
Материал из Umicms
Mad grant (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
Строка 88: | Строка 88: | ||
return def_module::parseTemplate($items_template, $items); | return def_module::parseTemplate($items_template, $items); | ||
} | } | ||
− | <source> | + | </source> |
Также, не забудь создать по пути /classes/modules/photoalbum/ файл permissions.custom.php со следующим содержанием: | Также, не забудь создать по пути /classes/modules/photoalbum/ файл permissions.custom.php со следующим содержанием: | ||
Строка 98: | Строка 98: | ||
); | ); | ||
?> | ?> | ||
− | <source> | + | </source> |
[[category:Модуль Фотогалереи]][[category:Написание кастомных макросов]][[Категория:API]] | [[category:Модуль Фотогалереи]][[category:Написание кастомных макросов]][[Категория:API]] |
Версия 13:06, 17 февраля 2014
Актуально для версии 2.9.5
Задача
Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя. Необходимо написать кастомный макрос, пример оного дан ниже.
Решение
%photoalbum getMultiAlbums()% - выводит фотографии из указанных альбомов
Параметры: photoalbum getMultiAlbums([$template = 'default', $albums_ids, $i_need_sort = false, $i_need_deep = 1, $per_page = 10, $ignore_paging = false])
$template
Принимает имя шаблона, по которому выводится результат макроса. В XSLT-шаблонизаторе не используется. По-умолчанию равен 'default', шаблон необходимо поместить в директорию /tpls/photalbum/.
$albums_ids
Принимает id фотоальбома, из которого нужно вывести фотографии. Можно указать несколько идентификаторов через точку с запятой. Если параметр не указан, то берется id текущей страницы, макрос нельзя вызывать через HTTP SCHEME MODE без указания этого параметра.
$i_need_sort
Включает сортировку по дате создания фотографии (create_time). Если сортировка включена, то в результат попадут только фотографии с заполненным полем. По-умолчанию сортировка отключена.
$i_need_deep
Глубина поиска объектов списка (во вложенных подразделах). По умолчанию — только в текущем разделе.
$per_page
Принимает число, которое обозначает максимальное количество выводимых фотографий на страницу. По-умолчанию равен 10.
$ignore_paging
Включает игнорирование постраничной навигации, то есть параметра 'p'. По-умолчанию отключен.
Для применения этого макроса скопируйте содержимое листинга макроса в файл /classes/modules/photoalbum/__custom.php.
Листинг макроса
public function getMultiAlbums($template = 'default', $albums_ids, $i_need_sort = false, $i_need_deep = 1, $per_page = 10, $ignore_paging = false){
if(intval($i_need_deep) == 0){
$i_need_deep = 1;
}
$page_num = (int) getRequest('p');
list($items_template, $item_template, $empty) = def_module::loadTemplates('photalbum/'.$template, 'items', 'item', 'empty');
$current_page_id = cmsController::getInstance()->getCurrentElementId();
$hierarchy = umiHierarchy::getInstance();
if($albums_ids == false){
if($current_page_id == false && defined('VIA_HTTP_SCHEME')){
throw new publicException('cant get current element via HTTP SCHEME MODE');
}
$albums_ids = $current_page_id;
}
$albums_ids = explode(';', $albums_ids);
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('photoalbum', 'photo');
foreach($albums_ids as $album_id){
if($hierarchy->getElement($album_id) !== false)
$pages->where('hierarchy')->page($album_id)->childs(intval($i_need_deep));
}
if($i_need_sort != false){
$pages->where('create_time')->isnotnull();
}
$total = $pages->length();
if($total == 0){
return def_module::parseTemplate($empty);
}
$photo_pages = $pages->result();
if($i_need_sort != false){
usort($photo_pages, function($a, $b){
$a_publishTime = $a->getValue('create_time');
$b_publishTime = $b->getValue('create_time');
if ($a_publishTime == $b_publishTime) {
return 0;
}
return ($a_publishTime > $b_publishTime) ? -1 : 1;
});
}
if($ignore_paging == false){
$offset = $page_num * intval($per_page);
$photo_pages = array_slice($photo_pages, $offset, intval($per_page));
}
$item = array();
$items = array();
foreach($photo_pages as $photo_page){
$item['attribute:id'] = $photo_page->id;
$item['attribute:link'] = $photo_page->link;
$item['attribute:name'] = $photo_page->getName();
$item['attribute:create_time'] = $photo_page->getValue('create_time');
$items[] = def_module::parseTemplate($item_template, $item);
}
$items = array('subnodes:items' => $items);
$items['total'] = $total;
$items['page_number'] = $page_num;
$items['per_page'] = $per_page;
return def_module::parseTemplate($items_template, $items);
}
Также, не забудь создать по пути /classes/modules/photoalbum/ файл permissions.custom.php со следующим содержанием:
<?php
$permissions = array(
'albums' => array('onCreatePhotoAdmin', 'getMultiAlbums'),
);
?>