<?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=Kalexey</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=Kalexey"/>
	<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/Kalexey"/>
	<updated>2026-05-04T19:44:28Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%81_%D0%BF%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C%D1%8E_%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=3989</id>
		<title>Поиск с панелью предложений</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%81_%D0%BF%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C%D1%8E_%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=3989"/>
		<updated>2012-09-05T12:17:03Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Вопросы и уроки разработки сайтов на UMI.CMS]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Задача&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Реализовать автодополнение при наборе текста в текстовых полях.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Решение&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Одно из решений для реализации данной возможности - применение плагина [http://jqueryui.com/demos/autocomplete/ jQuery UI Autocomplete] (client side) и использование кастомного макроса, который будет &amp;quot;вытаскивать&amp;quot; массив проиндексированных слов (server side).&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Поскольку Autocomplete уже входит в состав UMI.CMS (файл &amp;quot;/js/jquery/jquery-ui.js&amp;quot;), нам остаётся только описать стиль для данного виджета.&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Совет&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Удобнее всего скачать уже готовый стиль (тему) с официального сайта jQuery UI по ссылке: [http://jqueryui.com/download http://jqueryui.com/download]. Нас интересует только Autocomplete, поэтому можно убрать все флажки кроме &amp;quot;Autocomplete&amp;quot; в разделе &amp;quot;Widgets&amp;quot;. Из скачанного архива нам понадобится только файл вида &amp;quot;jquery-ui-[версия].custom.css&amp;quot; в папке &amp;quot;/css/[название_темы]/&amp;quot; (по-умолчанию используется тема &amp;quot;ui-lightness&amp;quot;). Его необходимо скопировать в папку &amp;quot;/css&amp;quot;. В дальнейшем в данном файле можно подредактировать стиль вручную (настроить шрифт, цвет, добавить скроллбар для выпадающего списка и т.д.).&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Пишем кастомный макрос, который будет возвращать массив проиндексированных слов из базы данных (подробнее про написание кастомных макросов Вы можете прочитать в [http://api.umi-cms.ru/ документации]):&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function wordsArray() {&lt;br /&gt;
    $config = mainConfiguration::getInstance();&lt;br /&gt;
    $host = $config-&amp;gt;get(&amp;#039;connections&amp;#039;, &amp;#039;core.host&amp;#039;);&lt;br /&gt;
    $login = $config-&amp;gt;get(&amp;#039;connections&amp;#039;, &amp;#039;core.login&amp;#039;);&lt;br /&gt;
    $password = $config-&amp;gt;get(&amp;#039;connections&amp;#039;, &amp;#039;core.password&amp;#039;);&lt;br /&gt;
    $dbname = $config-&amp;gt;get(&amp;#039;connections&amp;#039;, &amp;#039;core.dbname&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    $pool = ConnectionPool::getInstance();&lt;br /&gt;
    $pool-&amp;gt;addConnection(&amp;#039;core&amp;#039;, $host, $login, $password, $dbname);&lt;br /&gt;
    $pool-&amp;gt;init();&lt;br /&gt;
&lt;br /&gt;
    $connection = $pool-&amp;gt;getConnection(&amp;#039;core&amp;#039;);&lt;br /&gt;
    $sql = &amp;quot;SELECT word FROM cms3_search_index_words&amp;quot;;&lt;br /&gt;
    $query = $connection-&amp;gt;query($sql, true);&lt;br /&gt;
    $pool-&amp;gt;closeConnection(&amp;#039;core&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    for($i = 0, $numrows = mysql_num_rows($query); $i &amp;lt; $numrows; $i++) {&lt;br /&gt;
        $row = mysql_fetch_assoc($query);&lt;br /&gt;
	$words[$i] = strval($row[&amp;#039;word&amp;#039;]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return json_encode($words);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Текст макроса размещаем в файле &amp;quot;/classes/modules/search/__custom.php&amp;quot;, сразу после строчки &amp;quot;//TODO: Write your macroses here&amp;quot;. Также нужно задать разрешения для макроса. Создаём в той же папке файл &amp;quot;permissions.custom.php&amp;quot; и в нём настраиваем разрешения:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  $permissions = Array(&lt;br /&gt;
      &amp;#039;search&amp;#039; =&amp;gt; Array(&amp;#039;wordsArray&amp;#039;)&lt;br /&gt;
  );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для подключения плагина и стиля необходимо написать следующий код в &amp;#039;&amp;#039;&amp;#039;основном&amp;#039;&amp;#039;&amp;#039; шаблоне:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;/css/jquery-ui-1.8.20.custom.css&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;/js/jquery/jquery-ui.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        $(&amp;#039;#search&amp;#039;).autocomplete({ source: %search wordsArray()% });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
В данном случае мы подключаем Autocomplete для текстового поля с идентификатором &amp;quot;search&amp;quot;. Можно подключать Autocomplete к конкретным полям через их идентификатор, либо воспользоваться специальным классом для таких полей:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        $(&amp;#039;.autocomplete&amp;#039;).autocomplete({ source: %search wordsArray()% });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Подключаем Autocomplete для всех полей с классом &amp;quot;autocomplete&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Про настройки для Autocomplete можно прочитать в [http://jqueryui.com/demos/autocomplete/ официальной документации] виджета (вкладка &amp;quot;Options&amp;quot;).&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Важно&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для сайтов с большим количеством контента необходимо применять опцию &amp;quot;minLength&amp;quot;. Она позволяет настроить минимальное число символов для активации Autocomplete. Иначе скрипт может &amp;quot;подвисать&amp;quot; на достаточно большое время.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
В данной статье механизм тестировался на сайте с числом уникальных проиндексированных слов ~50000 и параметром &amp;quot;minLength&amp;quot; равным 3. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        $(&amp;#039;.autocomplete&amp;#039;).autocomplete({ &lt;br /&gt;
            source: %search wordsArray()%,&lt;br /&gt;
            minLength: 3 &lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Пример использования параметра &amp;quot;minLength&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Также хорошо бы добавить скроллбар для виджета, так как количество элементов может быть довольно большим. Для этого нам нужно подправить стиль &amp;quot;ui-autocomplete&amp;quot; в файле &amp;quot;jquery-ui-[версия].custom.css&amp;quot; (либо в Вашем собственном файле стилей):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.ui-autocomplete {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    cursor: default;&lt;br /&gt;
    max-height: 250px;&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Ограничиваем максимальную высоту виджета в 250 пикселей, скрываем горизонтальный скроллбар и настраиваем отображение вертикального скроллбара по необходимости.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:autocomplete.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Пример работы Autocomplete&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%81_%D0%BF%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C%D1%8E_%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=3988</id>
		<title>Поиск с панелью предложений</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%81_%D0%BF%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C%D1%8E_%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9&amp;diff=3988"/>
		<updated>2012-09-05T11:21:23Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Вопросы и уроки разработки сайтов на UMI.CMS]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Задача&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Реализовать автодополнение при наборе текста в текстовых полях.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Решение&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Одно из решений для реализации данной возможности - применение плагина [http://jqueryui.com/demos/autocomplete/ jQuery UI Autocomplete] (client side) и использование кастомного макроса, который будет &amp;quot;вытаскивать&amp;quot; массив проиндексированных слов (server side).&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Поскольку Autocomplete уже входит в состав UMI.CMS (файл &amp;quot;/js/jquery/jquery-ui.js&amp;quot;), нам остаётся только описать стиль для данного виджета.&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Совет&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Удобнее всего скачать уже готовый стиль (тему) с официального сайта jQuery UI по ссылке: [http://jqueryui.com/download http://jqueryui.com/download]. Нас интересует только Autocomplete, поэтому можно убрать все флажки кроме &amp;quot;Autocomplete&amp;quot; в разделе &amp;quot;Widgets&amp;quot;. Из скачанного архива нам понадобится только файл вида &amp;quot;jquery-ui-[версия].custom.css&amp;quot; в папке &amp;quot;/css/[название_темы]/&amp;quot; (по-умолчанию используется тема &amp;quot;ui-lightness&amp;quot;). Его необходимо скопировать в папку &amp;quot;/css&amp;quot;. В дальнейшем в данном файле можно подредактировать стиль вручную (настроить шрифт, цвет, добавить скроллбар для выпадающего списка и т.д.).&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Пишем кастомный макрос, который будет возвращать массив проиндексированных слов из базы данных (подробнее про написание кастомных макросов Вы можете прочитать в [http://api.umi-cms.ru/ документации]):&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function wordsArray() {&lt;br /&gt;
    $config = mainConfiguration::getInstance();&lt;br /&gt;
    $host = $config-&amp;gt;get(&amp;#039;connections&amp;#039;, &amp;#039;core.host&amp;#039;);&lt;br /&gt;
    $login = $config-&amp;gt;get(&amp;#039;connections&amp;#039;, &amp;#039;core.login&amp;#039;);&lt;br /&gt;
    $password = $config-&amp;gt;get(&amp;#039;connections&amp;#039;, &amp;#039;core.password&amp;#039;);&lt;br /&gt;
    $dbname = $config-&amp;gt;get(&amp;#039;connections&amp;#039;, &amp;#039;core.dbname&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    $pool = ConnectionPool::getInstance();&lt;br /&gt;
    $pool-&amp;gt;addConnection(&amp;#039;core&amp;#039;, $host, $login, $password, $dbname);&lt;br /&gt;
    $pool-&amp;gt;init();&lt;br /&gt;
&lt;br /&gt;
    $connection = $pool-&amp;gt;getConnection(&amp;#039;core&amp;#039;);&lt;br /&gt;
    $sql = &amp;quot;SELECT word FROM cms3_search_index_words&amp;quot;;&lt;br /&gt;
    $query = $connection-&amp;gt;query($sql, true);&lt;br /&gt;
&lt;br /&gt;
    for($i = 0, $numrows = mysql_num_rows($query); $i &amp;lt; $numrows; $i++) {&lt;br /&gt;
        $row = mysql_fetch_assoc($query);&lt;br /&gt;
	$words[$i] = strval($row[&amp;#039;word&amp;#039;]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return json_encode($words);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Текст макроса размещаем в файле &amp;quot;/classes/modules/search/__custom.php&amp;quot;, сразу после строчки &amp;quot;//TODO: Write your macroses here&amp;quot;. Также нужно задать разрешения для макроса. Создаём в той же папке файл &amp;quot;permissions.custom.php&amp;quot; и в нём настраиваем разрешения:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  $permissions = Array(&lt;br /&gt;
      &amp;#039;search&amp;#039; =&amp;gt; Array(&amp;#039;wordsArray&amp;#039;)&lt;br /&gt;
  );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для подключения плагина и стиля необходимо написать следующий код в &amp;#039;&amp;#039;&amp;#039;основном&amp;#039;&amp;#039;&amp;#039; шаблоне:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link href=&amp;quot;/css/jquery-ui-1.8.20.custom.css&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;/js/jquery/jquery-ui.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        $(&amp;#039;#search&amp;#039;).autocomplete({ source: %search wordsArray()% });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
В данном случае мы подключаем Autocomplete для текстового поля с идентификатором &amp;quot;search&amp;quot;. Можно подключать Autocomplete к конкретным полям через их идентификатор, либо воспользоваться специальным классом для таких полей:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        $(&amp;#039;.autocomplete&amp;#039;).autocomplete({ source: %search wordsArray()% });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Подключаем Autocomplete для всех полей с классом &amp;quot;autocomplete&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Про настройки для Autocomplete можно прочитать в [http://jqueryui.com/demos/autocomplete/ официальной документации] виджета (вкладка &amp;quot;Options&amp;quot;).&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Важно&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для сайтов с большим количеством контента необходимо применять опцию &amp;quot;minLength&amp;quot;. Она позволяет настроить минимальное число символов для активации Autocomplete. Иначе скрипт может &amp;quot;подвисать&amp;quot; на достаточно большое время.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
В данной статье механизм тестировался на сайте с числом уникальных проиндексированных слов ~50000 и параметром &amp;quot;minLength&amp;quot; равным 3. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        $(&amp;#039;.autocomplete&amp;#039;).autocomplete({ &lt;br /&gt;
            source: %search wordsArray()%,&lt;br /&gt;
            minLength: 3 &lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Пример использования параметра &amp;quot;minLength&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Также хорошо бы добавить скроллбар для виджета, так как количество элементов может быть довольно большим. Для этого нам нужно подправить стиль &amp;quot;ui-autocomplete&amp;quot; в файле &amp;quot;jquery-ui-[версия].custom.css&amp;quot; (либо в Вашем собственном файле стилей):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.ui-autocomplete {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    cursor: default;&lt;br /&gt;
    max-height: 250px;&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Ограничиваем максимальную высоту виджета в 250 пикселей, скрываем горизонтальный скроллбар и настраиваем отображение вертикального скроллбара по необходимости.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:autocomplete.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Пример работы Autocomplete&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_xml-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3906</id>
		<title>Универсальный метод для кэширования xml-данных в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_xml-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3906"/>
		<updated>2012-08-15T11:14:36Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторая информация по кэшированию xml-данных была представлена в данной статье:&lt;br /&gt;
[[Кэширование результата работы метода getCreateForm в XSL-шаблоне]]&lt;br /&gt;
&lt;br /&gt;
Универсальный метод, который необходимо добавить в файл &amp;#039;&amp;#039;&amp;#039;classes/modules/cutom.php&amp;#039;&amp;#039;&amp;#039;, может быть представлен в следующем виде:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function xsltCache($expire = 3600, $stream){ &lt;br /&gt;
      $params_temp = array_slice(func_get_args(), 2);&lt;br /&gt;
      $params = array();&lt;br /&gt;
      foreach($params_temp as $param){&lt;br /&gt;
         $params[] = (strpos($param, &amp;#039;/&amp;#039;) !== FALSE) ? &amp;quot;(&amp;quot; . $param . &amp;quot;)&amp;quot; : $param;     &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      $params_str = implode(&amp;#039;/&amp;#039;, $params);&lt;br /&gt;
      $url = $stream . &amp;quot;://&amp;quot; . $params_str;&lt;br /&gt;
      $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/udatacache/&amp;#039;;  &lt;br /&gt;
      $path = $folder . md5($url) . &amp;#039;.xml&amp;#039;;&lt;br /&gt;
      if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
      if(is_file($path)) $mtime = filemtime($path);&lt;br /&gt;
   &lt;br /&gt;
      if(!is_file($path) || time() &amp;gt; ($mtime + $expire)) {    &lt;br /&gt;
        $data = file_get_contents($url);&lt;br /&gt;
        file_put_contents($path, $data);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $data); &lt;br /&gt;
      }else{&lt;br /&gt;
        $result = file_get_contents($path);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&lt;br /&gt;
      }	&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
а сам вызов в XSL-шаблоне будет следующим:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udata://custom/xsltCache/3600/custom/lidersCustom/20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
где 3600 - время кэширования xml-данных в секундах,&lt;br /&gt;
custom - модуль&lt;br /&gt;
lidersCustom - метод&lt;br /&gt;
20 - один из параметров, их может быть больше одного&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Категория:Верстка в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_html-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3905</id>
		<title>Универсальный метод для кэширования html-данных в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_html-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3905"/>
		<updated>2012-08-15T11:14:17Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В одной из статей уже был рассмотрен способ кэширования html-кода в XSLT,&lt;br /&gt;
это была статья [[Блочное кэширование html-кода в XSLT]]&lt;br /&gt;
&lt;br /&gt;
В данной статьей будет  показан пример универсального кастомного метода, &lt;br /&gt;
в который можно передавать основной вызов: модуль, метод, параметры и также&lt;br /&gt;
путь к шаблону для трансформации xml данных. Кастомный метод необходимо&lt;br /&gt;
добавить в файл &amp;#039;&amp;#039;&amp;#039;classes/modules/custom.php&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function xsltHtmlCache($expire = 3600, $module, $method){&lt;br /&gt;
      $xslFilePath = getRequest(&amp;#039;xsl&amp;#039;);&lt;br /&gt;
        // $filePath - путь к xsl-шаблону трансформации.&lt;br /&gt;
      $filePath = CURRENT_WORKING_DIR . &amp;#039;/xsltTpls/&amp;#039; . $xslFilePath;&lt;br /&gt;
      if(!is_file($filePath)) return;&lt;br /&gt;
      &lt;br /&gt;
      $args = func_get_args();&lt;br /&gt;
      $params = array_slice($args, 3);&lt;br /&gt;
      $params_str = implode(&amp;#039;/&amp;#039;, $params);&lt;br /&gt;
      $url = &amp;quot;udata://&amp;quot; . $module . &amp;#039;/&amp;#039; . $method . &amp;#039;/&amp;#039; . $params_str;&lt;br /&gt;
&lt;br /&gt;
      $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/udatacache/&amp;#039;;  &lt;br /&gt;
      $path = $folder . md5($url . $filePath) . &amp;#039;.xml&amp;#039;;&lt;br /&gt;
      if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
      if(is_file($path)) $mtime = filemtime($path);&lt;br /&gt;
   &lt;br /&gt;
      if(!is_file($path) || time() &amp;gt; ($mtime + $expire)) {    &lt;br /&gt;
      	&lt;br /&gt;
        $xsltDom = new DomDocument;&lt;br /&gt;
        $xsltDom-&amp;gt;resolveExternals = true;&lt;br /&gt;
        $xsltDom-&amp;gt;substituteEntities = true;&lt;br /&gt;
      &lt;br /&gt;
        $xsltDom-&amp;gt;load($filePath, DOM_LOAD_OPTIONS);&lt;br /&gt;
 &lt;br /&gt;
        $xslt = new xsltProcessor;&lt;br /&gt;
        $xslt-&amp;gt;registerPHPFunctions();&lt;br /&gt;
        $xslt-&amp;gt;importStyleSheet($xsltDom);&lt;br /&gt;
        $page_id = cmsController::getInstance()-&amp;gt;getCurrentElementId();&lt;br /&gt;
        $parent_id = &amp;quot;&amp;quot;;&lt;br /&gt;
        $active    = &amp;quot;&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        if($page_id){&lt;br /&gt;
           $page = umiHierarchy::getInstance()-&amp;gt;getElement($page_id);&lt;br /&gt;
           $parent_id = $page-&amp;gt;getParentId();&lt;br /&gt;
           $active    = (int) $page-&amp;gt;getIsDefault();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Добавляем необходимые глобальные переменные, которые можно будет использовать в xsl-шаблоне &lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;parent-id&amp;#039;, $parent_id);&lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;document-page-id&amp;#039;, $page_id);&lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;active&amp;#039;, $active);&lt;br /&gt;
        &lt;br /&gt;
        $dom_new = new DOMDocument(&amp;quot;1.0&amp;quot;, &amp;quot;utf-8&amp;quot;);&lt;br /&gt;
        // $xml - xml-данные для трансформации.&lt;br /&gt;
        $xml = file_get_contents($url);&lt;br /&gt;
        $dom_new-&amp;gt;loadXML($xml);&lt;br /&gt;
 &lt;br /&gt;
        //производим трансформацию&lt;br /&gt;
        $result = $xslt-&amp;gt;transformToXML($dom_new);&lt;br /&gt;
        //html-данные необходимо включить в CDATA и в какой либо корневой узел.&lt;br /&gt;
        $result = &amp;quot;&amp;lt;udata mode=\&amp;quot;cache\&amp;quot;&amp;gt;&amp;lt;![CDATA[&amp;quot; . $result . &amp;quot;]]&amp;gt;&amp;lt;/udata&amp;gt;&amp;quot;;&lt;br /&gt;
        // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&lt;br /&gt;
         &lt;br /&gt;
      }else{&lt;br /&gt;
        $result = file_get_contents($path);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&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;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;xsl:value-of select=&amp;quot;document(&amp;#039;udata://custom/xsltHtmlCache/3600/catalog/getCategoryList//8//1?xsl=modules/catalog/category-cache.xsl&amp;#039;)/udata&amp;quot; &lt;br /&gt;
disable-output-escaping=&amp;quot;yes&amp;quot; /&amp;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;
        // page_id текущей страницы сайта&lt;br /&gt;
        $page_id = cmsController::getInstance()-&amp;gt;getCurrentElementId();&lt;br /&gt;
        $parent_id = &amp;quot;&amp;quot;;&lt;br /&gt;
        $active    = &amp;quot;&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        if($page_id){&lt;br /&gt;
           $page = umiHierarchy::getInstance()-&amp;gt;getElement($page_id);&lt;br /&gt;
           $parent_id = $page-&amp;gt;getParentId();&lt;br /&gt;
           $active    = (int) $page-&amp;gt;getIsDefault();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Добавляем необходимые глобальные переменные, которые можно будет использовать в xsl-шаблоне &lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;parent-id&amp;#039;, $parent_id);&lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;document-page-id&amp;#039;, $page_id);&lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;active&amp;#039;, $active);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Категория: Верстка в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_xml-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3904</id>
		<title>Универсальный метод для кэширования xml-данных в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_xml-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3904"/>
		<updated>2012-08-15T06:48:13Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторая информация по кешированию xml-данных была представлена в данной статье:&lt;br /&gt;
[[Кэширование результата работы метода getCreateForm в XSL-шаблоне]]&lt;br /&gt;
&lt;br /&gt;
Универсальный метод, который необходимо добавить в файл &amp;#039;&amp;#039;&amp;#039;classes/modules/cutom.php&amp;#039;&amp;#039;&amp;#039;, может быть представлен в следующем виде:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function xsltCache($expire = 3600, $stream){ &lt;br /&gt;
      $params_temp = array_slice(func_get_args(), 2);&lt;br /&gt;
      $params = array();&lt;br /&gt;
      foreach($params_temp as $param){&lt;br /&gt;
         $params[] = (strpos($param, &amp;#039;/&amp;#039;) !== FALSE) ? &amp;quot;(&amp;quot; . $param . &amp;quot;)&amp;quot; : $param;     &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      $params_str = implode(&amp;#039;/&amp;#039;, $params);&lt;br /&gt;
      $url = $stream . &amp;quot;://&amp;quot; . $params_str;&lt;br /&gt;
      $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/udatacache/&amp;#039;;  &lt;br /&gt;
      $path = $folder . md5($url) . &amp;#039;.xml&amp;#039;;&lt;br /&gt;
      if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
      if(is_file($path)) $mtime = filemtime($path);&lt;br /&gt;
   &lt;br /&gt;
      if(!is_file($path) || time() &amp;gt; ($mtime + $expire)) {    &lt;br /&gt;
        $data = file_get_contents($url);&lt;br /&gt;
        file_put_contents($path, $data);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $data); &lt;br /&gt;
      }else{&lt;br /&gt;
        $result = file_get_contents($path);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&lt;br /&gt;
      }	&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
а сам вызов в XSL-шаблоне будет следующим:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udata://custom/xsltCache/3600/custom/lidersCustom/20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
где 3600 - время кеширования xml-данных в секундах,&lt;br /&gt;
custom - модуль&lt;br /&gt;
lidersCustom - метод&lt;br /&gt;
20 - один из параметров, их может быть больше одного&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Категория:Верстка в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:VITL%27&amp;diff=3903</id>
		<title>Участник:VITL&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:VITL%27&amp;diff=3903"/>
		<updated>2012-08-15T06:40:15Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Декабрь==&lt;br /&gt;
*[[Универсальный метод для кэширования xml-данных в XSLT]]&lt;br /&gt;
*[[Универсальный метод для кэширования html-данных в XSLT]]&lt;br /&gt;
==Ноябрь==&lt;br /&gt;
*[[Отображение третьего столбца для поля типа Составное]]&lt;br /&gt;
*[[Белый экран вместо редиректа]]&lt;br /&gt;
*[[Изменение расположения доменов зарегистрированных в системе]]&lt;br /&gt;
*[[Отладка кастомных методов]]&lt;br /&gt;
*[[Установка и удаление модуля]]&lt;br /&gt;
*[[Как нельзя делать определение максимальной и минимальной цен товара в разделе]]&lt;br /&gt;
*[[Важное отличие между полным получением данных через upage и частичным используя upage.page id.field name]]&lt;br /&gt;
*[[Кэширование списка акционных товаров, для выбора одного случайного товара из кэша]]&lt;br /&gt;
*[[Использование статичных данных, вместо динамических]]&lt;br /&gt;
*[[Особенности импорта и экспорта CSV в модуле Обмен данными]]&lt;br /&gt;
==Октябрь==&lt;br /&gt;
*[[Отключение вывода блока Права доступа в режиме редактирования страницы]]&lt;br /&gt;
*[[Добавление обработчиков событий в ваш кастомный модуль ]]&lt;br /&gt;
*[[Использование модуля GeoIP в TPL-шаблонизаторе]]&lt;br /&gt;
*[[Импортирование Единицы измерения номенклатурной позиции]]&lt;br /&gt;
*[[Форматирование чисел средствами XSLT]]&lt;br /&gt;
*[[Изменение формирования номера следующего заказа и имени заказа]]&lt;br /&gt;
*[[Кэширование динамического многоуровнего меню]]&lt;br /&gt;
*[[Работа с подписчиками средствами API UMI.CMS]]&lt;br /&gt;
*[[Удаление страниц через клиентскую часть]]&lt;br /&gt;
*[[Заказ черновик или временная корзина]]&lt;br /&gt;
==Сентябрь==&lt;br /&gt;
*[[Блочное кэширование html-кода в TPL]]&lt;br /&gt;
*[[Запрет выполнения метода в XSLT при вызове его через браузер]]&lt;br /&gt;
*[[Обновление объектов созданных вручную данными из 1С]]&lt;br /&gt;
*[[Смена contentType с html на xml в кастом методе]]&lt;br /&gt;
*[[Подключение нужного xsl-файла в зависимости от типа страницы]]&lt;br /&gt;
*[[Изменение шаблонов страниц, после того как данные уже импортированы из 1С]]&lt;br /&gt;
*[[Процесс формирования заказов для 1С]]&lt;br /&gt;
*[[Проверка активности раздела каталога при использовании макроса getCategoryList]]&lt;br /&gt;
*[[Отключение экспорта виртуальных копий в YML]]&lt;br /&gt;
*[[Добавление кастомных настроек в модуле каталог]]&lt;br /&gt;
==Август==&lt;br /&gt;
*[[Расширение функционала метода emarket basket]]&lt;br /&gt;
*[[Отключение складывания скидок на заказ и товар]]&lt;br /&gt;
*[[Особенность добавления прав на модули для пользователей]]&lt;br /&gt;
*[[Оформление заказа в один шаг – tpl шаблонизатор]]&lt;br /&gt;
*[[Оформление заказа в один шаг – xslt шаблонизатор]]&lt;br /&gt;
*[[Определение страницы с которой была сделана виртуальная копия]]&lt;br /&gt;
*[[Почему не сохраняется положение структуры и панель с модулями]]&lt;br /&gt;
*[[Дополнительные параметры фильтрации в адресной строке]]&lt;br /&gt;
*[[Общий принцип подключения новой платежной системы]]&lt;br /&gt;
*[[Логика работы макроса content в tpl-шаблонах]]&lt;br /&gt;
==Июль==&lt;br /&gt;
*[[Структура шаблонов модуля Каталог, демо-сайт Современный]]&lt;br /&gt;
*[[Скидка на товар в зависимости от количества этого товара в корзине]]&lt;br /&gt;
*[[Подключение к второй базе данных в кастомном методе]]&lt;br /&gt;
*[[Добавление нового правила валидации поля (restriction)]]&lt;br /&gt;
*[[Корректное отображение полей в первой группе нового типа данных]]&lt;br /&gt;
*[[Использование ajax модуля Обмен данными для выполнения определенных операций]]&lt;br /&gt;
*[[Блочное кэширование html-кода в XSLT]]&lt;br /&gt;
*[[Назначение методов getEditLink и getObjectEditLink в модуле системы]]&lt;br /&gt;
*[[Назначение метода getDatasetConfiguration в модуле системы]]&lt;br /&gt;
*[[Пример административного шаблона для объектов]]&lt;br /&gt;
==Июнь==&lt;br /&gt;
*[[Замена метода go_to для подсчета переходов по баннеру]]&lt;br /&gt;
*[[Подсчет количества объектов каталога в разделе через События]]&lt;br /&gt;
==Май==&lt;br /&gt;
*[[Добавление Doctype в XSLT]]&lt;br /&gt;
*[[Максимальное и минимальное значение цен среди объектов каталога]]&lt;br /&gt;
==Апрель==&lt;br /&gt;
*[[Повторение ранее совершенного заказа]]&lt;br /&gt;
*[[Передача значений на кириллице в кастомный метод]]&lt;br /&gt;
*[[Мультиязычность - локализация сайта на tpl-шаблонах]]&lt;br /&gt;
*[[Получение доступа к значениям php массивов $ REQUEST и $ SERVER]]&lt;br /&gt;
*[[Отображение индекса последней страницы при постраничном выводе, tpl-шаблоны]]&lt;br /&gt;
*[[Смена вкладки модуля, открываемой по умолчанию]]&lt;br /&gt;
*[[События - подсчет количества комментариев для страницы]]&lt;br /&gt;
*[[Кэширование результата работы метода getCreateForm в XSL-шаблоне]]&lt;br /&gt;
*[[События - подписка на рассылки при регистрации пользователя]]&lt;br /&gt;
*[[Динамическое изменение количества отображаемых товаров на странице, tpl-шаблоны]]&lt;br /&gt;
==Март==&lt;br /&gt;
*[[Импорт объектов каталога сразу в несколько разделов]]&lt;br /&gt;
*[[Получение настроек системы в кастомном методе]]&lt;br /&gt;
*[[Добавление вкладок в кастомный модуль]]&lt;br /&gt;
*[[События – отслеживание изменения цены товаров в административной части]]&lt;br /&gt;
*[[Экспорт в YML списка объектов каталога]]&lt;br /&gt;
*[[Указание статуса 404 Not Found]]&lt;br /&gt;
*[[Использование выпадающего списка с множественным выбором]]&lt;br /&gt;
*[[Redirect в системе, перенос сайта на umi.cms, ч.2]]&lt;br /&gt;
*[[Сортировка элементов справочника средствами XSLT]]&lt;br /&gt;
*[[Captcha и ее смена при каждом обновлении страницы, отправке сообщения]]&lt;br /&gt;
==Февраль==&lt;br /&gt;
*[[Использование кастомных макросов в XSLT]]&lt;br /&gt;
*[[Добавление нового правила скидки]]&lt;br /&gt;
*[[Смена шагов оформления заказа на этапе delivery]]&lt;br /&gt;
*[[Подключение дополнительных шаблонов для административного интерфейса]]&lt;br /&gt;
*[[Вывод простых данных кастомного модуля в административной части]]&lt;br /&gt;
*[[Добавление нового сплиттера для импорта данных]]&lt;br /&gt;
*[[Подключение поддерживаемых платежных систем]]&lt;br /&gt;
*[[Кастомизация макроса catalog getObjectsList для ускорения формирования страницы]]&lt;br /&gt;
*[[Кастомизация getCreateForm и getEditForm для гибкой верстки полей]]&lt;br /&gt;
*[[Модификация способа вывода объектов каталога (TPL)]]&lt;br /&gt;
==Январь==&lt;br /&gt;
*[[Selector - протокол выборки данных]] *&lt;br /&gt;
*[[Голосование за страницы]]&lt;br /&gt;
*[[Динамическое изменение количества объектов на странице]]&lt;br /&gt;
*[[Протокол ulang и ENTITY, мультиязычность]]&lt;br /&gt;
*[[Определение позиции объекта в списке данных, первый – последний, четный – нечетный]]&lt;br /&gt;
*[[Использование макроса system makeThumbnail с учетом ориентации изображения, TPL-шаблоны]]&lt;br /&gt;
*[[Поиск страниц с другого домена используя протокол usel или API]]&lt;br /&gt;
*[[Редактирование страниц с клиентской части сайта]]&lt;br /&gt;
*[[Механизм работы кэша в umi]]&lt;br /&gt;
*[[Рекомендации по ускорению работы сайта]]&lt;br /&gt;
*[[Трансформация xml-даннных в кастомном php макросе]]&lt;br /&gt;
&lt;br /&gt;
==Декабрь==&lt;br /&gt;
*[[Округление значения стоимости заказа]]&lt;br /&gt;
*[[Добавление нового формата экспорта данных]]&lt;br /&gt;
*[[Ссылка на платежную квитанцию в личном кабинете]]&lt;br /&gt;
*[[Подключение редиректа]]&lt;br /&gt;
*[[Добавление товара в корзину с указанием Количества]]&lt;br /&gt;
*[[Сброс информации о текущем покупателе, обнуление cookie]]&lt;br /&gt;
*[[Добавление комментария при оформлении заказа]]&lt;br /&gt;
*[[Кастомизация административной части на примере модуля emarket]]&lt;br /&gt;
*[[Функционал импорта и экспорта в csv для какого-либо модуля]]&lt;br /&gt;
*[[Создание скидки для emarket-а с помощью API]]&lt;br /&gt;
==Ноябрь==&lt;br /&gt;
*[[Captcha – изменение настроек (2.8)]]&lt;br /&gt;
*[[Настройка rss ленты]]&lt;br /&gt;
*[[Визуальное оформление недавно добавленных товаров]]&lt;br /&gt;
*[[Изменение значений полей h1 и title при обновлении данных]]&lt;br /&gt;
*[[Получение ссылки на страницу с использованием параметра object id]]&lt;br /&gt;
*[[Автоматическая индексация страниц при интеграции с 1С]]&lt;br /&gt;
*[[Получение object id страницы зная element id (tpl-шаблоны)]]&lt;br /&gt;
*[[Redirect в системе, перенос сайта на umi.cms]]&lt;br /&gt;
*[[Создание кастомного метода для вывода отфильтрованного выпадающего списка]]&lt;br /&gt;
*[[Изменение имени заказа при оформлении покупки]]&lt;br /&gt;
*[[Редактирование объектов каталога определенного типа при табличном отображении]]&lt;br /&gt;
==Октябрь==&lt;br /&gt;
*[[Мультидоменность – замена макроса content (tpl)]]&lt;br /&gt;
*[[Мультиязычность - перевод выпадающих списков]]&lt;br /&gt;
*[[Получение доступа к методом модулей]]&lt;br /&gt;
*[[Ошибки при интеграции с 1С]]&lt;br /&gt;
*[[Формирование YML файла для разных доменов в системе]]&lt;br /&gt;
*[[Управление адресами доставки в настройках пользователя (tpl)]]&lt;br /&gt;
*[[Удаление адреса доставки]]&lt;br /&gt;
==Сентябрь==&lt;br /&gt;
*[[Другой вариант платежной квитанции]]&lt;br /&gt;
*[[Интеграция с 1С на хостингах Sweb и RU-center (nic.ru)]]&lt;br /&gt;
*[[Отправка писем менеджерам в зависимости от домена]]&lt;br /&gt;
*[[Настройка экспорта в YML (Яндекс-маркет)]]&lt;br /&gt;
*[[Автоматическая установка значений по умолчанию]]&lt;br /&gt;
*[[Переключатель (radio) вместо выпадающего списка]]&lt;br /&gt;
*[[Robots.txt на каждый домен (2.8)]]&lt;br /&gt;
*[[Настройка верстки для каждого поля при использовании webforms add]]&lt;br /&gt;
*[[Импорт товаров в систему 1С]]&lt;br /&gt;
*[[События – автоматическое наследование meta keywords и meta descriptions]]&lt;br /&gt;
==Август==&lt;br /&gt;
*[[Возможности extended-pack]]&lt;br /&gt;
*[[Единственный тип данных Объект каталога, при импорте из 1С]]&lt;br /&gt;
*[[Импорт всех типов Цен]]&lt;br /&gt;
*[[Импорт нескольких изображений для одного товара]]&lt;br /&gt;
*[[Перемещение элементов при импорте их из 1С]]&lt;br /&gt;
*[[Сохранение типов полей из 1С]]&lt;br /&gt;
*[[Суть интеграции с 1С]]&lt;br /&gt;
*[[Техническая сторона импорта данных из 1С]]&lt;br /&gt;
*[[Удаление элементов или снятие активности при импорте данных из 1С]]&lt;br /&gt;
*[[Использование нескольких Цен для одного товара]]&lt;br /&gt;
==Июль==&lt;br /&gt;
*[[Создание собственного модуля (страницы)]]&lt;br /&gt;
*[[Отображение цены товара на сайте в другой валюте (2.8)]]&lt;br /&gt;
*[[Экспорт данных в формат UmiDump2.0 при нехватке memory limit на хостинге]]&lt;br /&gt;
*[[Вложенные комментарии]]&lt;br /&gt;
*[[Уведомление менеджеру о заказе, со всем необходимыми данными (emarket)]]&lt;br /&gt;
*[[Использование метода setValue при сохранении строки типа HTML-текст]]&lt;br /&gt;
*[[Использование Событий для подсчета Фотографий в Фотоальбоме]]&lt;br /&gt;
==Июнь==&lt;br /&gt;
*[[Добавление счетчика liveinternet]]&lt;br /&gt;
*[[Форматирование значения цены товара (вставка пробелов)]]&lt;br /&gt;
==Май==&lt;br /&gt;
*[[Добавление страниц через клиентскую часть]]&lt;br /&gt;
*[[Фильтрация объектов каталога по всем разделам]]&lt;br /&gt;
*[[Переиндексация сайта при нехватке производительности сервера]]&lt;br /&gt;
*[[Примеры использования макроса data doSelection]]&lt;br /&gt;
*[[Экспорт в YML при нехватке производительности сервера (umi 2.8.1)]]&lt;br /&gt;
*[[Работа с опционными свойствами (umi 2.8, tpl шаблоны)]]&lt;br /&gt;
*[[Создание кастомного макроса на основе существующего (data getObjectList)]]&lt;br /&gt;
==Апрель==&lt;br /&gt;
*[[Обновленный макрос doSelection, который принимает GET параметры (Фильтрация данных)]]&lt;br /&gt;
*[[Отображение значения скидки в процентах tpl 2.8)]]&lt;br /&gt;
*[[Где прячутся тэги?]]&lt;br /&gt;
*[[Экспорт в YML при нехватке оперативной памяти под php скрипты (версия 2.7.4 и ниже)]]&lt;br /&gt;
*[[Смена изображения при наведении на него курсора мыши]]&lt;br /&gt;
*[[Подключение кастомных макросов и событий для модулей]]&lt;br /&gt;
*[[Вывод значения поля для случайной страницы]]&lt;br /&gt;
*[[Добавление новых (кастомных) полей для модуля Блоги 2.0]]&lt;br /&gt;
*[[Экспорт определенных полей в csv файл]]&lt;br /&gt;
*[[Архитектура базы данных системы]]&lt;br /&gt;
== Март ==&lt;br /&gt;
*[[Пример создания сложной фильтрации по каталогу (кастомный макрос)]]&lt;br /&gt;
*[[Вывод страницы в карте сайте с отключением вывода в меню]]&lt;br /&gt;
*[[Ограничение вывода тэгов при использовании макроса tagsDomainEfficiencyCloud]]&lt;br /&gt;
*[[Дополнительный параметр для поиска (search branches)]]&lt;br /&gt;
*[[Карта сайта без каких-либо настроек страниц]]&lt;br /&gt;
*[[Недокументированный макрос news calendar() для Гостей]]&lt;br /&gt;
*[[Добавление новых (кастомных) полей для модуля Комментарии]]&lt;br /&gt;
*[[Вывод общей стоимости заказа без скидки (umi 2.8 и выше)]]&lt;br /&gt;
*[[Вывод значений полей группы в виде таблицы]]&lt;br /&gt;
*[[Получение значений полей у родительских страниц любого уровня]]&lt;br /&gt;
== Февраль ==&lt;br /&gt;
*[[Обновленный макрос system order_by (двойная сортировка по одной ссылке)]]&lt;br /&gt;
*[[Экспорт в YML (vendor.model)]]&lt;br /&gt;
*[[Вывод значения цены без скидки]]&lt;br /&gt;
*[[Отображение цены товара в другой валюте]]&lt;br /&gt;
*[[Как удалить всех подписчиков на рассылку?]]&lt;br /&gt;
*[[Вывод даты последней модификации страницы (API)]]&lt;br /&gt;
*[[Вывод автора страницы]]&lt;br /&gt;
*[[Вывод аватара пользователя]]&lt;br /&gt;
*[[Автоматический перевод полей страниц для сайтов En-Ru + подключение нужных шаблонов]]&lt;br /&gt;
*[[Вызов шаблона, макроса в зависимоcти от значения]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%92_phpinfo.php_%D0%B2%D0%B8%D0%B4%D0%BD%D0%BE,_%D1%87%D1%82%D0%BE_eaccelerator_%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD,_%D0%BE%D0%B4%D0%BD%D0%B0%D0%BA%D0%BE,_%D0%B2_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%BE%D0%B2_%D0%B5%D0%B3%D0%BE_%D0%BD%D0%B5%D1%82&amp;diff=3901</id>
		<title>В phpinfo.php видно, что eaccelerator установлен, однако, в списке кэширующих механизмов его нет</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%92_phpinfo.php_%D0%B2%D0%B8%D0%B4%D0%BD%D0%BE,_%D1%87%D1%82%D0%BE_eaccelerator_%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD,_%D0%BE%D0%B4%D0%BD%D0%B0%D0%BA%D0%BE,_%D0%B2_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%BE%D0%B2_%D0%B5%D0%B3%D0%BE_%D0%BD%D0%B5%D1%82&amp;diff=3901"/>
		<updated>2012-08-15T06:29:56Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «В phpinfo.php видно, что eaccelerator установлен, однако, в списке кеширующих механизмов его нет» в «[[В phpinfo.php видно, что eaccelerator устано�&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eaccelerator должен быть скомпилирован с опцией --with-eaccelerator-shared-memory. Обратитесь к хостинг-провайдеру с просьбой пересобрать этот модуль.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Решение проблем и ошибок]]&lt;br /&gt;
[[Категория:Кеширование]]&lt;br /&gt;
[[Категория:e-accelerator]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%92_phpinfo.php_%D0%B2%D0%B8%D0%B4%D0%BD%D0%BE,_%D1%87%D1%82%D0%BE_eaccelerator_%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD,_%D0%BE%D0%B4%D0%BD%D0%B0%D0%BA%D0%BE,_%D0%B2_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%BE%D0%B2_%D0%B5%D0%B3%D0%BE_%D0%BD%D0%B5%D1%82&amp;diff=3902</id>
		<title>В phpinfo.php видно, что eaccelerator установлен, однако, в списке кеширующих механизмов его нет</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%92_phpinfo.php_%D0%B2%D0%B8%D0%B4%D0%BD%D0%BE,_%D1%87%D1%82%D0%BE_eaccelerator_%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD,_%D0%BE%D0%B4%D0%BD%D0%B0%D0%BA%D0%BE,_%D0%B2_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B5_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D1%85_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC%D0%BE%D0%B2_%D0%B5%D0%B3%D0%BE_%D0%BD%D0%B5%D1%82&amp;diff=3902"/>
		<updated>2012-08-15T06:29:56Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «В phpinfo.php видно, что eaccelerator установлен, однако, в списке кеширующих механизмов его нет» в «[[В phpinfo.php видно, что eaccelerator устано�&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[В phpinfo.php видно, что eaccelerator установлен, однако, в списке кэширующих механизмов его нет]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D0%B5%D1%88%D0%B0&amp;diff=3900</id>
		<title>Кэширование списка акционных товаров, для выбора одного случайного товара из кеша</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D0%B5%D1%88%D0%B0&amp;diff=3900"/>
		<updated>2012-08-15T05:54:53Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Кэширование списка акционных товаров, для выбора одного случайного товара из кеша» в «[[Кэширование списка акционных това&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Кэширование списка акционных товаров, для выбора одного случайного товара из кэша]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D1%8D%D1%88%D0%B0&amp;diff=3899</id>
		<title>Кэширование списка акционных товаров, для выбора одного случайного товара из кэша</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D1%8D%D1%88%D0%B0&amp;diff=3899"/>
		<updated>2012-08-15T05:54:53Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Кэширование списка акционных товаров, для выбора одного случайного товара из кеша» в «[[Кэширование списка акционных това&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Не редким случаем является тот вариант, когда необходимо на сайте выводить один или несколько акционных товаров, и чтобы при обновлении страницы, из определенного списка эти товары выбирались случайным образом. &lt;br /&gt;
Если сайт небольшой, мало данных, небольшая посещаемость, то можно конечно используя протокол &amp;#039;&amp;#039;&amp;#039;usel&amp;#039;&amp;#039;&amp;#039; , написать шаблон, по которому в разделе каталога будет случайным образом выбираться один элемент каталога отмеченный чекбоксом Акция.&lt;br /&gt;
В случае TPL-шаблонизатора, необходимо будет еще использовать макрос &amp;#039;&amp;#039;&amp;#039;%data doSelection()%&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Но если ситуация по сайту совсем иная, это серьезный Интернет магазин, с большой посещаемостью, то было бы неправильным, при каждой загрузке страницы, из всего каталога, выбирать случайным образом товар, с указанными параметрами.&lt;br /&gt;
&lt;br /&gt;
Для решения данного вопроса, без лишней нагрузки на сервер, можно использовать кэширование данных. Из общего списка товаров, которые подходят по нужным условиям, делается [http://ru.php.net/manual/ru/function.serialize.php сериализованный] массив и сохраняется в кэш, можно просто в файл. Кэш можно настроить так, чтобы он обновлялся один раз в час. Данные из Кэша (или из файла) считываются, потом с помощью php-функции [http://ru.php.net/manual/ru/function.array-rand.php array_rand] из массива можно выбрать случайное значение (id товара):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arr_serialize = file_get_contents(&amp;quot;…&amp;quot;);&lt;br /&gt;
$arr_id = unserialize($arr_serialize);&lt;br /&gt;
if(!is_array($arr_id) || !sizeof($arr_id)) return &amp;quot;&amp;quot;;&lt;br /&gt;
$rand_key = array_rand($arr_id);&lt;br /&gt;
$page_id = $arr_id[$rand_key];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как четкий алгоритм для выборки только id страниц с помощью протокола &amp;#039;&amp;#039;&amp;#039;Selector&amp;#039;&amp;#039;&amp;#039; еще не опреден, то лучше использовать  [http://api.umi-cms.ru/ umiSelection]. Примеры кэширования данных можно посмотреть в этом же разделе, что и эта статья.&lt;br /&gt;
[[Категория: Верстка в XSLT ]] [[Категория: Верстка в TPL]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D1%8D%D1%88%D0%B0&amp;diff=3898</id>
		<title>Кэширование списка акционных товаров, для выбора одного случайного товара из кэша</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D1%8D%D1%88%D0%B0&amp;diff=3898"/>
		<updated>2012-08-15T05:54:45Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Не редким случаем является тот вариант, когда необходимо на сайте выводить один или несколько акционных товаров, и чтобы при обновлении страницы, из определенного списка эти товары выбирались случайным образом. &lt;br /&gt;
Если сайт небольшой, мало данных, небольшая посещаемость, то можно конечно используя протокол &amp;#039;&amp;#039;&amp;#039;usel&amp;#039;&amp;#039;&amp;#039; , написать шаблон, по которому в разделе каталога будет случайным образом выбираться один элемент каталога отмеченный чекбоксом Акция.&lt;br /&gt;
В случае TPL-шаблонизатора, необходимо будет еще использовать макрос &amp;#039;&amp;#039;&amp;#039;%data doSelection()%&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Но если ситуация по сайту совсем иная, это серьезный Интернет магазин, с большой посещаемостью, то было бы неправильным, при каждой загрузке страницы, из всего каталога, выбирать случайным образом товар, с указанными параметрами.&lt;br /&gt;
&lt;br /&gt;
Для решения данного вопроса, без лишней нагрузки на сервер, можно использовать кэширование данных. Из общего списка товаров, которые подходят по нужным условиям, делается [http://ru.php.net/manual/ru/function.serialize.php сериализованный] массив и сохраняется в кэш, можно просто в файл. Кэш можно настроить так, чтобы он обновлялся один раз в час. Данные из Кэша (или из файла) считываются, потом с помощью php-функции [http://ru.php.net/manual/ru/function.array-rand.php array_rand] из массива можно выбрать случайное значение (id товара):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arr_serialize = file_get_contents(&amp;quot;…&amp;quot;);&lt;br /&gt;
$arr_id = unserialize($arr_serialize);&lt;br /&gt;
if(!is_array($arr_id) || !sizeof($arr_id)) return &amp;quot;&amp;quot;;&lt;br /&gt;
$rand_key = array_rand($arr_id);&lt;br /&gt;
$page_id = $arr_id[$rand_key];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как четкий алгоритм для выборки только id страниц с помощью протокола &amp;#039;&amp;#039;&amp;#039;Selector&amp;#039;&amp;#039;&amp;#039; еще не опреден, то лучше использовать  [http://api.umi-cms.ru/ umiSelection]. Примеры кэширования данных можно посмотреть в этом же разделе, что и эта статья.&lt;br /&gt;
[[Категория: Верстка в XSLT ]] [[Категория: Верстка в TPL]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D1%8D%D1%88%D0%B0&amp;diff=3896</id>
		<title>Кэширование списка акционных товаров, для выбора одного случайного товара из кэша</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D1%8D%D1%88%D0%B0&amp;diff=3896"/>
		<updated>2012-08-15T05:54:23Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Кеширование списка акционных товаров, для выбора одного случайного товара из кеша» в «[[Кэширование списка акционных това&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Не редким случаем является тот вариант, когда необходимо на сайте выводить один или несколько акционных товаров, и чтобы при обновлении страницы, из определенного списка эти товары выбирались случайным образом. &lt;br /&gt;
Если сайт небольшой, мало данных, небольшая посещаемость, то можно конечно используя протокол &amp;#039;&amp;#039;&amp;#039;usel&amp;#039;&amp;#039;&amp;#039; , написать шаблон, по которому в разделе каталога будет случайным образом выбираться один элемент каталога отмеченный чекбоксом Акция.&lt;br /&gt;
В случае TPL-шаблонизатора, необходимо будет еще использовать макрос &amp;#039;&amp;#039;&amp;#039;%data doSelection()%&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Но если ситуация по сайту совсем иная, это серьезный Интернет магазин, с большой посещаемостью, то было бы неправильным, при каждой загрузке страницы, из всего каталога, выбирать случайным образом товар, с указанными параметрами.&lt;br /&gt;
&lt;br /&gt;
Для решения данного вопроса, без лишней нагрузки на сервер, можно использовать кеширование данных. Из общего списка товаров, которые подходят по нужным условиям, делается [http://ru.php.net/manual/ru/function.serialize.php сериализованный] массив и сохраняется в кеш, можно просто в файл. Кеш можно настроить так, чтобы он обновлялся один раз в час. Данные из Кеша (или из файла) считываются, потом с помощью php-функции [http://ru.php.net/manual/ru/function.array-rand.php array_rand] из массива можно выбрать случайное значение (id товара):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$arr_serialize = file_get_contents(&amp;quot;…&amp;quot;);&lt;br /&gt;
$arr_id = unserialize($arr_serialize);&lt;br /&gt;
if(!is_array($arr_id) || !sizeof($arr_id)) return &amp;quot;&amp;quot;;&lt;br /&gt;
$rand_key = array_rand($arr_id);&lt;br /&gt;
$page_id = $arr_id[$rand_key];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как четкий алгоритм для выборки только id страниц с помощью протокола &amp;#039;&amp;#039;&amp;#039;Selector&amp;#039;&amp;#039;&amp;#039; еще не опреден, то лучше использовать  [http://api.umi-cms.ru/ umiSelection]. Примеры кеширования данных можно посмотреть в этом же разделе, что и эта статья.&lt;br /&gt;
[[Категория: Верстка в XSLT ]] [[Категория: Верстка в TPL]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D0%B5%D1%88%D0%B0&amp;diff=3897</id>
		<title>Кеширование списка акционных товаров, для выбора одного случайного товара из кеша</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B0%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D1%85_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2,_%D0%B4%D0%BB%D1%8F_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D0%BE%D0%B3%D0%BE_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0_%D0%B8%D0%B7_%D0%BA%D0%B5%D1%88%D0%B0&amp;diff=3897"/>
		<updated>2012-08-15T05:54:23Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Кеширование списка акционных товаров, для выбора одного случайного товара из кеша» в «[[Кэширование списка акционных това&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Кэширование списка акционных товаров, для выбора одного случайного товара из кеша]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D0%BD%D1%8E&amp;diff=3895</id>
		<title>Кэширование динамического многоуровнего меню</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D0%BD%D1%8E&amp;diff=3895"/>
		<updated>2012-08-15T05:54:11Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной статье будет рассмотрен пример кэширования динамического многоуровнего меню разделов каталога,&lt;br /&gt;
при использовании TPL-шаблонизатора. Логика для XSLT-будет аналогичная. В данном случае, &lt;br /&gt;
динамическим меню называется то меню, которое изменяется в зависимости от того в каком разделе каталога мы находимся,&lt;br /&gt;
т.е. определенная ветка меню раскрыта, другие свернуты. Логика кэша заключается в том, что должен быть&lt;br /&gt;
кэш-файл на каждый раздел каталога. Будет подключаться тот кэш-файл, который связан с текущим &amp;quot;Разделом&lt;br /&gt;
каталога&amp;quot;. Если посетитель находится на странице &amp;quot;Объекта каталога&amp;quot;, то проверяется к какому разделу каталога принадлежит&lt;br /&gt;
данный объект, и потом берется кэш связанный с этим разделом каталога. Также, должен быть еще один кэш для случая&lt;br /&gt;
когда пользователь находится на странице, которая не является ни разделом каталога, ни объектом каталога.&lt;br /&gt;
Для реализации данной задачи добавим дополнительный кастомный php-метод в файл classes/modules/custom.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function menuLeftCustom(){&lt;br /&gt;
        // время жизни кэш-файла&lt;br /&gt;
        $expire = 86400;&lt;br /&gt;
        $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/tplcache/&amp;#039;;&lt;br /&gt;
        if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
        $controller = cmsController::getInstance();&lt;br /&gt;
        $current_page_id = $controller-&amp;gt;getCurrentElementId();&lt;br /&gt;
        if($current_page_id){&lt;br /&gt;
            $element = umiHierarchy::getInstance()-&amp;gt;getElement($current_page_id);&lt;br /&gt;
            $type_id = $element-&amp;gt;getTypeId();&lt;br /&gt;
            // 5 - раздел каталога, 6 - объект каталога&lt;br /&gt;
            if($type_id == 5 || $type_id == 6){&lt;br /&gt;
               $rel_id = ($type_id == 6) ? $element-&amp;gt;getParentId() : $current_page_id;&lt;br /&gt;
               $data_path = $folder . &amp;#039;menuLeft_rel_&amp;#039; . $rel_id . &amp;#039;.html&amp;#039;;&lt;br /&gt;
               if(is_file($data_path)){&lt;br /&gt;
                  $mtime = filemtime($data_path);&lt;br /&gt;
                  if(time() &amp;lt; ($mtime + $expire)) {&lt;br /&gt;
                    return file_get_contents($data_path);&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
               $ini = $controller-&amp;gt;getModule(&amp;#039;content&amp;#039;);&lt;br /&gt;
               $result = $ini-&amp;gt;menu(&amp;#039;menu_left&amp;#039;, &amp;#039;2&amp;#039;, 1533);&lt;br /&gt;
               file_put_contents($data_path, $result);&lt;br /&gt;
               return $result;&lt;br /&gt;
                       &lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
        $data_path = $folder . &amp;#039;menuLeft_all.html&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
        if(is_file($data_path)){&lt;br /&gt;
            $mtime = filemtime($data_path);&lt;br /&gt;
            if(time() &amp;lt; ($mtime + $expire)) {&lt;br /&gt;
              return file_get_contents($data_path);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        $ini = $controller-&amp;gt;getModule(&amp;#039;content&amp;#039;);&lt;br /&gt;
        $result = $ini-&amp;gt;menu(&amp;#039;menu_left&amp;#039;, &amp;#039;2&amp;#039;, 1533);&lt;br /&gt;
        file_put_contents($data_path, $result);&lt;br /&gt;
        return $result;&lt;br /&gt;
        &lt;br /&gt;
  } &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Стандартный вызов макрос в шаблоне был бы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%content menu(&amp;#039;menu_left&amp;#039;, &amp;#039;2&amp;#039;, 1533)%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
При использовании кастомного метода, вызов должен быть:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%custom menuLeftCustom()%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В методе используются иерархические типы данных Раздела каталога и Объекта каталога (5 - раздел каталога, 6 - объект каталога), для вашего сайта вы их должны определить в настройках модуля Шаблоны данных, в режиме xml:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/admin/data/config/.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
также, в кастомном методе,в двух местах пропишите вызов метода &amp;#039;&amp;#039;&amp;#039;menu&amp;#039;&amp;#039;&amp;#039; с вашими параметрами:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$result = $ini-&amp;gt;menu(&amp;#039;menu_left&amp;#039;, &amp;#039;2&amp;#039;, 1533);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Верстка в TPL]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D0%BD%D1%8E&amp;diff=3893</id>
		<title>Кэширование динамического многоуровнего меню</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D0%BD%D1%8E&amp;diff=3893"/>
		<updated>2012-08-15T05:53:40Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Кеширование динамического многоуровнего меню» в «Кэширование динамического многоуровнего меню»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной статье будет рассмотрен пример кеширования динамического многоуровнего меню разделов каталога,&lt;br /&gt;
при использовании TPL-шаблонизатора. Логика для XSLT-будет аналогичная. В данном случае, &lt;br /&gt;
динамическим меню называется то меню, которое изменяется в зависимости от того в каком разделе каталога мы находимся,&lt;br /&gt;
т.е. определенная ветка меню раскрыта, другие свернуты. Логика кеша заключается в том, что должен быть&lt;br /&gt;
кеш-файл на каждый раздел каталога. Будет подключаться тот кеш файл, который связан с текущим &amp;quot;Разделом&lt;br /&gt;
каталога&amp;quot;. Если посетитель находится на странице &amp;quot;Объекта каталога&amp;quot;, то проверяется к какому разделу каталога принадлежит&lt;br /&gt;
данный объект, и потом берется кеш связанный с этим разделом каталога. Также, должен быть еще один кеш для случая&lt;br /&gt;
когда пользователь находится на странице, которая не является ни разделом каталога, ни объектом каталога.&lt;br /&gt;
Для реализации данной задачи добавим дополнительный кастомный php-метод в файл classes/modules/custom.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function menuLeftCustom(){&lt;br /&gt;
        // время жизни кеш-файла&lt;br /&gt;
        $expire = 86400;&lt;br /&gt;
        $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/tplcache/&amp;#039;;&lt;br /&gt;
        if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
        $controller = cmsController::getInstance();&lt;br /&gt;
        $current_page_id = $controller-&amp;gt;getCurrentElementId();&lt;br /&gt;
        if($current_page_id){&lt;br /&gt;
            $element = umiHierarchy::getInstance()-&amp;gt;getElement($current_page_id);&lt;br /&gt;
            $type_id = $element-&amp;gt;getTypeId();&lt;br /&gt;
            // 5 - раздел каталога, 6 - объект каталога&lt;br /&gt;
            if($type_id == 5 || $type_id == 6){&lt;br /&gt;
               $rel_id = ($type_id == 6) ? $element-&amp;gt;getParentId() : $current_page_id;&lt;br /&gt;
               $data_path = $folder . &amp;#039;menuLeft_rel_&amp;#039; . $rel_id . &amp;#039;.html&amp;#039;;&lt;br /&gt;
               if(is_file($data_path)){&lt;br /&gt;
                  $mtime = filemtime($data_path);&lt;br /&gt;
                  if(time() &amp;lt; ($mtime + $expire)) {&lt;br /&gt;
                    return file_get_contents($data_path);&lt;br /&gt;
                  }&lt;br /&gt;
               }&lt;br /&gt;
               $ini = $controller-&amp;gt;getModule(&amp;#039;content&amp;#039;);&lt;br /&gt;
               $result = $ini-&amp;gt;menu(&amp;#039;menu_left&amp;#039;, &amp;#039;2&amp;#039;, 1533);&lt;br /&gt;
               file_put_contents($data_path, $result);&lt;br /&gt;
               return $result;&lt;br /&gt;
                       &lt;br /&gt;
            }       &lt;br /&gt;
        }&lt;br /&gt;
        $data_path = $folder . &amp;#039;menuLeft_all.html&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
        if(is_file($data_path)){&lt;br /&gt;
            $mtime = filemtime($data_path);&lt;br /&gt;
            if(time() &amp;lt; ($mtime + $expire)) {&lt;br /&gt;
              return file_get_contents($data_path);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        $ini = $controller-&amp;gt;getModule(&amp;#039;content&amp;#039;);&lt;br /&gt;
        $result = $ini-&amp;gt;menu(&amp;#039;menu_left&amp;#039;, &amp;#039;2&amp;#039;, 1533);&lt;br /&gt;
        file_put_contents($data_path, $result);&lt;br /&gt;
        return $result;&lt;br /&gt;
        &lt;br /&gt;
  } &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Стандартный вызов макрос в шаблоне был бы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%content menu(&amp;#039;menu_left&amp;#039;, &amp;#039;2&amp;#039;, 1533)%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
При использовании кастомного метода, вызов должен быть:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%custom menuLeftCustom()%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В методе используются иерархические типы данных Раздела каталога и Объекта каталога (5 - раздел каталога, 6 - объект каталога), для вашего сайта вы их должны определить в настройках модуля Шаблоны данных, в режиме xml:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/admin/data/config/.xml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
также, в кастомном методе,в двух местах пропишите вызов метода &amp;#039;&amp;#039;&amp;#039;menu&amp;#039;&amp;#039;&amp;#039; с вашими параметрами:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$result = $ini-&amp;gt;menu(&amp;#039;menu_left&amp;#039;, &amp;#039;2&amp;#039;, 1533);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Верстка в TPL]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D0%BD%D1%8E&amp;diff=3894</id>
		<title>Кеширование динамического многоуровнего меню</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B3%D0%BE_%D0%BC%D0%B5%D0%BD%D1%8E&amp;diff=3894"/>
		<updated>2012-08-15T05:53:40Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Кеширование динамического многоуровнего меню» в «Кэширование динамического многоуровнего меню»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Кэширование динамического многоуровнего меню]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_TPL&amp;diff=3892</id>
		<title>Блочное кэширование html-кода в TPL</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_TPL&amp;diff=3892"/>
		<updated>2012-08-15T05:53:28Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной статье представлен пример кастомного php-метода, с помощью которого можно сохранить результат выполнения tpl-макроса в кэш, на указанное время. Метод необходимо добавить в файл &amp;#039;&amp;#039;&amp;#039;classes/modules/custom.php&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function tplcache($expire = 0, $module = &amp;#039;&amp;#039;, $method = &amp;#039;&amp;#039;) {&lt;br /&gt;
  $expire = (int) $expire;&lt;br /&gt;
  &lt;br /&gt;
  $macrosArr = array();&lt;br /&gt;
  $macrosArr[&amp;#039;module&amp;#039;] = htmlspecialchars($module);&lt;br /&gt;
  $macrosArr[&amp;#039;method&amp;#039;] = htmlspecialchars($method);&lt;br /&gt;
  &lt;br /&gt;
  $args = func_get_args();&lt;br /&gt;
  $params = array_slice($args, 3);&lt;br /&gt;
  $macrosArr[&amp;#039;args&amp;#039;] = $params;&lt;br /&gt;
  &lt;br /&gt;
  $params_path = &amp;#039;&amp;#039;;&lt;br /&gt;
  foreach($params as $arg){&lt;br /&gt;
    if($params_path) $params_path .= &amp;quot;, &amp;#039;&amp;quot; . $arg . &amp;quot;&amp;#039;&amp;quot;;&lt;br /&gt;
    else $params_path .= &amp;quot;&amp;#039;&amp;quot; . $arg . &amp;quot;&amp;#039;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  // ключ для кэша&lt;br /&gt;
  $path = $macrosArr[&amp;#039;module&amp;#039;] . &amp;#039; &amp;#039; . $macrosArr[&amp;#039;method&amp;#039;] . &amp;#039;(&amp;#039;. $params_path . &amp;#039;)&amp;#039;;&lt;br /&gt;
  $templater = templater::getInstance();&lt;br /&gt;
  $cacheFrontend = cacheFrontend::getInstance();&lt;br /&gt;
  // проверка на активность поддерживаемого кэша, apc, eaccelerator, memcached и т.п.&lt;br /&gt;
  if($cacheFrontend-&amp;gt;getCurrentCacheEngineName()){&lt;br /&gt;
    // загрузка данных из кэша, промежуточный ключ $path&lt;br /&gt;
    if($data = $cacheFrontend-&amp;gt;loadData($path)) {&lt;br /&gt;
      return $data;&lt;br /&gt;
    }&lt;br /&gt;
    // выполнение метода, с указанными параметрами&lt;br /&gt;
    $result = $templater-&amp;gt;executeMacros($macrosArr);&lt;br /&gt;
    &lt;br /&gt;
    if($expire &amp;gt; 0) {&lt;br /&gt;
      // сохранение данных в кэш&lt;br /&gt;
      $cacheFrontend-&amp;gt;saveData($path, $result, $expire);&lt;br /&gt;
    }&lt;br /&gt;
  }else{&lt;br /&gt;
    // использование файлового кэша, данные хранятся в html-файле&lt;br /&gt;
    $cmsController = cmsController::getInstance();&lt;br /&gt;
    &lt;br /&gt;
    $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/tplcache/&amp;#039;;&lt;br /&gt;
    if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
    static $lang_id, $domain_id;&lt;br /&gt;
    if(!isset($lang_id)) $lang_id = $cmsController-&amp;gt;getCurrentLang()-&amp;gt;getId();&lt;br /&gt;
    if(!isset($domain_id)) $domain_id = $cmsController-&amp;gt;getCurrentDomain()-&amp;gt;getId();&lt;br /&gt;
    $key_path = $path . &amp;#039;_&amp;#039; . $lang_id . &amp;#039;_&amp;#039; . $domain_id;&lt;br /&gt;
    $key = sha1($key_path . SYS_CACHE_SALT);&lt;br /&gt;
    $data_path = $folder . $key . &amp;#039;.html&amp;#039;;&lt;br /&gt;
    // проверка даты создания файла и времени жизни кэша (expire)&lt;br /&gt;
    if(is_file($data_path)){&lt;br /&gt;
      $mtime = filemtime($data_path);&lt;br /&gt;
      if(time() &amp;lt; ($mtime + $expire)) {&lt;br /&gt;
        return file_get_contents($data_path);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    $result = $templater-&amp;gt;executeMacros($macrosArr);&lt;br /&gt;
    file_put_contents($data_path, $result);&lt;br /&gt;
  }&lt;br /&gt;
return $result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В методе стоит проверка на то, включен ли один из стандартных кэширующих механизмов, в случае если кэш включен, то он и используется, в ином случае используется файловый кэш. Данные файлового кэша сохраняются в папке &amp;#039;&amp;#039;&amp;#039;/sys-temp/tplcache/&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Пример стандартного вызова tpl-макроса:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%news lastlist(&amp;#039;/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/&amp;#039;, &amp;#039;home&amp;#039;, 2)%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вызова макроса через кастомный метод &amp;#039;&amp;#039;&amp;#039;tplcache&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%custom tplcache(600, &amp;#039;news&amp;#039;, &amp;#039;lastlist&amp;#039;, &amp;#039;/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/&amp;#039;, &amp;#039;home&amp;#039;, 2)%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
600 - время хранения кэша; news - модуль; lastlist - метод модуля; далее параметры метода в стандартном порядке, как в&lt;br /&gt;
[http://help-dev.umi-cms.ru/news.lastlist.html документации]&lt;br /&gt;
[[Категория:Верстка в TPL]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_TPL&amp;diff=3890</id>
		<title>Блочное кэширование html-кода в TPL</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_TPL&amp;diff=3890"/>
		<updated>2012-08-15T05:52:54Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Блочное кеширование html-кода в TPL» в «Блочное кэширование html-кода в TPL»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной статье представлен пример кастомного php-метода, с помощью которого можно сохранить результат выполнения tpl-макроса в кеш, на указанное время. Метод необходимо добавить в файл &amp;#039;&amp;#039;&amp;#039;classes/modules/custom.php&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function tplcache($expire = 0, $module = &amp;#039;&amp;#039;, $method = &amp;#039;&amp;#039;) {&lt;br /&gt;
  $expire = (int) $expire;&lt;br /&gt;
  &lt;br /&gt;
  $macrosArr = array();&lt;br /&gt;
  $macrosArr[&amp;#039;module&amp;#039;] = htmlspecialchars($module);&lt;br /&gt;
  $macrosArr[&amp;#039;method&amp;#039;] = htmlspecialchars($method);&lt;br /&gt;
  &lt;br /&gt;
  $args = func_get_args();&lt;br /&gt;
  $params = array_slice($args, 3);&lt;br /&gt;
  $macrosArr[&amp;#039;args&amp;#039;] = $params;&lt;br /&gt;
  &lt;br /&gt;
  $params_path = &amp;#039;&amp;#039;;&lt;br /&gt;
  foreach($params as $arg){&lt;br /&gt;
    if($params_path) $params_path .= &amp;quot;, &amp;#039;&amp;quot; . $arg . &amp;quot;&amp;#039;&amp;quot;;&lt;br /&gt;
    else $params_path .= &amp;quot;&amp;#039;&amp;quot; . $arg . &amp;quot;&amp;#039;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  // ключ для кеша&lt;br /&gt;
  $path = $macrosArr[&amp;#039;module&amp;#039;] . &amp;#039; &amp;#039; . $macrosArr[&amp;#039;method&amp;#039;] . &amp;#039;(&amp;#039;. $params_path . &amp;#039;)&amp;#039;;&lt;br /&gt;
  $templater = templater::getInstance();&lt;br /&gt;
  $cacheFrontend = cacheFrontend::getInstance();&lt;br /&gt;
  // проверка на активность поддерживаемого кеша, apc, eaccelerator, memcached и т.п.&lt;br /&gt;
  if($cacheFrontend-&amp;gt;getCurrentCacheEngineName()){&lt;br /&gt;
    // загрузка данных из кеша, промежуточный ключ $path&lt;br /&gt;
    if($data = $cacheFrontend-&amp;gt;loadData($path)) {&lt;br /&gt;
      return $data;&lt;br /&gt;
    }&lt;br /&gt;
    // выполнение метода, с указанными параметрами&lt;br /&gt;
    $result = $templater-&amp;gt;executeMacros($macrosArr);&lt;br /&gt;
    &lt;br /&gt;
    if($expire &amp;gt; 0) {&lt;br /&gt;
      // сохранение данных в кеш&lt;br /&gt;
      $cacheFrontend-&amp;gt;saveData($path, $result, $expire);&lt;br /&gt;
    }&lt;br /&gt;
  }else{&lt;br /&gt;
    // использование файлового кеша, данные хранятся в html-файле&lt;br /&gt;
    $cmsController = cmsController::getInstance();&lt;br /&gt;
    &lt;br /&gt;
    $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/tplcache/&amp;#039;;&lt;br /&gt;
    if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
    static $lang_id, $domain_id;&lt;br /&gt;
    if(!isset($lang_id)) $lang_id = $cmsController-&amp;gt;getCurrentLang()-&amp;gt;getId();&lt;br /&gt;
    if(!isset($domain_id)) $domain_id = $cmsController-&amp;gt;getCurrentDomain()-&amp;gt;getId();&lt;br /&gt;
    $key_path = $path . &amp;#039;_&amp;#039; . $lang_id . &amp;#039;_&amp;#039; . $domain_id;&lt;br /&gt;
    $key = sha1($key_path . SYS_CACHE_SALT);&lt;br /&gt;
    $data_path = $folder . $key . &amp;#039;.html&amp;#039;;&lt;br /&gt;
    // проверка даты создания файла и времени жизни кеша (expire)&lt;br /&gt;
    if(is_file($data_path)){&lt;br /&gt;
      $mtime = filemtime($data_path);&lt;br /&gt;
      if(time() &amp;lt; ($mtime + $expire)) {&lt;br /&gt;
        return file_get_contents($data_path);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    $result = $templater-&amp;gt;executeMacros($macrosArr);&lt;br /&gt;
    file_put_contents($data_path, $result);&lt;br /&gt;
  }&lt;br /&gt;
return $result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В методе стоит проверка на то, включен ли один из стандартных кеширующих механизмов, в случае если кеш включен, то он и используется, в ином случае используется файловый кеш. Данные файлового кеша сохраняются в папке &amp;#039;&amp;#039;&amp;#039;/sys-temp/tplcache/&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Пример стандартного вызова tpl-макроса:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%news lastlist(&amp;#039;/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/&amp;#039;, &amp;#039;home&amp;#039;, 2)%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример вызова макроса через кастомный метод &amp;#039;&amp;#039;&amp;#039;tplcache&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%custom tplcache(600, &amp;#039;news&amp;#039;, &amp;#039;lastlist&amp;#039;, &amp;#039;/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/&amp;#039;, &amp;#039;home&amp;#039;, 2)%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
600 - время хранения кеша; news - модуль; lastlist - метод модуля; далее параметры метода в стандартном порядке, как в&lt;br /&gt;
[http://help-dev.umi-cms.ru/news.lastlist.html документации]&lt;br /&gt;
[[Категория:Верстка в TPL]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_TPL&amp;diff=3891</id>
		<title>Блочное кеширование html-кода в TPL</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_TPL&amp;diff=3891"/>
		<updated>2012-08-15T05:52:54Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Блочное кеширование html-кода в TPL» в «Блочное кэширование html-кода в TPL»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Блочное кэширование html-кода в TPL]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_XSLT&amp;diff=3889</id>
		<title>Блочное кэширование html-кода в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_XSLT&amp;diff=3889"/>
		<updated>2012-08-15T05:52:42Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной статье будет приведен пример небольшого кастомного php-макроса, с помощью которого можно закэшировать определенный html-блок сайта, допустим список разделов каталога. В стандартном xsl шаблоне происходит начальный вызов, xsl:apply-templates, потом полученные xml-данные обрабатываются, далее происходят дополнительные вызовы для получения необходимых данных. Для очень высоко нагруженного сайта, одним из идеальных вариантов было бы кэширование не xml-данных, которые потом еще надо обработать, а итогового html-кода, одного из блоков страницы сайта.&lt;br /&gt;
Рассмотрим пример метода для реализации нашей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function categoryCache(){&lt;br /&gt;
&lt;br /&gt;
  $xsltDom = new DomDocument;&lt;br /&gt;
  $xsltDom-&amp;gt;resolveExternals = true;&lt;br /&gt;
  $xsltDom-&amp;gt;substituteEntities = true;&lt;br /&gt;
  // $filePath - путь к xsl-шаблону трансформации.&lt;br /&gt;
  $filePath = CURRENT_WORKING_DIR . &amp;#039;/xsltTpls/leftCache.xsl&amp;#039;;&lt;br /&gt;
  $xsltDom-&amp;gt;load($filePath, DOM_LOAD_OPTIONS);&lt;br /&gt;
  &lt;br /&gt;
  $xslt = new xsltProcessor;&lt;br /&gt;
  $xslt-&amp;gt;registerPHPFunctions();&lt;br /&gt;
  $xslt-&amp;gt;importStyleSheet($xsltDom);&lt;br /&gt;
  &lt;br /&gt;
  $dom_new = new DOMDocument(&amp;quot;1.0&amp;quot;, &amp;quot;utf-8&amp;quot;);&lt;br /&gt;
  // $xml - xml-данные для трансформации.&lt;br /&gt;
  $xml = file_get_contents(&amp;#039;udata://catalog/getCategoryList/void/shop/&amp;#039;);&lt;br /&gt;
  $dom_new-&amp;gt;loadXML($xml);&lt;br /&gt;
  &lt;br /&gt;
  //производим трансформацию&lt;br /&gt;
  $result = $xslt-&amp;gt;transformToXML($dom_new);&lt;br /&gt;
  //html-данные необходимо включить в CDATA и в какой либо корневой узел.&lt;br /&gt;
  $result = &amp;#039;&amp;lt;udata&amp;gt;&amp;lt;![CDATA[&amp;#039; . $result . &amp;#039;]]&amp;gt;&amp;lt;/udata&amp;gt;&amp;#039;;&lt;br /&gt;
  &lt;br /&gt;
  // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS&lt;br /&gt;
  return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Метод можно добавить в файл &amp;#039;&amp;#039;&amp;#039;classes/modules/custom.php&amp;#039;&amp;#039;&amp;#039;, тогда вызов в xsl-шаблоне будет следующим:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;xsl:value-of select=&amp;quot;document(&amp;#039;udata://custom/categoryCache?expire=36000&amp;#039;)/udata&amp;quot; disable-output-escaping=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученный html-код будет закэширован на час, если на сайте включен кэш. В случае необходимости, можно настроить сохранение кэша в текстовый файл на сервере, как это было сделано в данной статье [[Кэширование результата работы метода getCreateForm в XSL-шаблоне]] . Пример метода, для кэширования данных в html-файл:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function getCategoryListCustom(){&lt;br /&gt;
      $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/udatacache/&amp;#039;;  &lt;br /&gt;
      $path = $folder . &amp;#039;left-columnCache.xml&amp;#039;;&lt;br /&gt;
      if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
      if(is_file($path)) $mtime = filemtime($path);&lt;br /&gt;
      $expire = 86400;&lt;br /&gt;
     &lt;br /&gt;
      if(!is_file($path) || time() &amp;gt; ($mtime + $expire)) {&lt;br /&gt;
        $xsltDom = new DomDocument;&lt;br /&gt;
        $xsltDom-&amp;gt;resolveExternals = true;&lt;br /&gt;
        $xsltDom-&amp;gt;substituteEntities = true;&lt;br /&gt;
        // $filePath - путь к xsl-шаблону трансформации.&lt;br /&gt;
        $filePath = CURRENT_WORKING_DIR . &amp;#039;/xsltTpls/modules/catalog/leftCache.xsl&amp;#039;;&lt;br /&gt;
        $xsltDom-&amp;gt;load($filePath, DOM_LOAD_OPTIONS);&lt;br /&gt;
&lt;br /&gt;
        $xslt = new xsltProcessor;&lt;br /&gt;
        $xslt-&amp;gt;registerPHPFunctions();&lt;br /&gt;
        $xslt-&amp;gt;importStyleSheet($xsltDom);&lt;br /&gt;
       &lt;br /&gt;
        $dom_new = new DOMDocument(&amp;quot;1.0&amp;quot;, &amp;quot;utf-8&amp;quot;);&lt;br /&gt;
        // $xml - xml-данные для трансформации.&lt;br /&gt;
        $xml = file_get_contents(&amp;#039;udata://catalog/getCategoryList/void/shop/&amp;#039;);&lt;br /&gt;
        $dom_new-&amp;gt;loadXML($xml);&lt;br /&gt;
       &lt;br /&gt;
        //производим трансформацию&lt;br /&gt;
        $result = $xslt-&amp;gt;transformToXML($dom_new);&lt;br /&gt;
        //html-данные необходимо включить в CDATA и в какой либо корневой узел.&lt;br /&gt;
        $result = &amp;quot;&amp;lt;udata mode=\&amp;quot;cache\&amp;quot;&amp;gt;&amp;lt;![CDATA[&amp;quot; . $result . &amp;quot;]]&amp;gt;&amp;lt;/udata&amp;gt;&amp;quot;;&lt;br /&gt;
        file_put_contents($path, $result);&lt;br /&gt;
&lt;br /&gt;
        // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result); &lt;br /&gt;
      }else{&lt;br /&gt;
        $result = file_get_contents($path);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&lt;br /&gt;
      }	&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример шаблона &amp;#039;&amp;#039;&amp;#039;leftCache.xsl&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE xsl:stylesheet SYSTEM &amp;quot;ulang://i18n/constants.dtd:file&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; &lt;br /&gt;
  xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; &lt;br /&gt;
  xmlns:xlink=&amp;quot;http://www.w3.org/TR/xlink&amp;quot; &lt;br /&gt;
  xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &lt;br /&gt;
  xmlns:umi=&amp;quot;http://www.umi-cms.ru/TR/umi&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:output encoding=&amp;quot;utf-8&amp;quot; method=&amp;quot;html&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;xsl:apply-templates select=&amp;quot;.&amp;quot; mode=&amp;quot;left-column&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;udata[@method = &amp;#039;getCategoryList&amp;#039;]&amp;quot; mode=&amp;quot;left-column&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;ul class=&amp;quot;catalog_menu&amp;quot; umi:button-position=&amp;quot;bottom left&amp;quot; umi:element-id=&amp;quot;{@category-id}&amp;quot; umi:region=&amp;quot;list&amp;quot; umi:module=&amp;quot;catalog&amp;quot; umi:sortable=&amp;quot;sortable&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:apply-templates select=&amp;quot;//item&amp;quot; mode=&amp;quot;left-column&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;udata[@method = &amp;#039;getCategoryList&amp;#039;]//item&amp;quot; mode=&amp;quot;left-column&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li umi:element-id=&amp;quot;{@id}&amp;quot; umi:region=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span&amp;gt;&lt;br /&gt;
          &amp;lt;a href=&amp;quot;{@link}&amp;quot; umi:field-name=&amp;quot;name&amp;quot; umi:delete=&amp;quot;delete&amp;quot; umi:empty=&amp;quot;&amp;amp;empty-section-name;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:apply-templates select=&amp;quot;document(concat(&amp;#039;udatacache://catalog/getCategoryList/void/&amp;#039;, @id))/udata&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;udata[@method = &amp;#039;getCategoryList&amp;#039;]&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;ul umi:element-id=&amp;quot;{@category-id}&amp;quot; umi:region=&amp;quot;list&amp;quot; umi:module=&amp;quot;catalog&amp;quot; umi:sortable=&amp;quot;sortable&amp;quot; umi:button-position=&amp;quot;top right&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:apply-templates select=&amp;quot;//item&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;udata[@method = &amp;#039;getCategoryList&amp;#039;]//item&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li umi:element-id=&amp;quot;{@id}&amp;quot; umi:region=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;{@link}&amp;quot; umi:field-name=&amp;quot;name&amp;quot; umi:delete=&amp;quot;delete&amp;quot; umi:empty=&amp;quot;&amp;amp;empty-section-name;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Категория:Шаблонизаторы]][[Категория:Верстка в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_XSLT&amp;diff=3887</id>
		<title>Блочное кэширование html-кода в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_XSLT&amp;diff=3887"/>
		<updated>2012-08-15T05:52:17Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Блочное кеширование html-кода в XSLT» в «Блочное кэширование html-кода в XSLT»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной статье будет приведен пример небольшого кастомного php-макроса, с помощью которого можно закешировать определенный html-блок сайта, допустим список разделов каталога. В стандартном xsl шаблоне происходит начальный вызов, xsl:apply-templates, потом полученные xml-данные обрабатываются, далее происходят дополнительные вызовы для получения необходимых данных. Для очень высоко нагруженного сайта, одним из идеальных вариантов было бы кеширование не xml-данных, которые потом еще надо обработать, а итогового html-кода, одного из блоков страницы сайта.&lt;br /&gt;
Рассмотрим пример метода для реализации нашей задачи:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function categoryCache(){&lt;br /&gt;
&lt;br /&gt;
  $xsltDom = new DomDocument;&lt;br /&gt;
  $xsltDom-&amp;gt;resolveExternals = true;&lt;br /&gt;
  $xsltDom-&amp;gt;substituteEntities = true;&lt;br /&gt;
  // $filePath - путь к xsl-шаблону трансформации.&lt;br /&gt;
  $filePath = CURRENT_WORKING_DIR . &amp;#039;/xsltTpls/leftCache.xsl&amp;#039;;&lt;br /&gt;
  $xsltDom-&amp;gt;load($filePath, DOM_LOAD_OPTIONS);&lt;br /&gt;
  &lt;br /&gt;
  $xslt = new xsltProcessor;&lt;br /&gt;
  $xslt-&amp;gt;registerPHPFunctions();&lt;br /&gt;
  $xslt-&amp;gt;importStyleSheet($xsltDom);&lt;br /&gt;
  &lt;br /&gt;
  $dom_new = new DOMDocument(&amp;quot;1.0&amp;quot;, &amp;quot;utf-8&amp;quot;);&lt;br /&gt;
  // $xml - xml-данные для трансформации.&lt;br /&gt;
  $xml = file_get_contents(&amp;#039;udata://catalog/getCategoryList/void/shop/&amp;#039;);&lt;br /&gt;
  $dom_new-&amp;gt;loadXML($xml);&lt;br /&gt;
  &lt;br /&gt;
  //производим трансформацию&lt;br /&gt;
  $result = $xslt-&amp;gt;transformToXML($dom_new);&lt;br /&gt;
  //html-данные необходимо включить в CDATA и в какой либо корневой узел.&lt;br /&gt;
  $result = &amp;#039;&amp;lt;udata&amp;gt;&amp;lt;![CDATA[&amp;#039; . $result . &amp;#039;]]&amp;gt;&amp;lt;/udata&amp;gt;&amp;#039;;&lt;br /&gt;
  &lt;br /&gt;
  // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS&lt;br /&gt;
  return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Метод можно добавить в файл &amp;#039;&amp;#039;&amp;#039;classes/modules/custom.php&amp;#039;&amp;#039;&amp;#039;, тогда вызов в xsl-шаблоне будет следующим:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;xsl:value-of select=&amp;quot;document(&amp;#039;udata://custom/categoryCache?expire=36000&amp;#039;)/udata&amp;quot; disable-output-escaping=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученный html-код будет закеширован на час, если на сайте включен кеш. В случае необходимости, можно настроить сохранение кеша в текстовый файл на сервере, как это было сделано в данной статье [[Кеширование результата работы метода getCreateForm в XSL-шаблоне]] . Пример метода, для кеширования данных в html-файл:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function getCategoryListCustom(){&lt;br /&gt;
      $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/udatacache/&amp;#039;;  &lt;br /&gt;
      $path = $folder . &amp;#039;left-columnCache.xml&amp;#039;;&lt;br /&gt;
      if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
      if(is_file($path)) $mtime = filemtime($path);&lt;br /&gt;
      $expire = 86400;&lt;br /&gt;
     &lt;br /&gt;
      if(!is_file($path) || time() &amp;gt; ($mtime + $expire)) {&lt;br /&gt;
        $xsltDom = new DomDocument;&lt;br /&gt;
        $xsltDom-&amp;gt;resolveExternals = true;&lt;br /&gt;
        $xsltDom-&amp;gt;substituteEntities = true;&lt;br /&gt;
        // $filePath - путь к xsl-шаблону трансформации.&lt;br /&gt;
        $filePath = CURRENT_WORKING_DIR . &amp;#039;/xsltTpls/modules/catalog/leftCache.xsl&amp;#039;;&lt;br /&gt;
        $xsltDom-&amp;gt;load($filePath, DOM_LOAD_OPTIONS);&lt;br /&gt;
&lt;br /&gt;
        $xslt = new xsltProcessor;&lt;br /&gt;
        $xslt-&amp;gt;registerPHPFunctions();&lt;br /&gt;
        $xslt-&amp;gt;importStyleSheet($xsltDom);&lt;br /&gt;
       &lt;br /&gt;
        $dom_new = new DOMDocument(&amp;quot;1.0&amp;quot;, &amp;quot;utf-8&amp;quot;);&lt;br /&gt;
        // $xml - xml-данные для трансформации.&lt;br /&gt;
        $xml = file_get_contents(&amp;#039;udata://catalog/getCategoryList/void/shop/&amp;#039;);&lt;br /&gt;
        $dom_new-&amp;gt;loadXML($xml);&lt;br /&gt;
       &lt;br /&gt;
        //производим трансформацию&lt;br /&gt;
        $result = $xslt-&amp;gt;transformToXML($dom_new);&lt;br /&gt;
        //html-данные необходимо включить в CDATA и в какой либо корневой узел.&lt;br /&gt;
        $result = &amp;quot;&amp;lt;udata mode=\&amp;quot;cache\&amp;quot;&amp;gt;&amp;lt;![CDATA[&amp;quot; . $result . &amp;quot;]]&amp;gt;&amp;lt;/udata&amp;gt;&amp;quot;;&lt;br /&gt;
        file_put_contents($path, $result);&lt;br /&gt;
&lt;br /&gt;
        // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result); &lt;br /&gt;
      }else{&lt;br /&gt;
        $result = file_get_contents($path);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&lt;br /&gt;
      }	&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пример шаблона &amp;#039;&amp;#039;&amp;#039;leftCache.xsl&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE xsl:stylesheet SYSTEM &amp;quot;ulang://i18n/constants.dtd:file&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;xsl:stylesheet version=&amp;quot;1.0&amp;quot; &lt;br /&gt;
  xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot; &lt;br /&gt;
  xmlns:xlink=&amp;quot;http://www.w3.org/TR/xlink&amp;quot; &lt;br /&gt;
  xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &lt;br /&gt;
  xmlns:umi=&amp;quot;http://www.umi-cms.ru/TR/umi&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:output encoding=&amp;quot;utf-8&amp;quot; method=&amp;quot;html&amp;quot; indent=&amp;quot;yes&amp;quot;/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;xsl:apply-templates select=&amp;quot;.&amp;quot; mode=&amp;quot;left-column&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;udata[@method = &amp;#039;getCategoryList&amp;#039;]&amp;quot; mode=&amp;quot;left-column&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;ul class=&amp;quot;catalog_menu&amp;quot; umi:button-position=&amp;quot;bottom left&amp;quot; umi:element-id=&amp;quot;{@category-id}&amp;quot; umi:region=&amp;quot;list&amp;quot; umi:module=&amp;quot;catalog&amp;quot; umi:sortable=&amp;quot;sortable&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:apply-templates select=&amp;quot;//item&amp;quot; mode=&amp;quot;left-column&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;udata[@method = &amp;#039;getCategoryList&amp;#039;]//item&amp;quot; mode=&amp;quot;left-column&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li umi:element-id=&amp;quot;{@id}&amp;quot; umi:region=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span&amp;gt;&lt;br /&gt;
          &amp;lt;a href=&amp;quot;{@link}&amp;quot; umi:field-name=&amp;quot;name&amp;quot; umi:delete=&amp;quot;delete&amp;quot; umi:empty=&amp;quot;&amp;amp;empty-section-name;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:apply-templates select=&amp;quot;document(concat(&amp;#039;udatacache://catalog/getCategoryList/void/&amp;#039;, @id))/udata&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;udata[@method = &amp;#039;getCategoryList&amp;#039;]&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;ul umi:element-id=&amp;quot;{@category-id}&amp;quot; umi:region=&amp;quot;list&amp;quot; umi:module=&amp;quot;catalog&amp;quot; umi:sortable=&amp;quot;sortable&amp;quot; umi:button-position=&amp;quot;top right&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;xsl:apply-templates select=&amp;quot;//item&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;xsl:template match=&amp;quot;udata[@method = &amp;#039;getCategoryList&amp;#039;]//item&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;li umi:element-id=&amp;quot;{@id}&amp;quot; umi:region=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;{@link}&amp;quot; umi:field-name=&amp;quot;name&amp;quot; umi:delete=&amp;quot;delete&amp;quot; umi:empty=&amp;quot;&amp;amp;empty-section-name;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Категория:Шаблонизаторы]][[Категория:Верстка в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_XSLT&amp;diff=3888</id>
		<title>Блочное кеширование html-кода в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%91%D0%BB%D0%BE%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_XSLT&amp;diff=3888"/>
		<updated>2012-08-15T05:52:17Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Блочное кеширование html-кода в XSLT» в «Блочное кэширование html-кода в XSLT»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Блочное кэширование html-кода в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_getCreateForm_%D0%B2_XSL-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=3886</id>
		<title>Кэширование результата работы метода getCreateForm в XSL-шаблоне</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_getCreateForm_%D0%B2_XSL-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=3886"/>
		<updated>2012-08-15T05:52:07Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В некоторых ситуациях, в XSL-шаблоне вызывается метод, который долго выполняется и отдает результат, который меняется очень редко. Таким методом может быть data getCreateForm(). В данной статье рассмотрим пример кэширования результата работы макроса getCreateForm() на один час.&lt;br /&gt;
Сначала в папке &amp;#039;&amp;#039;&amp;#039;/sys-temp/&amp;#039;&amp;#039;&amp;#039; создадим папку &amp;#039;&amp;#039;&amp;#039;/udatacache/&amp;#039;&amp;#039;&amp;#039; . Далее в папке &amp;#039;&amp;#039;&amp;#039;classes/modules/data/&amp;#039;&amp;#039;&amp;#039; добавим  &amp;#039;&amp;#039;&amp;#039;permissions.custom.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
следующего содержания:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $permissions = Array(&amp;#039;main&amp;#039; =&amp;gt; Array(&amp;#039;getCreateFormCustom&amp;#039;));&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А в файл &amp;#039;&amp;#039;&amp;#039;__custom.php&amp;#039;&amp;#039;&amp;#039; добавим новый метод &amp;#039;&amp;#039;&amp;#039;getCreateFormCustom&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function getCreateFormCustom($typ_id){&lt;br /&gt;
    $typ_id = (int) $typ_id;&lt;br /&gt;
    $path = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/udatacache/getCreateForm&amp;#039; . $typ_id . &amp;#039;.xml&amp;#039;;&lt;br /&gt;
    if(is_file($path) == false){&lt;br /&gt;
       $uri = &amp;quot;udata://data/getCreateForm/{$typ_id}&amp;quot;;&lt;br /&gt;
       $data = file_get_contents($uri);&lt;br /&gt;
       file_put_contents($path, $data);&lt;br /&gt;
       return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $data);  &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    $mtime = filemtime($path);&lt;br /&gt;
    $data = file_get_contents($path);&lt;br /&gt;
    $expire = 3600;&lt;br /&gt;
			&lt;br /&gt;
    if(time() &amp;gt; ($mtime + $expire)) {&lt;br /&gt;
         $uri = &amp;quot;udata://data/getCreateForm/{$typ_id}&amp;quot;;&lt;br /&gt;
	 $data = file_get_contents($uri);&lt;br /&gt;
	 file_put_contents($path, $data);&lt;br /&gt;
         return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $data);&lt;br /&gt;
    }else  return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $data);  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В самом XSL-шаблоне необходимо будет использовать метод &amp;#039;&amp;#039;&amp;#039;getCreateFormCustom&amp;#039;&amp;#039;&amp;#039;, вместо &amp;#039;&amp;#039;&amp;#039;getCreateForm&amp;#039;&amp;#039;&amp;#039;. Метод &amp;#039;&amp;#039;&amp;#039;getCreateFormCustom&amp;#039;&amp;#039;&amp;#039; сохраняет результат работы оригинального метода &amp;#039;&amp;#039;&amp;#039;getCreateForm&amp;#039;&amp;#039;&amp;#039; в файл, данные сохраняются в xml-формате. Из кэша данные берутся в течении часа (3600 секунд), потом кэш обновляется.&lt;br /&gt;
[[Категория:Шаблонизаторы]][[Категория:Верстка в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_getCreateForm_%D0%B2_XSL-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=3884</id>
		<title>Кэширование результата работы метода getCreateForm в XSL-шаблоне</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_getCreateForm_%D0%B2_XSL-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=3884"/>
		<updated>2012-08-15T05:51:54Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Кеширование результата работы метода getCreateForm в XSL-шаблоне» в «Кэширование результата работы метода getCreateForm в XSL-шаблоне»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В некоторых ситуациях, в XSL-шаблоне вызывается метод, который долго выполняется и отдает результат, который меняется очень редко. Таким методом может быть data getCreateForm(). В данной статье рассмотрим пример кеширования результата работы макроса getCreateForm() на один час.&lt;br /&gt;
Сначала в папке &amp;#039;&amp;#039;&amp;#039;/sys-temp/&amp;#039;&amp;#039;&amp;#039; создадим папку &amp;#039;&amp;#039;&amp;#039;/udatacache/&amp;#039;&amp;#039;&amp;#039; . Далее в папке &amp;#039;&amp;#039;&amp;#039;classes/modules/data/&amp;#039;&amp;#039;&amp;#039; добавим  &amp;#039;&amp;#039;&amp;#039;permissions.custom.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
следующего содержания:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    $permissions = Array(&amp;#039;main&amp;#039; =&amp;gt; Array(&amp;#039;getCreateFormCustom&amp;#039;));&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А в файл &amp;#039;&amp;#039;&amp;#039;__custom.php&amp;#039;&amp;#039;&amp;#039; добавим новый метод &amp;#039;&amp;#039;&amp;#039;getCreateFormCustom&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function getCreateFormCustom($typ_id){&lt;br /&gt;
    $typ_id = (int) $typ_id;&lt;br /&gt;
    $path = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/udatacache/getCreateForm&amp;#039; . $typ_id . &amp;#039;.xml&amp;#039;;&lt;br /&gt;
    if(is_file($path) == false){&lt;br /&gt;
       $uri = &amp;quot;udata://data/getCreateForm/{$typ_id}&amp;quot;;&lt;br /&gt;
       $data = file_get_contents($uri);&lt;br /&gt;
       file_put_contents($path, $data);&lt;br /&gt;
       return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $data);  &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    $mtime = filemtime($path);&lt;br /&gt;
    $data = file_get_contents($path);&lt;br /&gt;
    $expire = 3600;&lt;br /&gt;
			&lt;br /&gt;
    if(time() &amp;gt; ($mtime + $expire)) {&lt;br /&gt;
         $uri = &amp;quot;udata://data/getCreateForm/{$typ_id}&amp;quot;;&lt;br /&gt;
	 $data = file_get_contents($uri);&lt;br /&gt;
	 file_put_contents($path, $data);&lt;br /&gt;
         return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $data);&lt;br /&gt;
    }else  return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $data);  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В самом XSL-шаблоне необходимо будет использовать метод &amp;#039;&amp;#039;&amp;#039;getCreateFormCustom&amp;#039;&amp;#039;&amp;#039;, вместо &amp;#039;&amp;#039;&amp;#039;getCreateForm&amp;#039;&amp;#039;&amp;#039;. Метод &amp;#039;&amp;#039;&amp;#039;getCreateFormCustom&amp;#039;&amp;#039;&amp;#039; сохраняет результат работы оригинального метода &amp;#039;&amp;#039;&amp;#039;getCreateForm&amp;#039;&amp;#039;&amp;#039; в файл, данные сохраняются в xml-формате. Из кеша данные берутся в течении часа (3600 секунд), потом кеш обновляется.&lt;br /&gt;
[[Категория:Шаблонизаторы]][[Категория:Верстка в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_getCreateForm_%D0%B2_XSL-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=3885</id>
		<title>Кеширование результата работы метода getCreateForm в XSL-шаблоне</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9A%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_getCreateForm_%D0%B2_XSL-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=3885"/>
		<updated>2012-08-15T05:51:54Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Кеширование результата работы метода getCreateForm в XSL-шаблоне» в «Кэширование результата работы метода getCreateForm в XSL-шаблоне»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Кэширование результата работы метода getCreateForm в XSL-шаблоне]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BA%D1%8D%D1%88%D0%B0_%D0%B2_umi&amp;diff=3883</id>
		<title>Механизм работы кэша в umi</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BA%D1%8D%D1%88%D0%B0_%D0%B2_umi&amp;diff=3883"/>
		<updated>2012-08-15T05:51:42Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Архитектура UMI.CMS]]&lt;br /&gt;
&lt;br /&gt;
Umi.cms поддерживает различные кэширующие механизмы, допустим apc, eaccelerator. В данной статье будет описан принцип работы кэша APC, все остальные типы действуют по аналогичной схеме. Основной php класс, который выполняет функции управления кэшем находится в файле:&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;/classes/system/subsystems/cache/cacheFrontend.php&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
Если на хостинге подключен один из поддерживаемых системой кэширующих механизмов:&lt;br /&gt;
* apc&lt;br /&gt;
* eaccelerator&lt;br /&gt;
* xcache&lt;br /&gt;
* memcached&lt;br /&gt;
&lt;br /&gt;
тогда в модуле &amp;quot;Конфигурация&amp;quot;, вкладка &amp;quot;Производительность&amp;quot; будет доступен для выбора кэш, подключенный на хостинге. Допустим мы включили кэш APC. Если вы уже просматривали код системы, то в очень многих системных классах:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\classes\system\subsystems\models\data\&lt;br /&gt;
\classes\system\subsystems\models\hierarchy\&lt;br /&gt;
\classes\system\subsystems\streams\&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
происходит вызов методов из класса &amp;#039;&amp;#039;&amp;#039;cacheFrontend&amp;#039;&amp;#039;&amp;#039;, допустим:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$cacheFrontend = cacheFrontend::getInstance();&lt;br /&gt;
$cacheFrontend-&amp;gt;save($element, &amp;quot;element&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
метод getElement() в классе umiHierarchy.&lt;br /&gt;
&lt;br /&gt;
В классе cacheFrontend, определяется текующий тип кэша, при вызове метода save() класса cacheFrontend, и включенном АРС, происходит вызов метода saveObjectData() в классе apcCacheEngine, файл:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\classes\system\subsystems\cache\engines\apc.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В классе &amp;#039;&amp;#039;&amp;#039;apcCacheEngine&amp;#039;&amp;#039;&amp;#039; используются стандартные функции APC по сохранению данных, чтению, удалению и очистки всего кэша:&lt;br /&gt;
* apc_store&lt;br /&gt;
* apc_fetch&lt;br /&gt;
* apc_delete&lt;br /&gt;
* apc_clear_cache&lt;br /&gt;
&lt;br /&gt;
Боле подробно ознакомиться с данными функциями и настройками APC можно на официальном сайте [http://ru.php.net/manual/en/book.apc.php php.net]&lt;br /&gt;
&lt;br /&gt;
Umi.cms кэширует объекты, элементы, типы данных, значения полей и не только. В зависимости от типа сохраняемого значения формируется название ключа, по которому потом можно будет получить данные. Возможны примерно следующие варианты ключей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
27612_object__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde&lt;br /&gt;
50_element__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde&lt;br /&gt;
8873_field__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde&lt;br /&gt;
27607.32_property__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde &lt;br /&gt;
697_object_type__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;27612_object&amp;#039;&amp;#039;&amp;#039; – начальная информация об объекте с $object_id = 27612, в самой umi, в базе данных это таблица cms3_objects.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;50_element&amp;#039;&amp;#039;&amp;#039; –  данные о страницы с $page_id = 50, таблица cms3_hierarchy.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;8873_field&amp;#039;&amp;#039;&amp;#039; – информация о поле c id=8873, таблица cms3_object_fields.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;27607.32_property&amp;#039;&amp;#039;&amp;#039; – объект с $object_id = 27607, 32 – id поля, таблица в БД cms3_object_content.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;697_object_type&amp;#039;&amp;#039;&amp;#039; – тип данных с $type_id = 697, таблица cms3_object_types&lt;br /&gt;
&lt;br /&gt;
Информация по архитектуре базы данных: [[Архитектура базы данных системы]]&lt;br /&gt;
&lt;br /&gt;
Как вы уже заметили, в самом конце названий ключей используется одно и тоже значение длиной в 40 символов, при получении данного значения используется переменная salt, в конфигурационном файле, config.ini. salt&amp;#039;a генерируется автоматически при установке системы.&lt;br /&gt;
&lt;br /&gt;
Возможны также следующие префиксы для ключей:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;1_domain&amp;#039;&amp;#039;&amp;#039; – домен системы, таблица cms3_domains&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;1_lang&amp;#039;&amp;#039;&amp;#039; – язык системы, таблица cms3_langs&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;2_template&amp;#039;&amp;#039;&amp;#039; – шаблон системы (XSL или TPL), таблица cms3_templates&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;7_field_type&amp;#039;&amp;#039;&amp;#039; – тип поля, таблица cms3_object_field_types&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;24_element_type&amp;#039;&amp;#039;&amp;#039; – иерархический тип объекта, таблица cms3_hierarchy_types&lt;br /&gt;
&lt;br /&gt;
При редактировании данных в административной части или через edit-in-place, происходит обнуление данных в кэше, соответственно обнуление только необходимых данных, а не всего кэша.&lt;br /&gt;
&lt;br /&gt;
При запросе каких либо данных, происходит проверка, не хранятся ли уже необходимые данные в кэше, если да, то происходит загрузка данных из кэша, без каких-либо запросов к базе данных.&lt;br /&gt;
&lt;br /&gt;
В том же классе &amp;#039;&amp;#039;&amp;#039;umiHierarchy&amp;#039;&amp;#039;&amp;#039;, в файле&amp;#039;&amp;#039;&amp;#039; \classes\system\subsystems\models\hierarchy\umiHierarchy.php&amp;#039;&amp;#039;&amp;#039;, в методе &amp;#039;&amp;#039;&amp;#039;getElement()&amp;#039;&amp;#039;&amp;#039;, происходит загрузка данных из кша:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$cacheFrontend = cacheFrontend::getInstance();&lt;br /&gt;
$element = $cacheFrontend-&amp;gt;load($element_id, &amp;quot;element&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
сначала запускается метод load() класса cacheFrontend, а потом запускается метод loadObjectData($key) текущего класса кэша, для apc: &amp;#039;&amp;#039;&amp;#039;/engines/apc.php&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BA%D1%8D%D1%88%D0%B0_%D0%B2_umi&amp;diff=3881</id>
		<title>Механизм работы кэша в umi</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BA%D1%8D%D1%88%D0%B0_%D0%B2_umi&amp;diff=3881"/>
		<updated>2012-08-15T05:50:55Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: «Механизм работы кеша в umi» переименована в «Механизм работы кэша в umi» поверх перенаправления&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Архитектура UMI.CMS]]&lt;br /&gt;
&lt;br /&gt;
Umi.cms поддерживает различные кеширующие механизмы, допустим apc, eaccelerator. В данной статье будет описан принцип работы кеша APC, все остальные типы действуют по аналогичной схеме. Основной php класс, который выполняет функции управления кешем находится в файле:&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;/classes/system/subsystems/cache/cacheFrontend.php&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
Если на хостинге подключен один из поддерживаемых системой кеширующих механизмов:&lt;br /&gt;
* apc&lt;br /&gt;
* eaccelerator&lt;br /&gt;
* xcache&lt;br /&gt;
* memcached&lt;br /&gt;
&lt;br /&gt;
тогда в модуле &amp;quot;Конфигурация&amp;quot;, вкладка &amp;quot;Производительность&amp;quot; будет доступен для выбора кеш, подключенный на хостинге. Допустим мы включили кеш APC. Если вы уже просматривали код системы, то в очень многих системных классах:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\classes\system\subsystems\models\data\&lt;br /&gt;
\classes\system\subsystems\models\hierarchy\&lt;br /&gt;
\classes\system\subsystems\streams\&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
происходит вызов методов из класса &amp;#039;&amp;#039;&amp;#039;cacheFrontend&amp;#039;&amp;#039;&amp;#039;, допустим:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$cacheFrontend = cacheFrontend::getInstance();&lt;br /&gt;
$cacheFrontend-&amp;gt;save($element, &amp;quot;element&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
метод getElement() в классе umiHierarchy.&lt;br /&gt;
&lt;br /&gt;
В классе cacheFrontend, определяется текующий тип кеша, при вызове метода save() класса cacheFrontend, и включенном АРС, происходит вызов метода saveObjectData() в классе apcCacheEngine, файл:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\classes\system\subsystems\cache\engines\apc.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В классе &amp;#039;&amp;#039;&amp;#039;apcCacheEngine&amp;#039;&amp;#039;&amp;#039; используются стандартные функции APC по сохранению данных, чтению, удалению и очистки всего кеша:&lt;br /&gt;
* apc_store&lt;br /&gt;
* apc_fetch&lt;br /&gt;
* apc_delete&lt;br /&gt;
* apc_clear_cache&lt;br /&gt;
&lt;br /&gt;
Боле подробно ознакомиться с данными функциями и настройками APC можно на официальном сайте [http://ru.php.net/manual/en/book.apc.php php.net]&lt;br /&gt;
&lt;br /&gt;
Umi.cms кеширует объекты, элементы, типы данных, значения полей и не только. В зависимости от типа сохраняемого значения формируется название ключа, по которому потом можно будет получить данные. Возможны примерно следующие варианты ключей:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
27612_object__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde&lt;br /&gt;
50_element__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde&lt;br /&gt;
8873_field__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde&lt;br /&gt;
27607.32_property__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde &lt;br /&gt;
697_object_type__3e53ea3115e961f8b4a2c2125a4dfcca8f45efde&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;27612_object&amp;#039;&amp;#039;&amp;#039; – начальная информация об объекте с $object_id = 27612, в самой umi, в базе данных это таблица cms3_objects.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;50_element&amp;#039;&amp;#039;&amp;#039; –  данные о страницы с $page_id = 50, таблица cms3_hierarchy.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;8873_field&amp;#039;&amp;#039;&amp;#039; – информация о поле c id=8873, таблица cms3_object_fields.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;27607.32_property&amp;#039;&amp;#039;&amp;#039; – объект с $object_id = 27607, 32 – id поля, таблица в БД cms3_object_content.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;697_object_type&amp;#039;&amp;#039;&amp;#039; – тип данных с $type_id = 697, таблица cms3_object_types&lt;br /&gt;
&lt;br /&gt;
Информация по архитектуре базы данных: [[Архитектура базы данных системы]]&lt;br /&gt;
&lt;br /&gt;
Как вы уже заметили, в самом конце названий ключей используется одно и тоже значение длиной в 40 символов, при получении данного значения используется переменная salt, в конфигурационном файле, config.ini. salt&amp;#039;a генерируется автоматически при установке системы.&lt;br /&gt;
&lt;br /&gt;
Возможны также следующие префиксы для ключей:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;1_domain&amp;#039;&amp;#039;&amp;#039; – домен системы, таблица cms3_domains&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;1_lang&amp;#039;&amp;#039;&amp;#039; – язык системы, таблица cms3_langs&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;2_template&amp;#039;&amp;#039;&amp;#039; – шаблон системы (XSL или TPL), таблица cms3_templates&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;7_field_type&amp;#039;&amp;#039;&amp;#039; – тип поля, таблица cms3_object_field_types&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;24_element_type&amp;#039;&amp;#039;&amp;#039; – иерархический тип объекта, таблица cms3_hierarchy_types&lt;br /&gt;
&lt;br /&gt;
При редактировании данных в административной части или через edit-in-place, происходит обнуление данных в кеше, соответственно обнуление только необходимых данных, а не всего кеша.&lt;br /&gt;
&lt;br /&gt;
При запросе каких либо данных, происходит проверка, не хранятся ли уже необходимые данные в кеше, если да, то происходит загрузка данных из кеша, без каких-либо запросов к базе данных.&lt;br /&gt;
&lt;br /&gt;
В том же классе &amp;#039;&amp;#039;&amp;#039;umiHierarchy&amp;#039;&amp;#039;&amp;#039;, в файле&amp;#039;&amp;#039;&amp;#039; \classes\system\subsystems\models\hierarchy\umiHierarchy.php&amp;#039;&amp;#039;&amp;#039;, в методе &amp;#039;&amp;#039;&amp;#039;getElement()&amp;#039;&amp;#039;&amp;#039;, происходит загрузка данных из кеша:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$cacheFrontend = cacheFrontend::getInstance();&lt;br /&gt;
$element = $cacheFrontend-&amp;gt;load($element_id, &amp;quot;element&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
сначала запускается метод load() класса cacheFrontend, а потом запускается метод loadObjectData($key) текущего класса кеша, для apc: &amp;#039;&amp;#039;&amp;#039;/engines/apc.php&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BA%D0%B5%D1%88%D0%B0_%D0%B2_umi&amp;diff=3882</id>
		<title>Механизм работы кеша в umi</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BA%D0%B5%D1%88%D0%B0_%D0%B2_umi&amp;diff=3882"/>
		<updated>2012-08-15T05:50:55Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: «Механизм работы кеша в umi» переименована в «Механизм работы кэша в umi» поверх перенаправления&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Механизм работы кэша в umi]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB_%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BA_config.ini&amp;diff=3880</id>
		<title>Файл настроек config.ini</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB_%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BA_config.ini&amp;diff=3880"/>
		<updated>2012-08-15T05:50:37Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание ==&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 2.8.х появился основной файл настройки системы &amp;#039;&amp;#039;&amp;#039;config.ini&amp;#039;&amp;#039;&amp;#039;, который располагается в корневой директории DOCUMENT_ROOT и содержит большинство настроек системы. Туда переехали почти все константы, многие настройки из реестра и появились совершенно новые. [http://help-dev.umi-cms.ru/part.Config.syntax.html Синтаксис config.ini]&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
; Основные системные настройки&lt;br /&gt;
[system]&lt;br /&gt;
; Текущий драйвер БД системы. На данный момент поддерживается 2 значения: &amp;quot;mysql&amp;quot; и &amp;quot;xml&amp;quot;&lt;br /&gt;
db-driver = mysql&lt;br /&gt;
&lt;br /&gt;
; Язык сайта по умолчанию&lt;br /&gt;
default-lang = ru&lt;br /&gt;
&lt;br /&gt;
; Скин административного интерфейса по умолчанию&lt;br /&gt;
default-skin = mac&lt;br /&gt;
&lt;br /&gt;
; Язык административного интерфейса по умолчанию&lt;br /&gt;
default-interface-lang = ru&lt;br /&gt;
&lt;br /&gt;
; Список скинов, доступных в системе&lt;br /&gt;
skins[] = mac&lt;br /&gt;
skins[] = full&lt;br /&gt;
skins[] = simple&lt;br /&gt;
skins[] = prototype&lt;br /&gt;
&lt;br /&gt;
; Список доступных языковых версий&lt;br /&gt;
interface-langs[] = &amp;quot;ru&amp;quot;&lt;br /&gt;
interface-langs[] = &amp;quot;en&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Время жизни сесси в минутах&lt;br /&gt;
session-lifetime = 60&lt;br /&gt;
&lt;br /&gt;
; Формат вывода даты по умолчанию&lt;br /&gt;
default-date-format = &amp;quot;Y-m-d H:i:s&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Код валюты по умолчанию&lt;br /&gt;
default-currency = &amp;#039;RUR&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; Настройки ядра системы&lt;br /&gt;
[kernel]&lt;br /&gt;
; Выводить содержимое текстовых полей well-formed xml&amp;#039;ом при доступе из через внутренние протоколы.&lt;br /&gt;
property-value-mode = &amp;#039;xml&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; Выводить меню одним деревом при работе с xslt-шаблонами&lt;br /&gt;
xslt-nested-menu = 1&lt;br /&gt;
&lt;br /&gt;
; Отключить оптимизацию получения свойств из базы данных.&lt;br /&gt;
; Оптимизация подразумевает выборку всех св-в объекта одним запросом.&lt;br /&gt;
; При выключенной оптимизации на каждое свойство будет выполняться отдельный запрос&lt;br /&gt;
disable-getvalue-optimization = 0&lt;br /&gt;
&lt;br /&gt;
; Отключить вычисление количество записей через CALC_FOUND_ROWS при выборках через umiSelection&lt;br /&gt;
selection-calc-found-rows-disable = 0&lt;br /&gt;
&lt;br /&gt;
; Установить максимальное количество join-таблиц в запросе, после которого нужно отключить оптимизатор запросов mysql&amp;#039;а&lt;br /&gt;
selection-max-joins = 10 ; MAX_SELECTION_TABLE_JOINS = 10&lt;br /&gt;
&lt;br /&gt;
; Включить коррекцию кэша при работе системы в кластере (1 db-server, &amp;gt; 2 app-server)&lt;br /&gt;
cluster-cache-correction = 0&lt;br /&gt;
&lt;br /&gt;
; Ключевое слово для выборки всех элементов в макросах&lt;br /&gt;
grab-all-keyword = &amp;quot;mode=all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Использовать расширение reflection для вызова подключаемых библиотек&lt;br /&gt;
use-reflection-extension = 0&lt;br /&gt;
&lt;br /&gt;
; Игнорировать совпадение адресов страниц и названий модулей.&lt;br /&gt;
; По умолчанию система исправляет название страницы, чтобы избежать коллизий.&lt;br /&gt;
ignore-module-names-overrite = 0&lt;br /&gt;
&lt;br /&gt;
; Автоматически индексировать изменения страниц&lt;br /&gt;
pages-auto-index = 1&lt;br /&gt;
&lt;br /&gt;
; Включить предварительную авторизацию&lt;br /&gt;
enable-pre-auth = 0&lt;br /&gt;
&lt;br /&gt;
; Форматировать выводимый xml-документы&lt;br /&gt;
xml-format-output = 0&lt;br /&gt;
&lt;br /&gt;
; Разрешить перехват вызываемых адресов umap&amp;#039;ом&lt;br /&gt;
matches-enabled = 1&lt;br /&gt;
&lt;br /&gt;
; Настройки режима отладки&lt;br /&gt;
[debug]&lt;br /&gt;
; Включить режим отладки&lt;br /&gt;
enabled = 1&lt;br /&gt;
&lt;br /&gt;
; Список адресов, для которых будет включен режим отладки.&lt;br /&gt;
; Если ни один адрес не задан, то он будет включен для всех пользователей.&lt;br /&gt;
;filter.ip[] = &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Настройка подключения к базе данных. Соединение совершается on-demand&lt;br /&gt;
; Помимо core-соединения, планируется поддержка разбиения бд для крупных проектов на подсистемы: поиск, кэш, бекап и т.д..&lt;br /&gt;
[connections]&lt;br /&gt;
; Тип подключения&lt;br /&gt;
core.type = mysql&lt;br /&gt;
&lt;br /&gt;
; Хост&lt;br /&gt;
core.host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Логин&lt;br /&gt;
core.login = &amp;quot;root&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Пароль	&lt;br /&gt;
core.password = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Имя базы данных&lt;br /&gt;
core.dbname = &amp;quot;dbname&amp;quot;	&lt;br /&gt;
&lt;br /&gt;
; Порт&lt;br /&gt;
core.port = &lt;br /&gt;
&lt;br /&gt;
; Постоянное соединение&lt;br /&gt;
core.persistent = 1&lt;br /&gt;
&lt;br /&gt;
; Использовать сжатие при передачи данных между БД и системой&lt;br /&gt;
core.compression = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Настройки rest-протоколов&lt;br /&gt;
[streams]&lt;br /&gt;
; Список доступных системе протоколов&lt;br /&gt;
enable[] = &amp;#039;udata&amp;#039;&lt;br /&gt;
enable[] = &amp;#039;utype&amp;#039;&lt;br /&gt;
enable[] = &amp;#039;upage&amp;#039;&lt;br /&gt;
enable[] = &amp;#039;uobject&amp;#039;&lt;br /&gt;
enable[] = &amp;#039;ufs&amp;#039;&lt;br /&gt;
enable[] = &amp;#039;usel&amp;#039;&lt;br /&gt;
enable[] = &amp;#039;umap&amp;#039;&lt;br /&gt;
enable[] = &amp;#039;uhttp&amp;#039;&lt;br /&gt;
enable[] = &amp;#039;ulang&amp;#039;&lt;br /&gt;
enable[] = &amp;#039;umess&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; Разрешения на доступ к протоколам через HTTP&lt;br /&gt;
udata.http.allow = 1&lt;br /&gt;
uobject.http.allow = 1&lt;br /&gt;
upage.http.allow = 1&lt;br /&gt;
umess.http.allow = 1&lt;br /&gt;
ufs.http.allow = 1&lt;br /&gt;
&lt;br /&gt;
; Выставление прав доступа на вызов протокола через HTTP&lt;br /&gt;
; Можно выбрать:&lt;br /&gt;
; &amp;#039;all&amp;#039; - доступно всем (по умолчанию)&lt;br /&gt;
; &amp;#039;admin&amp;#039; - доступно  только администраторам сайта&lt;br /&gt;
; &amp;#039;sv&amp;#039; - доступно  только супервайзерам&lt;br /&gt;
; &amp;#039;auth&amp;#039; - доступно только авторизованным ползователям&lt;br /&gt;
; Так же можно перечислить через запятую только список id групп пользователей и пользователей, &lt;br /&gt;
; для которых будет доступен протокол через HTTP&lt;br /&gt;
uobject.http.permissions = &amp;#039;sv&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; Заголовок &amp;quot;User Agent&amp;quot;, который будет отправлять система при доступе к внешним данным&lt;br /&gt;
user-agent = &amp;#039;UMI.CMS libxml agent&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; Список путей, используемых системой.&lt;br /&gt;
; С их помощью можно значительно преобразовать стр-ру файловой системы&lt;br /&gt;
[includes]&lt;br /&gt;
; Ядро системы&lt;br /&gt;
system.kernel = &amp;quot;~/classes/system/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Классы внутренних протоколов&lt;br /&gt;
system.kernel.streams = &amp;quot;~/classes/system/subsystems/streams/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Собранный в 1 файл ядра (компилируется файлов compile.php)&lt;br /&gt;
system.kernel.assebled = &amp;quot;~/sys-temp/kernel.php&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Класс базового модуля&lt;br /&gt;
system.default-module = &amp;quot;~/classes/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Классы модулей&lt;br /&gt;
system.modules = &amp;quot;~/classes/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Классы виртуальных модулей&lt;br /&gt;
system.virtual-modules = &amp;quot;~/classes/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Библиотечные файлы (в данный момент поддерживается только частично)&lt;br /&gt;
system.libs = &amp;quot;~/libs/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Временные файлы системы&lt;br /&gt;
system.runtime-cache = &amp;quot;~/sys-temp/runtime-cache/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Страницы ошибок&lt;br /&gt;
system.error = &amp;quot;~/errors/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Страница-заглушка&lt;br /&gt;
system.stub = &amp;quot;~/errors/stub.php&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Скины&lt;br /&gt;
templates.skins = &amp;quot;~/styles/skins/{skin}/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Tpl-шаблоны (в пути можно указывать макросы {lang} и {domain})&lt;br /&gt;
templates.tpl = &amp;quot;~/tpls/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Xslt-шаблоны  (в пути можно указывать макросы {lang} и {domain})&lt;br /&gt;
templates.xsl = &amp;quot;~/xsltTpls/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Настройки кэширования системы&lt;br /&gt;
[cache]&lt;br /&gt;
; Текущий кэширующий механизм.&lt;br /&gt;
; На текущий момент доступны: apc, eaccelerator, xcache, fs, memcache&lt;br /&gt;
engine = &amp;#039;none&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; Включение/выключение статического кэширования&lt;br /&gt;
static.enabled = 0&lt;br /&gt;
&lt;br /&gt;
; Режим работы статического кэширования&lt;br /&gt;
static.mode = 0&lt;br /&gt;
; Отключить сбор статистики при выдаче страниц из статического кэша&lt;br /&gt;
&lt;br /&gt;
static.ignore-stat = 0&lt;br /&gt;
&lt;br /&gt;
; Настройки страницы-заглушки&lt;br /&gt;
[stub]&lt;br /&gt;
; Включить заглушку&lt;br /&gt;
enabled = 0&lt;br /&gt;
&lt;br /&gt;
; Не показывать заглушку для списка ip:&lt;br /&gt;
;filter.ip[] = &amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Seo-настройки&lt;br /&gt;
[seo]&lt;br /&gt;
; Не реализовано&lt;br /&gt;
;url-extension = &amp;quot;.html&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Не реализовано&lt;br /&gt;
;folder-redirect = 1&lt;br /&gt;
&lt;br /&gt;
; Вычислять last-modified заголовок страниц.&lt;br /&gt;
; Обратите внимание, что для системных страниц (корзина товаров, страница авторизации и т.д.) эта опция может игнорироваться.&lt;br /&gt;
; Для всех &amp;quot;настоящих&amp;quot; страниц будет осуществлен корректный расчет времени последней модификации.&lt;br /&gt;
calculate-last-modified = 0&lt;br /&gt;
&lt;br /&gt;
; Вычислять e-tag заголовок всех страниц&lt;br /&gt;
calculate-e-tag = 0&lt;br /&gt;
&lt;br /&gt;
; Следить за историей изменений адресов страниц (переименования, перемещения)&lt;br /&gt;
; При включенной опции ведется статистика изменений, при попадании пользователя на перемещенную страницу,&lt;br /&gt;
; система будет осуществлять seo-корректное перенаправление на новый адрес страницы&lt;br /&gt;
watch-redirects-history = 1&lt;br /&gt;
&lt;br /&gt;
; Значение crawl-delay в robots.txt&lt;br /&gt;
crawl-delay = 3&lt;br /&gt;
&lt;br /&gt;
; Переадресовывать на основной домен, если пользователь зашел на зеркало&lt;br /&gt;
primary-domain-redirect = 0&lt;br /&gt;
&lt;br /&gt;
; Настройки капчи&lt;br /&gt;
[captcha]&lt;br /&gt;
; Класс отрисовки изображений (можно заменить стандартную отрисовку0&lt;br /&gt;
drawer = &amp;quot;default&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Настройки подсистемы внутренних сообщений&lt;br /&gt;
[messages]&lt;br /&gt;
; Перехватывать и логгировать системные события (сохранять в системный журнал событий)&lt;br /&gt;
catch-system-events = 0&lt;br /&gt;
&lt;br /&gt;
; Индивидуальные настройки модулей&lt;br /&gt;
[modules]&lt;br /&gt;
; Класс для расчета номера следующего заказа в интернет-магазине&lt;br /&gt;
emarket.numbers = &amp;#039;default&amp;#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_xml-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3875</id>
		<title>Универсальный метод для кэширования xml-данных в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_xml-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3875"/>
		<updated>2012-08-15T05:43:45Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Универсальный метод для кеширования xml-данных в XSLT» в «Универсальный метод для кэширования xml-данных в XSLT»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Некоторая информация по кешированию xml-данных была представлена в данной статье:&lt;br /&gt;
[[Кеширование результата работы метода getCreateForm в XSL-шаблоне]]&lt;br /&gt;
&lt;br /&gt;
Универсальный метод, который необходимо добавить в файл &amp;#039;&amp;#039;&amp;#039;classes/modules/cutom.php&amp;#039;&amp;#039;&amp;#039;, может быть представлен в следующем виде:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function xsltCache($expire = 3600, $stream){ &lt;br /&gt;
      $params_temp = array_slice(func_get_args(), 2);&lt;br /&gt;
      $params = array();&lt;br /&gt;
      foreach($params_temp as $param){&lt;br /&gt;
         $params[] = (strpos($param, &amp;#039;/&amp;#039;) !== FALSE) ? &amp;quot;(&amp;quot; . $param . &amp;quot;)&amp;quot; : $param;     &lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      $params_str = implode(&amp;#039;/&amp;#039;, $params);&lt;br /&gt;
      $url = $stream . &amp;quot;://&amp;quot; . $params_str;&lt;br /&gt;
      $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/udatacache/&amp;#039;;  &lt;br /&gt;
      $path = $folder . md5($url) . &amp;#039;.xml&amp;#039;;&lt;br /&gt;
      if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
      if(is_file($path)) $mtime = filemtime($path);&lt;br /&gt;
   &lt;br /&gt;
      if(!is_file($path) || time() &amp;gt; ($mtime + $expire)) {    &lt;br /&gt;
        $data = file_get_contents($url);&lt;br /&gt;
        file_put_contents($path, $data);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $data); &lt;br /&gt;
      }else{&lt;br /&gt;
        $result = file_get_contents($path);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&lt;br /&gt;
      }	&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
  &lt;br /&gt;
а сам вызов в XSL-шаблоне будет следующим:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udata://custom/xsltCache/3600/custom/lidersCustom/20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
где 3600 - время кеширования xml-данных в секундах,&lt;br /&gt;
custom - модуль&lt;br /&gt;
lidersCustom - метод&lt;br /&gt;
20 - один из параметров, их может быть больше одного&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Категория:Верстка в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_xml-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3876</id>
		<title>Универсальный метод для кеширования xml-данных в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_xml-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3876"/>
		<updated>2012-08-15T05:43:45Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Универсальный метод для кеширования xml-данных в XSLT» в «Универсальный метод для кэширования xml-данных в XSLT»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Универсальный метод для кэширования xml-данных в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_html-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3874</id>
		<title>Универсальный метод для кеширования html-данных в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_html-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3874"/>
		<updated>2012-08-15T05:43:23Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Универсальный метод для кеширования html-данных в XSLT» в «Универсальный метод для кэширования html-данных в XSLT»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Универсальный метод для кэширования html-данных в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_html-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3873</id>
		<title>Универсальный метод для кэширования html-данных в XSLT</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_html-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT&amp;diff=3873"/>
		<updated>2012-08-15T05:43:22Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Универсальный метод для кеширования html-данных в XSLT» в «Универсальный метод для кэширования html-данных в XSLT»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В одной из статей уже был рассмотрен способ кеширования html-кода в XSLT,&lt;br /&gt;
это была статья [[Блочное кеширование html-кода в XSLT]]&lt;br /&gt;
&lt;br /&gt;
В данной статьей будет  показан пример универсального кастомного метода, &lt;br /&gt;
в который можно передавать основной вызов: модуль, метод, параметры и также&lt;br /&gt;
путь к шаблону для трансформации xml данных. Кастомный метод необходимо&lt;br /&gt;
добавить в файл &amp;#039;&amp;#039;&amp;#039;classes/modules/custom.php&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function xsltHtmlCache($expire = 3600, $module, $method){&lt;br /&gt;
      $xslFilePath = getRequest(&amp;#039;xsl&amp;#039;);&lt;br /&gt;
        // $filePath - путь к xsl-шаблону трансформации.&lt;br /&gt;
      $filePath = CURRENT_WORKING_DIR . &amp;#039;/xsltTpls/&amp;#039; . $xslFilePath;&lt;br /&gt;
      if(!is_file($filePath)) return;&lt;br /&gt;
      &lt;br /&gt;
      $args = func_get_args();&lt;br /&gt;
      $params = array_slice($args, 3);&lt;br /&gt;
      $params_str = implode(&amp;#039;/&amp;#039;, $params);&lt;br /&gt;
      $url = &amp;quot;udata://&amp;quot; . $module . &amp;#039;/&amp;#039; . $method . &amp;#039;/&amp;#039; . $params_str;&lt;br /&gt;
&lt;br /&gt;
      $folder = CURRENT_WORKING_DIR . &amp;#039;/sys-temp/udatacache/&amp;#039;;  &lt;br /&gt;
      $path = $folder . md5($url . $filePath) . &amp;#039;.xml&amp;#039;;&lt;br /&gt;
      if(!is_dir($folder)) mkdir($folder, 0777, true);&lt;br /&gt;
      if(is_file($path)) $mtime = filemtime($path);&lt;br /&gt;
   &lt;br /&gt;
      if(!is_file($path) || time() &amp;gt; ($mtime + $expire)) {    &lt;br /&gt;
      	&lt;br /&gt;
        $xsltDom = new DomDocument;&lt;br /&gt;
        $xsltDom-&amp;gt;resolveExternals = true;&lt;br /&gt;
        $xsltDom-&amp;gt;substituteEntities = true;&lt;br /&gt;
      &lt;br /&gt;
        $xsltDom-&amp;gt;load($filePath, DOM_LOAD_OPTIONS);&lt;br /&gt;
 &lt;br /&gt;
        $xslt = new xsltProcessor;&lt;br /&gt;
        $xslt-&amp;gt;registerPHPFunctions();&lt;br /&gt;
        $xslt-&amp;gt;importStyleSheet($xsltDom);&lt;br /&gt;
        $page_id = cmsController::getInstance()-&amp;gt;getCurrentElementId();&lt;br /&gt;
        $parent_id = &amp;quot;&amp;quot;;&lt;br /&gt;
        $active    = &amp;quot;&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        if($page_id){&lt;br /&gt;
           $page = umiHierarchy::getInstance()-&amp;gt;getElement($page_id);&lt;br /&gt;
           $parent_id = $page-&amp;gt;getParentId();&lt;br /&gt;
           $active    = (int) $page-&amp;gt;getIsDefault();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Добавляем необходимые глобальные переменные, которые можно будет использовать в xsl-шаблоне &lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;parent-id&amp;#039;, $parent_id);&lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;document-page-id&amp;#039;, $page_id);&lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;active&amp;#039;, $active);&lt;br /&gt;
        &lt;br /&gt;
        $dom_new = new DOMDocument(&amp;quot;1.0&amp;quot;, &amp;quot;utf-8&amp;quot;);&lt;br /&gt;
        // $xml - xml-данные для трансформации.&lt;br /&gt;
        $xml = file_get_contents($url);&lt;br /&gt;
        $dom_new-&amp;gt;loadXML($xml);&lt;br /&gt;
 &lt;br /&gt;
        //производим трансформацию&lt;br /&gt;
        $result = $xslt-&amp;gt;transformToXML($dom_new);&lt;br /&gt;
        //html-данные необходимо включить в CDATA и в какой либо корневой узел.&lt;br /&gt;
        $result = &amp;quot;&amp;lt;udata mode=\&amp;quot;cache\&amp;quot;&amp;gt;&amp;lt;![CDATA[&amp;quot; . $result . &amp;quot;]]&amp;gt;&amp;lt;/udata&amp;gt;&amp;quot;;&lt;br /&gt;
        // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&lt;br /&gt;
         &lt;br /&gt;
      }else{&lt;br /&gt;
        $result = file_get_contents($path);&lt;br /&gt;
        return array(&amp;#039;plain:result&amp;#039; =&amp;gt; $result);&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;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;xsl:value-of select=&amp;quot;document(&amp;#039;udata://custom/xsltHtmlCache/3600/catalog/getCategoryList//8//1?xsl=modules/catalog/category-cache.xsl&amp;#039;)/udata&amp;quot; &lt;br /&gt;
disable-output-escaping=&amp;quot;yes&amp;quot; /&amp;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;
        // page_id текущей страницы сайта&lt;br /&gt;
        $page_id = cmsController::getInstance()-&amp;gt;getCurrentElementId();&lt;br /&gt;
        $parent_id = &amp;quot;&amp;quot;;&lt;br /&gt;
        $active    = &amp;quot;&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        if($page_id){&lt;br /&gt;
           $page = umiHierarchy::getInstance()-&amp;gt;getElement($page_id);&lt;br /&gt;
           $parent_id = $page-&amp;gt;getParentId();&lt;br /&gt;
           $active    = (int) $page-&amp;gt;getIsDefault();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Добавляем необходимые глобальные переменные, которые можно будет использовать в xsl-шаблоне &lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;parent-id&amp;#039;, $parent_id);&lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;document-page-id&amp;#039;, $page_id);&lt;br /&gt;
        $xslt-&amp;gt;setParameter(&amp;quot;&amp;quot;, &amp;#039;active&amp;#039;, $active);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Категория: Верстка в XSLT]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%83%D0%BF%D1%80%D0%B5%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B8_%D1%81%D0%B0%D0%B9%D1%82%D0%B0&amp;diff=3871</id>
		<title>Предупреждение при посещении сайта</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%83%D0%BF%D1%80%D0%B5%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8_%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B8_%D1%81%D0%B0%D0%B9%D1%82%D0%B0&amp;diff=3871"/>
		<updated>2012-08-10T09:04:47Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Большинство ресурсов в Сети ориентированы на широкую целевую аудиторию, но также существуют ресурсы, посещение которых определенными группами пользователей нежелательно. Чтобы предупредить пользователя зашедшего на подобный сайт и получить от него согласие на просмотр ресурса можно воспользоваться различными программными решениями. В данной статье будет рассмотрен самый простой способ с использованием технологии JavaScript.&lt;br /&gt;
&lt;br /&gt;
В JavaScript сущестуют события позволяющее вывести для пользователя всплывающее окно и получить от него информацию.&lt;br /&gt;
Таких событий всего 3: &amp;#039;&amp;#039;Alert&amp;#039;&amp;#039; (выводит сообщение с кнопкой OK), &amp;#039;&amp;#039;Confirm&amp;#039;&amp;#039; (позволяет либо согласиться либо отказаться с каким-то сообщением) и &amp;#039;&amp;#039;Prompt&amp;#039;&amp;#039; (позволяет получить от пользователя какую-либо текстовую информацию).&lt;br /&gt;
&lt;br /&gt;
Особенность данных диалоговых окон в том, что пока пользователь не закроет окно он не сможет воспользоваться сайтом.&lt;br /&gt;
&lt;br /&gt;
В JavaScript также имеются возможности по работе с cookies. Комбинируя работу с диалоговыми окнами и с cookies мы можем успешно решить поставленную задачу.&lt;br /&gt;
&lt;br /&gt;
Для работы с cookies, воспользуемся готовым решением, а именно скриптом jquery.cookie.js написанным на JQuery. Данный скрипт подключается системой по умолчанию из директории /js/.&lt;br /&gt;
   &lt;br /&gt;
Функция, котороя позволяет установить куку в браузер пользователя: &lt;br /&gt;
   $.cookie(&amp;#039;myage&amp;#039;, &amp;#039;iam18&amp;#039;);&lt;br /&gt;
   где, &amp;#039;myage&amp;#039; - имя куки,&lt;br /&gt;
        &amp;#039;iam18&amp;#039; - значение куки&lt;br /&gt;
&lt;br /&gt;
Функция, которая позволяет получить куку из браузера пользователя: &lt;br /&gt;
   $.cookie(&amp;#039;myage&amp;#039;);&lt;br /&gt;
Функция, которая позволяет удалить куку из браузера пользователя: &lt;br /&gt;
   $.cookie(&amp;#039;myage&amp;#039;, null);&lt;br /&gt;
&lt;br /&gt;
Теперь осталось написать свою функцию по проверке куки и ответа от пользователя:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
function checkCookie()&lt;br /&gt;
{&lt;br /&gt;
    if ($.cookie(&amp;#039;myage&amp;#039;) == null || $.cookie(&amp;#039;myage&amp;#039;) == &amp;#039;&amp;#039;){&lt;br /&gt;
		answer=confirm(&amp;quot;Внимание!\nВы заходите на ресурс для взрослых (18+).\nВы подтверждаете и гарантируете, что вам &lt;br /&gt;
исполнилось не менее 18 лет?\nЕсли \&amp;quot;Да\&amp;quot;, то нажмите на кнопку \&amp;quot;ОК\&amp;quot;, если \&amp;quot;Нет\&amp;quot;, то нажмите на кнопку \&amp;quot;Отмена\&amp;quot;.&amp;quot;);&lt;br /&gt;
		if (answer==true){&lt;br /&gt;
			$.cookie(&amp;#039;myage&amp;#039;, &amp;#039;iam18&amp;#039;);&lt;br /&gt;
		} else {&lt;br /&gt;
			$.cookie(&amp;#039;myage&amp;#039;, null);&lt;br /&gt;
			alert(&amp;quot;Вы отказались от просмотра нашего сайта!&amp;quot;);&lt;br /&gt;
			window.location.replace(&amp;#039;http://ya.ru&amp;#039;); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Функция не получает никаких параметров. В ней мы проверяем наличие в браузере пользователя куки с нашим значением (мы проверяем это на значения &amp;#039;&amp;#039;null&amp;#039;&amp;#039; и &amp;#039;&amp;#039;пустую строку&amp;#039;&amp;#039;).&lt;br /&gt;
Если у пользователя нет нашей куки , то мы показываем пользователю вопрос о желании посещения ресурса, результат ответа записываем в переменную &amp;#039;&amp;#039;answer&amp;#039;&amp;#039;. Далее мы проверяем, если пользователь согласился на посещение ресурса (&amp;#039;&amp;#039;answer==true&amp;#039;&amp;#039;), то устанавливаем в его браузер куку с именем &amp;#039;&amp;#039;&amp;quot;myage&amp;quot;&amp;#039;&amp;#039; и значением &amp;#039;&amp;#039;&amp;quot;yes18&amp;quot;&amp;#039;&amp;#039;: &lt;br /&gt;
    &amp;#039;&amp;#039;$.cookie(&amp;#039;myage&amp;#039;, &amp;#039;iam18&amp;#039;);&amp;#039;&amp;#039;&lt;br /&gt;
Если пользователь отказался от посещения сайта, то сообщаем ему об этом и переадресовываем на другой адрес (например, на поисковую систему).&lt;br /&gt;
&lt;br /&gt;
Теперь настало время разместить данные функции в нужном месте и вызвать их при загрузке страницы.&lt;br /&gt;
&lt;br /&gt;
Разместим данный скрипт в шаблоне шапки страницы (header), между тегами &amp;#039;&amp;#039;&amp;lt;head&amp;gt; &amp;lt;/head&amp;gt;&amp;#039;&amp;#039;.&lt;br /&gt;
Там же найдем тег &amp;#039;&amp;#039;&amp;lt;body&amp;gt;&amp;#039;&amp;#039;, он нам будет нужен, чтобы запустить скрипт до загрузки страницы.&lt;br /&gt;
У тега &amp;#039;&amp;#039;&amp;lt;body&amp;gt;&amp;#039;&amp;#039; имеется событие &amp;#039;&amp;#039;onload=&amp;quot;&amp;quot;&amp;#039;&amp;#039;, передадим ему нашу функцию по проверке куки:&lt;br /&gt;
    &amp;lt;body  onload=&amp;quot;checkCookie()&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё, функционал уже должен работать.&lt;br /&gt;
&lt;br /&gt;
Возможна ситуация, когда у пользователя отключен JavaScript, чтобы в этом случае затруднить пользователю просмотр ресурса, воспользуемся тегами &amp;#039;&amp;#039;&amp;lt;noscript&amp;gt; &amp;lt;/noscript&amp;gt;&amp;#039;&amp;#039;. Данный элемент должен быть написан сразу после тега &amp;lt;body&amp;gt;.&lt;br /&gt;
Внутрь элемента &amp;#039;&amp;#039;&amp;lt;noscript&amp;gt;&amp;#039;&amp;#039; мы разместим css-заглушку с предупреждением:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;noscript&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;background-color: #FFFBCC;&lt;br /&gt;
    border: 1px solid #888888;&lt;br /&gt;
    border-radius: 25px 25px 25px 25px;&lt;br /&gt;
    box-shadow: 5px 5px 5px #544A35;&lt;br /&gt;
    font-size: 2em;&lt;br /&gt;
    line-height: 100px;&lt;br /&gt;
    left: 40%;&lt;br /&gt;
    margin-left: -275px;&lt;br /&gt;
    padding: 20px;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 100px;&lt;br /&gt;
    width: 750px;&lt;br /&gt;
    height: 350px;&lt;br /&gt;
    z-index: 9999999;&amp;quot;&amp;gt;&lt;br /&gt;
В вашем браузере отключен JavaScript.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Пожалуйста, включите его в настройках вашего браузера,&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
если желаете работать с нашим сайтом.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/noscript&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Версия системы: 2.8.5.2&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kalexey&amp;diff=3856</id>
		<title>Участник:Kalexey</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kalexey&amp;diff=3856"/>
		<updated>2012-08-01T06:42:19Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Июль ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вставка статуса ICQ и Skype на сайт]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Взаимодействие с Twitter (XML API)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Система рэйтинга]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Комментарии ВКонтакте и Facebook (TPL)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Плагин &amp;quot;Spoiler&amp;quot; для TinyMCE]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Получение текущего шаблона в кастомном методе]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Макрос укорачивания URL]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Июнь ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вывод случайного изображения из папки]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Наложение водяной подписи на изображение]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Минимизация CSS и JavaScript]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вывод списка тегов всех постов блогов]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Расширяем функциональность TinyMCE]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Май ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Расширяем возможности макроса content redirect]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Подключаем кастомный WYSIWYG-редактор для административной панели]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Поиск с панелью предложений]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Апрель ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Добавляем QR-коды для ссылок на сайте]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Организуем интерфейс для слабовидящих пользователей]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81_%D1%83%D0%BA%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_URL&amp;diff=3854</id>
		<title>Макрос укорачивания URL</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81_%D1%83%D0%BA%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_URL&amp;diff=3854"/>
		<updated>2012-08-01T06:42:06Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Укорачивание URL» в «Макрос укорачивания URL»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Написание кастомных макросов]]&lt;br /&gt;
 [[category:Верстка в XSLT]]&lt;br /&gt;
 [[category:Верстка в TPL]]&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный макрос будет укорачивать переданный ему URL с помощью сервиса [http://www.tinyurl.com tinyurl.com]. Этот сервис не делает самый короткий URL, но его плюсом является то, что он не требует регистрации.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Тело макроса нужно будет разместить в файле &amp;quot;/classes/modules/content/__custom.php&amp;quot; после строки &amp;quot;//TODO: Write here your own macroses&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 1. Код макроса&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  @param String&lt;br /&gt;
    $url - URL для укорачивания&lt;br /&gt;
 */&lt;br /&gt;
public function getTinyUrl($url) {&lt;br /&gt;
  if($url)  &lt;br /&gt;
    return file_get_contents(&amp;quot;http://tinyurl.com/api-create.php?url=&amp;quot;.$url);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После того, как код макроса написан, необходимо добавить для него резрешение. Для этого создаём файл &amp;quot;permissions.custom.php&amp;quot; в той же папке, где находится &amp;quot;__custom.php&amp;quot;, и пишем в нём следующий текст:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 2. Добавление разрешения&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  $permissions = Array(&lt;br /&gt;
    &amp;#039;content&amp;#039; =&amp;gt; &lt;br /&gt;
      Array(&amp;#039;getTinyUrl&amp;#039;)&lt;br /&gt;
  );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Теперь можно использовать макрос. Вот примеры его использования в TPL и XSLT шаблонизаторах:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 3. Использование макроса в TPL&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
%content getTinyUrl(&amp;#039;http://www.umi-cms.ru/product/system/usability/&amp;#039;)%&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 4. Использование макроса в XSLT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a&amp;gt;&lt;br /&gt;
  &amp;lt;xsl:attribute name=&amp;quot;href&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:select-of select=&amp;quot;document(&amp;#039;udata://content/getTinyUrl/(http://www.umi-cms.ru/product/system/usability/)&amp;#039;)/udata&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;
  &amp;lt;xsl:text&amp;gt;&lt;br /&gt;
    UMI.CMS Usability&lt;br /&gt;
  &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;
&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Примечание&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный функционал был проверен на работоспособность в версии системы 2.8.5.1.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BA%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_URL&amp;diff=3855</id>
		<title>Укорачивание URL</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D0%BA%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_URL&amp;diff=3855"/>
		<updated>2012-08-01T06:42:06Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: переименовал «Укорачивание URL» в «Макрос укорачивания URL»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Макрос укорачивания URL]]&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kalexey&amp;diff=3848</id>
		<title>Участник:Kalexey</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kalexey&amp;diff=3848"/>
		<updated>2012-08-01T05:02:46Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: /* Июль */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Июль ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вставка статуса ICQ и Skype на сайт]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Взаимодействие с Twitter (XML API)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Система рэйтинга]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Комментарии ВКонтакте и Facebook (TPL)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Плагин &amp;quot;Spoiler&amp;quot; для TinyMCE]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Получение текущего шаблона в кастомном методе]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Укорачивание URL]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Июнь ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вывод случайного изображения из папки]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Наложение водяной подписи на изображение]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Минимизация CSS и JavaScript]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вывод списка тегов всех постов блогов]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Расширяем функциональность TinyMCE]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Май ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Расширяем возможности макроса content redirect]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Подключаем кастомный WYSIWYG-редактор для административной панели]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Поиск с панелью предложений]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Апрель ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Добавляем QR-коды для ссылок на сайте]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Организуем интерфейс для слабовидящих пользователей]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kalexey&amp;diff=3845</id>
		<title>Участник:Kalexey</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kalexey&amp;diff=3845"/>
		<updated>2012-08-01T04:58:25Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: /* Июль */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Июль ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Статус ICQ и Skype]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Взаимодействие с Twitter (XML API)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Система рэйтинга]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Комментарии ВКонтакте и Facebook (TPL)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Плагин &amp;quot;Spoiler&amp;quot; для TinyMCE]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Получение текущего шаблона в кастомном методе]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Укорачивание URL]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Июнь ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вывод случайного изображения из папки]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Наложение водяной подписи на изображение]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Минимизация CSS и JavaScript]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вывод списка тегов всех постов блогов]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Расширяем функциональность TinyMCE]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Май ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Расширяем возможности макроса content redirect]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Подключаем кастомный WYSIWYG-редактор для административной панели]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Поиск с панелью предложений]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Апрель ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Добавляем QR-коды для ссылок на сайте]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Организуем интерфейс для слабовидящих пользователей]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81_Twitter_(XML_API)&amp;diff=3842</id>
		<title>Взаимодействие с Twitter (XML API)</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81_Twitter_(XML_API)&amp;diff=3842"/>
		<updated>2012-08-01T04:24:34Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Написание кастомных макросов]]&lt;br /&gt;
 [[category:Вопросы и уроки разработки сайтов на UMI.CMS]]&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
В данной статье будут представлены макросы, для взаимодействия с сервисом Twitter через Twitter XML API. Макрос для получения информации о пользователе и макрос получения ленты твитов.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для незарегистрированных пользователей количество запросов к XML API ограничено. В час можно произвести только 150 запросов. Чтобы обойти данное ограничение, будут использоваться два вспомогательных макроса, для организации своего рода кэша. Макрос &amp;quot;writeCache&amp;quot; будет записывать полученные данные во временный файл, а макрос &amp;quot;readCache&amp;quot; считывать их. В последствии, чтобы каждый раз при обращение к странице, где будут использоваться макросы получения информации о пользователе или ленты твитов, не производился запрос к серверу Twitter, данные будут браться из временных файлов.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Все макросы необходимо разместить в файле &amp;quot;/classes/modules/custom.php&amp;quot;, сразу после строки &amp;quot;//TODO: Write your macroses here&amp;quot;. Для удобства написания и чтения кода воспользуемся константами, их нужно будет разместить после текста &amp;quot;&amp;lt;?php&amp;quot;. В результате, файл &amp;quot;custom.php&amp;quot; будет выглядеть примерно следующим образом:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 1. Файл &amp;quot;custom.php&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
  // Константы для макросов взаимодействия с Twitter&lt;br /&gt;
  define(&amp;#039;CACHE_PATH&amp;#039;, &amp;#039;./sys-temp/twitter/&amp;#039;, true); // Директория для файлов кэша&lt;br /&gt;
  define(&amp;#039;SCREEN_LINK&amp;#039;, &amp;#039;http://twitter.com/users/show.xml?screen_name=&amp;#039;, true); // URL для получения информации о пользователе&lt;br /&gt;
  define(&amp;#039;TIMELINE_LINK&amp;#039;, &amp;#039;http://twitter.com/statuses/user_timeline/&amp;#039;, true); // URL для получения ленты твитов&lt;br /&gt;
  &lt;br /&gt;
  class custom extends def_module {&lt;br /&gt;
    public function cms_callMethod($method_name, $args) {&lt;br /&gt;
      return call_user_func_array(Array($this, $method_name), $args);&lt;br /&gt;
    }&lt;br /&gt;
		&lt;br /&gt;
    public function __call($method, $args) {&lt;br /&gt;
      throw new publicException(&amp;quot;Method &amp;quot; . get_class($this) . &amp;quot;::&amp;quot; . $method . &amp;quot; doesn&amp;#039;t exists&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //TODO: Write your own macroses here&lt;br /&gt;
    &lt;br /&gt;
    // + Twitter&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос записи данных в кэш&lt;br /&gt;
      @param String&lt;br /&gt;
        $filename - имя файла&lt;br /&gt;
      @param String&lt;br /&gt;
        $content - содержание файла&lt;br /&gt;
     */&lt;br /&gt;
    private function writeCache($filename, $content) {&lt;br /&gt;
      if(!file_exists(CACHE_PATH))&lt;br /&gt;
        mkdir(CACHE_PATH);&lt;br /&gt;
      &lt;br /&gt;
      try {&lt;br /&gt;
        $fp = fopen(CACHE_PATH.$filename, &amp;#039;w&amp;#039;);&lt;br /&gt;
        flock($fp, LOCK_EX);&lt;br /&gt;
        fwrite($fp, $content);&lt;br /&gt;
        flock($fp, LOCK_UN);&lt;br /&gt;
        fclose($fp);&lt;br /&gt;
      } catch(Exception $e) {&lt;br /&gt;
        echo $e-&amp;gt;getMessage();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос чтения данных из кэша&lt;br /&gt;
      @param String&lt;br /&gt;
        $filename - имя файла&lt;br /&gt;
      @param Integer&lt;br /&gt;
        $expiry - время в миллисекундах (необходимо для вычисления актуальности данных)&lt;br /&gt;
     */&lt;br /&gt;
    private function readCache($filename, $expiry) {&lt;br /&gt;
      $cache_filename = CACHE_PATH.$filename;&lt;br /&gt;
      if(file_exists($cache_filename)) {&lt;br /&gt;
        if((time() - $expiry) &amp;gt; filemtime($cache_filename))&lt;br /&gt;
          return false;&lt;br /&gt;
          &lt;br /&gt;
        return simplexml_load_file($cache_filename);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос получения информации о пользователе&lt;br /&gt;
      @param String&lt;br /&gt;
        $id - идентификатор пользователя&lt;br /&gt;
      @param String&lt;br /&gt;
        $template - шаблон вывода в TPL&lt;br /&gt;
     */&lt;br /&gt;
    public function twitterScreen($id, $template = &amp;#039;default&amp;#039;) {&lt;br /&gt;
      if(!isset($template))&lt;br /&gt;
        $template = &amp;#039;default&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
      list($widget_block, $error_block) =&lt;br /&gt;
        self::loadTemplates(&amp;#039;twitter/user/&amp;#039;.$template, &amp;#039;widget_block&amp;#039;, &amp;#039;error_block&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
      if(!isset($id))&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $user_cache_filename = $id.&amp;#039;.user.cache&amp;#039;;&lt;br /&gt;
      if(!($user = $this-&amp;gt;readCache($user_cache_filename, 1800))) {&lt;br /&gt;
        $user = simplexml_load_file(SCREEN_LINK.$id);&lt;br /&gt;
        $this-&amp;gt;writeCache($user_cache_filename, $user-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(!$user)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $block_arr = array();&lt;br /&gt;
      $block_arr[&amp;#039;id&amp;#039;] = (string)$user[0]-&amp;gt;id;&lt;br /&gt;
      $block_arr[&amp;#039;name&amp;#039;] = (string)$user[0]-&amp;gt;name;&lt;br /&gt;
      $block_arr[&amp;#039;screen_name&amp;#039;] = (string)$user[0]-&amp;gt;screen_name;&lt;br /&gt;
      $block_arr[&amp;#039;location&amp;#039;] = (string)$user[0]-&amp;gt;location;&lt;br /&gt;
      $block_arr[&amp;#039;description&amp;#039;] = (string)$user[0]-&amp;gt;description;&lt;br /&gt;
      $block_arr[&amp;#039;profile_image_url&amp;#039;] = (string)$user[0]-&amp;gt;profile_image_url;&lt;br /&gt;
      $block_arr[&amp;#039;url&amp;#039;] = (string)$user[0]-&amp;gt;url;&lt;br /&gt;
      $block_arr[&amp;#039;followers_count&amp;#039;] = (string)$user[0]-&amp;gt;followers_count;&lt;br /&gt;
      $block_arr[&amp;#039;statuses_count&amp;#039;] = (string)$user[0]-&amp;gt;statuses_count;&lt;br /&gt;
      $block_arr[&amp;#039;lang&amp;#039;] = (string)$user[0]-&amp;gt;lang;&lt;br /&gt;
      $block_arr[&amp;#039;status&amp;#039;] = (string)$user[0]-&amp;gt;status-&amp;gt;text;&lt;br /&gt;
&lt;br /&gt;
      return self::parseTemplate($widget_block, $block_arr);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос получения ленты твитов&lt;br /&gt;
      @param String&lt;br /&gt;
        $id - идентификатор пользователя&lt;br /&gt;
      @param Integer&lt;br /&gt;
        $count - количество выводимых твитов&lt;br /&gt;
      @param String&lt;br /&gt;
        $template - шаблон вывода в TPL&lt;br /&gt;
     */&lt;br /&gt;
    public function twitterTimeline($id, $count = 3, $template = &amp;#039;default&amp;#039;) {&lt;br /&gt;
      if(!isset($template))&lt;br /&gt;
        $template = &amp;#039;default&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
      list($timeline_block, $lines_block, $error_block) =&lt;br /&gt;
        self::loadTemplates(&amp;#039;twitter/timeline/&amp;#039;.$template, &amp;#039;timeline_block&amp;#039;, &amp;#039;lines_block&amp;#039;, &amp;#039;error_block&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
      if(!isset($id))&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $user_cache_filename = $id.&amp;#039;.user.cache&amp;#039;;&lt;br /&gt;
      if(!($user = $this-&amp;gt;readCache($user_cache_filename, 1800))) {&lt;br /&gt;
        $user = simplexml_load_file(SCREEN_LINK.$id);&lt;br /&gt;
        $this-&amp;gt;writeCache($user_cache_filename, $user-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(!$user)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $timeline_cache_filename = $id.&amp;#039;.timeline.cache&amp;#039;;&lt;br /&gt;
      if(!($timeline = $this-&amp;gt;readCache($timeline_cache_filename, 1800))) {&lt;br /&gt;
        $timeline = simplexml_load_file(TIMELINE_LINK.$id.&amp;#039;.rss&amp;#039;);&lt;br /&gt;
        $this-&amp;gt;writeCache($timeline_cache_filename, $timeline-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(!$timeline)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
        &lt;br /&gt;
      if($count &amp;lt; 1)&lt;br /&gt;
        $count = 1;&lt;br /&gt;
        &lt;br /&gt;
      $length = count($timeline-&amp;gt;channel-&amp;gt;item);&lt;br /&gt;
      if($count &amp;gt; $length)&lt;br /&gt;
        $count = $length;&lt;br /&gt;
      &lt;br /&gt;
      $lines = array();&lt;br /&gt;
      for($i = 0; $i &amp;lt; $count; $i++) {&lt;br /&gt;
        $line_arr = array();&lt;br /&gt;
        $line_arr[&amp;#039;date&amp;#039;] = (string)date(&amp;#039;d.m.Y G:i&amp;#039;, strtotime($timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;pubDate));&lt;br /&gt;
        $line_arr[&amp;#039;title&amp;#039;] = (string)$timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;title;&lt;br /&gt;
        $line_arr[&amp;#039;link&amp;#039;] = (string)$timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;link;&lt;br /&gt;
        $lines[] = self::parseTemplate($lines_block, $line_arr);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      $block_arr = array();&lt;br /&gt;
      $block_arr[&amp;#039;id&amp;#039;] = (string)$user[0]-&amp;gt;id;&lt;br /&gt;
      $block_arr[&amp;#039;name&amp;#039;] = (string)$user[0]-&amp;gt;name;&lt;br /&gt;
      $block_arr[&amp;#039;screen_name&amp;#039;] = (string)$user[0]-&amp;gt;screen_name;&lt;br /&gt;
      $block_arr[&amp;#039;count&amp;#039;] = (integer)$count;&lt;br /&gt;
      $block_arr[&amp;#039;subnodes:lines&amp;#039;] = (array)$lines;&lt;br /&gt;
      &lt;br /&gt;
      return self::parseTemplate($timeline_block, $block_arr);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // - Twitter&lt;br /&gt;
  };&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Макросы &amp;quot;writeCache&amp;quot; и &amp;quot;readCache&amp;quot; имеют модификаторы &amp;quot;private&amp;quot;. Это сделано для того, чтобы они были недоступны для пользователей на прямую.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Теперь можно посмотреть ответ UData, к примеру, макроса &amp;quot;twitterScreen&amp;quot;. Для этого наберите в адресной сроке браузера текст: &amp;quot;domain.ru/udata/custom/twitterScreen/umi_cms/notemplate&amp;quot;. В результате будет получен ответ UData:&lt;br /&gt;
&amp;lt;/p&amp;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;custom&amp;quot; method=&amp;quot;twitterScreen&amp;quot; generation-time=&amp;quot;0.707462&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;id&amp;gt;63716372&amp;lt;/id&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;UMI&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;screen_name&amp;gt;umi_cms&amp;lt;/screen_name&amp;gt;&lt;br /&gt;
  &amp;lt;description&amp;gt;UMI.CMS среди лидеров рынка CMS в России. Каждый третий разработчик Рунета использует UMI.CMS для создания сайтов.&amp;lt;/description&amp;gt;&lt;br /&gt;
  &amp;lt;profile_image_url&amp;gt;http://a0.twimg.com/profile_images/1850324360/vert1_normal.png&amp;lt;/profile_image_url&amp;gt;&lt;br /&gt;
  &amp;lt;url&amp;gt;http://www.umi-cms.ru&amp;lt;/url&amp;gt;&lt;br /&gt;
  &amp;lt;followers_count&amp;gt;469&amp;lt;/followers_count&amp;gt;&lt;br /&gt;
  &amp;lt;statuses_count&amp;gt;905&amp;lt;/statuses_count&amp;gt;&lt;br /&gt;
  &amp;lt;lang&amp;gt;ru&amp;lt;/lang&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;RT @fullspace_: Внедрили поддержку @umi_cms в настройки Nginx. Ускоряем сайты как никто! :) http://t.co/2N3Sbo2l&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/udata&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
При использовании XSLT-шаблонизатора макросы готовы к работе. Если Вы используете TPL-шаблонизатор, необходимо организовать шаблоны вывода информации. Создайте файл &amp;quot;/tpls/twitter/user/default.tpl&amp;quot; - шаблон вывода информации о пользователе. Его содержание будет следующим:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 2. Шаблон вывода информации о пользователе&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$FORMS = Array();&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;widget_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;%id%&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;%description%&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;img src=&amp;quot;%profile_image_url%&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;error_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ошибка!&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Далее нужно создать файл &amp;quot;/tpls/twitter/timeline/default.tpl&amp;quot; - шаблон вывода ленты твитов. Содержание данного файла будет таким:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 3. Шаблон вывода ленты твитов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$FORMS = Array();&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;timeline_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Последние &amp;lt;strong&amp;gt;%count%&amp;lt;/strong&amp;gt; твитов пользователя &lt;br /&gt;
    &amp;lt;strong&amp;gt;%name%&amp;lt;/strong&amp;gt; (%id%)&amp;lt;/p&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;%lines%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;lines_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;%date%&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;%title%.&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;%link%&amp;quot;&amp;gt;Twitter&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;error_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ошибка!&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После создания шаблонов вывода, макросы готовы к использованию и в TPL-шаблонизаторе.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для примера, выведем последние 3 твита пользователя &amp;quot;umi_cms&amp;quot; в TPL-шаблон &amp;quot;Интернет-магазин&amp;quot; (Хомячки). Откройте файл &amp;quot;/tpls/content/index.tpl&amp;quot; и пропишите макрос &amp;quot;custom twitterTimeline&amp;quot; в блоке &amp;quot;&amp;amp;lt;div class=&amp;quot;column&amp;quot;&amp;amp;gt;&amp;quot;:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;column&amp;quot;&amp;gt;			&lt;br /&gt;
  %search insert_form(&amp;#039;home&amp;#039;)%&lt;br /&gt;
					&lt;br /&gt;
  %custom twitterTimeline(&amp;#039;umi_cms&amp;#039;)%&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Twitter_screen.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Последние 3 твита пользователя &amp;quot;umi_cms&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Примечание&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный функционал был проверен на работоспособность в версии системы 2.8.5.1.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81_Twitter_(XML_API)&amp;diff=3841</id>
		<title>Взаимодействие с Twitter (XML API)</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81_Twitter_(XML_API)&amp;diff=3841"/>
		<updated>2012-08-01T04:23:19Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Написание кастомных макросов]]&lt;br /&gt;
 [[category:Вопросы и уроки разработки сайтов на UMI.CMS]]&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
В данной статье будут представлены макросы, для взаимодействия с сервисом Twitter через Twitter XML API. Макрос для получения информации о пользователе и макрос получения ленты твитов.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для незарегистрированных пользователей количество запросов к XML API ограничено. В час можно произвести только 150 запросов. Чтобы обойти данное ограничение, будут использоваться два вспомогательных макроса, для организации своего рода кэша. Макрос &amp;quot;writeCache&amp;quot; будет записывать полученные данные во временный файл, а макрос &amp;quot;readCache&amp;quot; считывать их. В последствии, чтобы каждый раз при обращение к странице, где будут использоваться макросы получения информации о пользователе или ленты твитов, не производился запрос к серверу Twitter, данные будут браться из временных файлов.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Все макросы необходимо разместить в файле &amp;quot;/classes/modules/custom.php&amp;quot;, сразу после строки &amp;quot;//TODO: Write your macroses here&amp;quot;. Для удобства написания и чтения кода воспользуемся константами, их нужно будет разместить после текста &amp;quot;&amp;lt;?php&amp;quot;. В результате, файл &amp;quot;custom.php&amp;quot; будет выглядеть примерно следующим образом:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 1. Файл &amp;quot;custom.php&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
  // Константы для макросов взаимодействия с Twitter&lt;br /&gt;
  define(&amp;#039;CACHE_PATH&amp;#039;, &amp;#039;./sys-temp/twitter/&amp;#039;, true); // Директория для файлов кэша&lt;br /&gt;
  define(&amp;#039;SCREEN_LINK&amp;#039;, &amp;#039;http://twitter.com/users/show.xml?screen_name=&amp;#039;, true); // URL для получения информации о пользователе&lt;br /&gt;
  define(&amp;#039;TIMELINE_LINK&amp;#039;, &amp;#039;http://twitter.com/statuses/user_timeline/&amp;#039;, true); // URL для получения ленты твитов&lt;br /&gt;
  &lt;br /&gt;
  class custom extends def_module {&lt;br /&gt;
    public function cms_callMethod($method_name, $args) {&lt;br /&gt;
      return call_user_func_array(Array($this, $method_name), $args);&lt;br /&gt;
    }&lt;br /&gt;
		&lt;br /&gt;
    public function __call($method, $args) {&lt;br /&gt;
      throw new publicException(&amp;quot;Method &amp;quot; . get_class($this) . &amp;quot;::&amp;quot; . $method . &amp;quot; doesn&amp;#039;t exists&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //TODO: Write your own macroses here&lt;br /&gt;
    &lt;br /&gt;
    // + Twitter&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос записи данных в кэш&lt;br /&gt;
      @param String&lt;br /&gt;
        $filename - имя файла&lt;br /&gt;
      @param String&lt;br /&gt;
        $content - содержание файла&lt;br /&gt;
     */&lt;br /&gt;
    private function writeCache($filename, $content) {&lt;br /&gt;
      if(!file_exists(CACHE_PATH))&lt;br /&gt;
        mkdir(CACHE_PATH);&lt;br /&gt;
      &lt;br /&gt;
      try {&lt;br /&gt;
        $fp = fopen(CACHE_PATH.$filename, &amp;#039;w&amp;#039;);&lt;br /&gt;
        flock($fp, LOCK_EX);&lt;br /&gt;
        fwrite($fp, $content);&lt;br /&gt;
        flock($fp, LOCK_UN);&lt;br /&gt;
        fclose($fp);&lt;br /&gt;
      } catch(Exception $e) {&lt;br /&gt;
        echo $e-&amp;gt;getMessage();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос чтения данных из кэша&lt;br /&gt;
      @param String&lt;br /&gt;
        $filename - имя файла&lt;br /&gt;
      @param Integer&lt;br /&gt;
        $expiry - время в миллисекундах (необходимо для вычисления актуальности данных)&lt;br /&gt;
     */&lt;br /&gt;
    private function readCache($filename, $expiry) {&lt;br /&gt;
      $cache_filename = CACHE_PATH.$filename;&lt;br /&gt;
      if(file_exists($cache_filename)) {&lt;br /&gt;
        if((time() - $expiry) &amp;gt; filemtime($cache_filename))&lt;br /&gt;
          return false;&lt;br /&gt;
          &lt;br /&gt;
        return simplexml_load_file($cache_filename);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос получения информации о пользователе&lt;br /&gt;
      @param String&lt;br /&gt;
        $id - идентификатор пользователя&lt;br /&gt;
      @param String&lt;br /&gt;
        $template - шаблон вывода в TPL&lt;br /&gt;
     */&lt;br /&gt;
    public function twitterScreen($id, $template = &amp;#039;default&amp;#039;) {&lt;br /&gt;
      if(!isset($template))&lt;br /&gt;
        $template = &amp;#039;default&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
      list($widget_block, $error_block) =&lt;br /&gt;
        self::loadTemplates(&amp;#039;twitter/user/&amp;#039;.$template, &amp;#039;widget_block&amp;#039;, &amp;#039;error_block&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
      if(!isset($id))&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $user_cache_filename = $id.&amp;#039;.user.cache&amp;#039;;&lt;br /&gt;
      if(!($user = $this-&amp;gt;readCache($user_cache_filename, 1800))) {&lt;br /&gt;
        $user = simplexml_load_file(SCREEN_LINK.$id);&lt;br /&gt;
        $this-&amp;gt;writeCache($user_cache_filename, $user-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(!$user)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $block_arr = array();&lt;br /&gt;
      $block_arr[&amp;#039;id&amp;#039;] = (string)$user[0]-&amp;gt;id;&lt;br /&gt;
      $block_arr[&amp;#039;name&amp;#039;] = (string)$user[0]-&amp;gt;name;&lt;br /&gt;
      $block_arr[&amp;#039;screen_name&amp;#039;] = (string)$user[0]-&amp;gt;screen_name;&lt;br /&gt;
      $block_arr[&amp;#039;location&amp;#039;] = (string)$user[0]-&amp;gt;location;&lt;br /&gt;
      $block_arr[&amp;#039;description&amp;#039;] = (string)$user[0]-&amp;gt;description;&lt;br /&gt;
      $block_arr[&amp;#039;profile_image_url&amp;#039;] = (string)$user[0]-&amp;gt;profile_image_url;&lt;br /&gt;
      $block_arr[&amp;#039;url&amp;#039;] = (string)$user[0]-&amp;gt;url;&lt;br /&gt;
      $block_arr[&amp;#039;followers_count&amp;#039;] = (string)$user[0]-&amp;gt;followers_count;&lt;br /&gt;
      $block_arr[&amp;#039;statuses_count&amp;#039;] = (string)$user[0]-&amp;gt;statuses_count;&lt;br /&gt;
      $block_arr[&amp;#039;lang&amp;#039;] = (string)$user[0]-&amp;gt;lang;&lt;br /&gt;
      $block_arr[&amp;#039;status&amp;#039;] = (string)$user[0]-&amp;gt;status-&amp;gt;text;&lt;br /&gt;
&lt;br /&gt;
      return self::parseTemplate($widget_block, $block_arr);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос получения ленты твитов&lt;br /&gt;
      @param String&lt;br /&gt;
        $id - идентификатор пользователя&lt;br /&gt;
      @param Integer&lt;br /&gt;
        $count - количество выводимых твитов&lt;br /&gt;
      @param String&lt;br /&gt;
        $template - шаблон вывода в TPL&lt;br /&gt;
     */&lt;br /&gt;
    public function twitterTimeline($id, $count = 3, $template = &amp;#039;default&amp;#039;) {&lt;br /&gt;
      if(!isset($template))&lt;br /&gt;
        $template = &amp;#039;default&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
      list($timeline_block, $lines_block, $error_block) =&lt;br /&gt;
        self::loadTemplates(&amp;#039;twitter/timeline/&amp;#039;.$template, &amp;#039;timeline_block&amp;#039;, &amp;#039;lines_block&amp;#039;, &amp;#039;error_block&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
      if(!isset($id))&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $user_cache_filename = $id.&amp;#039;.user.cache&amp;#039;;&lt;br /&gt;
      if(!($user = $this-&amp;gt;readCache($user_cache_filename, 1800))) {&lt;br /&gt;
        $user = simplexml_load_file(SCREEN_LINK.$id);&lt;br /&gt;
        $this-&amp;gt;writeCache($user_cache_filename, $user-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(!$user)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $timeline_cache_filename = $id.&amp;#039;.timeline.cache&amp;#039;;&lt;br /&gt;
      if(!($timeline = $this-&amp;gt;readCache($timeline_cache_filename, 1800))) {&lt;br /&gt;
        $timeline = simplexml_load_file(TIMELINE_LINK.$id.&amp;#039;.rss&amp;#039;);&lt;br /&gt;
        $this-&amp;gt;writeCache($timeline_cache_filename, $timeline-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(!$timeline)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
        &lt;br /&gt;
      if($count &amp;lt; 1)&lt;br /&gt;
        $count = 1;&lt;br /&gt;
        &lt;br /&gt;
      $length = count($timeline-&amp;gt;channel-&amp;gt;item);&lt;br /&gt;
      if($count &amp;gt; $length)&lt;br /&gt;
        $count = $length;&lt;br /&gt;
      &lt;br /&gt;
      $lines = array();&lt;br /&gt;
      for($i = 0; $i &amp;lt; $count; $i++) {&lt;br /&gt;
        $line_arr = array();&lt;br /&gt;
        $line_arr[&amp;#039;date&amp;#039;] = (string)date(&amp;#039;d.m.Y G:i&amp;#039;, strtotime($timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;pubDate));&lt;br /&gt;
        $line_arr[&amp;#039;title&amp;#039;] = (string)$timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;title;&lt;br /&gt;
        $line_arr[&amp;#039;link&amp;#039;] = (string)$timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;link;&lt;br /&gt;
        $lines[] = self::parseTemplate($lines_block, $line_arr);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      $block_arr = array();&lt;br /&gt;
      $block_arr[&amp;#039;id&amp;#039;] = (string)$user[0]-&amp;gt;id;&lt;br /&gt;
      $block_arr[&amp;#039;name&amp;#039;] = (string)$user[0]-&amp;gt;name;&lt;br /&gt;
      $block_arr[&amp;#039;screen_name&amp;#039;] = (string)$user[0]-&amp;gt;screen_name;&lt;br /&gt;
      $block_arr[&amp;#039;count&amp;#039;] = (integer)$count;&lt;br /&gt;
      $block_arr[&amp;#039;subnodes:lines&amp;#039;] = (array)$lines;&lt;br /&gt;
      &lt;br /&gt;
      return self::parseTemplate($timeline_block, $block_arr);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // - Twitter&lt;br /&gt;
  };&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Макросы &amp;quot;writeCache&amp;quot; и &amp;quot;readCache&amp;quot; имеют модификаторы &amp;quot;private&amp;quot;. Это сделано для того, чтобы они были недоступны для пользователей на прямую.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Теперь можно посмотреть ответ UData, к примеру, макроса &amp;quot;twitterScreen&amp;quot;. Для этого наберите в адресной сроке браузера текст: &amp;quot;domain.ru/udata/custom/twitterScreen/umi_cms/notemplate&amp;quot;. В результате будет получен ответ UData:&lt;br /&gt;
&amp;lt;/p&amp;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;custom&amp;quot; method=&amp;quot;twitterScreen&amp;quot; generation-time=&amp;quot;0.707462&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;id&amp;gt;63716372&amp;lt;/id&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;UMI&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;screen_name&amp;gt;umi_cms&amp;lt;/screen_name&amp;gt;&lt;br /&gt;
  &amp;lt;description&amp;gt;UMI.CMS среди лидеров рынка CMS в России. Каждый третий разработчик Рунета использует UMI.CMS для создания сайтов.&amp;lt;/description&amp;gt;&lt;br /&gt;
  &amp;lt;profile_image_url&amp;gt;http://a0.twimg.com/profile_images/1850324360/vert1_normal.png&amp;lt;/profile_image_url&amp;gt;&lt;br /&gt;
  &amp;lt;url&amp;gt;http://www.umi-cms.ru&amp;lt;/url&amp;gt;&lt;br /&gt;
  &amp;lt;followers_count&amp;gt;469&amp;lt;/followers_count&amp;gt;&lt;br /&gt;
  &amp;lt;statuses_count&amp;gt;905&amp;lt;/statuses_count&amp;gt;&lt;br /&gt;
  &amp;lt;lang&amp;gt;ru&amp;lt;/lang&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;RT @fullspace_: Внедрили поддержку @umi_cms в настройки Nginx. Ускоряем сайты как никто! :) http://t.co/2N3Sbo2l&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/udata&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
При использовании XSLT-шаблонизатора макросы готовы к работе. Если Вы используете TPL-шаблонизатор, необходимо организовать шаблоны вывода информации. Создайте файл &amp;quot;/tpls/twitter/user/default.tpl&amp;quot; - шаблон вывода информации о пользователе. Его содержание будет следующим:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 2. Шаблон вывода информации о пользователе&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$FORMS = Array();&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;widget_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;%id%&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;%description%&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;img src=&amp;quot;%profile_image_url%&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;error_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ошибка!&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Далее нужно создать файл &amp;quot;/tpls/twitter/timeline/default.tpl&amp;quot; - шаблон вывода ленты твитов. Содержание данного файла будет таким:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 3. Шаблон вывода ленты твитов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$FORMS = Array();&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;timeline_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Последние &amp;lt;strong&amp;gt;%count%&amp;lt;/strong&amp;gt; твитов пользователя &lt;br /&gt;
    &amp;lt;strong&amp;gt;%name%&amp;lt;/strong&amp;gt; (%id%)&amp;lt;/p&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;%lines%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;lines_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;%date%&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;%title%.&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;%link%&amp;quot;&amp;gt;Twitter&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;error_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ошибка!&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После создания шаблонов вывода, макросы готовы к использованию и в TPL-шаблонизаторе.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для примера, выведем информацию о пользователе &amp;quot;umi_cms&amp;quot; в TPL-шаблон &amp;quot;Интернет-магазин&amp;quot; (Хомячки). Откройте файл &amp;quot;/tpls/content/index.tpl&amp;quot; и пропишите макрос &amp;quot;custom twitterScreen&amp;quot; в блоке &amp;quot;&amp;amp;lt;div class=&amp;quot;column&amp;quot;&amp;amp;gt;&amp;quot;:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;column&amp;quot;&amp;gt;			&lt;br /&gt;
  %search insert_form(&amp;#039;home&amp;#039;)%&lt;br /&gt;
					&lt;br /&gt;
  %custom twitterTimeline(&amp;#039;umi_cms&amp;#039;)%&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Twitter_screen.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Последние 3 твита пользователя &amp;quot;umi_cms&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Примечание&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный функционал был проверен на работоспособность в версии системы 2.8.5.1.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81_Twitter_(XML_API)&amp;diff=3828</id>
		<title>Взаимодействие с Twitter (XML API)</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81_Twitter_(XML_API)&amp;diff=3828"/>
		<updated>2012-07-31T08:46:03Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Написание кастомных макросов]]&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
В данной статье будут представлены макросы, для взаимодействия с сервисом Twitter через Twitter XML API. Макрос для получения информации о пользователе и макрос получения ленты твитов.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для незарегистрированных пользователей количество запросов к XML API ограничено. В час можно произвести только 150 запросов. Чтобы обойти данное ограничение, будут использоваться два вспомогательных макроса, для организации своего рода кэша. Макрос &amp;quot;writeCache&amp;quot; будет записывать полученные данные во временный файл, а макрос &amp;quot;readCache&amp;quot; считывать их. В последствии, чтобы каждый раз при обращение к странице, где будут использоваться макросы получения информации о пользователе или ленты твитов, не производился запрос к серверу Twitter, данные будут браться из временных файлов.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Все макросы необходимо разместить в файле &amp;quot;/classes/modules/custom.php&amp;quot;, сразу после строки &amp;quot;//TODO: Write your macroses here&amp;quot;. Для удобства написания и чтения кода воспользуемся константами, их нужно будет разместить после текста &amp;quot;&amp;lt;?php&amp;quot;. В результате, файл &amp;quot;custom.php&amp;quot; будет выглядеть примерно следующим образом:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 1. Файл &amp;quot;custom.php&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
  // Константы для макросов взаимодействия с Twitter&lt;br /&gt;
  define(&amp;#039;CACHE_PATH&amp;#039;, &amp;#039;./sys-temp/twitter/&amp;#039;, true); // Директория для файлов кэша&lt;br /&gt;
  define(&amp;#039;SCREEN_LINK&amp;#039;, &amp;#039;http://twitter.com/users/show.xml?screen_name=&amp;#039;, true); // URL для получения информации о пользователе&lt;br /&gt;
  define(&amp;#039;TIMELINE_LINK&amp;#039;, &amp;#039;http://twitter.com/statuses/user_timeline/&amp;#039;, true); // URL для получения ленты твитов&lt;br /&gt;
  &lt;br /&gt;
  class custom extends def_module {&lt;br /&gt;
    public function cms_callMethod($method_name, $args) {&lt;br /&gt;
      return call_user_func_array(Array($this, $method_name), $args);&lt;br /&gt;
    }&lt;br /&gt;
		&lt;br /&gt;
    public function __call($method, $args) {&lt;br /&gt;
      throw new publicException(&amp;quot;Method &amp;quot; . get_class($this) . &amp;quot;::&amp;quot; . $method . &amp;quot; doesn&amp;#039;t exists&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //TODO: Write your own macroses here&lt;br /&gt;
    &lt;br /&gt;
    // + Twitter&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос записи данных в кэш&lt;br /&gt;
      @param String&lt;br /&gt;
        $filename - имя файла&lt;br /&gt;
      @param String&lt;br /&gt;
        $content - содержание файла&lt;br /&gt;
     */&lt;br /&gt;
    private function writeCache($filename, $content) {&lt;br /&gt;
      if(!file_exists(CACHE_PATH))&lt;br /&gt;
        mkdir(CACHE_PATH);&lt;br /&gt;
      &lt;br /&gt;
      try {&lt;br /&gt;
        $fp = fopen(CACHE_PATH.$filename, &amp;#039;w&amp;#039;);&lt;br /&gt;
        flock($fp, LOCK_EX);&lt;br /&gt;
        fwrite($fp, $content);&lt;br /&gt;
        flock($fp, LOCK_UN);&lt;br /&gt;
        fclose($fp);&lt;br /&gt;
      } catch(Exception $e) {&lt;br /&gt;
        echo $e-&amp;gt;getMessage();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос чтения данных из кэша&lt;br /&gt;
      @param String&lt;br /&gt;
        $filename - имя файла&lt;br /&gt;
      @param Integer&lt;br /&gt;
        $expiry - время в миллисекундах (необходимо для вычисления актуальности данных)&lt;br /&gt;
     */&lt;br /&gt;
    private function readCache($filename, $expiry) {&lt;br /&gt;
      $cache_filename = CACHE_PATH.$filename;&lt;br /&gt;
      if(file_exists($cache_filename)) {&lt;br /&gt;
        if((time() - $expiry) &amp;gt; filemtime($cache_filename))&lt;br /&gt;
          return false;&lt;br /&gt;
          &lt;br /&gt;
        return simplexml_load_file($cache_filename);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос получения информации о пользователе&lt;br /&gt;
      @param String&lt;br /&gt;
        $id - идентификатор пользователя&lt;br /&gt;
      @param String&lt;br /&gt;
        $template - шаблон вывода в TPL&lt;br /&gt;
     */&lt;br /&gt;
    public function twitterScreen($id, $template = &amp;#039;default&amp;#039;) {&lt;br /&gt;
      if(!isset($template))&lt;br /&gt;
        $template = &amp;#039;default&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
      list($widget_block, $error_block) =&lt;br /&gt;
        self::loadTemplates(&amp;#039;twitter/user/&amp;#039;.$template, &amp;#039;widget_block&amp;#039;, &amp;#039;error_block&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
      if(!isset($id))&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $user_cache_filename = $id.&amp;#039;.user.cache&amp;#039;;&lt;br /&gt;
      if(!($user = $this-&amp;gt;readCache($user_cache_filename, 1800))) {&lt;br /&gt;
        $user = simplexml_load_file(SCREEN_LINK.$id);&lt;br /&gt;
        $this-&amp;gt;writeCache($user_cache_filename, $user-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(!$user)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $block_arr = array();&lt;br /&gt;
      $block_arr[&amp;#039;id&amp;#039;] = (string)$user[0]-&amp;gt;id;&lt;br /&gt;
      $block_arr[&amp;#039;name&amp;#039;] = (string)$user[0]-&amp;gt;name;&lt;br /&gt;
      $block_arr[&amp;#039;screen_name&amp;#039;] = (string)$user[0]-&amp;gt;screen_name;&lt;br /&gt;
      $block_arr[&amp;#039;location&amp;#039;] = (string)$user[0]-&amp;gt;location;&lt;br /&gt;
      $block_arr[&amp;#039;description&amp;#039;] = (string)$user[0]-&amp;gt;description;&lt;br /&gt;
      $block_arr[&amp;#039;profile_image_url&amp;#039;] = (string)$user[0]-&amp;gt;profile_image_url;&lt;br /&gt;
      $block_arr[&amp;#039;url&amp;#039;] = (string)$user[0]-&amp;gt;url;&lt;br /&gt;
      $block_arr[&amp;#039;followers_count&amp;#039;] = (string)$user[0]-&amp;gt;followers_count;&lt;br /&gt;
      $block_arr[&amp;#039;statuses_count&amp;#039;] = (string)$user[0]-&amp;gt;statuses_count;&lt;br /&gt;
      $block_arr[&amp;#039;lang&amp;#039;] = (string)$user[0]-&amp;gt;lang;&lt;br /&gt;
      $block_arr[&amp;#039;status&amp;#039;] = (string)$user[0]-&amp;gt;status-&amp;gt;text;&lt;br /&gt;
&lt;br /&gt;
      return self::parseTemplate($widget_block, $block_arr);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос получения ленты твитов&lt;br /&gt;
      @param String&lt;br /&gt;
        $id - идентификатор пользователя&lt;br /&gt;
      @param Integer&lt;br /&gt;
        $count - количество выводимых твитов&lt;br /&gt;
      @param String&lt;br /&gt;
        $template - шаблон вывода в TPL&lt;br /&gt;
     */&lt;br /&gt;
    public function twitterTimeline($id, $count = 3, $template = &amp;#039;default&amp;#039;) {&lt;br /&gt;
      if(!isset($template))&lt;br /&gt;
        $template = &amp;#039;default&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
      list($timeline_block, $lines_block, $error_block) =&lt;br /&gt;
        self::loadTemplates(&amp;#039;twitter/timeline/&amp;#039;.$template, &amp;#039;timeline_block&amp;#039;, &amp;#039;lines_block&amp;#039;, &amp;#039;error_block&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
      if(!isset($id))&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $user_cache_filename = $id.&amp;#039;.user.cache&amp;#039;;&lt;br /&gt;
      if(!($user = $this-&amp;gt;readCache($user_cache_filename, 1800))) {&lt;br /&gt;
        $user = simplexml_load_file(SCREEN_LINK.$id);&lt;br /&gt;
        $this-&amp;gt;writeCache($user_cache_filename, $user-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(!$user)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $timeline_cache_filename = $id.&amp;#039;.timeline.cache&amp;#039;;&lt;br /&gt;
      if(!($timeline = $this-&amp;gt;readCache($timeline_cache_filename, 1800))) {&lt;br /&gt;
        $timeline = simplexml_load_file(TIMELINE_LINK.$id.&amp;#039;.rss&amp;#039;);&lt;br /&gt;
        $this-&amp;gt;writeCache($timeline_cache_filename, $timeline-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(!$timeline)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
        &lt;br /&gt;
      if($count &amp;lt; 1)&lt;br /&gt;
        $count = 1;&lt;br /&gt;
        &lt;br /&gt;
      $length = count($timeline-&amp;gt;channel-&amp;gt;item);&lt;br /&gt;
      if($count &amp;gt; $length)&lt;br /&gt;
        $count = $length;&lt;br /&gt;
      &lt;br /&gt;
      $lines = array();&lt;br /&gt;
      for($i = 0; $i &amp;lt; $count; $i++) {&lt;br /&gt;
        $line_arr = array();&lt;br /&gt;
        $line_arr[&amp;#039;date&amp;#039;] = (string)date(&amp;#039;d.m.Y G:i&amp;#039;, strtotime($timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;pubDate));&lt;br /&gt;
        $line_arr[&amp;#039;title&amp;#039;] = (string)$timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;title;&lt;br /&gt;
        $line_arr[&amp;#039;link&amp;#039;] = (string)$timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;link;&lt;br /&gt;
        $lines[] = self::parseTemplate($lines_block, $line_arr);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      $block_arr = array();&lt;br /&gt;
      $block_arr[&amp;#039;id&amp;#039;] = (string)$user[0]-&amp;gt;id;&lt;br /&gt;
      $block_arr[&amp;#039;name&amp;#039;] = (string)$user[0]-&amp;gt;name;&lt;br /&gt;
      $block_arr[&amp;#039;screen_name&amp;#039;] = (string)$user[0]-&amp;gt;screen_name;&lt;br /&gt;
      $block_arr[&amp;#039;count&amp;#039;] = (integer)$count;&lt;br /&gt;
      $block_arr[&amp;#039;subnodes:lines&amp;#039;] = (array)$lines;&lt;br /&gt;
      &lt;br /&gt;
      return self::parseTemplate($timeline_block, $block_arr);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // - Twitter&lt;br /&gt;
  };&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Макросы &amp;quot;writeCache&amp;quot; и &amp;quot;readCache&amp;quot; имеют модификаторы &amp;quot;private&amp;quot;. Это сделано для того, чтобы они были недоступны для пользователей на прямую.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Теперь можно посмотреть ответ UData, к примеру, макроса &amp;quot;twitterScreen&amp;quot;. Для этого наберите в адресной сроке браузера текст: &amp;quot;domain.ru/udata/custom/twitterScreen/umi_cms/notemplate&amp;quot;. В результате будет получен ответ UData:&lt;br /&gt;
&amp;lt;/p&amp;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;custom&amp;quot; method=&amp;quot;twitterScreen&amp;quot; generation-time=&amp;quot;0.707462&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;id&amp;gt;63716372&amp;lt;/id&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;UMI&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;screen_name&amp;gt;umi_cms&amp;lt;/screen_name&amp;gt;&lt;br /&gt;
  &amp;lt;description&amp;gt;UMI.CMS среди лидеров рынка CMS в России. Каждый третий разработчик Рунета использует UMI.CMS для создания сайтов.&amp;lt;/description&amp;gt;&lt;br /&gt;
  &amp;lt;profile_image_url&amp;gt;http://a0.twimg.com/profile_images/1850324360/vert1_normal.png&amp;lt;/profile_image_url&amp;gt;&lt;br /&gt;
  &amp;lt;url&amp;gt;http://www.umi-cms.ru&amp;lt;/url&amp;gt;&lt;br /&gt;
  &amp;lt;followers_count&amp;gt;469&amp;lt;/followers_count&amp;gt;&lt;br /&gt;
  &amp;lt;statuses_count&amp;gt;905&amp;lt;/statuses_count&amp;gt;&lt;br /&gt;
  &amp;lt;lang&amp;gt;ru&amp;lt;/lang&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;RT @fullspace_: Внедрили поддержку @umi_cms в настройки Nginx. Ускоряем сайты как никто! :) http://t.co/2N3Sbo2l&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/udata&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
При использовании XSLT-шаблонизатора макросы готовы к работе. Если Вы используете TPL-шаблонизатор, необходимо организовать шаблоны вывода информации. Создайте файл &amp;quot;/tpls/twitter/user/default.tpl&amp;quot; - шаблон вывода информации о пользователе. Его содержание будет следующим:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 2. Шаблон вывода информации о пользователе&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$FORMS = Array();&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;widget_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;%id%&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;%description%&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;img src=&amp;quot;%profile_image_url%&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;error_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ошибка!&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Далее нужно создать файл &amp;quot;/tpls/twitter/timeline/default.tpl&amp;quot; - шаблон вывода ленты твитов. Содержание данного файла будет таким:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 3. Шаблон вывода ленты твитов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$FORMS = Array();&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;timeline_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Последние &amp;lt;strong&amp;gt;%count%&amp;lt;/strong&amp;gt; твитов пользователя &lt;br /&gt;
    &amp;lt;strong&amp;gt;%name%&amp;lt;/strong&amp;gt; (%id%)&amp;lt;/p&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;%lines%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;lines_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;%date%&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;%title%.&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;%link%&amp;quot;&amp;gt;Twitter&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;error_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ошибка!&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После создания шаблонов вывода, макросы готовы к использованию и в TPL-шаблонизаторе.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для примера, выведем информацию о пользователе &amp;quot;umi_cms&amp;quot; в TPL-шаблон &amp;quot;Интернет-магазин&amp;quot; (Хомячки). Откройте файл &amp;quot;/tpls/content/index.tpl&amp;quot; и пропишите макрос &amp;quot;custom twitterScreen&amp;quot; в блоке &amp;quot;&amp;amp;lt;div class=&amp;quot;column&amp;quot;&amp;amp;gt;&amp;quot;:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;column&amp;quot;&amp;gt;			&lt;br /&gt;
  %search insert_form(&amp;#039;home&amp;#039;)%&lt;br /&gt;
					&lt;br /&gt;
  %custom twitterTimeline(&amp;#039;umi_cms&amp;#039;)%&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Twitter_screen.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Последние 3 твита пользователя &amp;quot;umi_cms&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Примечание&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный функционал был проверен на работоспособность в версии системы 2.8.5.1.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kalexey&amp;diff=3827</id>
		<title>Участник:Kalexey</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Kalexey&amp;diff=3827"/>
		<updated>2012-07-31T08:02:20Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: /* Июль */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Июль ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Взаимодействие с Twitter (XML API)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Система рэйтинга]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Комментарии ВКонтакте и Facebook (TPL)]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Плагин &amp;quot;Spoiler&amp;quot; для TinyMCE]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Получение текущего шаблона в кастомном методе]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Укорачивание URL]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Июнь ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вывод случайного изображения из папки]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Наложение водяной подписи на изображение]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Минимизация CSS и JavaScript]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Вывод списка тегов всех постов блогов]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Расширяем функциональность TinyMCE]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Май ==&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Расширяем возможности макроса content redirect]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Подключаем кастомный WYSIWYG-редактор для административной панели]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Поиск с панелью предложений]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Апрель ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Добавляем QR-коды для ссылок на сайте]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[Организуем интерфейс для слабовидящих пользователей]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81_Twitter_(XML_API)&amp;diff=3826</id>
		<title>Взаимодействие с Twitter (XML API)</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D1%81_Twitter_(XML_API)&amp;diff=3826"/>
		<updated>2012-07-31T08:01:57Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: Новая страница: « category:Написание кастомных макросов &amp;lt;p&amp;gt; В данной статье будут представлены макросы, для вз…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Написание кастомных макросов]]&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
В данной статье будут представлены макросы, для взаимодействия с сервисом Twitter через Twitter XML API. Макрос для получения информации о пользователе и макрос получения ленты твитов.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для незарегистрированных пользователей количество запросов к XML API ограничено. В час можно произвести только 150 запросов. Чтобы обойти данное ограничение, будут использоваться два вспомогательных макроса, для организации своего рода кэша. Макрос &amp;quot;writeCache&amp;quot; будет записывать полученные данные во временный файл, а макрос &amp;quot;readCache&amp;quot; считывать их. В последствии, чтобы каждый раз при обращение к странице, где будут использоваться макросы получения информации о пользователе или ленты твитов, не производился запрос к серверу Twitter, данные будут браться из временных файлов.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Все макросы необходимо разместить в файле &amp;quot;/classes/modules/custom.php&amp;quot;, сразу после строки &amp;quot;//TODO: Write your macroses here&amp;quot;. Для удобства написания и чтения кода воспользуемся константами, их нужно будет разместить после текста &amp;quot;&amp;lt;?php&amp;quot;. В результате, файл &amp;quot;custom.php&amp;quot; будет выглядеть примерно следующим образом:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 1. Файл &amp;quot;custom.php&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
  // Константы для макросов взаимодействия с Twitter&lt;br /&gt;
  define(&amp;#039;CACHE_PATH&amp;#039;, &amp;#039;./sys-temp/twitter/&amp;#039;, true); // Директория для файлов кэша&lt;br /&gt;
  define(&amp;#039;SCREEN_LINK&amp;#039;, &amp;#039;http://twitter.com/users/show.xml?screen_name=&amp;#039;, true); // URL для получения информации о пользователе&lt;br /&gt;
  define(&amp;#039;TIMELINE_LINK&amp;#039;, &amp;#039;http://twitter.com/statuses/user_timeline/&amp;#039;, true); // URL для получения ленты твитов&lt;br /&gt;
  &lt;br /&gt;
  class custom extends def_module {&lt;br /&gt;
    public function cms_callMethod($method_name, $args) {&lt;br /&gt;
      return call_user_func_array(Array($this, $method_name), $args);&lt;br /&gt;
    }&lt;br /&gt;
		&lt;br /&gt;
    public function __call($method, $args) {&lt;br /&gt;
      throw new publicException(&amp;quot;Method &amp;quot; . get_class($this) . &amp;quot;::&amp;quot; . $method . &amp;quot; doesn&amp;#039;t exists&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    //TODO: Write your own macroses here&lt;br /&gt;
    &lt;br /&gt;
    // + Twitter&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос записи данных в кэш&lt;br /&gt;
      @param String&lt;br /&gt;
        $filename - имя файла&lt;br /&gt;
      @param String&lt;br /&gt;
        $content - содержание файла&lt;br /&gt;
     */&lt;br /&gt;
    private function writeCache($filename, $content) {&lt;br /&gt;
      if(!file_exists(CACHE_PATH))&lt;br /&gt;
        mkdir(CACHE_PATH);&lt;br /&gt;
      &lt;br /&gt;
      try {&lt;br /&gt;
        $fp = fopen(CACHE_PATH.$filename, &amp;#039;w&amp;#039;);&lt;br /&gt;
        flock($fp, LOCK_EX);&lt;br /&gt;
        fwrite($fp, $content);&lt;br /&gt;
        flock($fp, LOCK_UN);&lt;br /&gt;
        fclose($fp);&lt;br /&gt;
      } catch(Exception $e) {&lt;br /&gt;
        echo $e-&amp;gt;getMessage();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос чтения данных из кэша&lt;br /&gt;
      @param String&lt;br /&gt;
        $filename - имя файла&lt;br /&gt;
      @param Integer&lt;br /&gt;
        $expiry - время в миллисекундах (необходимо для вычисления актуальности данных)&lt;br /&gt;
     */&lt;br /&gt;
    private function readCache($filename, $expiry) {&lt;br /&gt;
      $cache_filename = CACHE_PATH.$filename;&lt;br /&gt;
      if(file_exists($cache_filename)) {&lt;br /&gt;
        if((time() - $expiry) &amp;gt; filemtime($cache_filename))&lt;br /&gt;
          return false;&lt;br /&gt;
          &lt;br /&gt;
        return simplexml_load_file($cache_filename);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос получения информации о пользователе&lt;br /&gt;
      @param String&lt;br /&gt;
        $id - идентификатор пользователя&lt;br /&gt;
      @param String&lt;br /&gt;
        $template - шаблон вывода в TPL&lt;br /&gt;
     */&lt;br /&gt;
    public function twitterScreen($id, $template = &amp;#039;default&amp;#039;) {&lt;br /&gt;
      if(!isset($template))&lt;br /&gt;
        $template = &amp;#039;default&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
      list($widget_block, $error_block) =&lt;br /&gt;
        self::loadTemplates(&amp;#039;twitter/user/&amp;#039;.$template, &amp;#039;widget_block&amp;#039;, &amp;#039;error_block&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
      if(!isset($id))&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $user_cache_filename = $id.&amp;#039;.user.cache&amp;#039;;&lt;br /&gt;
      if(!($user = $this-&amp;gt;readCache($user_cache_filename, 1800))) {&lt;br /&gt;
        $user = simplexml_load_file(SCREEN_LINK.$id);&lt;br /&gt;
        $this-&amp;gt;writeCache($user_cache_filename, $user-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(!$user)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $block_arr = array();&lt;br /&gt;
      $block_arr[&amp;#039;id&amp;#039;] = (string)$user[0]-&amp;gt;id;&lt;br /&gt;
      $block_arr[&amp;#039;name&amp;#039;] = (string)$user[0]-&amp;gt;name;&lt;br /&gt;
      $block_arr[&amp;#039;screen_name&amp;#039;] = (string)$user[0]-&amp;gt;screen_name;&lt;br /&gt;
      $block_arr[&amp;#039;location&amp;#039;] = (string)$user[0]-&amp;gt;location;&lt;br /&gt;
      $block_arr[&amp;#039;description&amp;#039;] = (string)$user[0]-&amp;gt;description;&lt;br /&gt;
      $block_arr[&amp;#039;profile_image_url&amp;#039;] = (string)$user[0]-&amp;gt;profile_image_url;&lt;br /&gt;
      $block_arr[&amp;#039;url&amp;#039;] = (string)$user[0]-&amp;gt;url;&lt;br /&gt;
      $block_arr[&amp;#039;followers_count&amp;#039;] = (string)$user[0]-&amp;gt;followers_count;&lt;br /&gt;
      $block_arr[&amp;#039;statuses_count&amp;#039;] = (string)$user[0]-&amp;gt;statuses_count;&lt;br /&gt;
      $block_arr[&amp;#039;lang&amp;#039;] = (string)$user[0]-&amp;gt;lang;&lt;br /&gt;
      $block_arr[&amp;#039;status&amp;#039;] = (string)$user[0]-&amp;gt;status-&amp;gt;text;&lt;br /&gt;
&lt;br /&gt;
      return self::parseTemplate($widget_block, $block_arr);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
      @title&lt;br /&gt;
        Макрос получения ленты твитов&lt;br /&gt;
      @param String&lt;br /&gt;
        $id - идентификатор пользователя&lt;br /&gt;
      @param Integer&lt;br /&gt;
        $count - количество выводимых твитов&lt;br /&gt;
      @param String&lt;br /&gt;
        $template - шаблон вывода в TPL&lt;br /&gt;
     */&lt;br /&gt;
    public function twitterTimeline($id, $count = 3, $template = &amp;#039;default&amp;#039;) {&lt;br /&gt;
      if(!isset($template))&lt;br /&gt;
        $template = &amp;#039;default&amp;#039;;&lt;br /&gt;
        &lt;br /&gt;
      list($timeline_block, $lines_block, $error_block) =&lt;br /&gt;
        self::loadTemplates(&amp;#039;twitter/timeline/&amp;#039;.$template, &amp;#039;timeline_block&amp;#039;, &amp;#039;lines_block&amp;#039;, &amp;#039;error_block&amp;#039;);&lt;br /&gt;
        &lt;br /&gt;
      if(!isset($id))&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $user_cache_filename = $id.&amp;#039;.user.cache&amp;#039;;&lt;br /&gt;
      if(!($user = $this-&amp;gt;readCache($user_cache_filename, 1800))) {&lt;br /&gt;
        $user = simplexml_load_file(SCREEN_LINK.$id);&lt;br /&gt;
        $this-&amp;gt;writeCache($user_cache_filename, $user-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      if(!$user)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
      &lt;br /&gt;
      $timeline_cache_filename = $id.&amp;#039;.timeline.cache&amp;#039;;&lt;br /&gt;
      if(!($timeline = $this-&amp;gt;readCache($timeline_cache_filename, 1800))) {&lt;br /&gt;
        $timeline = simplexml_load_file(TIMELINE_LINK.$id.&amp;#039;.rss&amp;#039;);&lt;br /&gt;
        $this-&amp;gt;writeCache($timeline_cache_filename, $timeline-&amp;gt;asXML());&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if(!$timeline)&lt;br /&gt;
        return $error_block;&lt;br /&gt;
        &lt;br /&gt;
      if($count &amp;lt; 1)&lt;br /&gt;
        $count = 1;&lt;br /&gt;
        &lt;br /&gt;
      $length = count($timeline-&amp;gt;channel-&amp;gt;item);&lt;br /&gt;
      if($count &amp;gt; $length)&lt;br /&gt;
        $count = $length;&lt;br /&gt;
      &lt;br /&gt;
      $lines = array();&lt;br /&gt;
      for($i = 0; $i &amp;lt; $count; $i++) {&lt;br /&gt;
        $line_arr = array();&lt;br /&gt;
        $line_arr[&amp;#039;date&amp;#039;] = (string)date(&amp;#039;d.m.Y G:i&amp;#039;, strtotime($timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;pubDate));&lt;br /&gt;
        $line_arr[&amp;#039;title&amp;#039;] = (string)$timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;title;&lt;br /&gt;
        $line_arr[&amp;#039;link&amp;#039;] = (string)$timeline-&amp;gt;channel-&amp;gt;item[$i]-&amp;gt;link;&lt;br /&gt;
        $lines[] = self::parseTemplate($lines_block, $line_arr);&lt;br /&gt;
      }&lt;br /&gt;
      &lt;br /&gt;
      $block_arr = array();&lt;br /&gt;
      $block_arr[&amp;#039;id&amp;#039;] = (string)$user[0]-&amp;gt;id;&lt;br /&gt;
      $block_arr[&amp;#039;name&amp;#039;] = (string)$user[0]-&amp;gt;name;&lt;br /&gt;
      $block_arr[&amp;#039;screen_name&amp;#039;] = (string)$user[0]-&amp;gt;screen_name;&lt;br /&gt;
      $block_arr[&amp;#039;count&amp;#039;] = (integer)$count;&lt;br /&gt;
      $block_arr[&amp;#039;subnodes:lines&amp;#039;] = (array)$lines;&lt;br /&gt;
      &lt;br /&gt;
      return self::parseTemplate($timeline_block, $block_arr);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // - Twitter&lt;br /&gt;
  };&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Макросы &amp;quot;writeCache&amp;quot; и &amp;quot;readCache&amp;quot; имеют модификаторы &amp;quot;private&amp;quot;. Это сделано для того, чтобы они были недоступны для пользователей на прямую.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Теперь можно посмотреть ответ UData, к примеру, макроса &amp;quot;twitterScreen&amp;quot;. Для этого наберите в адресной сроке браузера текст: &amp;quot;domain.ru/udata/custom/twitterScreen/umi_cms/notemplate&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;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;custom&amp;quot; method=&amp;quot;twitterScreen&amp;quot; generation-time=&amp;quot;0.707462&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;id&amp;gt;63716372&amp;lt;/id&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;UMI&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;screen_name&amp;gt;umi_cms&amp;lt;/screen_name&amp;gt;&lt;br /&gt;
  &amp;lt;description&amp;gt;UMI.CMS среди лидеров рынка CMS в России. Каждый третий разработчик Рунета использует UMI.CMS для создания сайтов.&amp;lt;/description&amp;gt;&lt;br /&gt;
  &amp;lt;profile_image_url&amp;gt;http://a0.twimg.com/profile_images/1850324360/vert1_normal.png&amp;lt;/profile_image_url&amp;gt;&lt;br /&gt;
  &amp;lt;url&amp;gt;http://www.umi-cms.ru&amp;lt;/url&amp;gt;&lt;br /&gt;
  &amp;lt;followers_count&amp;gt;469&amp;lt;/followers_count&amp;gt;&lt;br /&gt;
  &amp;lt;statuses_count&amp;gt;905&amp;lt;/statuses_count&amp;gt;&lt;br /&gt;
  &amp;lt;lang&amp;gt;ru&amp;lt;/lang&amp;gt;&lt;br /&gt;
  &amp;lt;status&amp;gt;RT @fullspace_: Внедрили поддержку @umi_cms в настройки Nginx. Ускоряем сайты как никто! :) http://t.co/2N3Sbo2l&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;/udata&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
При использовании XSLT-шаблонизатора макросы готовы к работе. Если Вы используете TPL-шаблонизатор, необходимо организовать шаблоны вывода информации. Создайте файл &amp;quot;/tpls/twitter/user/default.tpl&amp;quot; - шаблон вывода информации о пользователе. Его содержание будет следующим:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 2. Шаблон вывода информации о пользователе&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$FORMS = Array();&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;widget_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;%id%&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;%description%&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;img src=&amp;quot;%profile_image_url%&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;error_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ошибка!&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Далее нужно создать файл &amp;quot;/tpls/twitter/timeline/default.tpl&amp;quot; - шаблон вывода ленты твитов. Содержание данного файла будет таким:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 3. Шаблон вывода ленты твитов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$FORMS = Array();&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;timeline_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Последние &amp;lt;strong&amp;gt;%count%&amp;lt;/strong&amp;gt; твитов пользователя &lt;br /&gt;
    &amp;lt;strong&amp;gt;%name%&amp;lt;/strong&amp;gt; (%id%)&amp;lt;/p&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;%lines%&amp;lt;/div&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;lines_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;%date%&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;%title%.&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;%link%&amp;quot;&amp;gt;Twitter&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
$FORMS[&amp;#039;error_block&amp;#039;] = &amp;lt;&amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ошибка!&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После создания шаблонов вывода, макросы готовы к использованию и в TPL-шаблонизаторе.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для примера, выведем информацию о пользователе &amp;quot;umi_cms&amp;quot; в TPL-шаблон &amp;quot;Интернет-магазин&amp;quot; (Хомячки). Откройте файл &amp;quot;/tpls/content/index.tpl&amp;quot; и пропишите макрос &amp;quot;custom twitterScreen&amp;quot; в блоке &amp;quot;&amp;amp;lt;div class=&amp;quot;column&amp;quot;&amp;amp;gt;&amp;quot;:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;column&amp;quot;&amp;gt;			&lt;br /&gt;
  %search insert_form(&amp;#039;home&amp;#039;)%&lt;br /&gt;
					&lt;br /&gt;
  %custom twitterTimeline(&amp;#039;umi_cms&amp;#039;)%&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Twitter_screen.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Последние 3 твита пользователя &amp;quot;umi_cms&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Примечание&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный функционал был проверен на работоспособность в версии системы 2.8.5.1.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Twitter_screen.png&amp;diff=3825</id>
		<title>Файл:Twitter screen.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Twitter_screen.png&amp;diff=3825"/>
		<updated>2012-07-31T07:57:53Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%80%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3%D0%B0&amp;diff=3824</id>
		<title>Система рейтинга</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%80%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3%D0%B0&amp;diff=3824"/>
		<updated>2012-07-30T05:36:09Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Вопросы и уроки разработки сайтов на UMI.CMS]]&lt;br /&gt;
 [[category:Написание кастомных макросов]]&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Задача&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Организовать систему рейтинга для объектов UMI.CMS.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Решение&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Организуем рейтинг с использованием jQuery и Ajax на примере объектов каталога. В начале, необходимо отредактировать тип данных &amp;quot;Объект каталога&amp;quot;: зайдите в модуль &amp;quot;Шаблоны данных&amp;quot;, найдите тип данных &amp;quot;Объект каталога&amp;quot; и откройте его для редактирования. Нажмите кнопку &amp;quot;Добавить группу&amp;quot; и задайте имя группы, например - &amp;quot;Рейтинг&amp;quot;. В созданной группе добавьте два поля типа &amp;quot;Число&amp;quot;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;quot;Хороший&amp;quot; (good);&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;quot;Плохой&amp;quot; (bad).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Rate_fields.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Группа полей &amp;quot;Рейтинг&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Теперь необходимо написать макросы, которые будут работать с данными полями. Откройте файл &amp;quot;/classes/modules/vote/__custom.php&amp;quot; и добавьте код макросов сразу же после строки &amp;quot;//TODO: Write your macroses here&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 1. Код макросов установки и получения рейтинга&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  @title&lt;br /&gt;
    Установка рейтинга объекта&lt;br /&gt;
 */&lt;br /&gt;
public function setRate() {&lt;br /&gt;
  $id = (int)getRequest(&amp;#039;id&amp;#039;);&lt;br /&gt;
  if(!isset($id) || !is_numeric($id))&lt;br /&gt;
    throw new publicException(&amp;#039;Invalid object ID&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
  $type = (string)getRequest(&amp;#039;type&amp;#039;);&lt;br /&gt;
  if(!isset($type))&lt;br /&gt;
    throw new publicException(&amp;#039;Invalid rate type&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
  $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
  $element = $hierarchy-&amp;gt;getElement($id);&lt;br /&gt;
  $rate = $element-&amp;gt;getValue($type) + 1;&lt;br /&gt;
  $element-&amp;gt;setValue($type, $rate);&lt;br /&gt;
  $element-&amp;gt;commit();&lt;br /&gt;
  &lt;br /&gt;
  echo $rate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
  @title&lt;br /&gt;
    Получение рейтинга объекта&lt;br /&gt;
  @param Integer&lt;br /&gt;
    $id - идентификатор объекта&lt;br /&gt;
  @param String&lt;br /&gt;
    $type - тип рейтинга (good/bad)&lt;br /&gt;
 */&lt;br /&gt;
public function getRate($id, $type) {&lt;br /&gt;
  if(!isset($id) || !is_numeric($id))&lt;br /&gt;
    throw new publicException(&amp;#039;Invalid object ID&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
  if(!isset($type))&lt;br /&gt;
    throw new publicException(&amp;#039;Invalid rate type&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
  $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
  $element = $hierarchy-&amp;gt;getElement($id);&lt;br /&gt;
  $rate = $element-&amp;gt;getValue($type);&lt;br /&gt;
  &lt;br /&gt;
  return (int)($rate ? $rate : 0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После этого, нужно добавить разрешения для макросов. Создайте файл &amp;quot;/classes/modules/vote/permissions.custom.php&amp;quot; с таким содержимым:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 2. Разрешения для макросов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  $permissions = array(&lt;br /&gt;
    &amp;#039;post&amp;#039; =&amp;gt; array(&amp;#039;setRate&amp;#039;, &amp;#039;getRate&amp;#039;)&lt;br /&gt;
  );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Далее необходимо повесить обработчик на событие &amp;quot;click&amp;quot; для ссылок, которые будут устанавливать значение рейтинга. Для этого создайте файл &amp;quot;/js/rate.js&amp;quot; и напишите в него следующий код:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 3. Файл &amp;quot;rate.js&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
&lt;br /&gt;
  jQuery(&amp;#039;.vote&amp;#039;).click(function() {&lt;br /&gt;
    var cid = &amp;#039;vote&amp;#039; + jQuery(this).attr(&amp;#039;id&amp;#039;);&lt;br /&gt;
    if(jQuery.cookie(cid)) {&lt;br /&gt;
      window.alert(&amp;#039;Вы уже голосовали!&amp;#039;);&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var self = jQuery(this);&lt;br /&gt;
    var parent = jQuery(this).parent();&lt;br /&gt;
    &lt;br /&gt;
    var id = jQuery(this).attr(&amp;#039;id&amp;#039;);&lt;br /&gt;
    var type = jQuery(this).attr(&amp;#039;name&amp;#039;);&lt;br /&gt;
    var req = &amp;#039;id=&amp;#039; + id + &amp;#039;&amp;amp;type=&amp;#039; + type;&lt;br /&gt;
    var e = &amp;#039;.rate .&amp;#039; + type;&lt;br /&gt;
    &lt;br /&gt;
    parent.animate({&amp;#039;opacity&amp;#039;: 0.3}, 200);&lt;br /&gt;
    jQuery.ajax({&lt;br /&gt;
      type: &amp;#039;POST&amp;#039;,&lt;br /&gt;
      url: &amp;#039;/udata/vote/setRate&amp;#039;,&lt;br /&gt;
      data: req,&lt;br /&gt;
      cache: false,&lt;br /&gt;
    })&lt;br /&gt;
    .success(function(data) {&lt;br /&gt;
      self.html(data);&lt;br /&gt;
      parent.animate({&amp;#039;opacity&amp;#039;: 1}, 200);&lt;br /&gt;
      jQuery.cookie(cid, &amp;#039;true&amp;#039;, {&amp;#039;expires&amp;#039;: new Date().getTime() - 1});&lt;br /&gt;
    })&lt;br /&gt;
    .error(function() {&lt;br /&gt;
      window.alert(&amp;#039;Ошибка! К сожалению, Ваш голос не будет учтён.&amp;#039;);&lt;br /&gt;
      jQuery(e).animate({&amp;#039;opacity&amp;#039;: 1}, 200);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  &lt;br /&gt;
  jQuery(&amp;#039;.rate .good&amp;#039;).hover(&lt;br /&gt;
    function() {&lt;br /&gt;
      jQuery(this).css(&amp;#039;background-color&amp;#039;, &amp;#039;#88D135&amp;#039;);&lt;br /&gt;
    }, &lt;br /&gt;
    function() {&lt;br /&gt;
      jQuery(this).css(&amp;#039;background-color&amp;#039;, &amp;#039;#4AA735&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
  &lt;br /&gt;
  jQuery(&amp;#039;.rate .bad&amp;#039;).hover(&lt;br /&gt;
    function() {&lt;br /&gt;
      jQuery(this).css(&amp;#039;background-color&amp;#039;, &amp;#039;#FF7A32&amp;#039;);&lt;br /&gt;
    }, &lt;br /&gt;
    function() {&lt;br /&gt;
      jQuery(this).css(&amp;#039;background-color&amp;#039;, &amp;#039;#FF2926&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
  &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Событие &amp;quot;click&amp;quot; будет обрабатываться у ссылок с классом &amp;quot;vote&amp;quot;. Также в данном коде присутствует обработчики события &amp;quot;hover&amp;quot;. Он срабатывает при наведении курсора мыши и меняет цвет кнопки рейтинга. По желанию, этот функционал можно удалить.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Осталось задать стиль панели рейтинга. Создайте файл &amp;quot;/css/rate.css&amp;quot; со следующим содержимым:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 4. Файл &amp;quot;rate.css&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.rate,&lt;br /&gt;
.good,&lt;br /&gt;
.bad&lt;br /&gt;
{&lt;br /&gt;
  float: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.rate span&lt;br /&gt;
{&lt;br /&gt;
  float: left;&lt;br /&gt;
  margin: 2px 12px 4px 20px;&lt;br /&gt;
  color: #4A89BA;&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.good,&lt;br /&gt;
.bad&lt;br /&gt;
{&lt;br /&gt;
  padding: 4px 12px;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin: 0 2px;&lt;br /&gt;
  border-radius: 5px;&lt;br /&gt;
  -moz-border-radius: 5px;&lt;br /&gt;
  -webkit-border-radius: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.good a,&lt;br /&gt;
.bad a&lt;br /&gt;
{&lt;br /&gt;
  color: #000;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  font-size: 15px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.good&lt;br /&gt;
{&lt;br /&gt;
  background-color: #4AA735;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.bad&lt;br /&gt;
{&lt;br /&gt;
  background-color: #FF2926;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для примера, подключим панель рейтинга в стандартный XSLT-шаблон UMI.CMS &amp;quot;Интернер-магазин современный&amp;quot; (DemoDizzi). Откройте файл &amp;quot;/xsltTpls/layouts/default.xsl&amp;quot; и подключите созданные файлы &amp;quot;rate.js&amp;quot; и &amp;quot;rate.css&amp;quot; в секции &amp;quot;head&amp;quot; следующим образом:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 5. Подключение файлов &amp;quot;rate.js&amp;quot; и &amp;quot;rate.css&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Рейтинг --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/js/rate.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;/css/rate.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После того, как файлы будут подключены, останется отредактировать шаблон вывода информации об объекте каталога. Откройте файл &amp;quot;/xsltTpls/modules/catalog/object-view.xsl&amp;quot; и разместите следующий код после блока &amp;quot;price&amp;quot;, чтобы получилось примерно так:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 6. Размещение панели рейтинга в шаблоне&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Блок &amp;quot;price&amp;quot; --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;price&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;span umi:element-id=&amp;quot;{page/@id}&amp;quot; umi:field-name=&amp;quot;price&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:apply-templates select=&amp;quot;document(concat(&amp;#039;udata://emarket/price/&amp;#039;, page/@id))&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Панель рейтинга --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;rate&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;good&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;vote&amp;quot; id=&amp;quot;{page/@id}&amp;quot; name=&amp;quot;good&amp;quot; title=&amp;quot;Хороший&amp;quot; href=&amp;quot;javascript: void(0);&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;xsl:value-of select=&amp;quot;document(concat(&amp;#039;udata://vote/getRate/&amp;#039;, page/@id, &amp;#039;/good/&amp;#039;))/udata&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;bad&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;vote&amp;quot; id=&amp;quot;{page/@id}&amp;quot; name=&amp;quot;bad&amp;quot; title=&amp;quot;Плохой&amp;quot; href=&amp;quot;javascript: void(0);&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;xsl:value-of select=&amp;quot;document(concat(&amp;#039;udata://vote/getRate/&amp;#039;, page/@id, &amp;#039;/bad/&amp;#039;))/udata&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Rate-panel.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Панель рейтинга&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Важно&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для работы представленной системы рейтинга в шаблон должны быть подключены библиотека jQuery и плагин jQuery Cookie. Если в шаблоне вызывается макрос includeQuickEditJs, то jQuery и jQuery Cookie подключатся автоматически.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Примечание&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный функционал был проверен на работоспособность в версии системы 2.8.5.1.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Rate-panel.png&amp;diff=3823</id>
		<title>Файл:Rate-panel.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Rate-panel.png&amp;diff=3823"/>
		<updated>2012-07-30T05:35:48Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%80%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3%D0%B0&amp;diff=3818</id>
		<title>Система рейтинга</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%80%D0%B5%D0%B9%D1%82%D0%B8%D0%BD%D0%B3%D0%B0&amp;diff=3818"/>
		<updated>2012-07-30T05:30:47Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Вопросы и уроки разработки сайтов на UMI.CMS]]&lt;br /&gt;
 [[category:Написание кастомных макросов]]&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Задача&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Организовать систему рейтинга для объектов UMI.CMS.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Решение&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Организуем рейтинг с использованием jQuery и Ajax на примере объектов каталога. В начале, необходимо отредактировать тип данных &amp;quot;Объект каталога&amp;quot;: зайдите в модуль &amp;quot;Шаблоны данных&amp;quot;, найдите тип данных &amp;quot;Объект каталога&amp;quot; и откройте его для редактирования. Нажмите кнопку &amp;quot;Добавить группу&amp;quot; и задайте имя группы, например - &amp;quot;Рейтинг&amp;quot;. В созданной группе добавьте два поля типа &amp;quot;Число&amp;quot;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;quot;Хороший&amp;quot; (good);&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;quot;Плохой&amp;quot; (bad).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Rate_fields.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Группа полей &amp;quot;Рейтинг&amp;quot;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Теперь необходимо написать макросы, которые будут работать с данными полями. Откройте файл &amp;quot;/classes/modules/vote/__custom.php&amp;quot; и добавьте код макросов сразу же после строки &amp;quot;//TODO: Write your macroses here&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 1. Код макросов установки и получения рейтинга&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  @title&lt;br /&gt;
    Установка рейтинга объекта&lt;br /&gt;
 */&lt;br /&gt;
public function setRate() {&lt;br /&gt;
  $id = (int)getRequest(&amp;#039;id&amp;#039;);&lt;br /&gt;
  if(!isset($id) || !is_numeric($id))&lt;br /&gt;
    throw new publicException(&amp;#039;Invalid object ID&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
  $type = (string)getRequest(&amp;#039;type&amp;#039;);&lt;br /&gt;
  if(!isset($type))&lt;br /&gt;
    throw new publicException(&amp;#039;Invalid rate type&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
  $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
  $element = $hierarchy-&amp;gt;getElement($id);&lt;br /&gt;
  $rate = $element-&amp;gt;getValue($type) + 1;&lt;br /&gt;
  $element-&amp;gt;setValue($type, $rate);&lt;br /&gt;
  $element-&amp;gt;commit();&lt;br /&gt;
  &lt;br /&gt;
  echo $rate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
  @title&lt;br /&gt;
    Получение рейтинга объекта&lt;br /&gt;
  @param Integer&lt;br /&gt;
    $id - идентификатор объекта&lt;br /&gt;
  @param String&lt;br /&gt;
    $type - тип рейтинга (good/bad)&lt;br /&gt;
 */&lt;br /&gt;
public function getRate($id, $type) {&lt;br /&gt;
  if(!isset($id) || !is_numeric($id))&lt;br /&gt;
    throw new publicException(&amp;#039;Invalid object ID&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
  if(!isset($type))&lt;br /&gt;
    throw new publicException(&amp;#039;Invalid rate type&amp;#039;);&lt;br /&gt;
    &lt;br /&gt;
  $hierarchy = umiHierarchy::getInstance();&lt;br /&gt;
  $element = $hierarchy-&amp;gt;getElement($id);&lt;br /&gt;
  $rate = $element-&amp;gt;getValue($type);&lt;br /&gt;
  &lt;br /&gt;
  return (int)($rate ? $rate : 0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После этого, нужно добавить разрешения для макросов. Создайте файл &amp;quot;/classes/modules/vote/permissions.custom.php&amp;quot; с таким содержимым:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 2. Разрешения для макросов&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  $permissions = array(&lt;br /&gt;
    &amp;#039;post&amp;#039; =&amp;gt; array(&amp;#039;setRate&amp;#039;, &amp;#039;getRate&amp;#039;)&lt;br /&gt;
  );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Далее необходимо повесить обработчик на событие &amp;quot;click&amp;quot; для ссылок, которые будут устанавливать значение рейтинга. Для этого создайте файл &amp;quot;/js/rate.js&amp;quot; и напишите в него следующий код:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 3. Файл &amp;quot;rate.js&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
jQuery(document).ready(function() {&lt;br /&gt;
&lt;br /&gt;
  jQuery(&amp;#039;.vote&amp;#039;).click(function() {&lt;br /&gt;
    var cid = &amp;#039;vote&amp;#039; + jQuery(this).attr(&amp;#039;id&amp;#039;);&lt;br /&gt;
    if(jQuery.cookie(cid)) {&lt;br /&gt;
      window.alert(&amp;#039;Вы уже голосовали!&amp;#039;);&lt;br /&gt;
      return false;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    var self = jQuery(this);&lt;br /&gt;
    var parent = jQuery(this).parent();&lt;br /&gt;
    &lt;br /&gt;
    var id = jQuery(this).attr(&amp;#039;id&amp;#039;);&lt;br /&gt;
    var type = jQuery(this).attr(&amp;#039;name&amp;#039;);&lt;br /&gt;
    var req = &amp;#039;id=&amp;#039; + id + &amp;#039;&amp;amp;type=&amp;#039; + type;&lt;br /&gt;
    var e = &amp;#039;.rate .&amp;#039; + type;&lt;br /&gt;
    &lt;br /&gt;
    parent.animate({&amp;#039;opacity&amp;#039;: 0.3}, 200);&lt;br /&gt;
    jQuery.ajax({&lt;br /&gt;
      type: &amp;#039;POST&amp;#039;,&lt;br /&gt;
      url: &amp;#039;/udata/vote/setRate&amp;#039;,&lt;br /&gt;
      data: req,&lt;br /&gt;
      cache: false,&lt;br /&gt;
    })&lt;br /&gt;
    .success(function(data) {&lt;br /&gt;
      self.html(data);&lt;br /&gt;
      parent.animate({&amp;#039;opacity&amp;#039;: 1}, 200);&lt;br /&gt;
      jQuery.cookie(cid, &amp;#039;true&amp;#039;, {&amp;#039;expires&amp;#039;: new Date().getTime() - 1});&lt;br /&gt;
    })&lt;br /&gt;
    .error(function() {&lt;br /&gt;
      window.alert(&amp;#039;Ошибка! К сожалению, Ваш голос не будет учтён.&amp;#039;);&lt;br /&gt;
      jQuery(e).animate({&amp;#039;opacity&amp;#039;: 1}, 200);&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
  &lt;br /&gt;
  jQuery(&amp;#039;.rate .good&amp;#039;).hover(&lt;br /&gt;
    function() {&lt;br /&gt;
      jQuery(this).css(&amp;#039;background-color&amp;#039;, &amp;#039;#88D135&amp;#039;);&lt;br /&gt;
    }, &lt;br /&gt;
    function() {&lt;br /&gt;
      jQuery(this).css(&amp;#039;background-color&amp;#039;, &amp;#039;#4AA735&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
  &lt;br /&gt;
  jQuery(&amp;#039;.rate .bad&amp;#039;).hover(&lt;br /&gt;
    function() {&lt;br /&gt;
      jQuery(this).css(&amp;#039;background-color&amp;#039;, &amp;#039;#FF7A32&amp;#039;);&lt;br /&gt;
    }, &lt;br /&gt;
    function() {&lt;br /&gt;
      jQuery(this).css(&amp;#039;background-color&amp;#039;, &amp;#039;#FF2926&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
  &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Событие &amp;quot;click&amp;quot; будет обрабатываться у ссылок с классом &amp;quot;vote&amp;quot;. Также в данном коде присутствует обработчики события &amp;quot;hover&amp;quot;. Он срабатывает при наведении курсора мыши и меняет цвет кнопки рейтинга. По желанию, этот функционал можно удалить.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Осталось задать стиль панели рейтинга. Создайте файл &amp;quot;/css/rate.css&amp;quot; со следующим содержимым:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 4. Файл &amp;quot;rate.css&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.rate,&lt;br /&gt;
.good,&lt;br /&gt;
.bad&lt;br /&gt;
{&lt;br /&gt;
  float: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.rate span&lt;br /&gt;
{&lt;br /&gt;
  float: left;&lt;br /&gt;
  margin: 2px 12px 4px 20px;&lt;br /&gt;
  color: #4A89BA;&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.good,&lt;br /&gt;
.bad&lt;br /&gt;
{&lt;br /&gt;
  padding: 4px 12px;&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  margin: 0 2px;&lt;br /&gt;
  border-radius: 5px;&lt;br /&gt;
  -moz-border-radius: 5px;&lt;br /&gt;
  -webkit-border-radius: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.good a,&lt;br /&gt;
.bad a&lt;br /&gt;
{&lt;br /&gt;
  color: #000;&lt;br /&gt;
  font-weight: bold;&lt;br /&gt;
  font-size: 15px;&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.good&lt;br /&gt;
{&lt;br /&gt;
  background-color: #4AA735;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.bad&lt;br /&gt;
{&lt;br /&gt;
  background-color: #FF2926;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для примера, подключим панель рейтинга в стандартный XSLT-шаблон UMI.CMS &amp;quot;Интернер-магазин современный&amp;quot; (DemoDizzi). Откройте файл &amp;quot;/xsltTpls/layouts/default.xsl&amp;quot; и подключите созданные файлы &amp;quot;rate.js&amp;quot; и &amp;quot;rate.css&amp;quot; в секции &amp;quot;head&amp;quot; следующим образом:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 5. Подключение файлов &amp;quot;rate.js&amp;quot; и &amp;quot;rate.css&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Рейтинг --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/js/rate.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;/css/rate.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После того, как файлы будут подключены, останется отредактировать шаблон вывода информации об объекте каталога. Откройте файл &amp;quot;/xsltTpls/modules/catalog/object-view.xsl&amp;quot; и разместите следующий код после блока &amp;quot;price&amp;quot;, чтобы получилось примерно так:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 6. Размещение панели рейтинга в шаблоне&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Блок &amp;quot;price&amp;quot; --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;price&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;span umi:element-id=&amp;quot;{page/@id}&amp;quot; umi:field-name=&amp;quot;price&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:apply-templates select=&amp;quot;document(concat(&amp;#039;udata://emarket/price/&amp;#039;, page/@id))&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Панель рейтинга --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;rate&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;good&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;vote&amp;quot; id=&amp;quot;{page/@id}&amp;quot; name=&amp;quot;good&amp;quot; title=&amp;quot;Хороший&amp;quot; href=&amp;quot;javascript: void(0);&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;xsl:value-of select=&amp;quot;document(concat(&amp;#039;udata://vote/getRate/&amp;#039;, page/@id, &amp;#039;/good/&amp;#039;))/udata&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;bad&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;vote&amp;quot; id=&amp;quot;{page/@id}&amp;quot; name=&amp;quot;bad&amp;quot; title=&amp;quot;Плохой&amp;quot; href=&amp;quot;javascript: void(0);&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;xsl:value-of select=&amp;quot;document(concat(&amp;#039;udata://vote/getRate/&amp;#039;, page/@id, &amp;#039;/bad/&amp;#039;))/udata&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px solid black; padding: 5px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Файл:Rate_panel.png]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;font-color: darkblue; font-weight: bold; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
Панель рейтинга&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Важно&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Для работы представленной системы рейтинга в шаблон должны быть подключены библиотека jQuery и плагин jQuery Cookie. Если в шаблоне вызывается макрос includeQuickEditJs, то jQuery и jQuery Cookie подключатся автоматически.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Примечание&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный функционал был проверен на работоспособность в версии системы 2.8.5.1.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81_%D1%83%D0%BA%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_URL&amp;diff=3816</id>
		<title>Макрос укорачивания URL</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81_%D1%83%D0%BA%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_URL&amp;diff=3816"/>
		<updated>2012-07-30T04:56:44Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Написание кастомных макросов]]&lt;br /&gt;
 [[category:Верстка в XSLT]]&lt;br /&gt;
 [[category:Верстка в TPL]]&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный макрос будет укорачивать переданный ему URL с помощью сервиса [http://www.tinyurl.com tinyurl.com]. Этот сервис не делает самый короткий URL, но его плюсом является то, что он не требует регистрации.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Тело макроса нужно будет разместить в файле &amp;quot;/classes/modules/content/__custom.php&amp;quot; после строки &amp;quot;//TODO: Write here your own macroses&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 1. Код макроса&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  @param String&lt;br /&gt;
    $url - URL для укорачивания&lt;br /&gt;
 */&lt;br /&gt;
public function getTinyUrl($url) {&lt;br /&gt;
  if($url)  &lt;br /&gt;
    return file_get_contents(&amp;quot;http://tinyurl.com/api-create.php?url=&amp;quot;.$url);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После того, как код макроса написан, необходимо добавить для него резрешение. Для этого создаём файл &amp;quot;permissions.custom.php&amp;quot; в той же папке, где находится &amp;quot;__custom.php&amp;quot;, и пишем в нём следующий текст:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 2. Добавление разрешения&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  $permissions = Array(&lt;br /&gt;
    &amp;#039;content&amp;#039; =&amp;gt; &lt;br /&gt;
      Array(&amp;#039;getTinyUrl&amp;#039;)&lt;br /&gt;
  );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Теперь можно использовать макрос. Вот примеры его использования в TPL и XSLT шаблонизаторах:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 3. Использование макроса в TPL&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
%content getTinyUrl(&amp;#039;http://www.umi-cms.ru/product/system/usability/&amp;#039;)%&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 4. Использование макроса в XSLT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a&amp;gt;&lt;br /&gt;
  &amp;lt;xsl:attribute name=&amp;quot;href&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;xsl:select-of select=&amp;quot;document(&amp;#039;udata://content/getTinyUrl/(http://www.umi-cms.ru/product/system/usability/)&amp;#039;)/udata&amp;quot; /&amp;gt;&lt;br /&gt;
  &amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;
  &amp;lt;xsl:text&amp;gt;&lt;br /&gt;
    UMI.CMS Usability&lt;br /&gt;
  &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;
&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Примечание&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный функционал был проверен на работоспособность в версии системы 2.8.5.1.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81_%D1%83%D0%BA%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_URL&amp;diff=3815</id>
		<title>Макрос укорачивания URL</title>
		<link rel="alternate" type="text/html" href="https://wiki.umisoft.ru/index.php?title=%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81_%D1%83%D0%BA%D0%BE%D1%80%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_URL&amp;diff=3815"/>
		<updated>2012-07-30T04:48:46Z</updated>

		<summary type="html">&lt;p&gt;Kalexey: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[category:Написание кастомных макросов]]&lt;br /&gt;
 [[category:Верстка в XSLT]]&lt;br /&gt;
 [[category:Верстка в TPL]]&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный макрос будет укорачивать переданный ему URL с помощью сервиса [http://www.tinyurl.com tinyurl.com]. Этот сервис не делает самый короткий URL, но его плюсом является то, что он не требует регистрации.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Тело макроса нужно будет разместить в файле &amp;quot;/classes/modules/content/__custom.php&amp;quot; после строки &amp;quot;//TODO: Write here your own macroses&amp;quot;.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 1. Код макроса&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  @param String&lt;br /&gt;
    $url - URL для укорачивания&lt;br /&gt;
 */&lt;br /&gt;
public function getTinyUrl($url) {&lt;br /&gt;
  if($url)  &lt;br /&gt;
    return file_get_contents(&amp;quot;http://tinyurl.com/api-create.php?url=&amp;quot;.$url);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
После того, как код макроса написан, необходимо добавить для него резрешение. Для этого создаём файл &amp;quot;permissions.custom.php&amp;quot; в той же папке, где находится &amp;quot;__custom.php&amp;quot;, и пишем в нём следующий текст:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 2. Добавление разрешения&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  $permissions = Array(&lt;br /&gt;
    &amp;#039;content&amp;#039; =&amp;gt; &lt;br /&gt;
      Array(&amp;#039;getTinyUrl&amp;#039;)&lt;br /&gt;
  );&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Теперь можно использовать макрос. Вот примеры его использования в TPL и XSLT шаблонизаторах:&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 3. Использование макроса в TPL&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
%content getTinyUrl(&amp;#039;http://www.umi-cms.ru/product/system/usability/&amp;#039;)%&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align: right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Листинг 4. Использование макроса в XSLT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;xsl:variable name=&amp;quot;tinyurl&amp;quot; &lt;br /&gt;
              select=&amp;quot;document(&amp;#039;udata://content/getTinyUrl/(http://www.umi-cms.ru/product/system/usability/)/)/udata&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{$tinyurl}&amp;quot;&amp;gt;UMI.CMS Usability&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;table align=&amp;quot;center&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border: 1px dotted black; padding: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Примечание&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Данный функционал был проверен на работоспособность в версии системы 2.8.5.1.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kalexey</name></author>
		
	</entry>
</feed>