<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.umisoft.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9A%D0%B0%D0%BA_%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D0%BC%D0%B5%D0%BD%D1%8E_%D0%BF%D0%BE_%D0%BA%D0%BE%D0%BD%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%BC%D1%83_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%82%D0%B8%D0%BF%D1%83</id>
	<title>Как вывести меню по конкретному иерархическому типу - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.umisoft.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9A%D0%B0%D0%BA_%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D0%BC%D0%B5%D0%BD%D1%8E_%D0%BF%D0%BE_%D0%BA%D0%BE%D0%BD%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%BC%D1%83_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%82%D0%B8%D0%BF%D1%83"/>
	<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D0%BC%D0%B5%D0%BD%D1%8E_%D0%BF%D0%BE_%D0%BA%D0%BE%D0%BD%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%BC%D1%83_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%82%D0%B8%D0%BF%D1%83&amp;action=history"/>
	<updated>2026-05-18T11:34:28Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D0%BC%D0%B5%D0%BD%D1%8E_%D0%BF%D0%BE_%D0%BA%D0%BE%D0%BD%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%BC%D1%83_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%82%D0%B8%D0%BF%D1%83&amp;diff=6764&amp;oldid=prev</id>
		<title>Mad grant: Новая страница: «&#039;&#039;&#039;Актуально для версии 2.9.5&#039;&#039;&#039;  == Задача ==  Если Вы столкнулись с данной задачей, то решить её …»</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8_%D0%BC%D0%B5%D0%BD%D1%8E_%D0%BF%D0%BE_%D0%BA%D0%BE%D0%BD%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%BC%D1%83_%D0%B8%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%82%D0%B8%D0%BF%D1%83&amp;diff=6764&amp;oldid=prev"/>
		<updated>2014-02-14T15:09:35Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «&amp;#039;&amp;#039;&amp;#039;Актуально для версии 2.9.5&amp;#039;&amp;#039;&amp;#039;  == Задача ==  Если Вы столкнулись с данной задачей, то решить её …»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 2.9.5&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Задача ==&lt;br /&gt;
&lt;br /&gt;
Если Вы столкнулись с данной задачей, то решить её стандартными средствами нельзя. Необходимо написать кастомный макрос, на основе content menu и его служебных методов.&lt;br /&gt;
&lt;br /&gt;
== Решение ==&lt;br /&gt;
&lt;br /&gt;
%custom custom_menu()% — выводит меню&lt;br /&gt;
&lt;br /&gt;
Все параметры в нем идентичны параметрам content menu, только добавляется параметр $h_type_id&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;$h_type_id&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   Идентификатор иерархического типа, страницы которого будут выведены в меню. Список иерархических типов можно посмотреть настройках модуля &amp;quot;Шаблоны данных&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для применения этого макроса скопируйте код макроса в файл /classes/modules/content/__custom.php, также не забудьте добавить пермишены.&lt;br /&gt;
&lt;br /&gt;
== Код макроса ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		public function custom_menu($menu_tpl = &amp;quot;default&amp;quot;, $max_depth = 1, $pid = false, $h_type_id = false) {&lt;br /&gt;
			$cmsController = cmsController::getInstance();&lt;br /&gt;
			$hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
			&lt;br /&gt;
			if($pid) {&lt;br /&gt;
				if(!is_numeric($pid)) {&lt;br /&gt;
					$pid = $hierarchy-&amp;gt;getIdByPath($pid);&lt;br /&gt;
				}&lt;br /&gt;
				$parent_alt = $hierarchy-&amp;gt;getPathById($pid, false, true, false, true);&lt;br /&gt;
			} else {&lt;br /&gt;
				$pid = 0;&lt;br /&gt;
				$parent_alt = $cmsController-&amp;gt;pre_lang .&amp;quot;/&amp;quot;. $cmsController-&amp;gt;getUrlPrefix();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if($parent_alt) {&lt;br /&gt;
				$parent_alt = rtrim($parent_alt, &amp;#039;/&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			$h_type_id = preg_replace(&amp;#039;/\s/&amp;#039;, &amp;#039;&amp;#039;, $h_type_id);	&lt;br /&gt;
&lt;br /&gt;
			$templates = def_module::loadTemplates(&amp;quot;content/menu/&amp;quot; . $menu_tpl);&lt;br /&gt;
			&lt;br /&gt;
			return content::build_cat_menu($pid, $templates, 0, $parent_alt, $max_depth, $h_type_id);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function getCatMenuTemplates($templates, $curr_depth) {&lt;br /&gt;
			$suffix = &amp;quot;_level&amp;quot; . $curr_depth;&lt;br /&gt;
&lt;br /&gt;
			$block = getArrayKey($templates, &amp;quot;menu_block&amp;quot; . $suffix);&lt;br /&gt;
			$line = getArrayKey($templates, &amp;quot;menu_line&amp;quot; . $suffix);&lt;br /&gt;
			$line_a = (array_key_exists(&amp;quot;menu_line&amp;quot; . $suffix . &amp;quot;_a&amp;quot;, $templates)) ? $templates[&amp;quot;menu_line&amp;quot; . $suffix . &amp;quot;_a&amp;quot;] : $line;&lt;br /&gt;
			$line_in = (array_key_exists(&amp;quot;menu_line&amp;quot; . $suffix . &amp;quot;_in&amp;quot;, $templates)) ? $templates[&amp;quot;menu_line&amp;quot; . $suffix . &amp;quot;_in&amp;quot;] : $line;&lt;br /&gt;
&lt;br /&gt;
			$class = getArrayKey($templates, &amp;quot;menu_class&amp;quot; . $suffix . &amp;quot;&amp;quot;);&lt;br /&gt;
			$class_last = getArrayKey($templates, &amp;quot;menu_class&amp;quot; . $suffix . &amp;quot;_last&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			if(!$block) {&lt;br /&gt;
				switch($curr_depth) {&lt;br /&gt;
					case 1: $suffix = &amp;quot;_fl&amp;quot;; break;&lt;br /&gt;
					case 2: $suffix = &amp;quot;_sl&amp;quot;; break;&lt;br /&gt;
				}&lt;br /&gt;
				$block = getArrayKey($templates, &amp;#039;menu_block&amp;#039; . $suffix);&lt;br /&gt;
				$line = getArrayKey($templates, &amp;#039;menu_line&amp;#039; . $suffix);&lt;br /&gt;
				$line_a = (array_key_exists(&amp;quot;menu_line&amp;quot; . $suffix . &amp;quot;_a&amp;quot;, $templates)) ? $templates[&amp;quot;menu_line&amp;quot; . $suffix . &amp;quot;_a&amp;quot;] : $line;&lt;br /&gt;
				$line_in = (array_key_exists(&amp;quot;menu_line&amp;quot; . $suffix . &amp;quot;_in&amp;quot;, $templates)) ? $templates[&amp;quot;menu_line&amp;quot; . $suffix . &amp;quot;_in&amp;quot;] : $line;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(!($separator = getArrayKey($templates, &amp;#039;separator&amp;#039; . $suffix))) {&lt;br /&gt;
				$separator = getArrayKey($templates, &amp;#039;separator&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(!($separator_last = getArrayKey($templates, &amp;#039;separator_last&amp;#039; . $suffix))) {&lt;br /&gt;
				$separator_last = getArrayKey($templates, &amp;#039;separator_last&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			return array($block, $line, $line_a, $line_in, $separator, $separator_last, $class, $class_last);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		public function build_cat_menu($page_id, &amp;amp;$templates, $curr_depth = 0, $parent_alt_name = &amp;quot;/&amp;quot;, $max_depth = 1, $h_type_id = false) {&lt;br /&gt;
			&lt;br /&gt;
			static $childsCache = array();&lt;br /&gt;
&lt;br /&gt;
			$hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
			$cmsController = cmsController::getInstance();&lt;br /&gt;
			$config = mainConfiguration::getInstance();&lt;br /&gt;
			&lt;br /&gt;
			list(&lt;br /&gt;
				$template_block, $template_line, $template_line_a, $template_line_in, $separator, $separator_last, $class, $class_last&lt;br /&gt;
			) = content::getCatMenuTemplates($templates, ($curr_depth + 1));&lt;br /&gt;
			&lt;br /&gt;
			if(isset($childsCache[$page_id])) {&lt;br /&gt;
				$result = $childsCache[$page_id];&lt;br /&gt;
			} else {&lt;br /&gt;
				$allow_visible = false;&lt;br /&gt;
				$langId = false;&lt;br /&gt;
				if($page_id) {&lt;br /&gt;
					$parentElement = $hierarchy-&amp;gt;getElement($page_id);&lt;br /&gt;
					if (! ($parentElement instanceOf umiHierarchyElement)) {&lt;br /&gt;
						return false;&lt;br /&gt;
					}&lt;br /&gt;
					$langId = $parentElement-&amp;gt;getLangId();&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
				$h_type_id = intval($h_type_id);&lt;br /&gt;
				$childs = $hierarchy-&amp;gt;getChilds($page_id, false, $allow_visible, 1, $h_type_id, false, $langId);&lt;br /&gt;
				if($childs === false) $childs = array();&lt;br /&gt;
				$result = array_keys($childs);&lt;br /&gt;
&lt;br /&gt;
				$childsCache[$page_id] = $result;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$sz = sizeof($result);&lt;br /&gt;
			if($sz == 0) {&lt;br /&gt;
				return &amp;quot;&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$lines = array();&lt;br /&gt;
			$arr_lines = array();&lt;br /&gt;
			$c = 0;&lt;br /&gt;
&lt;br /&gt;
			$currentElementId = $cmsController-&amp;gt;getCurrentElementId();&lt;br /&gt;
			$allParents = $hierarchy-&amp;gt;getAllParents($currentElementId, true);&lt;br /&gt;
&lt;br /&gt;
			foreach($result as $element_id) {&lt;br /&gt;
&lt;br /&gt;
				$element = $hierarchy-&amp;gt;getElement($element_id);&lt;br /&gt;
				if (!$element) continue;&lt;br /&gt;
				$text = $element-&amp;gt;getName();&lt;br /&gt;
&lt;br /&gt;
				$link = $rawLink = $parent_alt_name . &amp;#039;/&amp;#039; . $element-&amp;gt;getAltName();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				if ($config-&amp;gt;get(&amp;#039;seo&amp;#039;, &amp;#039;url-suffix.add&amp;#039;)) {&lt;br /&gt;
					$link .= $config-&amp;gt;get(&amp;#039;seo&amp;#039;, &amp;#039;url-suffix&amp;#039;);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if($template_line_in &amp;amp;&amp;amp; $template_line_in != $template_line) {&lt;br /&gt;
					if ($max_depth &amp;gt; 1 &amp;amp;&amp;amp; content::isInPath($element_id, $templates, ($curr_depth + 1), $link, $max_depth - 1)) {&lt;br /&gt;
						$is_active = true;&lt;br /&gt;
						$line = $template_line_in;&lt;br /&gt;
					} else {&lt;br /&gt;
						$is_active = (in_array($element_id, $allParents) !== false);&lt;br /&gt;
						$line = ($is_active) ? $template_line_a : $template_line;&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					$is_active = (in_array($element_id, $allParents) !== false);&lt;br /&gt;
					$line = ($is_active) ? $template_line_a : $template_line;&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
&lt;br /&gt;
				$sub_menu = &amp;#039;&amp;#039;;&lt;br /&gt;
				if(strstr($line, &amp;quot;%sub_menu%&amp;quot;) &amp;amp;&amp;amp; $max_depth &amp;gt; 1) {&lt;br /&gt;
					if($element-&amp;gt;getValue(&amp;quot;show_submenu&amp;quot;) &amp;amp;&amp;amp; ($is_active || $element-&amp;gt;getValue(&amp;quot;is_expanded&amp;quot;))) {&lt;br /&gt;
						$sub_menu = content::build_cat_menu($element_id, $templates, ($curr_depth + 1), $rawLink, $max_depth - 1, $h_type_id);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if($element-&amp;gt;getIsDefault()) {&lt;br /&gt;
					$link = $element-&amp;gt;link;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				$item_arr = array();&lt;br /&gt;
				$item_arr[&amp;#039;@id&amp;#039;] = $element_id;&lt;br /&gt;
				$item_arr[&amp;#039;@link&amp;#039;] = $link;&lt;br /&gt;
				$item_arr[&amp;#039;@name&amp;#039;] = $text;&lt;br /&gt;
				$item_arr[&amp;#039;@alt-name&amp;#039;] = $element-&amp;gt;getAltName();&lt;br /&gt;
				$item_arr[&amp;#039;xlink:href&amp;#039;] = &amp;quot;upage://&amp;quot; . $element_id;&lt;br /&gt;
&lt;br /&gt;
				if (def_module::isXSLTResultMode()) {&lt;br /&gt;
					if($max_depth &amp;gt; 1 &amp;amp;&amp;amp; XSLT_NESTED_MENU &amp;amp;&amp;amp; $element-&amp;gt;getValue(&amp;quot;show_submenu&amp;quot;) &amp;amp;&amp;amp; ($is_active || $element-&amp;gt;getValue(&amp;quot;is_expanded&amp;quot;))) {&lt;br /&gt;
					$xslt_submenu = content::build_cat_menu($element_id, $templates, ($curr_depth + 1), $rawLink, $max_depth - 1, $h_type_id);&lt;br /&gt;
						if(is_array($xslt_submenu) &amp;amp;&amp;amp; isset($xslt_submenu[&amp;#039;items&amp;#039;], $xslt_submenu[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;]) &amp;amp;&amp;amp; sizeof($xslt_submenu[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;])) {&lt;br /&gt;
							$item_arr[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;] = $xslt_submenu[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;];&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if(XSLT_NESTED_MENU != 2) {&lt;br /&gt;
					$item_arr[&amp;#039;node:text&amp;#039;] = $text;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				$item_arr[&amp;#039;void:num&amp;#039;] = ($c+1);&lt;br /&gt;
				$item_arr[&amp;#039;void:sub_menu&amp;#039;] = $sub_menu;&lt;br /&gt;
				$item_arr[&amp;#039;void:separator&amp;#039;] = (($sz == ($c + 1)) &amp;amp;&amp;amp; $separator_last) ? $separator_last : $separator;&lt;br /&gt;
&lt;br /&gt;
				if($is_active) {&lt;br /&gt;
					$item_arr[&amp;#039;attribute:status&amp;#039;] = &amp;quot;active&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				$item_arr[&amp;#039;class&amp;#039;] = ($sz &amp;gt; ($c + 1)) ? $class : $class_last;&lt;br /&gt;
&lt;br /&gt;
				$arr_lines[] = def_module::parseTemplate($line, $item_arr, $element_id);&lt;br /&gt;
&lt;br /&gt;
				$c++;&lt;br /&gt;
				$hierarchy-&amp;gt;unloadElement($element_id);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$block_arr = array(&lt;br /&gt;
				&amp;#039;subnodes:items&amp;#039;	=&amp;gt; $arr_lines,&lt;br /&gt;
				&amp;#039;void:lines&amp;#039;		=&amp;gt; $arr_lines,&lt;br /&gt;
				&amp;#039;id&amp;#039;				=&amp;gt; $page_id&lt;br /&gt;
			);&lt;br /&gt;
			return def_module::parseTemplate($template_block, $block_arr, $page_id);&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:Вопросы и уроки разработки сайтов на UMI.CMS]][[Категория:API]]&lt;/div&gt;</summary>
		<author><name>Mad grant</name></author>
		
	</entry>
</feed>