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

Материал из Umicms
Перейти к:навигация, поиск
Строка 7: Строка 7:
 
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');
Строка 27: Строка 27:
  
 
         foreach ($tags as $tag) {
 
         foreach ($tags as $tag) {
             $line_arr['node:text'] = $tag;
+
             $item['attribute:value'] = $tag;
            $lines[] = $line_arr;
+
    $items[] = def_module::parseTemplate($item_template, $item);
 
         }
 
         }
         $array_res['subnodes:lines'] = $lines;
+
         $blockItems = array();
        return def_module::parseTemplate($sTemplate, $array_res);
+
$blockItems['subnodes:items'] = $items;
 +
 
 +
return def_module::parseTemplate($items_template, $blockItems);
 
     }
 
     }
 
</source>
 
</source>

Версия 13:36, 8 октября 2014

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

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

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

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 раздела), в качестве третьего параметра указывается глубина выборки. Чтобы метод работал для всех пользователей, необходимо его добавить в файл permissions.custom.php в массив content.