Вывод количества фотографий и фотоальбомов — различия между версиями
Материал из Umicms
Ver (обсуждение | вклад)  | 
				Stexe (обсуждение | вклад)   | 
				||
| (не показано 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 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;  | ||
| + | |||
| + | }  | ||
| + | </source>  | ||
| − | + | <ul>  | |
| − | + | <li>Макрос '''getPhotosInAlbumCount()''' в качестве параметра принимает единственный параметр ''$parentId'' - id родительского фотоальбома, и возвращает количество фотографий в нем на всей глубине вложенности.</li>  | |
| − | + | <li>Макрос '''getSubAlbumsCount()''' в качестве параметра принимает единственный параметр ''$parentId'' - id родительского фотоальбома, и возвращает количество альбомов в нем.</li>  | |
| − | + | </ul>  | |
| − | + | <h2>TPL-шаблонизатор</h2>  | |
| − | + | Примеры вызовов:  | |
| + | <source lang="html4strict">  | ||
| + | %custom getPhotosInAlbumCount(%pid%)%  | ||
| + | %custom getPhotosInAlbumCount('22')%  | ||
| + | %custom getSubAlbumsCount(%pid%)%  | ||
| + | %custom getSubAlbumsCount('22')%  | ||
</source>  | </source>  | ||
| − | + | <h2>XSLT-шаблонизатор</h2>  | |
| + | Примеры вызовов:  | ||
| − | + | <source lang="xml">  | |
| − | + | <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"/>  | ||
| + | </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"/>