Вывод всех тегов из определённого раздела сайта — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показаны 3 промежуточные версии 2 участников)
Строка 1: Строка 1:
'''Актуально для версии 2.9'''
+
'''Актуально для версии 20'''
  
 
По умолчанию можно вывести только все теги сайта. Если возникает ситуация, когда необходимо вывести теги только определённого раздела, можно прибегнуть к выборкам средствами API.
 
По умолчанию можно вывести только все теги сайта. Если возникает ситуация, когда необходимо вывести теги только определённого раздела, можно прибегнуть к выборкам средствами API.
  
Напишем простой кастомный макрос, который позволит нам осуществить вывод тегов указанного раздела. Для этого в файл /classes/modules/content/__custom.php в класс __custom_content поместим следующий метод:
+
Напишем простой кастомный макрос, который позволит нам осуществить вывод тегов указанного раздела. Для этого в файл /classes/components/content/customMacros.php поместим следующий метод:
 
<source lang="php">
 
<source lang="php">
public function getTags($id=0,$template = 'default',$dept=1) {
+
public function getTags($id = 0, $template = 'default', $dept = 1) {
        $array_res = array();
+
$array_res = array();
        list ($sTemplate, $array_res) = def_module::loadTemplates('/content/' . $template, 'tags');
+
list($items_template, $item_template) = def_module::loadTemplates('/content/' . $template, 'items', 'item');
$resArray=array();
+
$resArray = array();
        $select = new selector('pages');
+
$select = new selector('pages');
 
$select->where('hierarchy')->page($id)->childs($dept);
 
$select->where('hierarchy')->page($id)->childs($dept);
$resArray=$select->result();
+
$resArray = $select->result();
 
          
 
          
        $tags = array();
+
$tags = array();
 
+
foreach ($resArray as $key=>$value) {
foreach($resArray as $key=>$value){
 
 
         $hierarchy = umiHierarchy::getInstance();
 
         $hierarchy = umiHierarchy::getInstance();
 
         $page = $hierarchy->getElement($value->id);
 
         $page = $hierarchy->getElement($value->id);
         $t=$page->getValue('tags');
+
         $t = $page->getValue('tags');
 
+
if (count($t) != 0 && $t != NULL) {
if(count($t)!=0&&$t!=NULL){
+
$tags = array_merge($tags, $t);
            $tags = array_merge($tags, $t);
 
 
}   
 
}   
 
}
 
}
        $tags = array_unique($tags);
+
 +
$tags = array_unique($tags);
 +
foreach ($tags as $tag) {
 +
$item['attribute:value'] = $tag;
 +
$items[] = def_module::parseTemplate($item_template, $item);
 +
}
 +
$blockItems = array();
 +
$blockItems['subnodes:items'] = $items;
  
        foreach ($tags as $tag) {
+
return def_module::parseTemplate($items_template, $blockItems);
            $line_arr['node:text'] = $tag;
+
}
            $lines[] = $line_arr;
 
        }
 
        $array_res['subnodes:lines'] = $lines;
 
        return def_module::parseTemplate($sTemplate, $array_res);
 
    }
 
 
</source>
 
</source>
  
 
Метод получает все значения из поля tags и удаляет повторяющиеся значения, на выходе мы получаем xml c перечислением всех тегов раздела, который указан в качестве первого параметра (id раздела), в качестве третьего параметра указывается глубина выборки.
 
Метод получает все значения из поля tags и удаляет повторяющиеся значения, на выходе мы получаем xml c перечислением всех тегов раздела, который указан в качестве первого параметра (id раздела), в качестве третьего параметра указывается глубина выборки.
Чтобы метод работал для всех пользователей, необходимо его добавить в файл permissions.custom.php в массив content.
+
Чтобы метод работал для всех пользователей, необходимо его добавить в файл /classes/components/content/permissions.custom.php в массив content:
 +
 
 +
<source lang="php">
 +
<?php
 +
/** Группы прав на функционал модуля */
 +
$permissions = [
 +
/** Просмотр контента */
 +
'content' => [
 +
'getTags'
 +
]
 +
];
 +
</source>
 +
 
 
[[Категория:Написание кастомных макросов]]
 
[[Категория:Написание кастомных макросов]]

Текущая версия на 09:09, 30 апреля 2019

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

По умолчанию можно вывести только все теги сайта. Если возникает ситуация, когда необходимо вывести теги только определённого раздела, можно прибегнуть к выборкам средствами API.

Напишем простой кастомный макрос, который позволит нам осуществить вывод тегов указанного раздела. Для этого в файл /classes/components/content/customMacros.php поместим следующий метод:

public function getTags($id = 0, $template = 'default', $dept = 1) {
	$array_res = array();
	list($items_template, $item_template) = def_module::loadTemplates('/content/' . $template, 'items', 'item');
	$resArray = array();
	$select = new selector('pages');
	$select->where('hierarchy')->page($id)->childs($dept);
	$resArray = $select->result();
        
	$tags = array();
	foreach ($resArray as $key=>$value) {
        $hierarchy = umiHierarchy::getInstance();
        $page = $hierarchy->getElement($value->id);
        $t = $page->getValue('tags');
		if (count($t) != 0 && $t != NULL) {
			$tags = array_merge($tags, $t);
		}  
	}
	
	$tags = array_unique($tags);
	foreach ($tags as $tag) {
		$item['attribute:value'] = $tag;
		$items[] = def_module::parseTemplate($item_template, $item);
	}
	$blockItems = array();
	$blockItems['subnodes:items'] = $items;

	return def_module::parseTemplate($items_template, $blockItems);
}

Метод получает все значения из поля tags и удаляет повторяющиеся значения, на выходе мы получаем xml c перечислением всех тегов раздела, который указан в качестве первого параметра (id раздела), в качестве третьего параметра указывается глубина выборки. Чтобы метод работал для всех пользователей, необходимо его добавить в файл /classes/components/content/permissions.custom.php в массив content:

<?php
	/** Группы прав на функционал модуля */
	$permissions = [
		/** Просмотр контента */
		'content' => [
			'getTags'
		]
	];