Forums / National / Russian / Шаблонизатор

dervan
#10464 2009-03-25 07:24
# Trustmaster : Ещё бы сделали ... разбор условий без eval'а

Хорошая мысль. :)

Пожалуй, совсем от варианта с eval() отказываться не надо - может потребоваться сложное условие. Но для простейших вариантов, когда в IF проверяется значение переменной bool или int, несложно сделать вариант без eval().

Мы с Dayver'ом, когда обсуждали разные варианты условий для IF (с вызовом функцищ, с использованием $GLOBALS для передачи аргументов функцищам), решили по возможности использовать в шаблонах для IF'ов не код PHP, а сформированные специально для шаблонов переменные bool. Именно такой подход использовал Dayver в выложенных им файлах, которые демонстрируют использование IF'ов в шаблонах.

Если придерживаться такого подхода и использовать в условиях IF шаблона только значения переменных bool или int, то эти условия будут проверяться без вызова eval().

Предлагаем улучшенный вариант XTemplate, проверяющий простые условия без eval(): xtemplate.class.php_57.zip
Остальные условия, которые не сводятся к простой проверке значения bool или int, как и прежде будут обрабатываться вызовом eval().

Все условия в выложенных Dayver'ом файлах этим вариантом XTemplate будут проверяться без eval(), т.е. будут обработаны быстрее.


Пример.

# Sergeich : В шаблоне page.tpl мне нужно разделять теги запятой (или любым другим разделителем), сейчас я это реализовал так:
<!-- BEGIN: PAGE_TAGS_ROW -->
	<a href="{PAGE_TAGS_ROW_URL}">{PAGE_TAGS_ROW_TAG}</a>,
<!-- END: PAGE_TAGS_ROW -->
Проблема в том, что после последнего тега также вставляется запятая (разделитель), что есть не красиво. Как бы убрать эту лишнюю запятую?

Если решать эту задачу, исходя из существующего кода плагина tags, получится вот что.

# dervan :
		<!-- BEGIN: PAGE_TAGS_ROW -->
		<a href="{PAGE_TAGS_ROW_URL}">{PAGE_TAGS_ROW_TAG}</a><!-- IF $GLOBALS['tag'] != $GLOBALS['tags'][count($GLOBALS['tags']) - 1] -->,<!-- ENDIF -->
		<!-- END: PAGE_TAGS_ROW -->
Только вот есть сомнения, правильно ли это - раз уж убирать HTML из кода, IMHO тогда не следует злоупотреблять кодом в шаблонах. А тут при каждом проходе парсера будет вызываться функцища count(). По-хорошему, в plugins/tags/tags.page.php надо добавить флажок, чтобы IF определял по нему последний проход парсера в блоке PAGE_TAGS_ROW.

Правильнее будет сформировать в plugins/tags/tags.page.php переменную для шаблона:
	$tags_cntdwn = count($tags);
	if($tags_cntdwn > 0)
	{
		foreach($tags as $tag)
		{
			$tags_cntdwn--;
и использовать в шаблоне простое условие:
		<!-- BEGIN: PAGE_TAGS_ROW -->
		<a href="{PAGE_TAGS_ROW_URL}">{PAGE_TAGS_ROW_TAG}</a><!-- IF {PHP.tags_cntdwn} -->,<!-- ENDIF -->
		<!-- END: PAGE_TAGS_ROW -->
При таком решении условие IF будет проверяться без eval(), и шаблон будет распарсен быстрее.