<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
	<channel>
		<title>cotonti.com : Шаблонизатор</title>
		<link>https://www.cotonti.com</link>
		<description>Son konu mesajları</description>
		<generator>Cotonti</generator>
		<language>en</language>
		<pubDate>Sun, 03 May 2026 14:35:47 -0000</pubDate>

		<item>
			<title>Macik</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=13965#13965">#</a> <strong>Sergeich :</strong>
Macik, по поводу дополнения, собственно вы делаете обратную работу, одним из приоритетов в развитии котонти было вынесенеие всего хтмл из пхп-кода, плюс разбиение крупных тегов (несущих большой кусок хтмл) на мелкие составляющие.<br />
</blockquote>
Видимо я не до конца донес мысль. Я не предлягаю переносить ХТМЛ в код, отнюдь. Наоборот из кода он пропадает практически полностью, т.к. все Тэги парсятся отдельной библиотекой, и уже она на основе внутренних шаблонов (тоже настраиваемых) создает готовый к работе ХТМЛ-тэг.<br />
Примерно так:<br />
Дизайнер пишет в шаблоне что-то типа:<br />
<div class="highlight"><pre class="html"> {INPUT_PASSWORD}</pre></div>
Программист пишет примерно следующее:<br />
<div class="highlight"><pre class="php">$ctl&#091;'Type'&#093; = 'password';
$ctl&#091;'Name'&#093; = 'rpassword';
$ctl&#091;'Class'&#093; = '_default';
init_control('INPUT_PASSWORD',$ctl);
parse_control('INPUT_PASSWORD');
</pre></div>
На выходе в шаблоне получаем готовый тэг:<br />
<div class="highlight"><pre class="html">&lt;input type=&quot;password&quot; class=&quot;password&quot; name=&quot;rpassword&quot; size=&quot;16&quot; maxlength=&quot;32&quot; /&gt;</pre></div>
<br />
В любом случае, это лишь касается моего проекта, так сказать мысли в слух, а не предложение или пожелание к движку.<br />
<br />
<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=13965#13965">#</a> <strong>Sergeich :</strong>
По поводу начала поста, а ваша конструкция сможет отрабатывать сложные куски хтмл с включением различных тегов движка? и будет ли это проще для дизайнера?<br />
</blockquote>
Да это вопрос. Я просто всегда иду со стороны того, что если не хватает функциональности - постарайся ее сделать доступными (читай предлагаемыми) методами и до последнего не залезать в &quot;Core&quot;.]]></description>
			<pubDate>Cum, 10 Tem 2009 02:57:43 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post13984]]></link>
		</item>
		<item>
			<title>Sergeich</title>
			<description><![CDATA[Macik, по поводу дополнения, собственно вы делаете обратную работу, одним из приоритетов в развитии котонти было вынесенеие всего хтмл из пхп-кода, плюс разбиение крупных тегов (несущих большой кусок хтмл) на мелкие составляющие. Это всё делалось для получения большего контроля за выводом информации посредством tpl. Разумеется это несколько усложнило шаблоны (хотя, скорее не усложнило, а увеличило кол-во чистого хтмл в шаблонах), но сильно подняло гибкость.<br />
<br />
По поводу начала поста, а ваша конструкция сможет отрабатывать сложные куски хтмл с включением различных тегов движка? и будет ли это проще для дизайнера?]]></description>
			<pubDate>Per, 09 Tem 2009 23:33:35 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post13965]]></link>
		</item>
		<item>
			<title>Macik</title>
			<description><![CDATA[В общем согласен.<br />
Хотя логика в блочном виде как сейчас не менее громоздка чем callback-функции. <br />
Отдельного плагина на каждый случай не потребуется - достаточно описать класс с минимальным и достаточным набором callback функций.<br />
Верстальщику вообще практически ничего объяснять не надо - надо показать 1 пример и все будет понятно.<br />
<br />
 Вот конкретика и примеры:<br />
Вместо вот этого<br />
<pre class="code">
&lt;!-- IF {PAGE_DESC}== &quot;&quot; --&gt;
Описание страницы пустое.
&lt;!-- ENDIF --&gt;
</pre>
<br />
Можно будет писать так:<br />
<pre class="code">
{PAGE_DESC|IS_NULL('Описание страницы пустое.')}
</pre>
<br />
Все что нужно для этого - создать в системе дочерний класс:<br />
<div class="highlight"><pre class="php">
class XT extends XTemplate {
  // функция проверки на предмет присвоено ли тэгу значение
  public function IS_NULL ($tag,$str) {
    // $tag - тело тэга с уже присвоеным значением
    // $str - строка, которую необходимо вывести если тег пустой
    if ($tag=='') {return $str;} else {return $tag;}
  }
}
</pre></div>
<br />
Аналогичным образом можно реализовать любое другое условие.<br />
Из плюсов такого подхода:<br />
1. Мы не трогаем исходный класс;<br />
2. Никаких отдельных плагинов - один раз описываем в системе класс и прописываем необходимую функциональность;<br />
3. Экономим на размерах шаблона и соответственно меньше шансов допустить в шаблоне ошибку/опечатку.<br />
<br />
Как дополнение:<br />
<br />
В своем проекте пытаюсь реализовать &quot;прозрачную&quot; (более абстрактную) для верстальщиков систему интерфейса.<br />
<br />
Сейчас по сути в шаблонах огромное количество HTML кода, и при том программно зависимого, как например:<br />
<div class="highlight"><pre class="html">
&lt;form action=&quot;{PAGEADD_FORM_SEND}&quot; method=&quot;post&quot; name=&quot;newpage&quot; enctype=&quot;multipart/form-data&quot;&gt;
...
&lt;form&gt;
</pre></div>
в таком случае дизайнер/верстальщик должен знать что указать в параметрах action, mothod, name, и т.п.<br />
<br />
Идея в том, что бы абстрагироваться от этого. Дизайнер указывает в шаблоне только ключевые Тэги:<br />
<pre class="code">
&lt;!-- BEGIN: MAIN --&gt;
Форма регистрации:
{FORM_LOGIN}
&lt;!-- END: MAIN --&gt;
&lt;!-- BEGIN: FORM_LOGIN --&gt;
Введите свои данные:
Login: {INPUT_USER_LOG}
Password: {INPUT_USER_PASS}
{BUTTON_LOGIN_SEND}
{SOME_TEXT}
&lt;!-- END: FORM_LOGIN --&gt;
</pre>
<br />
Задача программиста договориться с дизайнером о наборе тегов для конкретной формы.<br />
Затем проинициализировать структуру данных, которая задаст парамертры конкретных элементов.<br />
Далее вызвать автоматический обработчик, который уже на основании заполненых данных и на основании названия тегов решит что и как парсить.]]></description>
			<pubDate>Per, 09 Tem 2009 22:26:29 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post13957]]></link>
		</item>
		<item>
			<title>Trustmaster</title>
			<description><![CDATA[1. а. В целом согласен. А в частности бывают тонкости с отображением отдельных элементов, которые проще реализовать нехитрой логикой в шаблонах, чем делать хак ядра или писать отдельный плагин. Главное меру знать.<br />
1. б. XTemplate развивается очень пассивно. Выше вероятность, что мы перепишем XTemplate, чем то, что выйдет новая версия с важными патчами, которые на придётся включать. Последнее не так уж страшно.<br />
1. в. Опять же, callback-функции надо будет писать в виде специальных плагинов. И верстальщику непросто объяснить, что такое callback-функция.]]></description>
			<pubDate>Pzt, 06 Tem 2009 14:48:27 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post13802]]></link>
		</item>
		<item>
			<title>Macik</title>
			<description><![CDATA[Наткнулся на обсуждение Xtemplate и решил оживить топик.<br />
<br />
1. Не поддерживаю вашу инициативу по внесению логики в шаблоны в таком виде, по следующим причинам:<br />
а. Логика должна быть в программной части, визуальная часть в шаблонах.<br />
б. XTemplate сторонняя разработка и не есть гут ее &quot;строгать&quot; напильником, тем более, что в случае ее обновления будет трудно совмещать одно с другим.<br />
в. Почти все (а может и все) можно реализовать за счет Callback функций - встроенного в XTemplate механизма. Причем без громоздких блочных IF-ENDIF конструкций в шаблоне.<br />
<br />
<br />
2. В своем проекте наткнулся на баг XTemplate - при попытке переопределния tag_start_delim, tag_end_delim<br />
перестают работать callback функции. Видимо где-то косяк с правилами и сочетанием RegExp. Но разобраться в коде не осилил.<br />
<br />
Безотносительно написанного - спасибо вам за вашу работу. И развитие проекта.]]></description>
			<pubDate>Paz, 05 Tem 2009 08:46:45 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post13786]]></link>
		</item>
		<item>
			<title>medar</title>
			<description><![CDATA[<strong>dervan</strong>, <strong>dayver</strong>, супер, молодцы. :)<br />
У меня, к сожалению, сейчас аврал на работе, времени для cotonti сейчас нет. Надеюсь скоро вернуться.<br />
<br />
Предложенный вариант xtemplate, мне кажется, можно коммитить.<br />
<br />
По поводу вложенности условий - сложно сказать, нужны ли они. Это будет провоцировать людей на программинг в шаблонах, а это все-таки лучше делать в плагинах.<br />
<br />
По поводу eval(). В принципе, это дыра в безопасности, так как ушлый сторонний скинмейкер может разместить в условии кусок вредоносного кода. По хорошему надо бы от него совсем отказаться, сделав парсер условных выражений..]]></description>
			<pubDate>Çrş, 25 Mar 2009 17:59:03 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10469]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=10366#10366">#</a> <strong>Trustmaster :</strong>
Ещё бы сделали ... разбор условий без eval'а<br />
</blockquote>
<br />
Хорошая мысль. :)<br />
<br />
Пожалуй, совсем от варианта с eval() отказываться не надо - может потребоваться сложное условие. Но для простейших вариантов, когда в IF проверяется значение переменной bool или int, несложно сделать вариант без eval().<br />
<br />
Мы с <strong>Dayver</strong>'ом, когда обсуждали разные варианты условий для IF (с вызовом функцищ, с использованием $GLOBALS для передачи аргументов функцищам), решили по возможности использовать в шаблонах для IF'ов не код PHP, а сформированные специально для шаблонов переменные bool. Именно такой подход использовал <strong>Dayver</strong> в <a href="http://www.cotonti.com/forums.php?m=posts&amp;id=10347">выложенных им файлах</a>, которые демонстрируют использование IF'ов в шаблонах.<br />
<br />
Если придерживаться такого подхода и использовать в  условиях IF шаблона только значения переменных bool или int, то эти условия будут проверяться без вызова eval().<br />
<br />
Предлагаем улучшенный вариант XTemplate, проверяющий простые условия без eval(): <a href="https://www.cotonti.com/datas/users/xtemplate.class.php_57.zip">xtemplate.class.php_57.zip</a><br />
Остальные условия, которые не сводятся к простой проверке значения bool или int, как и прежде будут обрабатываться вызовом eval().<br />
<br />
Все условия в <a href="http://www.cotonti.com/forums.php?m=posts&amp;id=10347">выложенных <strong>Dayver</strong>'ом файлах</a> этим вариантом XTemplate будут проверяться без eval(), т.е. будут обработаны быстрее.<br />
<br />
<br />
Пример.<br />
<br />
<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=10357#10357">#</a> <strong>Sergeich :</strong>
В шаблоне page.tpl мне нужно разделять теги запятой (или любым другим разделителем), сейчас я это реализовал так:<br />
<div class="highlight"><pre class="html">
&lt;!-- BEGIN: PAGE_TAGS_ROW --&gt;
	&lt;a href=https://www.cotonti.com/&quot;{PAGE_TAGS_ROW_URL}&quot;&gt;{PAGE_TAGS_ROW_TAG}&lt;/a&gt;,
&lt;!-- END: PAGE_TAGS_ROW --&gt;
</pre></div>
Проблема в том, что после последнего тега также вставляется запятая (разделитель), что есть не красиво. Как бы убрать эту лишнюю запятую?<br />
</blockquote>
<br />
Если решать эту задачу, исходя из существующего кода плагина tags, получится вот что.<br />
<br />
<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=10413#10413">#</a> <strong>dervan :</strong>
<pre class="code">
		&lt;!-- BEGIN: PAGE_TAGS_ROW --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{PAGE_TAGS_ROW_URL}&quot;&gt;{PAGE_TAGS_ROW_TAG}&lt;/a&gt;&lt;!-- IF $GLOBALS&#091;'tag'&#093; != $GLOBALS&#091;'tags'&#093;&#091;count($GLOBALS&#091;'tags'&#093;) - 1&#093; --&gt;,&lt;!-- ENDIF --&gt;
		&lt;!-- END: PAGE_TAGS_ROW --&gt;
</pre>
Только вот есть сомнения, правильно ли это - раз уж убирать HTML из кода, IMHO тогда не следует злоупотреблять кодом в шаблонах. А тут при каждом проходе парсера будет вызываться функцища count(). По-хорошему, в plugins/tags/tags.page.php надо добавить флажок, чтобы IF определял по нему последний проход парсера в блоке PAGE_TAGS_ROW.<br />
</blockquote>
<br />
Правильнее будет сформировать в plugins/tags/tags.page.php переменную для шаблона:<br />
<pre class="code">
	$tags_cntdwn = count($tags);
	if($tags_cntdwn &gt; 0)
	{
		foreach($tags as $tag)
		{
			$tags_cntdwn--;
</pre>
и использовать в шаблоне простое условие:<br />
<pre class="code">
		&lt;!-- BEGIN: PAGE_TAGS_ROW --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{PAGE_TAGS_ROW_URL}&quot;&gt;{PAGE_TAGS_ROW_TAG}&lt;/a&gt;&lt;!-- IF {PHP.tags_cntdwn} --&gt;,&lt;!-- ENDIF --&gt;
		&lt;!-- END: PAGE_TAGS_ROW --&gt;
</pre>
При таком решении условие IF будет проверяться без eval(), и шаблон будет распарсен быстрее.]]></description>
			<pubDate>Çrş, 25 Mar 2009 07:24:54 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10464]]></link>
		</item>
		<item>
			<title>Trustmaster</title>
			<description><![CDATA[Ух, молодцы! Ещё бы сделали вложенные условия, парсер без многострочных регулярок, разбор условий без eval'а и оптимизировали использование памяти - я бы вам памятник поставил сразу  <img class="aux smiley" src="https://www.cotonti.com/./images/smilies/smile.gif" alt=":-)" />]]></description>
			<pubDate>Pzt, 23 Mar 2009 12:57:06 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10366]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[<strong>esclkm</strong>, больших изменений мы не делали - было улучшено то, что сделал <strong>medar</strong>. Это он говорил про оптимизацию, но будут ли это частичные изменения, или же предстоит серьёзный рефакторинг - сказать сложно, мы с <strong>Dayver</strong>'ом  этот вопрос не рассматривали.]]></description>
			<pubDate>Pzt, 23 Mar 2009 05:48:28 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10355]]></link>
		</item>
		<item>
			<title>esclkm</title>
			<description><![CDATA[вау ребята! medar и dervan - вы потрясающие парни! молодцы! а что то я слышал по поводу оптимизации самого шаблонизатора - то как с этим обстоят дела?]]></description>
			<pubDate>Pzt, 23 Mar 2009 05:00:46 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10352]]></link>
		</item>
		<item>
			<title>Dayver</title>
			<description><![CDATA[А для полноты информации об изменениях и заявленом применении на практике привожу два админовских пхп файлах из которых венесен xhtml<br />
<br />
<div style="margin:4px 0px 4px 0px"><input type="button" value="admin.inc.php" onclick="if(this.parentNode.getElementsByTagName('div')[0].style.display != '') { this.parentNode.getElementsByTagName('div')[0].style.display = ''; } else { this.parentNode.getElementsByTagName('div')[0].style.display = 'none'; }" /><div style="display:none" class="spoiler"><pre class="code">&lt;?PHP
/**
 * Administration panel
 *
 * @package Cotonti
 * @version 0.1.0
 * @author Neocrome, Cotonti Team
 * @copyright Copyright (c) Cotonti Team 2008-2009
 * @license BSD
 */

(defined('SED_CODE') &amp;&amp; defined('SED_ADMIN')) or die('Wrong URL.');

list($usr&#091;'auth_read'&#093;, $usr&#091;'auth_write'&#093;, $usr&#091;'isadmin'&#093;) = sed_auth('admin', 'any');
sed_block($usr&#091;'auth_read'&#093;);

$enabled&#091;0&#093; = $L&#091;'Disabled'&#093;;
$enabled&#091;1&#093; = $L&#091;'Enabled'&#093;;

$id = sed_import('id', 'G', 'TXT');
$po = sed_import('po', 'G', 'TXT');
$c = sed_import('c', 'G', 'TXT');
$p = sed_import('p', 'G', 'TXT');
$l = sed_import('l', 'G', 'TXT');
$o = sed_import('o', 'P', 'TXT');
$w = sed_import('w', 'P', 'TXT');
$u = sed_import('u', 'P', 'TXT');
$s = sed_import('s', 'G', 'ALP', 24);

/* === Hook for the plugins === */
$extp = sed_getextplugins('admin.main');
if(is_array($extp))
{
	foreach($extp as $k =&gt; $pl)
	{
		include_once($cfg&#091;'plugins_dir'&#093;.'/'.$pl&#091;'pl_code'&#093;.'/'.$pl&#091;'pl_file'&#093;.'.php');
	}
}

$sys&#091;'inc'&#093; = (empty($m)) ? 'admin.home' : &quot;admin.$m&quot;;
$sys&#091;'inc'&#093; = (empty($s)) ? $sys&#091;'inc'&#093; : $sys&#091;'inc'&#093;.&quot;.$s&quot;;
$sys&#091;'inc'&#093; = $cfg&#091;'system_dir'&#093;.'/core/admin/'.$sys&#091;'inc'&#093;.'.inc.php';

if(!file_exists($sys&#091;'inc'&#093;))
{
	sed_die();
}

$allow_img&#091;'0'&#093;&#091;'0'&#093; = &quot;&lt;img src=https://www.cotonti.com/\&quot;images/admin/deny.gif\&quot; alt=\&quot;\&quot; /&gt;&quot;;
$allow_img&#091;'1'&#093;&#091;'0'&#093; = &quot;&lt;img src=https://www.cotonti.com/\&quot;images/admin/allow.gif\&quot; alt=\&quot;\&quot; /&gt;&quot;;
$allow_img&#091;'0'&#093;&#091;'1'&#093; = &quot;&lt;img src=https://www.cotonti.com/\&quot;images/admin/deny_locked.gif\&quot; alt=\&quot;\&quot; /&gt;&quot;;
$allow_img&#091;'1'&#093;&#091;'1'&#093; = &quot;&lt;img src=https://www.cotonti.com/\&quot;images/admin/allow_locked.gif\&quot; alt=\&quot;\&quot; /&gt;&quot;;

$lincif_conf = sed_auth('admin', 'a', 'A');
$lincif_page = sed_auth('page', 'any', 'A');
$lincif_user = sed_auth('users', 'a', 'A');

$t = new XTemplate(sed_skinfile('admin.inc', false, true));
$t -&gt; assign(array(
	&quot;ADMINMENU_URL&quot; =&gt; sed_url('admin'),
	&quot;ADMINMENU_CONF_URL&quot; =&gt; sed_url('admin', &quot;m=config&quot;),
	&quot;ADMINMENU_PAGE_URL&quot; =&gt; sed_url('admin', &quot;m=page&quot;),
	&quot;ADMINMENU_FORUMS_URL&quot; =&gt; sed_url('admin', &quot;m=forums&quot;),
	&quot;ADMINMENU_USERS_URL&quot; =&gt; sed_url('admin', &quot;m=users&quot;),
	&quot;ADMINMENU_PLUG_URL&quot; =&gt; sed_url('admin', &quot;m=plug&quot;),
	&quot;ADMINMENU_TOOLS_URL&quot; =&gt; sed_url('admin', &quot;m=tools&quot;),
	&quot;ADMINMENU_TRASHCAN_URL&quot; =&gt; sed_url('admin', &quot;m=trashcan&quot;),
	&quot;ADMINMENU_OTHER_URL&quot; =&gt; sed_url('admin', &quot;m=other&quot;)
));
$t -&gt; parse(&quot;ADMINMENU&quot;);
$adminmenu = $t -&gt; text(&quot;ADMINMENU&quot;);

require_once($sys&#091;'inc'&#093;);
$adminhelp = (empty($adminhelp)) ? $L&#091;'None'&#093; : $adminhelp;

$title_tags&#091;&#093; = array('{ADMIN}');
$title_tags&#091;&#093; = array('%1$s');
$title_data = array($L&#091;'Administration'&#093;);
$out&#091;'subtitle'&#093; = sed_title('{ADMIN}', $title_tags, $title_data);

require_once($cfg&#091;'system_dir'&#093;.'/header.php');

$t = new XTemplate(sed_skinfile('admin', false, true));

$t-&gt;assign(array(
	&quot;ADMIN_TITLE&quot; =&gt; sed_build_adminsection($adminpath),
	&quot;ADMIN_SUBTITLE&quot; =&gt; $adminsubtitle,
	&quot;ADMIN_MENU&quot; =&gt; $adminmenu,
	&quot;ADMIN_MAIN&quot; =&gt; $adminmain,
	&quot;ADMIN_HELP&quot; =&gt; $adminhelp,
));

/* === Hook for the plugins === */
$extp = sed_getextplugins('admin.tags');
if(is_array($extp))
{
	foreach($extp as $k =&gt; $pl)
	{
		include_once($cfg&#091;'plugins_dir'&#093;.'/'.$pl&#091;'pl_code'&#093;.'/'.$pl&#091;'pl_file'&#093;.'.php');
	}
}
/* ===== */

$t-&gt;parse(&quot;MAIN&quot;);
$t-&gt;out(&quot;MAIN&quot;);

require_once($cfg&#091;'system_dir'&#093;.'/footer.php');

?&gt;</pre></div></div>
его тплка<br />
<div style="margin:4px 0px 4px 0px"><input type="button" value="admin.inc.tpl" onclick="if(this.parentNode.getElementsByTagName('div')[0].style.display != '') { this.parentNode.getElementsByTagName('div')[0].style.display = ''; } else { this.parentNode.getElementsByTagName('div')[0].style.display = 'none'; }" /><div style="display:none" class="spoiler"><pre class="code">&lt;!-- BEGIN: ADMINMENU --&gt;
&lt;table style=&quot;width:100%;&quot;&gt;
&lt;tr&gt;
	&lt;td style=&quot;width:11%; text-align:center;&quot;&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMINMENU_URL}&quot;&gt;&lt;img src=&quot;images/admin/admin.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Home}&lt;/a&gt;
	&lt;/td&gt;
	&lt;td style=&quot;width:12%; text-align:center;&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMINMENU_CONF_URL}&quot;&gt;&lt;img src=&quot;images/admin/config.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Configuration}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/config.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Configuration}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
	&lt;td style=&quot;width:11%; text-align:center;&quot;&gt;
		&lt;!-- IF {PHP.lincif_page} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMINMENU_PAGE_URL}&quot;&gt;&lt;img src=&quot;images/admin/page.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Pages}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/page.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Pages}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
	&lt;td style=&quot;width:11%; text-align:center;&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMINMENU_FORUMS_URL}&quot;&gt;&lt;img src=&quot;images/admin/forums.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Forums}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/forums.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Forums}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
	&lt;td style=&quot;width:11%; text-align:center;&quot;&gt;
		&lt;!-- IF {PHP.lincif_user} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMINMENU_USERS_URL}&quot;&gt;&lt;img src=&quot;images/admin/users.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Users}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/users.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Users}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
	&lt;td style=&quot;width:11%; text-align:center;&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMINMENU_PLUG_URL}&quot;&gt;&lt;img src=&quot;images/admin/plugins.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Plugins}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/plugins.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Plugins}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
	&lt;td style=&quot;width:11%; text-align:center;&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMINMENU_TOOLS_URL}&quot;&gt;&lt;img src=&quot;images/admin/tools.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Tools}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/tools.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Tools}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
	&lt;td style=&quot;width:11%; text-align:center;&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMINMENU_TRASHCAN_URL}&quot;&gt;&lt;img src=&quot;images/admin/delete.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Trashcan}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/delete.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Trashcan}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
	&lt;td style=&quot;width:11%; text-align:center;&quot;&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMINMENU_OTHER_URL}&quot;&gt;&lt;img src=&quot;images/admin/folder.gif&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;{PHP.L.Other}&lt;/a&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;!-- END: ADMINMENU --&gt;</pre></div></div>
<br />
<div style="margin:4px 0px 4px 0px"><input type="button" value="admin.other.inc.php" onclick="if(this.parentNode.getElementsByTagName('div')[0].style.display != '') { this.parentNode.getElementsByTagName('div')[0].style.display = ''; } else { this.parentNode.getElementsByTagName('div')[0].style.display = 'none'; }" /><div style="display:none" class="spoiler"><pre class="code">&lt;?PHP
/**
 * Administration panel
 *
 * @package Cotonti
 * @version 0.1.0
 * @author Neocrome, Cotonti Team
 * @copyright Copyright (c) Cotonti Team 2008-2009
 * @license BSD
 */

(defined('SED_CODE') &amp;&amp; defined('SED_ADMIN')) or die('Wrong URL.');

list($usr&#091;'auth_read'&#093;, $usr&#091;'auth_write'&#093;, $usr&#091;'isadmin'&#093;) = sed_auth('admin', 'a');
sed_block($usr&#091;'auth_read'&#093;);

$t = new XTemplate(sed_skinfile('admin.other.inc', false, true));

$adminpath&#091;&#093; = array(sed_url('admin', 'm=other'), $L&#091;'Other'&#093;);

$sql = sed_sql_query(&quot;SELECT DISTINCT(config_cat), COUNT(*) FROM $db_config WHERE config_owner!='plug' GROUP BY config_cat&quot;);
while($row = sed_sql_fetcharray($sql))
{
	$cfgentries&#091;$row&#091;'config_cat'&#093;&#093; = $row&#091;'COUNT(*)'&#093;;
}

$sql = sed_sql_query(&quot;SELECT DISTINCT(auth_code), COUNT(*) FROM $db_auth WHERE 1 GROUP BY auth_code&quot;);
while($row = sed_sql_fetcharray($sql))
{
	$authentries&#091;$row&#091;'auth_code'&#093;&#093; = $row&#091;'COUNT(*)'&#093;;
}

$sql = sed_sql_query(&quot;SELECT * FROM $db_core WHERE ct_code NOT IN ('admin', 'message', 'index', 'forums', 'users', 'plug', 'page', 'trash') ORDER BY ct_title ASC&quot;);
$lines = array();

while($row = sed_sql_fetcharray($sql))
{
    $lincif_mode = (sed_auth($row&#091;'ct_code'&#093;, 'a', 'A') &amp;&amp; $row&#091;'ct_code'&#093; != 'admin' &amp;&amp; $row&#091;'ct_code'&#093; != 'index' &amp;&amp; $row&#091;'ct_code'&#093; != 'message') ? true : false;
    $lincif_confmode = ($cfgentries&#091;$row&#091;'ct_code'&#093;&#093; &gt; 0) ? true : false;
    $lincif_rightsmode = ($authentries&#091;$row&#091;'ct_code'&#093;&#093; &gt; 0) ? true : false;
	$cfgcode = &quot;disable_&quot;.$row&#091;'ct_code'&#093;;//Непнятна а зачем?

	$t -&gt; assign(array(
		&quot;ADMIN_OTHER_CT_CODE&quot; =&gt; $row&#091;'ct_code'&#093;,
		&quot;ADMIN_OTHER_CT_TITLE_LOC&quot; =&gt; (empty($L&#091;&quot;core_&quot;.$row&#091;'ct_code'&#093;&#093;)) ? $row&#091;'ct_title'&#093; : $L&#091;&quot;core_&quot;.$row&#091;'ct_code'&#093;&#093;,
		&quot;ADMIN_OTHER_CT_CODE_URL&quot; =&gt; sed_url('admin', &quot;m=&quot;.$row&#091;'ct_code'&#093;),
		&quot;ADMIN_OTHER_RIGHTS&quot; =&gt; ($authentries&#091;$row&#091;'ct_code'&#093;&#093; &gt; 0) ? sed_url('admin', &quot;m=rightsbyitem&amp;ic=&quot;.$row&#091;'ct_code'&#093;.&quot;&amp;io=a&quot;) : '#',
		&quot;ADMIN_OTHER_CONFIG&quot; =&gt; ($cfgentries&#091;$row&#091;'ct_code'&#093;&#093; &gt; 0) ? sed_url('admin', &quot;m=config&amp;n=edit&amp;o=core&amp;p=&quot;.$row&#091;'ct_code'&#093;) : '#'
	));
	$t -&gt; parse(&quot;OTHER.OTHER_ROW&quot;);
}

$lincif_conf = sed_auth('admin', 'a', 'A');
$lincif_user = sed_auth('users', 'a', 'A');

$t -&gt; assign(array(
	&quot;ADMIN_OTHER_URL_CACHE&quot; =&gt; sed_url('admin', &quot;m=cache&quot;),
	&quot;ADMIN_OTHER_URL_BBCODE&quot; =&gt; sed_url('admin', &quot;m=bbcode&quot;),
	&quot;ADMIN_OTHER_URL_URLS&quot; =&gt; sed_url('admin', &quot;m=urls&quot;),
	&quot;ADMIN_OTHER_URL_BANLIST&quot; =&gt; sed_url('admin', &quot;m=banlist&quot;),
	&quot;ADMIN_OTHER_URL_HITS&quot; =&gt; sed_url('admin', &quot;m=hits&quot;),
	&quot;ADMIN_OTHER_URL_REFERS&quot; =&gt; sed_url('admin', &quot;m=referers&quot;),
	&quot;ADMIN_OTHER_URL_LOG&quot; =&gt; sed_url('admin', &quot;m=log&quot;),
	&quot;ADMIN_OTHER_URL_INFOS&quot; =&gt; sed_url('admin', &quot;m=infos&quot;)
));
$t -&gt; parse(&quot;OTHER&quot;);
$adminmain = $t -&gt; text(&quot;OTHER&quot;);

?&gt;</pre></div></div>
его тпл<br />
<div style="margin:4px 0px 4px 0px"><input type="button" value="admin.other.inc.tpl" onclick="if(this.parentNode.getElementsByTagName('div')[0].style.display != '') { this.parentNode.getElementsByTagName('div')[0].style.display = ''; } else { this.parentNode.getElementsByTagName('div')[0].style.display = 'none'; }" /><div style="display:none" class="spoiler"><pre class="code">&lt;!-- BEGIN: OTHER --&gt;
&lt;table class=&quot;cells&quot;&gt;
&lt;tr&gt;
	&lt;td class=&quot;coltop&quot;&gt;{PHP.L.Modules} {PHP.L.adm_clicktoedit}&lt;/td&gt;
	&lt;td class=&quot;coltop&quot; style=&quot;width:80px;&quot;&gt;{PHP.L.Rights}&lt;/td&gt;
	&lt;td class=&quot;coltop&quot; style=&quot;width:128px;&quot;&gt;{PHP.L.Configuration}&lt;/td&gt;
&lt;/tr&gt;
&lt;!-- BEGIN: OTHER_ROW --&gt;
&lt;tr&gt;
	&lt;td&gt;
	&lt;!-- IF {PHP.lincif_mode} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_CT_CODE_URL}&quot;&gt;&lt;img src=&quot;images/admin/{ADMIN_OTHER_CT_CODE}.gif&quot; alt=&quot;&quot; /&gt;{ADMIN_OTHER_CT_TITLE_LOC}&lt;/a&gt;
	&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/{ADMIN_OTHER_CT_CODE}.gif&quot; alt=&quot;&quot; /&gt;{ADMIN_OTHER_CT_TITLE_LOC}
	&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
	&lt;td style=&quot;text-align:center;&quot;&gt;
	&lt;!-- IF {PHP.lincif_rightsmode} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_RIGHTS}&quot;&gt;&lt;img src=&quot;images/admin/rights2.gif&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
	&lt;!-- ENDIF --&gt;
		&amp;nbsp;
	&lt;/td&gt;
	&lt;td style=&quot;text-align:center;&quot;&gt;
	&lt;!-- IF {PHP.lincif_confmode} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_CONFIG}&quot;&gt;&lt;img src=&quot;images/admin/config.gif&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;
	&lt;!-- ENDIF --&gt;
		&amp;nbsp;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;!-- END: OTHER_ROW --&gt;
&lt;tr&gt;
	&lt;td colspan=&quot;3&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_URL_CACHE}&quot;&gt;&lt;img src=&quot;images/admin/config.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_internalcache}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/config.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_internalcache}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td colspan=&quot;3&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_URL_BBCODE}&quot;&gt;&lt;img src=&quot;images/admin/page.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_bbcodes}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/page.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_bbcodes}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td colspan=&quot;3&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_URL_URLS}&quot;&gt;&lt;img src=&quot;images/admin/info.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_urls}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/info.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_urls}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td colspan=&quot;3&quot;&gt;
		&lt;!-- IF {PHP.lincif_user} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_URL_BANLIST}&quot;&gt;&lt;img src=&quot;images/admin/users.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.Banlist}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/users.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.Banlist}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td colspan=&quot;3&quot;&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_URL_HITS}&quot;&gt;&lt;img src=&quot;images/admin/statistics.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.Hits}&lt;/a&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td colspan=&quot;3&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_URL_REFERS}&quot;&gt;&lt;img src=&quot;images/admin/info.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.Referers}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/info.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.Referers}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td colspan=&quot;3&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_URL_LOG}&quot;&gt;&lt;img src=&quot;images/admin/page.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_log}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/page.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_log}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td colspan=&quot;3&quot;&gt;
		&lt;!-- IF {PHP.lincif_conf} --&gt;
		&lt;a href=https://www.cotonti.com/&quot;{ADMIN_OTHER_URL_INFOS}&quot;&gt;&lt;img src=&quot;images/admin/info.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_infos}&lt;/a&gt;
		&lt;!-- ELSE --&gt;
		&lt;img src=https://www.cotonti.com/&quot;images/admin/info.gif&quot; alt=&quot;&quot; /&gt;{PHP.L.adm_infos}
		&lt;!-- ENDIF --&gt;
	&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;!-- END: OTHER --&gt;</pre></div></div>
<br />
Эти два файла так сказать наиболее показательны в плане применения логики в шаблонизаторе потому код остальных переделаных файлов приводить не буду. Посему просьба к медару потестить скорость так сказать переделаного шаблонизатора с реальным примером применения. Если не возникнет замечаний то и шаблонизатор и части переделаной админки пойдут в транк.[/][/][/]]]></description>
			<pubDate>Pzt, 23 Mar 2009 03:47:28 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10347]]></link>
		</item>
		<item>
			<title>Sergeich</title>
			<description><![CDATA[Ну вы звери :). Вариант с &lt;!-- ELSE --&gt; мне понравился. Это значительно проще и понятнее для неподготовленного юзера (типа меня). Будем пробовать. :)]]></description>
			<pubDate>Pzt, 23 Mar 2009 03:37:40 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10346]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[Мы с <strong>Dayver</strong>'ом представляем результаты практического применения XTemplate с IF'ами - из опыта работы <strong>Dayver</strong>'а по выносу HTML из админки.<br />
<br />
Предлагаем для тестирования доработанный XTemplate: <a href="https://www.cotonti.com/datas/users/xtemplate.class.php_57.zip">xtemplate.class.php_57.zip</a><br />
<br />
Просьба к <strong>medar</strong>'у - посмотреть внесённые изменения, может будут какие замечания. Существенных изменений не вносилось, все исправления - простые.<br />
<br />
<br />
1.<br />
Использование переменных bool приводило к ошибке.<br />
<br />
Пример.<br />
Переменная в коде PHP:<br />
<pre class="code">
$is_test = false;
</pre>
Условие в шаблоне:<br />
<pre class="code">
&lt;!-- IF !{PHP.is_test} --&gt;not is_test&lt;!-- ENDIF --&gt;
</pre>
В результате - ошибка:<br />
<pre class="code">
Parse error: syntax error, unexpected ')' in mysite.com/system/xtemplate.class.php(781) : eval()'d code on line 1
</pre>
<br />
Причина - в XTemplate не было поддержки bool, они не нужны в шаблонах. Это мы поправили, тут вроде обсуждать нечего - bool в условиях использоваться будут.<br />
<br />
<br />
2.<br />
Исходя из практики, кроме короткого варианта с IF нужен ещё и вариант с ELSE. Такой вариант добавлен, сейчас в шаблоне возможны такие условия:<br />
<pre class="code">
&lt;!-- IF &lt;'if' statement&gt; --&gt;&#091;'then' content&#093;&lt;!-- ENDIF --&gt;
&lt;!-- IF &lt;'if' statement&gt; --&gt;&#091;'then' content&#093;&lt;!-- ELSE --&gt;&#091;'else' content&#093;&lt;!-- ENDIF --&gt;
</pre>
<br />
Реализация получилась простой - в коде <strong>medar</strong>'а исправлено 2 строки, и добавлена одна необязательная (в стиле уже сделанного им кода).<br />
<br />
Немного усложнился regex, но в целом применение такой конструкции должно давать выигрыш во времени обработки.<br />
<br />
Примеры из этого топика.<br />
<br />
<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9596#9596">#</a> <strong>medar :</strong>
<pre class="code">
&lt;!-- IF strpos({PAGE_TITLE}, &quot;жуй&quot;) --&gt;
{PAGE_TITLE|str_replace('жуй', '', %s)} ц-ц-ц как нехорошо
&lt;!-- ENDIF --&gt;
&lt;!-- IF !strpos({PAGE_TITLE}, &quot;жуй&quot;) --&gt;
{PAGE_TITLE}
&lt;!-- ENDIF --&gt;
</pre>
</blockquote>
<br />
<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=10020#10020">#</a> <strong>dervan :</strong>
<pre class="code">
&lt;!-- IF {PHP.usr.id} &lt; 1 --&gt;
вы - гость
&lt;!-- ENDIF --&gt;
&lt;!-- IF {PHP.usr.id} &gt;= 1 --&gt;
вы - зарегистрированный посетитель
&lt;!-- ENDIF --&gt;
</pre>
</blockquote>
<br />
В каждом из этих примеров парсится 2 условия IF, т.е. regex обрабатывается 2 раза. Кроме того, в 1-м примере в условиях IF дважды вызывается функцища strpos(), а во 2-м примере - дважды парсится тег {PHP.usr.id}. Если переписать эти примеры с ELSE, они будут работать быстрее, хотя regex для реализации ELSE чуть сложнее.<br />
<br />
<pre class="code">
&lt;!-- IF strpos({PAGE_TITLE}, &quot;жуй&quot;) --&gt;
{PAGE_TITLE|str_replace('жуй', '', %s)} ц-ц-ц как нехорошо
&lt;!-- ELSE --&gt;
{PAGE_TITLE}
&lt;!-- ENDIF --&gt;
</pre>
<br />
<pre class="code">
&lt;!-- IF {PHP.usr.id} &lt; 1 --&gt;
вы - гость
&lt;!-- ELSE --&gt;
вы - зарегистрированный посетитель
&lt;!-- ENDIF --&gt;
</pre>
<br />
В шаблоне для админки, который переделал <strong>Dayver</strong>, подобных конструкций - подавляющее большинство, поэтому исходя из практики выгоднее использовать вариант с ELSE.<br />
<br />
<strong>Предлагаем оставить в XTemplate вариант с поддержкой ELSE.</strong><br />
<br />
<br />
3.<br />
Проблема из-за копирования глобальных переменных методом scan_globals(), в результате чего в шаблоне не видны глобальные переменные, присвоенные после создания объекта XTemplate. На практике это создаёт большие сложности.<br />
<br />
Пример.<br />
Эту переменную $lincif_conf можно использовать в шаблоне:<br />
<pre class="code">
$lincif_conf = sed_auth('admin', 'a', 'A');
$t = new XTemplate(sed_skinfile('admin.inc', false, true));
</pre>
А эту переменную $lincif_conf использовать в шаблоне невозможно:<br />
<pre class="code">
$t = new XTemplate(sed_skinfile('admin.inc', false, true));
$lincif_conf = sed_auth('admin', 'a', 'A');
</pre>
<br />
Для решения проблемы удалось легко реализовать то, о чём говорил <strong>medar</strong>:<br />
<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9620#9620">#</a> <strong>medar :</strong>
Надо будет решить эту проблему по-другому - вообще отказаться от scan_globals(), а при парсинге тэгов {PHP.xxx} обращаться непосредственно к $GLOBALS.<br />
</blockquote>
<br />
Из метода scan_globals() убрано копирование $GLOBALS:<br />
<pre class="code">
	public function scan_globals () {
		if ($this-&gt;force_globals &amp;&amp; ini_get('auto_globals_jit') == true) {
			$tmp = $_SERVER;
			$tmp = $_ENV;
			$tmp = $_REQUEST;
			unset($tmp);
		}
	}
</pre>
<br />
А в методе parse() присваивается указатель:<br />
<pre class="code">
$this-&gt;vars&#091;'PHP'&#093; =&amp; $GLOBALS;
</pre>
и уничтожается перед выходом из parse(). Т.е. $GLOBALS теперь не копируется, и в то же время нет опасности уничтожения $GLOBALS через указатель $this-&gt;vars['PHP'] - этот указатель теперь не существует вне метода parse().<br />
<br />
Возникавшая из-за работы через указатель напрямую с $GLOBALS накладка, которая проявлялась в копировании в пустые строки умолчательных значений, определённых define(), в методе parse() была исправлена. Сообщение об этой накладке:<br />
<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9614#9614">#</a> <strong>dervan :</strong>
К тому же есть нюансы при работе метода parse(). Например, такой код в конце system/header.php, плюс тег <em>{PHP.TEST_DEFINE}</em> в header.tpl:<br />
<div class="highlight"><pre class="php">
define('TEST_DEFINE', 'test_define');
$TEST_DEFINE = '';

$t-&gt;parse(&quot;HEADER&quot;);
$t-&gt;out(&quot;HEADER&quot;);

echo $TEST_DEFINE, '&lt;br /&gt;';
</pre></div>
В случае оригинального scan_globals() глобальная переменная $TEST_DEFINE останется пустой строкой (значение будет присвоено её копии), а с переделанным scan_globals() после работы парсера $TEST_DEFINE получит значение 'test_define'.<br />
</blockquote>
<br />
Из метода get_vars_value() аналогичный код был удалён - пустую строку, которая пойдёт на проверку в IF, не надо подменять умолчательным значением.<br />
<br />
Остальной код в parse() был внимательно изучен, других накладок из-за работы через указатель напрямую с $GLOBALS не обнаружено.<br />
<br />
<strong>Предлагаем оставить в XTemplate этот вариант без копирования $GLOBALS.</strong>]]></description>
			<pubDate>Pzt, 23 Mar 2009 02:50:33 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10344]]></link>
		</item>
		<item>
			<title>Dayver</title>
			<description><![CDATA[<strong>medar</strong> а как с логикой типа <strong>else</strong>? Не получилось реализовать? Или уже есть такое(если есть то моно примерчик?)?]]></description>
			<pubDate>Pzt, 16 Mar 2009 23:44:30 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10080]]></link>
		</item>
		<item>
			<title>medar</title>
			<description><![CDATA[Да, я на самом деле зря тут перестраховался, на скорости это серьезно не скажется, сделаю попозже удаление мусора.]]></description>
			<pubDate>Pzt, 16 Mar 2009 04:31:09 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10046]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=10029#10029">#</a> <strong>Ratibor :</strong>
Осталось только доработать, чтоб все лишнее вырезалось если условие совпадает.<br />
</blockquote>
А у <strong>medar</strong>'а для этого всё готово.<br />
<div class="highlight"><pre class="php">
				$short_tpl_block = $ifs&#091;2&#093;&#091;$i&#093;;
...
				if(!$if_result)
				{
					// delete this IF block with all content
					$copy = str_replace($full_tpl_block, &quot;&quot;, $copy);
				}
				else
				{
					// delete only IF construction
					// ? delete or not - speed ?
				}
</pre></div>
<br />
Осталось выяснить, как сильно упадёт скорость работы парсера, если коментарий<br />
<div class="highlight"><pre class="php">
					// ? delete or not - speed ?
</pre></div>
заменить на код<br />
<div class="highlight"><pre class="php">
					$copy = str_replace($full_tpl_block, $short_tpl_block, $copy);
</pre></div>
<br />
Delete or not delete? :)]]></description>
			<pubDate>Paz, 15 Mar 2009 18:43:27 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10034]]></link>
		</item>
		<item>
			<title>Ratibor</title>
			<description><![CDATA[Данная функция понравилась, можно намного гибче шаблоны делать.<br />
Осталось только доработать, чтоб все лишнее вырезалось если условие совпадает.]]></description>
			<pubDate>Paz, 15 Mar 2009 14:36:47 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10029]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=10016#10016">#</a> <strong>Sergeich :</strong>
... если на сайт зашёл гость - показывается один блок, а если юзер - другой.<br />
</blockquote>
<pre class="code">
&lt;!-- IF {PHP.usr.id} &lt; 1 --&gt;
вы - гость
&lt;!-- ENDIF --&gt;
&lt;!-- IF {PHP.usr.id} &gt;= 1 --&gt;
вы - зарегистрированный посетитель
&lt;!-- ENDIF --&gt;
</pre>]]></description>
			<pubDate>Paz, 15 Mar 2009 06:17:47 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10020]]></link>
		</item>
		<item>
			<title>Sergeich</title>
			<description><![CDATA[Приведите пример пожалуйста для случая с зарегеным юзером и гостем. Т.е. если на сайт зашёл гость - показывается один блок, а если юзер - другой.]]></description>
			<pubDate>Paz, 15 Mar 2009 05:25:16 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10016]]></link>
		</item>
		<item>
			<title>Ratibor</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9596#9596">#</a> <strong>medar :</strong>
<strong>Использование.</strong><br />
<br />
Итак, у нас в шаблонах стала доступна вот такая вот конструкция:<br />
<pre class="code">&lt;!-- IF &lt;if_statement&gt; --&gt;
этот текст будет показан если &lt;if_statement&gt; является true
&lt;!-- ENDIF --&gt;</pre>
<br />
&lt;if_statement&gt; - это логическое php-выражение, только вместо переменных используются tpl-тэги (в том числе и глобальные!)<br />
<br />
Примеры:<br />
<pre class="code">&lt;!-- IF {PHP.usr.profile.user_name} == &quot;admin&quot; --&gt;
привет, админ !
&lt;!-- ENDIF --&gt;</pre>
</blockquote>
<br />
Попробовал сейчас добавить логику в шаблон.<br />
Работает вроде все нормально, но есть небольшое замечание.<br />
<br />
Чтоб было более понятно, объясню на приведенном выше примере:<br />
если имя не admin, т.е. условие не срабатывает, то все нормально,<br />
всмысле в выходном коде это все вырезается,<br />
но если это admin, т.е. условие срабатывает, то в выходном коде мы видим следующее:<br />
<pre class="code">&lt;!-- IF admin == &quot;admin&quot; --&gt;
привет, админ !
&lt;!-- ENDIF --&gt;</pre>
<br />
Не порядок, надо бы вырезать вот это:<br />
<pre class="code">&lt;!-- IF admin == &quot;admin&quot; --&gt;
&lt;!-- ENDIF --&gt;</pre>]]></description>
			<pubDate>Paz, 15 Mar 2009 04:06:11 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post10014]]></link>
		</item>
		<item>
			<title>medar</title>
			<description><![CDATA[Я просто жду реакции англоязычных товарищей, но её, походу, не будет.<br />
Приличия соблюдены, сейчас закоммичу.]]></description>
			<pubDate>Sal, 10 Mar 2009 15:28:08 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post9651]]></link>
		</item>
		<item>
			<title>Dayver</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9639#9639">#</a> <strong>medar :</strong>
Логику написали, теперь регулярки поправить внутри и все ок будет.<br />
</blockquote>
Тогда может уже закинешь в транк хотя бы с прикрученой логикой(в англ ветке отписался = офф. часть выполнил .... там молчат - знач моно закидывать!)? .... а с регулярками уже как нить опосля!?]]></description>
			<pubDate>Sal, 10 Mar 2009 04:51:26 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post9643]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9620#9620">#</a> <strong>medar :</strong>
<strong>dervan</strong><br />
Надо будет решить эту проблему по-другому - вообще отказаться от scan_globals(), а при парсинге тэгов {PHP.xxx} обращаться непосредственно к $GLOBALS.<br />
</blockquote>
<br />
Кстати, <strong>medar</strong>, если так переделывать, то вот от таких накладок при работе parse() всё равно не избавишься:<br />
<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9614#9614">#</a> <strong>dervan :</strong>
К тому же есть нюансы при работе метода parse(). Например, такой код в конце system/header.php, плюс тег <em>{PHP.TEST_DEFINE)</em> в header.tpl:<br />
<div class="highlight"><pre class="php">
define('TEST_DEFINE', 'test_define');
$TEST_DEFINE = '';

$t-&gt;parse(&quot;HEADER&quot;);
$t-&gt;out(&quot;HEADER&quot;);

echo $TEST_DEFINE, '&lt;br /&gt;';
</pre></div>
В случае оригинального scan_globals() глобальная переменная $TEST_DEFINE останется пустой строкой (значение будет присвоено её копии), а с переделанным scan_globals() после работы парсера $TEST_DEFINE получит значение 'test_define'.<br />
</blockquote>
<br />
А действия, подобные<br />
<div class="highlight"><pre class="php">
$t-&gt;assign('PHP', 'test_assign');
</pre></div>
это совершенно идиотские действия, что со старым scan_globals(), что с переделанным - из того же разряда, что и доступ к глобальным переменным через <em>$t-&gt;vars</em>. Так что если отказываться от локальной копии $GLOBALS, пожалуй нет смысла совсем убирать scan_globals(), проще его подправить.]]></description>
			<pubDate>Sal, 10 Mar 2009 04:05:57 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=30#post9641]]></link>
		</item>
		<item>
			<title>medar</title>
			<description><![CDATA[<blockquote>ну так может посмотрим пристально на другие шаблонизаторы</blockquote>
не, проще обустроить xtemplate. <br />
Логику написали, теперь регулярки поправить внутри и все ок будет.]]></description>
			<pubDate>Sal, 10 Mar 2009 03:30:59 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9639]]></link>
		</item>
		<item>
			<title>esclkm</title>
			<description><![CDATA[раз уже на икстеплейте то на икстемплейте.<br />
тем более что у нас появился специалист по xtemplate - поэтому возможно скоро мы увидим medarTemplate]]></description>
			<pubDate>Sal, 10 Mar 2009 02:55:59 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9637]]></link>
		</item>
		<item>
			<title>Sergeich</title>
			<description><![CDATA[ну так может посмотрим пристально на другие шаблонизаторы. Если всё так не здорово в нашем, то пока не поздно внедрить новый, правильный шаблонизатор :). Пока плагинов мало под кот - это можно будет сделать относительно безболеззненно. написать хороший скрипт миграции и вперёд :).]]></description>
			<pubDate>Sal, 10 Mar 2009 01:47:38 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9634]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[Эта гипотеза. Всё то, что я перечислил как доводы против переделки scan_globals(), сам бы ни за что не стал делать - изврат на изврате. :)]]></description>
			<pubDate>Sal, 10 Mar 2009 00:44:57 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9627]]></link>
		</item>
		<item>
			<title>medar</title>
			<description><![CDATA[Вопрос, есть ли такие. Я верю в здравый смысл плагинописателей. <br />
Если человек копался в коде и знает, что существует $t-&gt;vars, то он должен понимать, что брать оттуда данные, а не из например $cfg[] напрямую - это оперировать гланды через задницу. :)[/]]]></description>
			<pubDate>Sal, 10 Mar 2009 00:08:49 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9624]]></link>
		</item>
		<item>
			<title>Trustmaster</title>
			<description><![CDATA[С чего бы? Через $t-&gt;vars обычно вытаскивают локальные переменные, к глобальным обращаются напрямую, иначе очень большая глупость получается.<br />
<br />
ЗЫ: я тут глянул еще раз на код XTemplate. Возникает законный вопрос &quot;неужели это всё хоть сколько-нибудь работоспособно&quot;  <img class="aux smiley" src="https://www.cotonti.com/./images/smilies/grin.gif" alt=":-D" />]]></description>
			<pubDate>Sal, 10 Mar 2009 00:08:27 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9623]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9620#9620">#</a> <strong>medar :</strong>
<strong>dervan</strong><br />
Надо будет решить эту проблему по-другому - вообще отказаться от scan_globals(), а при парсинге тэгов {PHP.xxx} обращаться непосредственно к $GLOBALS.<br />
</blockquote>
Тогда посыпятся плагины, которые используют $t-&gt;vars.]]></description>
			<pubDate>Pzt, 09 Mar 2009 23:42:51 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9622]]></link>
		</item>
		<item>
			<title>medar</title>
			<description><![CDATA[<strong>dervan</strong><br />
Да, наверное, лучше убрать. <br />
Надо будет решить эту проблему по-другому - вообще отказаться от scan_globals(), а при парсинге тэгов {PHP.xxx} обращаться непосредственно к $GLOBALS.]]></description>
			<pubDate>Pzt, 09 Mar 2009 22:38:55 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9620]]></link>
		</item>
		<item>
			<title>Sergeich</title>
			<description><![CDATA[надо под нагрузкой всё это потестить для чистоты совести. А заодно в английскую ветку выложить, чтобы и там народ потестировал, может что интересное предложат.]]></description>
			<pubDate>Pzt, 09 Mar 2009 22:18:30 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9616]]></link>
		</item>
		<item>
			<title>medar</title>
			<description><![CDATA[<strong>UPD</strong><br />
Провел тестирование на линуксовом серваке. Цифры стали логичными и предсказуемыми.<br />
Все-таки php под виндой - это странная вещь. :)<br />
<br />
<em>Старый xtemplate</em><br />
Requests per second:    <strong>16.30</strong> [#/sec] (mean)<br />
Time per request:       245.377 [ms] (mean)<br />
Time per request:       61.344 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          123.87 [Kbytes/sec] received<br />
<br />
<em>Новый xtemplate + хак dervan (здесь и далее) шаблон без логики</em><br />
Requests per second:    <strong>17.47</strong> [#/sec] (mean)<br />
Time per request:       229.007 [ms] (mean)<br />
Time per request:       57.252 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          132.60 [Kbytes/sec] received<br />
<br />
<em>Новый xtemplate, шаблон с логикой, 1 условие</em><br />
Requests per second:    <strong>16.78</strong> [#/sec] (mean)<br />
Time per request:       238.446 [ms] (mean)<br />
Time per request:       59.611 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          128.34 [Kbytes/sec] received<br />
<br />
<em>Новый xtemplate, шаблон с логикой, 25 условий</em><br />
Requests per second:    <strong>15.60</strong> [#/sec] (mean)<br />
Time per request:       256.485 [ms] (mean)<br />
Time per request:       64.121 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          119.25 [Kbytes/sec] received]]></description>
			<pubDate>Pzt, 09 Mar 2009 22:13:47 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9615]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9604#9604">#</a> <strong>medar :</strong>
Кто-нибудь может прокомментировать, что происходит ? :) Как-то это всё нелогично..<br />
</blockquote>
Получается, что по ссылке на $GLOBALS парсинг работает дольше, чем при использовании локальной копии.<br />
<br />
================<br />
<br />
<strong>medar</strong>, я извиняюсь - не пойдёт этот хак scan_globals().<br />
<br />
Во-первых, я не учёл, что после такой переделки весь $GLOBALS можно убить методом assign(), например так:<br />
<div class="highlight"><pre class="php">
$t-&gt;assign('PHP', 'test_assign');
$t-&gt;assign(array('PHP' =&gt; 'test_assign_array'));
</pre></div>
<br />
Добавлял в конец system/header.php такой код, всё так и есть - $GLOBALS уничтожается:<br />
<div class="highlight"><pre class="php">
$t-&gt;assign('PHP', 'test_assign');

$t-&gt;parse(&quot;HEADER&quot;);
$t-&gt;out(&quot;HEADER&quot;);

echo '&lt;pre&gt;', strip_tags(print_r($GLOBALS, true)), '&lt;/pre&gt;';
</pre></div>
<br />
В принципе, можно в методе assign() проверять ключ на значение 'PHP' и не присваивать в этом случае значение. Но $GLOBALS всё равно можно убить напрямую через vars:<br />
<div class="highlight"><pre class="php">
$t-&gt;vars&#091;'PHP'&#093; = 'test_assign';
</pre></div>
А vars - public, и менять это нельзя, могут отказаться работать какие-нибудь плагины.<br />
<br />
К тому же есть нюансы при работе метода parse(). Например, такой код в конце system/header.php, плюс тег <em>{PHP.TEST_DEFINE)</em> в header.tpl:<br />
<div class="highlight"><pre class="php">
define('TEST_DEFINE', 'test_define');
$TEST_DEFINE = '';

$t-&gt;parse(&quot;HEADER&quot;);
$t-&gt;out(&quot;HEADER&quot;);

echo $TEST_DEFINE, '&lt;br /&gt;';
</pre></div>
В случае оригинального scan_globals() глобальная переменная $TEST_DEFINE останется пустой строкой (значение будет присвоено её копии), а с переделанным scan_globals() после работы парсера $TEST_DEFINE получит значение 'test_define'.<br />
<br />
И вдобавок по твоим тестам с переделанным scan_globals() парсер работает медленнее. Так что в сад. :)<br />
<br />
Ещё раз извиняюсь.]]></description>
			<pubDate>Pzt, 09 Mar 2009 22:08:14 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9614]]></link>
		</item>
		<item>
			<title>medar</title>
			<description><![CDATA[Проапдейтил файл с учетом изменений от dervan.<br />
<br />
Бенчмарк на локалхосте, php под виндой.<br />
<br />
ab -c 4 -n1000 &quot;http://localhost/svn.cotonti.com/trunk/page.php?id=2&quot;<br />
<br />
<em>Новый xtemplate, два логических блока в tpl.</em><br />
Requests per second:    <strong>8.48</strong> [#/sec] (mean)<br />
Time per request:       471.563 [ms] (mean)<br />
Time per request:       117.891 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          64.49 [Kbytes/sec] received<br />
<br />
<em>Новый xtemplate, без логических блоков.</em><br />
Requests per second:    <strong>8.81</strong> [#/sec] (mean)<br />
Time per request:       454.188 [ms] (mean)<br />
Time per request:       113.547 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          66.25 [Kbytes/sec] received<br />
<br />
Разницы практически нет, ок.<br />
<br />
<em>Теперь старый xtemplate</em><br />
Requests per second:    <strong>13.06</strong> [#/sec] (mean)<br />
Time per request:       306.188 [ms] (mean)<br />
Time per request:       76.547 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          99.96 [Kbytes/sec] received<br />
<br />
Результат, мягко говоря, обескураживает. Старый более чем в полтора раза быстрее.<br />
Начал разбираться в чем дело.<br />
<br />
<em>Новый xtemplate, но со старой функцией scan_globals() (без хака dervan)</em><br />
Requests per second:    <strong>9.41</strong> [#/sec] (mean)<br />
Time per request:       424.875 [ms] (mean)<br />
Time per request:       106.219 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          70.83 [Kbytes/sec] received<br />
<br />
Кто-нибудь может прокомментировать, что происходит ? :) Как-то это всё нелогично..<br />
<br />
Надо проштудировать хабр, вроде бы кто-то уже сталкивался с подобной ситуацией.]]></description>
			<pubDate>Pzt, 09 Mar 2009 15:35:27 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9604]]></link>
		</item>
		<item>
			<title>Dayver</title>
			<description><![CDATA[Афигенно.... если все работает, и без глюков да еще и без тормозов то на днях таки активизирую свою работу по устранению xhtml кода из админских php файлов(если данная фича будет закомичена в транк).....а как покончу с админкой(почти половину уже осилил) и дефолтными плугами(а там остался всего то один плуг поиска) возьмусь за остальные части папочки systems]]></description>
			<pubDate>Pzt, 09 Mar 2009 08:42:48 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9601]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9598#9598">#</a> <strong>medar :</strong>
Да, я тоже хотел сделать ссылкой, но меня насторожил код ниже:<br />
<div class="highlight"><pre class="php">case 'GLOBALS':
// Stop Recursion
break;</pre></div>
Наверное он там не просто так.<br />
...<br />
</blockquote>
Это ссылка в $GLOBALS на самого себя - она там ещё с PHP3, когда ещё в языке ссылки не поддерживались. Проверка - чтобы не зацикливаться при копировании.<br />
<br />
Про этот хак в XTemplate <a href="http://neocrome.ru/forums.php?m=posts&amp;p=21423#21423" rel="nofollow">подробно рассказано здесь</a>.]]></description>
			<pubDate>Pzt, 09 Mar 2009 08:30:45 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9600]]></link>
		</item>
		<item>
			<title>Sergeich</title>
			<description><![CDATA[Хорошо, бум пробовать, но слегонца пугают меня непрограмёра такие конструкции :)]]></description>
			<pubDate>Pzt, 09 Mar 2009 08:16:52 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9599]]></link>
		</item>
		<item>
			<title>medar</title>
			<description><![CDATA[Да, я тоже хотел сделать ссылкой, но меня насторожил код ниже:<br />
<div class="highlight"><pre class="php">case 'GLOBALS':
// Stop Recursion
break;</pre></div>
Наверное он там не просто так.<br />
<br />
Вроде со ссылкой на глаз все работает.<br />
Но print_r($this-&gt;vars); показывает вот что:<br />
<div class="highlight"><pre class="php">Array
(
    &#091;PHP&#093; =&gt; Array
        (
            &#091;GLOBALS&#093; =&gt; Array
 *RECURSION*
</pre></div>
Я такое вижу в первый раз, не знаю, чем это может нам грозить :)]]></description>
			<pubDate>Pzt, 09 Mar 2009 08:08:42 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9598]]></link>
		</item>
		<item>
			<title>dervan</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums.php?m=posts&amp;p=9596#9596">#</a> <strong>medar :</strong>
Вообще, когда я увидел ужас, летящий на крыльях ночи в xtemplate в виде массы регулярок и дублирования всех переменных движка, ...<br />
</blockquote>
От дублирования $GLOBALS можно избавиться, поправив в XTemplate метод scan_globals():<br />
<div class="highlight"><pre class="php">
	public function scan_globals ()
	{
		if ($this-&gt;force_globals &amp;&amp; ini_get('auto_globals_jit') == true)
		{
			$tmp = $_SERVER;
			$tmp = $_ENV;
			$tmp = $_REQUEST;
			unset($tmp);
		}
		$this-&gt;vars&#091;'PHP'&#093; =&amp; $GLOBALS;
	}
</pre></div>]]></description>
			<pubDate>Pzt, 09 Mar 2009 07:33:20 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/tr/forums?m=posts&q=2047&d=0#post9597]]></link>
		</item>
	</channel>
</rss>