medar |
|
---|---|
Предлагаю тут обсудить наш шаблонизатор - xtemplate.
Основная, на мой взгляд, его проблема описана например здесь - это невозможность задавать условия вывода тэга: Допустим, что PAGE_EXTRA1 у нас должно выводить в теле страницы хтмл-ссылку. В форму PAGEADD_FORM_EXTRA1 мы вбили нужный адрес, но он не обработается на странице и выведется простым текстом, а нам нужна именно действующая ссылка вида Т.е. по каждому подобному чиху мы вынуждены писать плагин, который будет смотреть пустое поле или не пустое и формировать вывод соответственно. Теоретически можно сменить шаблонизатор, но практически, мне кажется, - это не выход. Предлагаю здесь обсудить как нам дописать функционал xtemplate. Например, как сделать механизм вывода по условию. rangjungyeshe.ru
|
Sergeich |
|
---|---|
Так я в посте по ссылке предложил решение (юзерскую составляющую):
...весь обвес должен быть всё же в шаблоне, но будет хорошо, если обвес будет заключен в специальные комментарии, типа вот так:
<!-- 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 |
|
---|---|
Т.е. этот блок будет выводиться, только если в page.inc.php явно сделать парсинг области PAGE_EXTRA1 ? Имхо, нефункционально. Это придется делать $t->parse() по всем возможным тэгам, дозвиданья производительность.
Прочитал update. :) Я хочу предложить нечто похожее. Поковыряться в xtemplate.cpass.php в функции parse() и сделать например такую конструкцию: <!-- BEGIN: <условие> -->
<!-- END: <условие> --> rangjungyeshe.ru
|
|
This post was edited by medar (2009-02-12 00:29, 15 years ago) |
Sergeich |
|
---|---|
Я же пишу с позиции скинмейкера, как мне бы было удобно. А уж вам програмёрам нужно подумать как это реализовать технически :)
|
Dayver |
|
---|---|
Вообще мысль хорошая... но не будет ли введение в шаблонизатор разнообразных проверок, по нагрузке на производительность, равнозначным "$t->parse() по каждой мелочи". ?
Pavlo Tkachenko aka Dayver
|
medar |
|
---|---|
Очередная мысль. :)
А если <условие> сделать в виде строки, например 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 |
|
---|---|
Интересно было бы сначала провести небольшое исследование, что нового появилось в последнее время среди шаблонизаторов, кроме пресловутых бинарных модулей для выделенных серверов. Менять шаблонизатор нам ни к чему, но может на идеи интересные нападем.
May the Source be with you!
|
esclkm |
|
---|---|
Поддерживаю! Слишком здравая мысль! надо ее тут оформить и в идеи кинуть на день другой
И еще если будет IF то нужен будет и IF NOT littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты |
|
This post was edited by esclkm (2009-02-13 07:16, 15 years ago) |
kanda |
|
---|---|
Вот такая проблемка маленькая: внизу страницы(стандартный шаблон) есть кнопичько "Вверх". Дак вот там ссылка идет на блок с id=top("#top") и при нажатии он высылает на главную страницу... Дак какой хак ядра можно вставить что-бы перед "#top" выводилась ссылка текущей страницы?? То есть "<a href="{хак}#top"></a>".
P.s. извините если проглядел где... [h2][color=#3465A4][center][b]Верстаю сайт по фотографии![/b][/color](c)[/center][/h1]
|
Ratibor |
|
---|---|
# kanda : Дак вот там ссылка идет на блок с id=top("#top") и при нажатии он высылает на главную страницу...Странно, у меня перекидывает именно в верх страницы. Может я делаю чтото не правильно ? Не задавай глупых вопросов, не услышишь вранья.
|
Dayver |
|
---|---|
# kanda : Вот такая проблемка маленькая: внизу страницы(стандартный шаблон) есть кнопичько "Вверх". Дак вот там ссылка идет на блок с id=top("#top") и при нажатии он высылает на главную страницу... Дак какой хак ядра можно вставить что-бы перед "#top" выводилась ссылка текущей страницы?? То есть "<a href="{хак}#top"></a>".1. Какой броузер? 2. Это скорее не хак ядра а хак скина....а это вообще безболезнено Pavlo Tkachenko aka Dayver
|
kanda |
|
---|---|
Ладно, ссылка вверх - решаема проблема и не так актуальная как "Динамические ключивики".
Возможно ли как-нибудь вывести теги страницы в keywords? Если тупо вставить тег для вывода "тегов", то это не айс )) [h2][color=#3465A4][center][b]Верстаю сайт по фотографии![/b][/color](c)[/center][/h1]
|
medar |
|
---|---|
Та-дааа!!
Я, похоже, таки сделал логику для 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 |
|
---|---|
# 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 |
|
---|---|
Да, я тоже хотел сделать ссылкой, но меня насторожил код ниже:
case 'GLOBALS':
// Stop Recursion
break; Вроде со ссылкой на глаз все работает. Но print_r($this->vars); показывает вот что: Array
(
[PHP] => Array
(
[GLOBALS] => Array
*RECURSION*
rangjungyeshe.ru
|