.silent Опубликовано 5 Февраля 2006 Жалоба Поделиться Опубликовано 5 Февраля 2006 В последнее время активно интересуюсь такой вещью как шаблоны.Допустим, есть шаблон в IPB - файл, в нем класс куска скина с какими-то функциями, которые добавляют в output какой-то html.Ладно, как сделать простой вывод я понимаю. Это фигня. А вот интересует, к примеру, передача каких-то переменных в функцию. Да и те же условия прямо в шаблоне, собственные. тобишь есть код примерно такого содержания:function blah( $a ) { return <<<EOF Текст, переданный в функцию: {$a} EOF; }и {$a} заменяется текстом, передаваемым в функцию.пример дал так, от балды. в IPB вывод чуть другой, но это не суть важно. важно то, как вообще всё это работает, тоесть, происходит замена этой {$a} на передаваемый параметр.вот в это я не врубаюсь и прошу знающих людей объяснить, как это происходит. на пальцах, можно не вдаваться в подробности. покопался в class_template_engine.php и class_template.php и решил что лучше бы я их не смотрел там слишком много всего наваяно, когда мне нужно узнать, в принципе, только эту фишку, как она реализована. прошу сильно не ржать. я не волшебник, я только учусь.ответы с советами использовать какие-нибудь уже существующие шаблонные движки мне не надо. заранее благодарен за помощь балбесу =) p.s. мне не важно, как делаел это именно IPB, можно что угодно. а лучше просто растолковать саму суть этой штукиp.p.s. сорри за некоторую сумбурность. надеюсь, написал понятно =)p.p.p.s. принимаются так же ссылки на доки по использованию шаблонов. только не те что для дурачков, а для серьезных людей.p.p.p.p.s. обещаю больше не писать пост-скриптумы Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Destruction Опубликовано 5 Февраля 2006 Жалоба Поделиться Опубликовано 5 Февраля 2006 В тексте, который в <<<EOF, PHP заменяет переменные так же, как и в тексте с двойными кавычками. Сие хорошо демонстрирует следющий пример:function blah( $a ) { return <<<EOF Текст, переданный в функцию: {$a} EOF; } echo blah("text");Если Вас интересует, как это делает PHP - то вопрос не совсем в этот форум надо постить. Кстате, фигурные скобочки нужны только при вставке элемента массива или объекта -) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
.silent Опубликовано 5 Февраля 2006 Автор Жалоба Поделиться Опубликовано 5 Февраля 2006 прикольно. вот уж бы не подумал сорри. спасибо. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Destruction Опубликовано 5 Февраля 2006 Жалоба Поделиться Опубликовано 5 Февраля 2006 прикольно. вот уж бы не подумал сорри. спасибо.Да лан, я ж псих тупой, которого ты просил не отвечать на свои посты Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
.silent Опубликовано 5 Февраля 2006 Автор Жалоба Поделиться Опубликовано 5 Февраля 2006 хорошо, беру свои слова обратно и публично прошу прощения.был не прав, извини. хорошо, раз так просто оказалось с такой штукой, то рассмотрим те же условия вида.<if="ipb.member['id']"> код </if>как тогда здесь код подменяется чем-то другим. ведь он подменяется? или как?оригинальная суть вопроса, наверное, в этом и была. я думал что и переменные таким же образом как-то меняются.лоханулся с переменными я, конечно, здорово =)надеюсь, с функциями не лоханусь так же =) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 А это уже шаблонным движком IPB заменяется. В smarty аналогичные конструкции мне нравяться больше Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
.silent Опубликовано 6 Февраля 2006 Автор Жалоба Поделиться Опубликовано 6 Февраля 2006 а как хоть оно заменяется-то?это же функция?вот это мне интересно. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Destruction Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 http://php.net/preg Крайне полезная информация.. Типа шаблон парситься, а в 2.1 даже помещается в многозначительно названный массив "compiled_templates". PS: То, что я псих - я не отрицаю, а вот на знания лучше не наезжать - обижусь. Сейчас подумал - если сюда еще подключить http://php.net/eval то задача будет намного проще и шире. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
.silent Опубликовано 6 Февраля 2006 Автор Жалоба Поделиться Опубликовано 6 Февраля 2006 не, такими функциями я пользоваться умею.просто меня интересует, чем заменяются такие конструкции. php кодом? если да, то как они потом выполняются? если нет - то прямо в замене текста обдумывается что оставлять, а что нет? аа, eval.тогда ясно.спасибо Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Destruction Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 Насчёт IPB незнаю, а eval - это я сам придумал, я же говорю - никада не делал, просто знаю PS: Регулярка сила, попробуй отыскать функцию которая в IPB страдает заменой псевдоусловий - может циклы еще присобачим.. Еще подумал, а ведь если поставить eval, то можно пихать в шаблоны будет PHP-код, о чём так много людей мечтает.. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 В IPB такие конструкции преобразовываются в обычный php (регэкспы там или что попроще уже не помню). Скэшированный шаблон представляет собой обычный php код. Когда его подцепляет скрипт, он исполняется обычным образом. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Destruction Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 В IPB такие конструкции преобразовываются в обычный php (регэкспы там или что попроще уже не помню). Скэшированный шаблон представляет собой обычный php код. Когда его подцепляет скрипт, он исполняется обычным образом.ИМХО - нах надо, когда можно делать так:Через рег (ОДИН !!! ВСЕГО ОДИН, пишу с ходу - без гарантий) пример:$template = <<<EOF Hello <? echo $username ?> ! EOF;Делаем примерно такой прег:$template = preg_replace("/(\<\?)(.*)(\?\>)/",eval("\\1"),$template) Вуалямс - всё круто :-) PS: Знак $ следует закомментировать, если не хотите, чтобы оно заменилось на переменную, т.к. в функции с шаблоном может и не быть переменной. ___________________________________________________________ Хмм, не пашет, вобщем потыкаться надо, eval почему-то фигню берёт в качестве аргумента :-( ___________________________________________________________ Еще подумал понял - функция сначала берёт значения, а потом делает риплейс (т.е. eval() получает в качестве аргумента слеш (второй экранирует первый) и единицу...).. Жаль, надо менять тактику. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 На такую штуку не регэкспов ни вообще никакой этой байды не надо . Переменную же можно просто так вывести.А если делаешь preg_replace, то там модификатор "e" есть. Постоянно заменять все подряд и делать eval имхо медленнее будет, чем сразу php код подхватывать. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Destruction Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 Хы, заработало... $username = "Destruction"; $template = "Hello <? return \$username; ?> !"; $template = preg_replace("/(\<\?)(.*)(\?\>)/e", "eval('\\2')", $template); echo $template; d1pro - а пример мона? Я по этой части не совсем грамотен.. От себя могу еще пример дать, с условиями (переход на новую строку почему-то всё портит, ну и фиг с ним - не буду я делать из-за него еще прегу ни чего-либо еще..):$username = "Destruction"; $template = "Hello <? if(\$username=='Destruction'){return 'Destruction';}else{return 'Не Destruction';} ?> !"; $template = preg_replace("/(\<\?)(.*)(\?\>)/e", "eval('\\2')", $template); echo $template; Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 Попробуй без eval в качестве второго аргумента. Сам модификатор e по идее как eval действует.Насчет чего пример?Чисто теоретически eval работает медленнее чем стационарно прописанный код. Практически надо написать что-то более-менее грузящее и провести статистические исследования. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Destruction Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 Нифига не понял, ты можешь привести мне пример, как НАДО делать то, что делает мой пример? Без eval'а кстате не пашет.. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 Плохой пример на самом деле, тут гораздо проще сформировать необходимую строчку и подставить в качестве переменной.Лишние eval отрицательно сказываются на производительности скрипта.Чтобы регэксп не только в строчку понимал, там тоже модификатор есть, по-моему "i", но точно не помню, сам всегда за такими вещами в справку лезу . Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Destruction Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 Не, i - это чтобы регистр, млин, не хочу справку -) Слушай - у меня конкретная задача, чтобы в шаблоны встраивать PHP-код, почти чистый (переменные надо экранировать или не использовать EOF). Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 6 Февраля 2006 Жалоба Поделиться Опубликовано 6 Февраля 2006 Значит вероятно s. Ну как вариант можешь делать обычный html с вкраплениями php и при его подцеплении делать ob_start/ob_end_clean и в нужную переменную. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Valera Опубликовано 7 Февраля 2006 Жалоба Поделиться Опубликовано 7 Февраля 2006 а как хоть оно заменяется-то?это же функция?вот это мне интересно.В простейшом варианте eval (но говорят на евал, шаблонизаторы на сложных шаблонах работают шибко медленно).Если другой вариант, это трансформация в пхп файл (так называемая компиляция) и подключение через инклюд. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Destruction Опубликовано 7 Февраля 2006 Жалоба Поделиться Опубликовано 7 Февраля 2006 А кто-нить пример может дать? :-) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.