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

Материал из Umicms
Перейти к:навигация, поиск
 
(не показано 5 промежуточных версий 2 участников)
Строка 1: Строка 1:
== Задача ==
+
[[Категория:Верстка в TPL]][[Категория: Верстка в XSLT]][[Категория: Модуль Фотогалереи]][[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Написание кастомных макросов]]
Необходимо в описании раздела вывести общее количество фотографий во всех его подразделах.
+
'''Актуально для версии 2.9.6'''<br/><br/>
 
+
'''Задача:''' Вывести количество фотографий в фотоальбоме на всей глубине вложенности и количество дочерних альбомов в фотоальбоме.<br/><br/>
== Решение ==
+
'''Реализация:'''
Воспользуемся кастомным макросом:
 
  
 +
В файл \classes\modules\custom.php добавим код макросов '''getPhotosInAlbumCount()''' и '''getSubAlbumsCount()''', а также вспомогательного метода '''getPagesCount()'''.
 
<source lang="php">
 
<source lang="php">
public function phtShowPhotoCountTotal($pid = 0) {
+
public function getPhotosInAlbumCount ($parentId) {
if(!$pid) {
+
$maxDepth = 99;
return false;
+
return self::getPagesCount($parentId, 'photoalbum-photo', $maxDepth);
}
+
}
  
// Получаем id типа данных "Фотография"
+
public function getSubAlbumsCount ($parentId) {
$hierarchyTypes = umiHierarchyTypesCollection::getInstance();
+
return self::getPagesCount($parentId, 'photoalbum-album', 1);
$hierarchyTypeId = $objectTypes->getTypeByName('photoalbum', 'photo')->getId();
+
}
  
// Считаем количество дочерних объектов типа "Фотография"
+
protected function getPagesCount($parentId, $hierarchyTypeModuleMethod, $depth) {
// Скрытые и неактивные не считаем
+
if ( !$parentId ) {
$hierarchy = umiHierarchy::getInstance();
+
$parentId = getRequest('param0');
$childsCount = $hierarchy->getChildsCount($pid, false, false, 0, $hierarchyTypeId);
+
}
 +
if ( !$depth || !is_numeric($depth) ) {
 +
$depth = 0;
 +
}
 +
list($typeModule, $typeMethod) = explode('-', $hierarchyTypeModuleMethod);
 +
$hierarchyTypesColl = umiHierarchyTypesCollection::getInstance();
 +
$hierarchyType = $hierarchyTypesColl->getTypeByName($typeModule, $typeMethod);
 +
 +
if ( $hierarchyType instanceof iumiHierarchyType ) {
 +
$hierarchyTypeId = $hierarchyType->getId();
 +
$hierarchy = umiHierarchy::getInstance();
 +
$onlyActive = false;
 +
$withUnVisible = true;
 +
$childsCount = $hierarchy->getChildsCount($parentId, $onlyActive, $withUnVisible, $depth, $hierarchyTypeId);
 +
return intval( $childsCount );
 +
}
 +
return 0;
 +
 +
}
 +
</source>
  
if($childsCount){
+
<ul>
return $childsCount;
+
<li>Макрос '''getPhotosInAlbumCount()''' в качестве параметра принимает единственный параметр ''$parentId'' - id родительского фотоальбома, и возвращает количество фотографий в нем на всей глубине вложенности.</li>
} else {
+
<li>Макрос '''getSubAlbumsCount()''' в качестве параметра принимает единственный параметр ''$parentId'' - id родительского фотоальбома, и возвращает количество альбомов в нем.</li>
return false;
+
</ul>
}
+
<h2>TPL-шаблонизатор</h2>
}
+
Примеры вызовов:
 +
<source lang="html4strict">
 +
%custom getPhotosInAlbumCount(%pid%)%
 +
%custom getPhotosInAlbumCount('22')%
 +
%custom getSubAlbumsCount(%pid%)%
 +
%custom getSubAlbumsCount('22')%
 
</source>
 
</source>
  
Далее, в шаблон Фотогалереи добавим в нужное место строчку:
+
<h2>XSLT-шаблонизатор</h2>
 +
Примеры вызовов:
  
%custom phtShowPhotoCountTotal(%pid%)%
+
<source lang="xml">
 
+
<xsl:value-of select="document(concat('udata://custom/getPhotosInAlbumCount/', page/@id))/udata"/>
[[Категория:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:Написание кастомных макросов]]
+
<xsl:value-of select="document(concat('udata://custom/getPhotosInAlbumCount/', '22'))/udata"/>
 +
<xsl:value-of select="document(concat('udata://custom/getSubAlbumsCount/', page/@id))/udata"/>
 +
<xsl:value-of select="document(concat('udata://custom/getSubAlbumsCount/', '22'))/udata"/>
 +
</source>

Текущая версия на 08:49, 28 апреля 2014

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

Задача: Вывести количество фотографий в фотоальбоме на всей глубине вложенности и количество дочерних альбомов в фотоальбоме.

Реализация:

В файл \classes\modules\custom.php добавим код макросов getPhotosInAlbumCount() и getSubAlbumsCount(), а также вспомогательного метода getPagesCount().

public function getPhotosInAlbumCount ($parentId) {
	$maxDepth = 99;
	return self::getPagesCount($parentId, 'photoalbum-photo', $maxDepth);
}

public function getSubAlbumsCount ($parentId) {
	return self::getPagesCount($parentId, 'photoalbum-album', 1);
}

protected function getPagesCount($parentId, $hierarchyTypeModuleMethod, $depth) {
	if ( !$parentId ) {
		$parentId = getRequest('param0');
	}
	if ( !$depth || !is_numeric($depth) ) {
		$depth = 0;
	}
	list($typeModule, $typeMethod) = explode('-', $hierarchyTypeModuleMethod);
	$hierarchyTypesColl = umiHierarchyTypesCollection::getInstance();
	$hierarchyType = $hierarchyTypesColl->getTypeByName($typeModule, $typeMethod);
	
	if ( $hierarchyType instanceof iumiHierarchyType ) {
		$hierarchyTypeId = $hierarchyType->getId();
		$hierarchy = umiHierarchy::getInstance();
		$onlyActive = false;
		$withUnVisible = true;
		$childsCount = $hierarchy->getChildsCount($parentId, $onlyActive, $withUnVisible, $depth, $hierarchyTypeId);
		return intval( $childsCount );
	}
	return 0;
	
}
  • Макрос getPhotosInAlbumCount() в качестве параметра принимает единственный параметр $parentId - id родительского фотоальбома, и возвращает количество фотографий в нем на всей глубине вложенности.
  • Макрос getSubAlbumsCount() в качестве параметра принимает единственный параметр $parentId - id родительского фотоальбома, и возвращает количество альбомов в нем.

TPL-шаблонизатор

Примеры вызовов:

%custom getPhotosInAlbumCount(%pid%)%
%custom getPhotosInAlbumCount('22')%
%custom getSubAlbumsCount(%pid%)%
%custom getSubAlbumsCount('22')%

XSLT-шаблонизатор

Примеры вызовов:

<xsl:value-of select="document(concat('udata://custom/getPhotosInAlbumCount/', page/@id))/udata"/>
<xsl:value-of select="document(concat('udata://custom/getPhotosInAlbumCount/', '22'))/udata"/>
<xsl:value-of select="document(concat('udata://custom/getSubAlbumsCount/', page/@id))/udata"/>
<xsl:value-of select="document(concat('udata://custom/getSubAlbumsCount/', '22'))/udata"/>