<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.umisoft.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lesnik512</id>
	<title>Umicms - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.umisoft.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lesnik512"/>
	<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Lesnik512"/>
	<updated>2026-04-15T02:59:36Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2&amp;diff=8481</id>
		<title>Уменьшение вложенности товаров</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2&amp;diff=8481"/>
		<updated>2018-06-29T14:57:26Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: internal link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Часто для улучшения ранжирования в поисковых системах нужно уменьшать вложенность страниц. Например переместить товары на второй уровень, при этом сохранив структуру каталога.&lt;br /&gt;
&lt;br /&gt;
Изначально для данной задачи использовал [http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/formirovanie_dannyh_na_servere_protokol_umap/ протокол Umap], но решение было не очень гибкое.&lt;br /&gt;
&lt;br /&gt;
Недавно нашел более удачное решение, которое и привожу.&lt;br /&gt;
&lt;br /&gt;
Для начала нужно перехватывать событие systemPrepare, которое вызывается уже после анализа URL и до генерации глобальных переменных.&lt;br /&gt;
&lt;br /&gt;
Перехват события (файл events.php в папке classes/modules/catalog в директории шаблона, или custom_events.php в системной папке модуля):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
new umiEventListener(&amp;#039;systemPrepare&amp;#039;, &amp;#039;catalog&amp;#039;, &amp;#039;short_links&amp;#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Права на доступ к макросу (permissions.php или permissions_custom.php):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$permissions = array(&lt;br /&gt;
    &amp;#039;view&amp;#039; =&amp;gt; array(&amp;#039;short_links&amp;#039;)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сама функция с комментариями:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// импортируем Service в самом начале файла&lt;br /&gt;
use UmiCms\Service;&lt;br /&gt;
//...&lt;br /&gt;
public function short_links(iUmiEventPoint $oEventPoint) {&lt;br /&gt;
    if ($oEventPoint-&amp;gt;getMode() === &amp;quot;before&amp;quot;) {&lt;br /&gt;
        // парсим url в массив&lt;br /&gt;
        $path_parts = Service::Request()-&amp;gt;getPathParts();&lt;br /&gt;
&lt;br /&gt;
        // у нас ссылки вида /product/{$alt-name}/&lt;br /&gt;
        // и соответственно здесь проверяется, соответствует ли ссылка данному шаблону&lt;br /&gt;
        @list($part1, $alt_name, $part3) = $path_parts;&lt;br /&gt;
        if ($part3 or $part1 !== &amp;#039;product&amp;#039; or !$alt_name)&lt;br /&gt;
            return true;&lt;br /&gt;
&lt;br /&gt;
        // ищем объект каталога по alt-name&lt;br /&gt;
        $pages = new selector(&amp;#039;pages&amp;#039;);&lt;br /&gt;
        $pages-&amp;gt;types(&amp;#039;hierarchy-type&amp;#039;)-&amp;gt;name(&amp;#039;catalog&amp;#039;, &amp;#039;object&amp;#039;);&lt;br /&gt;
        $pages-&amp;gt;option(&amp;#039;return&amp;#039;)-&amp;gt;value(&amp;#039;id&amp;#039;);&lt;br /&gt;
        $pages-&amp;gt;where(&amp;#039;alt_name&amp;#039;)-&amp;gt;equals($alt_name);&lt;br /&gt;
        $page_id = $pages-&amp;gt;first();&lt;br /&gt;
        $page_id = $page_id ? @$page_id[&amp;#039;id&amp;#039;] : false;&lt;br /&gt;
        if (!$page_id)&lt;br /&gt;
            return true;&lt;br /&gt;
&lt;br /&gt;
        // переопределяем данные, чтобы сгенерировалась нужная страница&lt;br /&gt;
        $cmsController = cmsController::getInstance();&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentElementId($page_id);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentModule(&amp;#039;catalog&amp;#039;);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentMethod(&amp;#039;object&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для корректной работы нужно еще избавиться от товаров с одинаковым alt-name. Об этом с статье [[Поиск товаров с одинаковым alt-name]]&lt;br /&gt;
&lt;br /&gt;
 [[category:Решение проблем и ошибок]]&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2_%D1%81_%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2%D1%8B%D0%BC_alt-name&amp;diff=8480</id>
		<title>Поиск товаров с одинаковым alt-name</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2_%D1%81_%D0%BE%D0%B4%D0%B8%D0%BD%D0%B0%D0%BA%D0%BE%D0%B2%D1%8B%D0%BC_alt-name&amp;diff=8480"/>
		<updated>2018-06-29T14:56:11Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: «&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;  Это продолжение статьи &amp;quot;Уменьшение вложенности товаров&amp;quot;.  Д…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Это продолжение статьи &amp;quot;[[Уменьшение вложенности товаров]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для корректной работы статьи нужно избавиться от товаров с одинаковым alt-name. Сделать это можно вот таким скриптом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
define(&amp;quot;CURRENT_WORKING_DIR&amp;quot;, str_replace(&amp;quot;\\&amp;quot;, &amp;quot;/&amp;quot;, $dirname = dirname(__FILE__)));&lt;br /&gt;
require CURRENT_WORKING_DIR . &amp;#039;/libs/root-src/standalone.php&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// здесь можно заменить catalog и object на данные необходимого иерархического типа данных, например news и item — для страниц новостей.&lt;br /&gt;
$type_id = umiHierarchyTypesCollection::getInstance()-&amp;gt;getTypeByName(&amp;#039;catalog&amp;#039;, &amp;#039;object&amp;#039;)-&amp;gt;getId();&lt;br /&gt;
&lt;br /&gt;
$hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
$connection = ConnectionPool::getInstance()-&amp;gt;getConnection(&amp;#039;core&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// прямым запросов к базе ищем дубли по alt-name&lt;br /&gt;
$result = $connection-&amp;gt;query(&amp;quot;SELECT GROUP_CONCAT(id SEPARATOR &amp;#039;, &amp;#039;) id, COUNT(*) c FROM `cms3_hierarchy` WHERE `type_id` = $type_id GROUP BY alt_name HAVING c &amp;gt; 1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// распечатываем ссылки на страницы&lt;br /&gt;
while($row = mysqli_fetch_assoc($result)) {&lt;br /&gt;
	foreach (explode(&amp;#039;,&amp;#039;, $row[&amp;#039;id&amp;#039;]) as $id) {&lt;br /&gt;
        $page = $hierarchy-&amp;gt;getElement($id);&lt;br /&gt;
		echo &amp;quot;&amp;lt;a href=\&amp;quot;/admin/catalog/edit/{$page-&amp;gt;getId()}/\&amp;quot;&amp;gt;{$page-&amp;gt;getName()}&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кладем скрипт в корень сайта и вызываем из браузера. Корректируем страницы до тех пор, пока дублей не останется.&lt;br /&gt;
&lt;br /&gt;
 [[category:Написание кастомных макросов]]&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2&amp;diff=8479</id>
		<title>Уменьшение вложенности товаров</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2&amp;diff=8479"/>
		<updated>2018-06-29T14:33:21Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: «&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;  Часто для улучшения ранжирования в поисковых системах нужно…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Часто для улучшения ранжирования в поисковых системах нужно уменьшать вложенность страниц. Например переместить товары на второй уровень, при этом сохранив структуру каталога.&lt;br /&gt;
&lt;br /&gt;
Изначально для данной задачи использовал [http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/formirovanie_dannyh_na_servere_protokol_umap/ протокол Umap], но решение было не очень гибкое.&lt;br /&gt;
&lt;br /&gt;
Недавно нашел более удачное решение, которое и привожу.&lt;br /&gt;
&lt;br /&gt;
Для начала нужно перехватывать событие systemPrepare, которое вызывается уже после анализа URL и до генерации глобальных переменных.&lt;br /&gt;
&lt;br /&gt;
Перехват события (файл events.php в папке classes/modules/catalog в директории шаблона, или custom_events.php в системной папке модуля):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
new umiEventListener(&amp;#039;systemPrepare&amp;#039;, &amp;#039;catalog&amp;#039;, &amp;#039;short_links&amp;#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Права на доступ к макросу (permissions.php или permissions_custom.php):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$permissions = array(&lt;br /&gt;
    &amp;#039;view&amp;#039; =&amp;gt; array(&amp;#039;short_links&amp;#039;)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сама функция с комментариями:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// импортируем Service в самом начале файла&lt;br /&gt;
use UmiCms\Service;&lt;br /&gt;
//...&lt;br /&gt;
public function short_links(iUmiEventPoint $oEventPoint) {&lt;br /&gt;
    if ($oEventPoint-&amp;gt;getMode() === &amp;quot;before&amp;quot;) {&lt;br /&gt;
        // парсим url в массив&lt;br /&gt;
        $path_parts = Service::Request()-&amp;gt;getPathParts();&lt;br /&gt;
&lt;br /&gt;
        // у нас ссылки вида /product/{$alt-name}/&lt;br /&gt;
        // и соответственно здесь проверяется, соответствует ли ссылка данному шаблону&lt;br /&gt;
        @list($part1, $alt_name, $part3) = $path_parts;&lt;br /&gt;
        if ($part3 or $part1 !== &amp;#039;product&amp;#039; or !$alt_name)&lt;br /&gt;
            return true;&lt;br /&gt;
&lt;br /&gt;
        // ищем объект каталога по alt-name&lt;br /&gt;
        $pages = new selector(&amp;#039;pages&amp;#039;);&lt;br /&gt;
        $pages-&amp;gt;types(&amp;#039;hierarchy-type&amp;#039;)-&amp;gt;name(&amp;#039;catalog&amp;#039;, &amp;#039;object&amp;#039;);&lt;br /&gt;
        $pages-&amp;gt;option(&amp;#039;return&amp;#039;)-&amp;gt;value(&amp;#039;id&amp;#039;);&lt;br /&gt;
        $pages-&amp;gt;where(&amp;#039;alt_name&amp;#039;)-&amp;gt;equals($alt_name);&lt;br /&gt;
        $page_id = $pages-&amp;gt;first();&lt;br /&gt;
        $page_id = $page_id ? @$page_id[&amp;#039;id&amp;#039;] : false;&lt;br /&gt;
        if (!$page_id)&lt;br /&gt;
            return true;&lt;br /&gt;
&lt;br /&gt;
        // переопределяем данные, чтобы сгенерировалась нужная страница&lt;br /&gt;
        $cmsController = cmsController::getInstance();&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentElementId($page_id);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentModule(&amp;#039;catalog&amp;#039;);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentMethod(&amp;#039;object&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [[category:Решение проблем и ошибок]]&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%B8_%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=8465</id>
		<title>Удаление изображения при удалении страницы</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%B8_%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=8465"/>
		<updated>2018-06-17T08:23:34Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: «&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;  Назначаем обработчик события:  &amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt; new umiEventListener(&amp;#039;systemDeleteElem…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&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;
new umiEventListener(&amp;#039;systemDeleteElement&amp;#039;, &amp;#039;catalog&amp;#039;, &amp;#039;onRemoveItem&amp;#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&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;
$permissions = array(&amp;#039;view&amp;#039; =&amp;gt; array(&amp;#039;onRemoveItem&amp;#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&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;
/**Удаление изображений при удалении страницы&lt;br /&gt;
 * @param iUmiEventPoint $oEventPoint&lt;br /&gt;
 * @return bool&lt;br /&gt;
 */&lt;br /&gt;
public function onRemoveItem(iUmiEventPoint $oEventPoint) {&lt;br /&gt;
    if ($oEventPoint-&amp;gt;getMode() === &amp;quot;after&amp;quot;) {&lt;br /&gt;
        $element = $oEventPoint-&amp;gt;getRef(&amp;quot;element&amp;quot;);&lt;br /&gt;
        $photo = @ $element-&amp;gt;getValue(&amp;#039;photo&amp;#039;);&lt;br /&gt;
        if ($photo instanceof umiImageFile)&lt;br /&gt;
            $photo-&amp;gt;delete();&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[category:Написание кастомных макросов]]&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=8464</id>
		<title>Получить соседние страницы</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=8464"/>
		<updated>2018-06-17T07:53:20Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: «&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;  Из коробки есть макросы %system getNext()% и %system getPrevious()%.  Привожу прим…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Из коробки есть макросы %system getNext()% и %system getPrevious()%.&lt;br /&gt;
&lt;br /&gt;
Привожу пример объединенного сокращенного макроса. Принимает только один параметр: id страницы или путь.&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 get_neighbours($path = &amp;#039;&amp;#039;) {&lt;br /&gt;
    $element_id = def_module::analyzeRequiredPath($path);&lt;br /&gt;
    $element = $element_id ? umiHierarchy::getInstance()-&amp;gt;getElement($element_id) : false;&lt;br /&gt;
&lt;br /&gt;
    if(!$element)&lt;br /&gt;
        return &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    $pages = new selector(&amp;#039;pages&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;types(&amp;#039;hierarchy-type&amp;#039;)-&amp;gt;id($element-&amp;gt;getTypeId());&lt;br /&gt;
    $pages-&amp;gt;where(&amp;#039;hierarchy&amp;#039;)-&amp;gt;page($element-&amp;gt;getParentId())-&amp;gt;level(1);&lt;br /&gt;
    $pages-&amp;gt;order(&amp;#039;ord&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;option(&amp;#039;return&amp;#039;)-&amp;gt;value(&amp;#039;id&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    $next = false;&lt;br /&gt;
    $prev = false;&lt;br /&gt;
    $is_matched = false;&lt;br /&gt;
&lt;br /&gt;
    foreach($pages-&amp;gt;result() as $page) {&lt;br /&gt;
        $id = $page[&amp;#039;id&amp;#039;];&lt;br /&gt;
        if($is_matched) {&lt;br /&gt;
            $next = $id;&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
        if($id == $element_id)&lt;br /&gt;
            $is_matched = true;&lt;br /&gt;
        if (!$is_matched)&lt;br /&gt;
            $prev = $id;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return [&lt;br /&gt;
        &amp;#039;prev_id&amp;#039; =&amp;gt; $prev,&lt;br /&gt;
        &amp;#039;prev_link&amp;#039; =&amp;gt; umiHierarchy::getInstance()-&amp;gt;getPathById($prev),&lt;br /&gt;
        &amp;#039;next_id&amp;#039; =&amp;gt; $next,&lt;br /&gt;
        &amp;#039;next_link&amp;#039; =&amp;gt; umiHierarchy::getInstance()-&amp;gt;getPathById($next)&lt;br /&gt;
    ];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 https://somesite.ru/udata:/news/get_neighbours/456&lt;br /&gt;
&lt;br /&gt;
Пример xml-ответа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;udata xmlns:xlink=&amp;quot;http://www.w3.org/TR/xlink&amp;quot; module=&amp;quot;news&amp;quot; method=&amp;quot;get_neighbours&amp;quot; generation-time=&amp;quot;0.035878&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;prev_id&amp;gt;454&amp;lt;/prev_id&amp;gt;&lt;br /&gt;
    &amp;lt;prev_link&amp;gt;/news/lollipop-popular-android/&amp;lt;/prev_link&amp;gt;&lt;br /&gt;
    &amp;lt;next_id&amp;gt;457&amp;lt;/next_id&amp;gt;&lt;br /&gt;
    &amp;lt;next_link&amp;gt;/news/microsoft-surface-3-i-surface-pro-4-cases/&amp;lt;/next_link&amp;gt;&lt;br /&gt;
&amp;lt;/udata&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[category:Написание кастомных макросов]]&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D0%B0_%D1%81%D0%B0%D0%B9%D1%82%D0%B0&amp;diff=8463</id>
		<title>Постраничная карта сайта</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D0%B0%D1%80%D1%82%D0%B0_%D1%81%D0%B0%D0%B9%D1%82%D0%B0&amp;diff=8463"/>
		<updated>2018-06-15T19:36:31Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: «&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;  На страницах с больших количеством страниц может понадобится …»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
На страницах с больших количеством страниц может понадобится сделать постраничную карту сайта с заданным ограниченным количеством ссылок на странице.&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;
class content_custom extends def_module {&lt;br /&gt;
    public $sitemap_count_down;&lt;br /&gt;
    public $sitemap_offset;&lt;br /&gt;
    public $sitemap_iterator = 0;&lt;br /&gt;
    &lt;br /&gt;
    /**Постраничный вывод карты сайта&lt;br /&gt;
     * @param int $limit количество ссылок на странице&lt;br /&gt;
     * @param int $expire время жизни кеша в секундах&lt;br /&gt;
     * @return array&lt;br /&gt;
     * @throws selectorException&lt;br /&gt;
     */&lt;br /&gt;
    public function sitemap_pages($limit=500, $expire=7200) {&lt;br /&gt;
        $page = (int) getRequest(&amp;#039;p&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        $block_arr = array();&lt;br /&gt;
        $this-&amp;gt;sitemap_count_down = $limit;&lt;br /&gt;
        $this-&amp;gt;sitemap_offset = $page * $this-&amp;gt;sitemap_count_down;&lt;br /&gt;
&lt;br /&gt;
        $children_count = $this-&amp;gt;sitemap_children_count(0);&lt;br /&gt;
&lt;br /&gt;
        if ($this-&amp;gt;sitemap_offset &amp;gt; $children_count)&lt;br /&gt;
            return $block_arr[&amp;#039;items&amp;#039;] = &amp;#039;none&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        // кеширование данных карты сайта в файлы&lt;br /&gt;
        $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/sitemap-cache/&amp;#039;;&lt;br /&gt;
        if(!is_dir($folder))&lt;br /&gt;
            mkdir($folder, 0777, true);&lt;br /&gt;
        $data_path = $folder . &amp;#039;map&amp;#039; . $page . &amp;#039;.html&amp;#039;;&lt;br /&gt;
        $mtime = is_file($data_path) ? filemtime($data_path) : false;&lt;br /&gt;
        if($mtime &amp;amp;&amp;amp; (time() &amp;lt; ($mtime + $expire)))&lt;br /&gt;
            $block_arr[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;] = json_decode(file_get_contents($data_path),true);&lt;br /&gt;
        else {&lt;br /&gt;
            $block_arr[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;] = $this-&amp;gt;sitemap_children(0);&lt;br /&gt;
            file_put_contents($data_path, json_encode($block_arr[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;]));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $block_arr[&amp;#039;total&amp;#039;] = $children_count;&lt;br /&gt;
        $block_arr[&amp;#039;per_page&amp;#039;] = 500;&lt;br /&gt;
        return $block_arr;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**Рекурсивная функция для генерации данных карты сайта&lt;br /&gt;
     * @param int $page_id id страницы&lt;br /&gt;
     * @return array&lt;br /&gt;
     * @throws selectorException&lt;br /&gt;
     */&lt;br /&gt;
    public function sitemap_children($page_id) {&lt;br /&gt;
        $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
        $pages = new selector(&amp;#039;pages&amp;#039;);&lt;br /&gt;
        $pages-&amp;gt;where(&amp;#039;hierarchy&amp;#039;)-&amp;gt;page($page_id)-&amp;gt;level(1);&lt;br /&gt;
        $pages-&amp;gt;where(&amp;#039;robots_deny&amp;#039;)-&amp;gt;notequals(1);&lt;br /&gt;
        $pages-&amp;gt;where(&amp;#039;is_active&amp;#039;)-&amp;gt;equals(1);&lt;br /&gt;
        $pages-&amp;gt;where(&amp;#039;is_visible&amp;#039;)-&amp;gt;equals(1);&lt;br /&gt;
        $pages-&amp;gt;order(&amp;#039;ord&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        $items = array();&lt;br /&gt;
&lt;br /&gt;
        foreach ($pages as $page) {&lt;br /&gt;
            /** @var umiHierarchyElement $page */&lt;br /&gt;
            if (!isset($this-&amp;gt;sitemap_iterator))&lt;br /&gt;
                $this-&amp;gt;sitemap_iterator = 0;&lt;br /&gt;
            if (!$this-&amp;gt;sitemap_count_down)&lt;br /&gt;
                break;&lt;br /&gt;
            $children_count = $this-&amp;gt;sitemap_children_count($page-&amp;gt;getId()) + 1;&lt;br /&gt;
            if ($this-&amp;gt;sitemap_offset &amp;gt;= $children_count) {&lt;br /&gt;
                $this-&amp;gt;sitemap_offset -= $children_count;&lt;br /&gt;
                $this-&amp;gt;sitemap_iterator += $children_count;&lt;br /&gt;
            } else {&lt;br /&gt;
                $this-&amp;gt;sitemap_iterator++;&lt;br /&gt;
                if ($this-&amp;gt;sitemap_offset &amp;gt; 0) {&lt;br /&gt;
                    $this-&amp;gt;sitemap_offset--;&lt;br /&gt;
                    $item_arr = array();&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                    $this-&amp;gt;sitemap_count_down--;&lt;br /&gt;
                    $item_arr = array(&lt;br /&gt;
                        &amp;#039;@i&amp;#039; =&amp;gt; $this-&amp;gt;sitemap_iterator,&lt;br /&gt;
                        &amp;#039;@link&amp;#039; =&amp;gt; $page-&amp;gt;link,&lt;br /&gt;
                        &amp;#039;@name&amp;#039; =&amp;gt; $page-&amp;gt;getName(),&lt;br /&gt;
                    );&lt;br /&gt;
                }&lt;br /&gt;
                if (($children_count&amp;gt;1) &amp;amp;&amp;amp; $this-&amp;gt;sitemap_count_down)&lt;br /&gt;
                    $item_arr[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;] = $this-&amp;gt;sitemap_children($page-&amp;gt;getId());&lt;br /&gt;
                $items[] = $item_arr;&lt;br /&gt;
            }&lt;br /&gt;
            $hierarchy-&amp;gt;unloadElement($page-&amp;gt;getId());&lt;br /&gt;
        }&lt;br /&gt;
        return $items;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**Количество активных и видимых подстраниц на неограниченную вложенность&lt;br /&gt;
     * @param int $page_id id страницы&lt;br /&gt;
     * @return bool|int&lt;br /&gt;
     */&lt;br /&gt;
    public function sitemap_children_count($page_id) {&lt;br /&gt;
        $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
        return $hierarchy-&amp;gt;getChildrenCount($page_id, false, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&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;
$permissions = Array(&lt;br /&gt;
    &amp;#039;content&amp;#039; =&amp;gt; array(&amp;#039;sitemap_pages&amp;#039;, &amp;#039;sitemap_children&amp;#039;, &amp;#039;sitemap_children_count&amp;#039;)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример шаблона на php-шаблонизаторе:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$p = getRequest(&amp;#039;p&amp;#039;);&lt;br /&gt;
$sitemap = $this-&amp;gt;macros(&amp;#039;content&amp;#039;, &amp;#039;sitemap_pages&amp;#039;, array());&lt;br /&gt;
function renderMap($map) {&lt;br /&gt;
    $result = &amp;#039;&amp;#039;;&lt;br /&gt;
    if(isset($map[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;])) {&lt;br /&gt;
        $result .= &amp;#039;&amp;lt;ul&amp;gt;&amp;#039;;&lt;br /&gt;
        foreach($map[&amp;#039;items&amp;#039;][&amp;#039;nodes:item&amp;#039;] as $item) {&lt;br /&gt;
            $result .= &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
            if (isset($item[&amp;#039;@link&amp;#039;])) $result .= &amp;quot;&amp;lt;a href=\&amp;quot;{$item[&amp;#039;@link&amp;#039;]}\&amp;quot;&amp;gt;{$item[&amp;#039;@name&amp;#039;]}&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
            $result .= renderMap($item);&lt;br /&gt;
            $result .= &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        $result .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return $result;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;b-sitemap&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;?=renderMap($sitemap)?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?=@($sitemap[&amp;#039;total&amp;#039;] &amp;gt; $sitemap[&amp;#039;per_page&amp;#039;]) ? $this-&amp;gt;render($this-&amp;gt;macros(&amp;#039;system&amp;#039;,&amp;#039;numpages&amp;#039;, array($sitemap[&amp;#039;total&amp;#039;], $sitemap[&amp;#039;per_page&amp;#039;])), &amp;#039;library/numpages&amp;#039;) : &amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [[category:Написание кастомных макросов]]&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B8_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_selector&amp;diff=8460</id>
		<title>Кастомный макрос на основе выборки через selector</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B8_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_selector&amp;diff=8460"/>
		<updated>2018-06-13T16:48:36Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: «&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;  Стандартные макросы для выборки данных содержать в себе довол…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Стандартные макросы для выборки данных содержать в себе довольно много функциональности, которая может совсем не использоваться, а каких то функций или данных может наоборот не хватать.&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;
/**Постраничный вывод объектов каталога &lt;br /&gt;
 * @param int $parentId id раздела для поиска страниц&lt;br /&gt;
 * @param bool $limit количество объектов на странице&lt;br /&gt;
 * @param array $fields массив с дополнительными полями, которые нужны&lt;br /&gt;
 * @return array&lt;br /&gt;
 * @throws selectorException&lt;br /&gt;
 */&lt;br /&gt;
public function getObjects($parentId = 0, $limit = false, $fields = array()) {&lt;br /&gt;
    $limit = ($limit) ? $limit : $this-&amp;gt;module-&amp;gt;per_page;&lt;br /&gt;
    $currentPage = (int) getRequest(&amp;#039;p&amp;#039;);&lt;br /&gt;
    $offset = $currentPage * $limit;&lt;br /&gt;
    if (!is_array($fields)) $fields = explode(&amp;#039;,&amp;#039;,$fields);&lt;br /&gt;
&lt;br /&gt;
    // объединяем общий список полей с переданным через параметр $fields&lt;br /&gt;
    $fields = array_merge(array(&amp;#039;id&amp;#039;, &amp;#039;name&amp;#039;, &amp;#039;alt_name&amp;#039;), $fields);&lt;br /&gt;
&lt;br /&gt;
    $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
    $pages = new selector(&amp;#039;pages&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;types(&amp;#039;hierarchy-type&amp;#039;)-&amp;gt;name(&amp;#039;catalog&amp;#039;, &amp;#039;object&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;where(&amp;#039;hierarchy&amp;#039;)-&amp;gt;page($parentId)-&amp;gt;level(2);&lt;br /&gt;
&lt;br /&gt;
    // selector вернет вместо объектов umiHierarchyElement ассоциативный массив&lt;br /&gt;
    $pages-&amp;gt;option(&amp;#039;return&amp;#039;)-&amp;gt;value($fields);&lt;br /&gt;
    $pages-&amp;gt;order(&amp;#039;ord&amp;#039;)-&amp;gt;asc();&lt;br /&gt;
    $pages-&amp;gt;limit($offset, $limit);&lt;br /&gt;
&lt;br /&gt;
    $result = array();&lt;br /&gt;
    $total = $pages-&amp;gt;length();&lt;br /&gt;
    foreach($pages-&amp;gt;result as $page) {&lt;br /&gt;
        $item = $page;&lt;br /&gt;
        $item[&amp;#039;link&amp;#039;] = $hierarchy-&amp;gt;getPathById($item[&amp;#039;id&amp;#039;]);&lt;br /&gt;
        $result[&amp;#039;nodes:page&amp;#039;][] = $item;&lt;br /&gt;
    }&lt;br /&gt;
    $result[&amp;#039;total&amp;#039;] = $total;&lt;br /&gt;
    $result[&amp;#039;per_page&amp;#039;] = $limit;&lt;br /&gt;
    return $result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод работает в php- и xslt-шаблонизаторах.&lt;br /&gt;
&lt;br /&gt;
 [[category:Написание кастомных макросов]]&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=404_%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81_%D0%B4%D0%BB%D1%8F_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86&amp;diff=8441</id>
		<title>404 статус для существующих страниц</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=404_%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81_%D0%B4%D0%BB%D1%8F_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86&amp;diff=8441"/>
		<updated>2018-06-12T09:10:45Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Для некоторых страниц, например для страниц настроек или комментариев, может понадобиться выводить 404 страницу.&lt;br /&gt;
&lt;br /&gt;
В исходном коде системы есть стандартная точка вызова systemPrepare, описание которой я не нашел в документации. На мой взгляд это самое удачное место для внедрения кастомного обработчика.&lt;br /&gt;
&lt;br /&gt;
Перехватка события (файл events.php в папке classes/modules/content шаблона, или custom_events.php в системной папке модуля):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
new umiEventListener(&amp;#039;systemPrepare&amp;#039;, &amp;#039;content&amp;#039;, &amp;#039;after_system_prepared&amp;#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Права на доступ к макросу (permissions.php или permissions_custom.php):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$permissions= Array(&lt;br /&gt;
   &amp;#039;content&amp;#039; =&amp;gt; array(&amp;#039;after_system_prepared&amp;#039;)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сам макрос (в class.php или custom.php):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function after_system_prepared(iUmiEventPoint $oEventPoint) {&lt;br /&gt;
    if ($oEventPoint-&amp;gt;getMode() === &amp;quot;after&amp;quot;) {&lt;br /&gt;
        $cmsController = cmsController::getInstance();&lt;br /&gt;
&lt;br /&gt;
        $page_id = $cmsController-&amp;gt;getCurrentElementId();&lt;br /&gt;
        if (!$page_id or !$this-&amp;gt;isStatus404($page_id))&lt;br /&gt;
            return true;&lt;br /&gt;
&lt;br /&gt;
        // задаем данные, как для несуществующей страницы&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentElementId(false);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentModule(&amp;#039;content&amp;#039;);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentMethod(&amp;#039;content&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В методе isStatus404 определяем, какие страницы скрываются от отображения на сайте:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function isStatus404($pageId = false) {&lt;br /&gt;
    if (!$pageId)&lt;br /&gt;
        return true;&lt;br /&gt;
&lt;br /&gt;
    $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
    $page = $hierarchy-&amp;gt;getElement($pageId);&lt;br /&gt;
    $status = (bool) $page-&amp;gt;getValue(&amp;#039;status404&amp;#039;);&lt;br /&gt;
    if ($status)&lt;br /&gt;
        return true;&lt;br /&gt;
&lt;br /&gt;
    $parents = $hierarchy-&amp;gt;getAllParents($pageId);&lt;br /&gt;
    $pages = new selector(&amp;#039;pages&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;where(&amp;#039;id&amp;#039;)-&amp;gt;equals($parents);&lt;br /&gt;
    $pages-&amp;gt;option(&amp;#039;return&amp;#039;)-&amp;gt;value(&amp;#039;status404&amp;#039;);&lt;br /&gt;
    foreach ($pages-&amp;gt;result as $item) {&lt;br /&gt;
        if ($item[&amp;#039;status404&amp;#039;])&lt;br /&gt;
            return true;&lt;br /&gt;
    }&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае у типа данных &amp;quot;Раздел сайта&amp;quot; есть поле status404, при включении которого будет скрываться данная страница и все ее подстраницы.&lt;br /&gt;
&lt;br /&gt;
Также будет логичным скрыть такие страницы из xml-карты сайта. Для этого можно воспользоваться [http://wiki.umisoft.ru/Карта_сайта_xml:_кастомизация_обновления этой статьей].&lt;br /&gt;
&lt;br /&gt;
 [[category:Решение проблем и ошибок]]&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D1%80%D1%82%D0%B0_%D1%81%D0%B0%D0%B9%D1%82%D0%B0_xml:_%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=8440</id>
		<title>Карта сайта xml: кастомизация обновления</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D1%80%D1%82%D0%B0_%D1%81%D0%B0%D0%B9%D1%82%D0%B0_xml:_%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=8440"/>
		<updated>2018-06-12T09:10:11Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Статья предоставлена партнером UMI.CMS [https://www.umi-cms.ru/find_webdevs/shiriev_artur_venerovich/ Артуром Шириевым]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Может понадобиться управлять механизмом обновления некоторых страниц карты сайта.&lt;br /&gt;
Не так давно появилась новая стандартная точка вызова before_update_sitemap, которой нет в документации.&lt;br /&gt;
&lt;br /&gt;
Механизм назначения обработчика подробно описан в разделе [http://api.docs.umi-cms.ru/razrabotka_nestandartnogo_funkcionala/sobytijnaya_model_umicms/ Событийная модель UMI.CMS]&lt;br /&gt;
&lt;br /&gt;
 Точки вызова before_update_sitemap:&lt;br /&gt;
  Вызывается при подготовке глобальных переменных&lt;br /&gt;
   режим: before&lt;br /&gt;
   параметры: &lt;br /&gt;
    (int) id - id страницы&lt;br /&gt;
   параметры-ссылки: &lt;br /&gt;
    (bool) &amp;amp;robots_deny - запрет для отображения в карте сайта&lt;br /&gt;
    (string) &amp;amp;link - ссылка страницы&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 update_sitemap(iUmiEventPoint $oEventPoint) {&lt;br /&gt;
     if ($oEventPoint-&amp;gt;getMode() === &amp;quot;before&amp;quot;) {&lt;br /&gt;
         $link = &amp;amp;$oEventPoint-&amp;gt;getRef(&amp;#039;link&amp;#039;);&lt;br /&gt;
         $robots_deny = &amp;amp;$oEventPoint-&amp;gt;getRef(&amp;#039;robots_deny&amp;#039;);&lt;br /&gt;
         @$page_id = &amp;amp;$oEventPoint-&amp;gt;getParam(&amp;#039;id&amp;#039;);&lt;br /&gt;
         $page = $page_id ? umiHierarchy::getInstance()-&amp;gt;getElement($page_id) : false;&lt;br /&gt;
         if (!$page instanceof umiHierarchyElement) return true;&lt;br /&gt;
         // исключаем из карты сайта все комментарии&lt;br /&gt;
         if ($page-&amp;gt;getModule() == &amp;#039;comments&amp;#039;) $robots_deny = true;&lt;br /&gt;
&lt;br /&gt;
         // кастомный метод для определения, для каких страниц нужно отдавать 404-страницу&lt;br /&gt;
         if ($this-&amp;gt;isStatus404($page_id)) $robots_deny = true;&lt;br /&gt;
&lt;br /&gt;
         // на сайте используются модифицированные адреса объектов каталога&lt;br /&gt;
         if ($page-&amp;gt;getMethod() == &amp;#039;object&amp;#039;) {&lt;br /&gt;
             $link = &amp;#039;{your_domain}&amp;#039; . $page-&amp;gt;getAltName() . &amp;#039;/&amp;#039;;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return true;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример метода isStatus404 описан в [http://wiki.umisoft.ru/404_статус_для_существующих_страниц этой статьей].&lt;br /&gt;
&lt;br /&gt;
[[category:Написание кастомных макросов]]&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=404_%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81_%D0%B4%D0%BB%D1%8F_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86&amp;diff=8439</id>
		<title>404 статус для существующих страниц</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=404_%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81_%D0%B4%D0%BB%D1%8F_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86&amp;diff=8439"/>
		<updated>2018-06-12T09:09:21Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Решение проблем и ошибок]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Для некоторых страниц, например для страниц настроек или комментариев, может понадобиться выводить 404 страницу.&lt;br /&gt;
&lt;br /&gt;
В исходном коде системы есть стандартная точка вызова systemPrepare, описание которой я не нашел в документации. На мой взгляд это самое удачное место для внедрения кастомного обработчика.&lt;br /&gt;
&lt;br /&gt;
Перехватка события (файл events.php в папке classes/modules/content шаблона, или custom_events.php в системной папке модуля):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
new umiEventListener(&amp;#039;systemPrepare&amp;#039;, &amp;#039;content&amp;#039;, &amp;#039;after_system_prepared&amp;#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Права на доступ к макросу (permissions.php или permissions_custom.php):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$permissions= Array(&lt;br /&gt;
   &amp;#039;content&amp;#039; =&amp;gt; array(&amp;#039;after_system_prepared&amp;#039;)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сам макрос (в class.php или custom.php):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function after_system_prepared(iUmiEventPoint $oEventPoint) {&lt;br /&gt;
    if ($oEventPoint-&amp;gt;getMode() === &amp;quot;after&amp;quot;) {&lt;br /&gt;
        $cmsController = cmsController::getInstance();&lt;br /&gt;
&lt;br /&gt;
        $page_id = $cmsController-&amp;gt;getCurrentElementId();&lt;br /&gt;
        if (!$page_id or !$this-&amp;gt;isStatus404($page_id))&lt;br /&gt;
            return true;&lt;br /&gt;
&lt;br /&gt;
        // задаем данные, как для несуществующей страницы&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentElementId(false);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentModule(&amp;#039;content&amp;#039;);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentMethod(&amp;#039;content&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В методе isStatus404 определяем, какие страницы скрываются от отображения на сайте:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function isStatus404($pageId = false) {&lt;br /&gt;
    if (!$pageId)&lt;br /&gt;
        return true;&lt;br /&gt;
&lt;br /&gt;
    $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
    $page = $hierarchy-&amp;gt;getElement($pageId);&lt;br /&gt;
    $status = (bool) $page-&amp;gt;getValue(&amp;#039;status404&amp;#039;);&lt;br /&gt;
    if ($status)&lt;br /&gt;
        return true;&lt;br /&gt;
&lt;br /&gt;
    $parents = $hierarchy-&amp;gt;getAllParents($pageId);&lt;br /&gt;
    $pages = new selector(&amp;#039;pages&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;where(&amp;#039;id&amp;#039;)-&amp;gt;equals($parents);&lt;br /&gt;
    $pages-&amp;gt;option(&amp;#039;return&amp;#039;)-&amp;gt;value(&amp;#039;status404&amp;#039;);&lt;br /&gt;
    foreach ($pages-&amp;gt;result as $item) {&lt;br /&gt;
        if ($item[&amp;#039;status404&amp;#039;])&lt;br /&gt;
            return true;&lt;br /&gt;
    }&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае у типа данных &amp;quot;Раздел сайта&amp;quot; есть поле status404, при включении которого будет скрываться данная страница и все ее подстраницы.&lt;br /&gt;
&lt;br /&gt;
Также будет логичным скрыть такие страницы из xml-карты сайта. Для этого можно воспользоваться [http://wiki.umisoft.ru/Карта_сайта_xml:_кастомизация_обновления этой статьей].&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=404_%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81_%D0%B4%D0%BB%D1%8F_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86&amp;diff=8438</id>
		<title>404 статус для существующих страниц</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=404_%D1%81%D1%82%D0%B0%D1%82%D1%83%D1%81_%D0%B4%D0%BB%D1%8F_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86&amp;diff=8438"/>
		<updated>2018-06-12T09:07:06Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: « category:Решение проблем и ошибок  &amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;  Для некоторых страниц, наприм…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Решение проблем и ошибок]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Для некоторых страниц, например для страниц настроек или комментариев, может понадобиться выводить 404 страницу.&lt;br /&gt;
&lt;br /&gt;
В исходном коде системы есть стандартная точка вызова systemPrepare, описание которой я не нашел в документации. На мой взгляд это самое удачное место для внедрения кастомного обработчика.&lt;br /&gt;
&lt;br /&gt;
Перехватка события (файл events.php в папке classes/modules/content шаблона, или custom_events.php в системной папке модуля):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
new umiEventListener(&amp;#039;systemPrepare&amp;#039;, &amp;#039;content&amp;#039;, &amp;#039;after_system_prepared&amp;#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Права на доступ к макросу (permissions.php или permissions_custom.php):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$permissions= Array(&lt;br /&gt;
   &amp;#039;content&amp;#039; =&amp;gt; array(&amp;#039;after_system_prepared&amp;#039;)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сам макрос (в class.php или custom.php):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function after_system_prepared(iUmiEventPoint $oEventPoint) {&lt;br /&gt;
    if ($oEventPoint-&amp;gt;getMode() === &amp;quot;after&amp;quot;) {&lt;br /&gt;
        $cmsController = cmsController::getInstance();&lt;br /&gt;
&lt;br /&gt;
        $page_id = $cmsController-&amp;gt;getCurrentElementId();&lt;br /&gt;
        if (!$page_id or !$this-&amp;gt;isStatus404($page_id))&lt;br /&gt;
            return true;&lt;br /&gt;
&lt;br /&gt;
        // задаем данные, как для несуществующей страницы&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentElementId(false);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentModule(&amp;#039;content&amp;#039;);&lt;br /&gt;
        $cmsController-&amp;gt;setCurrentMethod(&amp;#039;content&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В методе isStatus404 определяем, какие страницы скрываются от отображения на сайте:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function isStatus404($pageId = false) {&lt;br /&gt;
    if (!$pageId)&lt;br /&gt;
        return true;&lt;br /&gt;
&lt;br /&gt;
    $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
    $page = $hierarchy-&amp;gt;getElement($pageId);&lt;br /&gt;
    $status = (bool) $page-&amp;gt;getValue(&amp;#039;status404&amp;#039;);&lt;br /&gt;
    if ($status)&lt;br /&gt;
        return true;&lt;br /&gt;
&lt;br /&gt;
    $parents = $hierarchy-&amp;gt;getAllParents($pageId);&lt;br /&gt;
    $pages = new selector(&amp;#039;pages&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;where(&amp;#039;id&amp;#039;)-&amp;gt;equals($parents);&lt;br /&gt;
    $pages-&amp;gt;option(&amp;#039;return&amp;#039;)-&amp;gt;value(&amp;#039;status404&amp;#039;);&lt;br /&gt;
    foreach ($pages-&amp;gt;result as $item) {&lt;br /&gt;
        if ($item[&amp;#039;status404&amp;#039;])&lt;br /&gt;
            return true;&lt;br /&gt;
    }&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае у типа данных &amp;quot;Раздел сайта&amp;quot; есть поле status404, при включении которого будет скрываться данная страница и все ее подстраницы.&lt;br /&gt;
&lt;br /&gt;
Также будет логичным скрыть такие страницы из xml-карты сайта. Для этого можно воспользоваться [http://wiki.umisoft.ru/%D0%9A%D0%B0%D1%80%D1%82%D0%B0_%D1%81%D0%B0%D0%B9%D1%82%D0%B0_xml:_%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F этой статьей].&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=Ajax_%D0%B8_php-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%82%D0%BE%D1%80&amp;diff=8437</id>
		<title>Ajax и php-шаблонизатор</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=Ajax_%D0%B8_php-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%82%D0%BE%D1%80&amp;diff=8437"/>
		<updated>2018-06-11T16:47:36Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: « category:Написание кастомных макросов  &amp;#039;&amp;#039;&amp;#039;Актуально для версии 18 и php-шаблонизатора.&amp;#039;&amp;#039;&amp;#039;  В доку…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Написание кастомных макросов]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18 и php-шаблонизатора.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
В документации не нашел, как подружить php-шаблонизатор и ajax.&lt;br /&gt;
&lt;br /&gt;
Привожу пример метода для ajax-подгрузки новостей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function getGallery($parentId = 0, $limit = false, $is_ajax = 0) {&lt;br /&gt;
    $module = $this-&amp;gt;module ? $this-&amp;gt;module : $this;&lt;br /&gt;
    $limit = ($limit) ? $limit : $module-&amp;gt;per_page;&lt;br /&gt;
    $currentPage = (int) getRequest(&amp;#039;p&amp;#039;);&lt;br /&gt;
    $offset = $currentPage * $limit;&lt;br /&gt;
&lt;br /&gt;
    $pages = new selector(&amp;#039;pages&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;types(&amp;#039;hierarchy-type&amp;#039;)-&amp;gt;name(&amp;#039;news&amp;#039;, &amp;#039;item&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;where(&amp;#039;hierarchy&amp;#039;)-&amp;gt;page($parentId)-&amp;gt;level(2);&lt;br /&gt;
    $pages-&amp;gt;order(&amp;#039;ord&amp;#039;);&lt;br /&gt;
    $pages-&amp;gt;limit($offset, $limit);&lt;br /&gt;
&lt;br /&gt;
    $result = array();&lt;br /&gt;
    $total = $pages-&amp;gt;length();&lt;br /&gt;
    $result[&amp;#039;nodes:page&amp;#039;] = array();&lt;br /&gt;
    foreach($pages-&amp;gt;result as $page) {&lt;br /&gt;
        $result[&amp;#039;nodes:page&amp;#039;][] = $page;&lt;br /&gt;
    }&lt;br /&gt;
    $result[&amp;#039;total&amp;#039;] = $total;&lt;br /&gt;
    $result[&amp;#039;per_page&amp;#039;] = $limit;&lt;br /&gt;
    $result[&amp;#039;stop&amp;#039;] = (int) (($offset + count($result[&amp;#039;nodes:page&amp;#039;])) == $total);&lt;br /&gt;
    $result[&amp;#039;category&amp;#039;] = $parentId;&lt;br /&gt;
&lt;br /&gt;
    // кусок, отвечающий за рендер&lt;br /&gt;
    if ($is_ajax) {&lt;br /&gt;
        $currentTemplater = cmsController::getInstance()-&amp;gt;getCurrentTemplater();&lt;br /&gt;
        $templatesSource = $currentTemplater-&amp;gt;getTemplatesSource();&lt;br /&gt;
        $templater = new umiTemplaterPHP($templatesSource);&lt;br /&gt;
        $buffer = OutputBuffer::current(&amp;#039;HTTPOutputBuffer&amp;#039;);&lt;br /&gt;
        $buffer-&amp;gt;push($templater-&amp;gt;render($result, &amp;#039;news/inc/gallery&amp;#039;));&lt;br /&gt;
        $buffer-&amp;gt;end();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return $result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном примере используется шаблон news/inc/gallery.&lt;br /&gt;
Лучше не передавать его снаружи из-за соображений безопасности. Либо делать это с большой осторожностью.&lt;br /&gt;
&lt;br /&gt;
Пример вызова: http://localhost/news/getGallery/{page_id}/{page_number}/1/&lt;br /&gt;
&lt;br /&gt;
Если в параметре $is_ajax истинное значение, то рендерится html.&lt;br /&gt;
Т.е. данный метод можно также использовать, как обычный макрос.&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9E%D0%B1%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B3%D0%BE_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B0_%D0%B2_%D1%82%D0%B5%D0%B3&amp;diff=8436</id>
		<title>Оборачивание каждого символа в тег</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9E%D0%B1%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B3%D0%BE_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B0_%D0%B2_%D1%82%D0%B5%D0%B3&amp;diff=8436"/>
		<updated>2018-06-10T13:19:35Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: « category:Верстка в XSLT  &amp;#039;&amp;#039;&amp;#039;Актуально для xslt-шаблонизатора&amp;#039;&amp;#039;&amp;#039;  Часто бывает нужно обернуть кажду…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Верстка в XSLT]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Актуально для xslt-шаблонизатора&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Часто бывает нужно обернуть каждую цифру числа в какой-нибудь тег, например для анимации расличных счетчиков.&lt;br /&gt;
&lt;br /&gt;
Сделать такое можно с помощью рекурсивного вызова внутри шаблона. Ниже пример реализации на XSLT:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;xsl:template name=&amp;quot;wrap-each-character&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:param name=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:if test=&amp;quot;string-length($string) &amp;amp;gt; 0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;substring($string,1,1)&amp;quot;/&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:call-template name=&amp;quot;wrap-each-character&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:with-param name=&amp;quot;string&amp;quot; select=&amp;quot;substring($string,2)&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;
&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тег span можно заменить на любой другой тег, который нужен.&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A1%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D0%B5_xml_%D0%B8_json_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BD%D0%B0_umi-cms_%D0%B4%D0%BB%D1%8F_%D0%BD%D0%B5%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9&amp;diff=8435</id>
		<title>Скрытие xml и json данных на umi-cms для неавторизованных пользователей</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A1%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D0%B5_xml_%D0%B8_json_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BD%D0%B0_umi-cms_%D0%B4%D0%BB%D1%8F_%D0%BD%D0%B5%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9&amp;diff=8435"/>
		<updated>2018-06-10T12:08:39Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: « category:Решение проблем и ошибок  &amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;  == Ограничение доступа к REST-пр…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Решение проблем и ошибок]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Актуально для версии 18.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Ограничение доступа к REST-протоколам ==&lt;br /&gt;
&lt;br /&gt;
Чтобы ограничить доступ к REST-протоколам udata, upage, uobject, usel и прочим, достаточно внести изменения в файл config.ini в корне сайта.&lt;br /&gt;
&lt;br /&gt;
Например для доступа без ограничения к протоколу udata используется параметр:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
udata.http.allow = &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы ограничить, нужно заменить этот параметр на&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
uobject.http.permissions = &amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Список возможных опций:&lt;br /&gt;
&lt;br /&gt;
* admin - доступно только администраторам сайта (администратор - пользователь, имеющий доступ к администрированию хотя бы одного модуля).&lt;br /&gt;
* sv - доступно только супервайзерам.&lt;br /&gt;
* auth - доступно только авторизованным пользователям.&lt;br /&gt;
&lt;br /&gt;
Для остальных протоколов используются аналогичные параметры. Пример с одного моего личного сайта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
uobject.http.permissions = &amp;quot;admin&amp;quot;&lt;br /&gt;
udata.http.permissions = &amp;quot;admin&amp;quot;&lt;br /&gt;
upage.http.permissions = &amp;quot;admin&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ограничение доступа к xml и json данным ({url}.xml или {url}.json)==&lt;br /&gt;
&lt;br /&gt;
К сожалению для решения данной задачи нет параметров в config.ini.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи нужно перехватывать событие отправки страницы в буфер, т.е. до отправки данных пользователю.&lt;br /&gt;
&lt;br /&gt;
Для начала нужно в файле config.ini включить отслеживание этого события:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
buffer-send-event-enable = &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перехватка события (файл events.php в папке classes/modules/content шаблона, или custom_events.php в системной папке модуля):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
new umiEventListener(&amp;#039;systemBufferSend&amp;#039;, &amp;#039;content&amp;#039;, &amp;#039;object_redirect&amp;#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Права на доступ к макросу (permissions.php или permissions_custom.php):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$permissions= Array(&lt;br /&gt;
   &amp;#039;content&amp;#039; =&amp;gt; array(&amp;#039;object_redirect&amp;#039;)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сам макрос (в class.php или custom.php, закрывает доступ для всех, кроме суперюзера):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function object_redirect(iUmiEventPoint $oEventPoint) {&lt;br /&gt;
    if ($oEventPoint-&amp;gt;getMode() === &amp;quot;before&amp;quot;) {&lt;br /&gt;
        $buffer = outputBuffer::current();&lt;br /&gt;
        $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
        $path = getServer(&amp;#039;REQUEST_URI&amp;#039;);&lt;br /&gt;
        $permsCol = permissionsCollection::getInstance();&lt;br /&gt;
        $isSV = $permsCol-&amp;gt;isSv();&lt;br /&gt;
        if (strpos($path, &amp;#039;.xml&amp;#039;) !== false &amp;amp;&amp;amp; !strpos($path, &amp;#039;sitemap.xml&amp;#039;) &amp;amp;&amp;amp; !$isSV) {&lt;br /&gt;
            $path = str_replace(&amp;#039;.xml&amp;#039;,&amp;#039;&amp;#039;,$path);&lt;br /&gt;
            $buffer-&amp;gt;status(&amp;#039;301 Moved Permanently&amp;#039;);&lt;br /&gt;
            $buffer-&amp;gt;redirect($path);&lt;br /&gt;
        }&lt;br /&gt;
        if (strpos($path, &amp;#039;.json&amp;#039;) !== false &amp;amp;&amp;amp; !$isSV) {&lt;br /&gt;
            $path = str_replace(&amp;#039;.json&amp;#039;,&amp;#039;&amp;#039;,$path);&lt;br /&gt;
            $buffer-&amp;gt;status(&amp;#039;301 Moved Permanently&amp;#039;);&lt;br /&gt;
            $buffer-&amp;gt;redirect($path);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D1%80%D1%82%D0%B0_%D1%81%D0%B0%D0%B9%D1%82%D0%B0_xml:_%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=8402</id>
		<title>Карта сайта xml: кастомизация обновления</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B0%D1%80%D1%82%D0%B0_%D1%81%D0%B0%D0%B9%D1%82%D0%B0_xml:_%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=8402"/>
		<updated>2018-06-04T18:29:18Z</updated>

		<summary type="html">&lt;p&gt;Lesnik512: Новая страница: « category:Написание кастомных макросов  Может понадобиться управлять механизмом обновлени…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Написание кастомных макросов]]&lt;br /&gt;
&lt;br /&gt;
Может понадобиться управлять механизмом обновления некоторых страниц карты сайта.&lt;br /&gt;
Не так давно появилась новая стандартная точка вызова before_update_sitemap, которой нет в документации.&lt;br /&gt;
&lt;br /&gt;
Механизм назначения обработчика подробно описан в разделе [http://api.docs.umi-cms.ru/razrabotka_nestandartnogo_funkcionala/sobytijnaya_model_umicms/ Событийная модель UMI.CMS]&lt;br /&gt;
&lt;br /&gt;
 Точки вызова before_update_sitemap:&lt;br /&gt;
  Вызывается при подготовке глобальных переменных&lt;br /&gt;
   режим: before&lt;br /&gt;
   параметры: &lt;br /&gt;
    (int) id - id страницы&lt;br /&gt;
   параметры-ссылки: &lt;br /&gt;
    (bool) &amp;amp;robots_deny - запрет для отображения в карте сайта&lt;br /&gt;
    (string) &amp;amp;link - ссылка страницы&lt;br /&gt;
&lt;br /&gt;
Пример обработчика:&lt;br /&gt;
&lt;br /&gt;
 public function update_sitemap(iUmiEventPoint $oEventPoint) {&lt;br /&gt;
     if ($oEventPoint-&amp;gt;getMode() === &amp;quot;before&amp;quot;) {&lt;br /&gt;
         $link = &amp;amp;$oEventPoint-&amp;gt;getRef(&amp;#039;link&amp;#039;);&lt;br /&gt;
         $robots_deny = &amp;amp;$oEventPoint-&amp;gt;getRef(&amp;#039;robots_deny&amp;#039;);&lt;br /&gt;
         @$page_id = &amp;amp;$oEventPoint-&amp;gt;getParam(&amp;#039;id&amp;#039;);&lt;br /&gt;
         $page = $page_id ? umiHierarchy::getInstance()-&amp;gt;getElement($page_id) : false;&lt;br /&gt;
         if (!$page instanceof umiHierarchyElement) return true;&lt;br /&gt;
         //&lt;br /&gt;
         // исключаем из карты сайта все комментарии&lt;br /&gt;
         if ($page-&amp;gt;getModule() == &amp;#039;comments&amp;#039;) $robots_deny = true;&lt;br /&gt;
         //&lt;br /&gt;
         // на сайте используются модифицированные адреса объектов каталога&lt;br /&gt;
         if ($page-&amp;gt;getMethod() == &amp;#039;object&amp;#039;) {&lt;br /&gt;
             $link = &amp;#039;{your_domain}&amp;#039; . $page-&amp;gt;getAltName() . &amp;#039;/&amp;#039;;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return true;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Lesnik512</name></author>
		
	</entry>
</feed>