Делаем аналог postsByTag для блогов (вывод блогов по тегам)

Материал из Umicms
Перейти к:навигация, поиск

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

Для того,чтобы вывести список блогов содержащих в описании какой либо тег, добавим соответствующую проверку в макрос blogsList. Скопируем код макроса в файл ~/classes/modules/blogs20/__custom.php после строки //TODO: Write here your own macroses и изменим его, чтобы в качестве параметра он принимал тэг, блоги с которым нужно вывести.

<?php
public function blogsByTag($tag,$blogsCount = false, $domainId = false, $template = 'default') {
		list($sTemplateBlock, $sTemplateLine) = def_module::loadTemplates('blogs20/'.$template, 'blogs_list_block', 'blogs_list_line');

		$page = (int)getRequest('p');

		$sel = new umiSelection;
		$hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("blogs20", "blog")->getId();
		$sel->addElementType($hierarchy_type_id);
		$sel->addPermissions();
        $sel->addLimit($blogsCount,$page*$blogsCount);

        $typesCollection = umiObjectTypesCollection::getInstance();
		$typeId   = $typesCollection->getTypeByHierarchyTypeId($hierarchy_type_id);
		$postType = $typesCollection->getType($typeId);

		$sel->addPropertyFilterNotEqual($postType->getFieldId('only_for_friends'), 1);
		$sel->addPropertyFilterEqual($postType->getFieldId('tags'), $tag);

		$sel->setOrderByProperty($postType->getFieldId('publish_time'), false);

		$result = umiSelectionsParser::runSelection($sel);
		$total  = umiSelectionsParser::runSelectionCounts($sel);

		$oHierarchy = umiHierarchy::getInstance();
		$result = array_unique($result);
		$aLines = array();
		foreach($result as $iBlogId) {
			$oBlog      = $oHierarchy->getElement($iBlogId);
			$aLineParam = array();
			$aLineParam['attribute:bid']   = $iBlogId;
			$aLineParam['attribute:title'] = $oBlog->getValue('title');
			$aLineParam['attribute:link']  = $oHierarchy->getPathById($iBlogId);
			$aLineParam['node:name']       = $oBlog->getName();
			$aLines[] = def_module::parseTemplate($sTemplateLine, $aLineParam, $iBlogId);
			$this->pushEditable("blogs20", "blog", $iBlogId);
		}
		$aBlockParam = array();
		$aBlockParam['subnodes:items'] = $aBlockParam['void:lines'] = $aLines;
		$aBlockParam['per_page'] = $blogsCount;
		$aBlockParam['total']    = $total;
		return def_module::parseTemplate($sTemplateBlock, $aBlockParam);
	}
?>

Данный макрос принимает в качестве первого параметра тэг, по которому нужно искать блоги, второй параметр количество на странице, третьим параметром идёт id домена а четвёртым шаблон (по умолчанию tpls/blogs20/default.tpl)