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

1234>>>

medar
#1 2009-02-11 23:40
Предлагаю тут обсудить наш шаблонизатор - xtemplate.

Основная, на мой взгляд, его проблема описана например здесь - это невозможность задавать условия вывода тэга:

Допустим, что PAGE_EXTRA1 у нас должно выводить в теле страницы хтмл-ссылку. В форму PAGEADD_FORM_EXTRA1 мы вбили нужный адрес, но он не обработается на странице и выведется простым текстом, а нам нужна именно действующая ссылка вида
<a href="{PAGE_EXTRA1}">НАША ССЫЛКА</a>

Конечно можно обвес вбить прямо в шаблон. Но если поле PAGE_EXTRA1 будет не заполнено, то весь обвес останется, и на странице появится кривая ссылка вида

<a href="">НАША ССЫЛКА</a>

Т.е. по каждому подобному чиху мы вынуждены писать плагин, который будет смотреть пустое поле или не пустое и формировать вывод соответственно.

Теоретически можно сменить шаблонизатор, но практически, мне кажется, - это не выход.

Предлагаю здесь обсудить как нам дописать функционал xtemplate. Например, как сделать механизм вывода по условию.
rangjungyeshe.ru
Sergeich
#2 2009-02-11 23:56
Так я в посте по ссылке предложил решение (юзерскую составляющую):
...весь обвес должен быть всё же в шаблоне, но будет хорошо, если обвес будет заключен в специальные комментарии, типа вот так:

<!-- BEGIN: PAGE_EXTRA1 -->
<a href="{PAGE_EXTRA1}">НАША ССЫЛКА</a>
<!-- END: PAGE_EXTRA1 -->

Причём, чтобы не усложнять без необходимости шаблон, стандартый вариант без комментариев тоже должен работать, но уже без возможности удалить обвес при пустом PAGE_EXTRA1.

----------------
Я тут ещё немножко подумал :). практически любой тег у нас может быть пустым и может быть не пустым.

Если тег не пустой, то всё выводится или в лоб (как сейчас), или в комментариях как в примере выше.

Если тег пустой, то или вообще ничего не выводится, или же мы можем добавить в шаблон некий блок, который будет выводить необходимый обвес. Что-то типа такого:

<!-- BEGIN OFF: PAGE_EXTRA1 -->
Здесь рыбы нет!
<!-- END OFF: PAGE_EXTRA1 -->

Это правило должно распространятся на некий набор тегов (а можно и на все), которые тянут информацию из базы.

Плюс этого метода:
- полная совместимость с действующими шаблонами. Если скинмейкер не хочет использовать сложные конструкции, то он их и не использует и верстает скины как сейчас.
- если скинмейкер желает чтобы блоки информации у него на странице могли изменяться в зависимости от наличия информации в теге, то он использует новые комментарии

<!-- BEGIN: PAGE_EXTRA1 -->
бла-бла-бла
<!-- END: PAGE_EXTRA1 -->

а при необходимости (но, не обязательно) и пустой блок-заглушку

<!-- BEGIN OFF: PAGE_EXTRA1 -->
бу-бу-бу
<!-- END OFF: PAGE_EXTRA1 -->
This post was edited by Sergeich (2009-02-12 00:13, 15 years ago)
medar
#3 2009-02-12 00:17
Т.е. этот блок будет выводиться, только если в page.inc.php явно сделать парсинг области PAGE_EXTRA1 ? Имхо, нефункционально. Это придется делать $t->parse() по всем возможным тэгам, дозвиданья производительность.

Прочитал update. :)
Я хочу предложить нечто похожее. Поковыряться в xtemplate.cpass.php в функции parse() и сделать например такую конструкцию:
<!-- BEGIN: <условие> -->
<!-- END: <условие> -->
а вот какой вид переменной будет в условии - это надо подумать.. Пока ограничиться page_xxxxx и user_xxxxx , где xxxxx - название поля.
rangjungyeshe.ru
This post was edited by medar (2009-02-12 00:29, 15 years ago)
Sergeich
#4 2009-02-12 00:26
Я же пишу с позиции скинмейкера, как мне бы было удобно. А уж вам програмёрам нужно подумать как это реализовать технически :)
Dayver
#5 2009-02-12 00:42
Вообще мысль хорошая... но не будет ли введение в шаблонизатор разнообразных проверок, по нагрузке на производительность, равнозначным "$t->parse() по каждой мелочи". ?
Pavlo Tkachenko aka Dayver
medar
#6 2009-02-12 00:43
Очередная мысль. :)
А если <условие> сделать в виде строки, например IF_PAGE_EXTRA1_EQUAL_10 , то в xtemplate не придется лазить! Достаточно перед каждым финальным $t->parse("MAIN") вызывать функцию, которая бы парсила файл скина, находила эти условия, разбирала их и при надобности вызывала штатный $t->parse("MAIN.IF_PAGE_EXTRA1_EQUAL_10");

не будет ли введение в шаблонизатор разнообразных проверок, по нагрузке на производительность, равнозначным "$t->parse() по каждой мелочи". ?
Нет, не должно. По крайней мере мы можем в самом начале перед регулярками проверять скин на наличие конструкций условий
strpos($mskin, "BEGIN: IF")
и не выполнять дальнейший код если они не найдены.
rangjungyeshe.ru
This post was edited by medar (2009-02-12 00:51, 15 years ago)
Trustmaster
#7 2009-02-12 01:04
Интересно было бы сначала провести небольшое исследование, что нового появилось в последнее время среди шаблонизаторов, кроме пресловутых бинарных модулей для выделенных серверов. Менять шаблонизатор нам ни к чему, но может на идеи интересные нападем.
May the Source be with you!
esclkm
#8 2009-02-12 01:38
Поддерживаю! Слишком здравая мысль! надо ее тут оформить и в идеи кинуть на день другой

И еще если будет IF то нужен будет и IF NOT
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты
This post was edited by esclkm (2009-02-13 07:16, 15 years ago)
kanda
#9 2009-02-16 15:20
Вот такая проблемка маленькая: внизу страницы(стандартный шаблон) есть кнопичько "Вверх". Дак вот там ссылка идет на блок с id=top("#top") и при нажатии он высылает на главную страницу... Дак какой хак ядра можно вставить что-бы перед "#top" выводилась ссылка текущей страницы?? То есть "<a href="{хак}#top"></a>".

P.s. извините если проглядел где...
[h2][color=#3465A4][center][b]Верстаю сайт по фотографии![/b][/color](c)[/center][/h1]
Ratibor
#10 2009-02-16 15:51
# kanda : Дак вот там ссылка идет на блок с id=top("#top") и при нажатии он высылает на главную страницу...
Странно, у меня перекидывает именно в верх страницы.
Может я делаю чтото не правильно ? :-)
Не задавай глупых вопросов, не услышишь вранья.
Dayver
#11 2009-02-16 20:33
# kanda : Вот такая проблемка маленькая: внизу страницы(стандартный шаблон) есть кнопичько "Вверх". Дак вот там ссылка идет на блок с id=top("#top") и при нажатии он высылает на главную страницу... Дак какой хак ядра можно вставить что-бы перед "#top" выводилась ссылка текущей страницы?? То есть "<a href="{хак}#top"></a>".
1. Какой броузер?
2. Это скорее не хак ядра а хак скина....а это вообще безболезнено
Pavlo Tkachenko aka Dayver
kanda
#12 2009-02-17 03:09
Ладно, ссылка вверх - решаема проблема и не так актуальная как "Динамические ключивики".
Возможно ли как-нибудь вывести теги страницы в keywords? Если тупо вставить тег для вывода "тегов", то это не айс ))
[h2][color=#3465A4][center][b]Верстаю сайт по фотографии![/b][/color](c)[/center][/h1]
medar
#13 2009-03-09 07:19
Та-дааа!!
Я, похоже, таки сделал логику для xtemplate.
Тот путь, который я описал в постах выше оказался тупиковым, пришлось сделать все совсем по-другому.

Файл пока не коммитю, так как даже обсуждения в Ideas не было. Хотя, ИМХО, обсуждать тут нечего, это мастхэв на 100% и дополнительных тормозов оно не создает.

Вообще, когда я увидел ужас, летящий на крыльях ночи в xtemplate в виде массы регулярок и дублирования всех переменных движка, я уже спокойнее отношусь к вопросу "а не затормозит ли это движок?". Не затормозит. Если xtemplate не убил скорость, то точно уже ничего не убьет. :)

Вот измененный файл: http://www.cotonti.com/datas/users/xtemplate.class_45.rar . Им надо переписать существующий (system/xtemplate.class.php). Посмотрите-потестите плиз, я погонял у себя, вроде работает везде и стабильно. Я завтра на свежую голову еще его погоняю и закоммитю.

Использование.

Итак, у нас в шаблонах стала доступна вот такая вот конструкция:
<!-- IF <if_statement> -->
этот текст будет показан если <if_statement> является true
<!-- ENDIF -->

<if_statement> - это логическое php-выражение, только вместо переменных используются tpl-тэги (в том числе и глобальные!)

Примеры:
<!-- IF {PHP.usr.profile.user_name} == "admin" -->
привет, админ !
<!-- ENDIF -->

<!-- IF {PAGE_DESC}== "" -->
Описание страницы пустое. Напишите хоть что-нибудь
<!-- ENDIF -->

<!-- IF {PAGE_DESC} == {PAGE_TITLE} AND {PAGE_COMMENTS_COUNT} > 0-->
Замечена нехилая активность в комментах! И, кстати, тайтл и деск страницы совпадают, если это вам интересно.
<!-- ENDIF -->

и даже можно так:
Пример, конечно, надуманный, но больше в такой поздний час ничего в голову не лезет.
<!-- IF strpos({PAGE_TITLE}, "жуй") -->
{PAGE_TITLE|str_replace('жуй', '', %s)} ц-ц-ц как нехорошо
<!-- ENDIF -->
<!-- IF !strpos({PAGE_TITLE}, "жуй") -->
{PAGE_TITLE}
<!-- ENDIF -->
"|str_replace" - это, кстати, фишка самого xtemplate - можно изменять значения тэгов callback-функциями. Вот как полезно, оказывается, читать документацию. :)

Единственно чего нельзя - делать эти конструкции вложенными. Но так как в выражении можно использовать AND и OR, вложенность и не нужна по сути.
rangjungyeshe.ru
dervan
#14 2009-03-09 07:33
# medar : Вообще, когда я увидел ужас, летящий на крыльях ночи в xtemplate в виде массы регулярок и дублирования всех переменных движка, ...
От дублирования $GLOBALS можно избавиться, поправив в XTemplate метод scan_globals():
	public function scan_globals ()
	{
		if ($this->force_globals && ini_get('auto_globals_jit') == true)
		{
			$tmp = $_SERVER;
			$tmp = $_ENV;
			$tmp = $_REQUEST;
			unset($tmp);
		}
		$this->vars['PHP'] =& $GLOBALS;
	}
medar
#15 2009-03-09 08:08
Да, я тоже хотел сделать ссылкой, но меня насторожил код ниже:
case 'GLOBALS':
// Stop Recursion
break;
Наверное он там не просто так.

Вроде со ссылкой на глаз все работает.
Но print_r($this->vars); показывает вот что:
Array
(
    [PHP] => Array
        (
            [GLOBALS] => Array
 *RECURSION*
Я такое вижу в первый раз, не знаю, чем это может нам грозить :)
rangjungyeshe.ru

1234>>>