Перейти к контенту

Шаблоны (templates) в php


Рекомендуемые сообщения

В последнее время активно интересуюсь такой вещью как шаблоны.

Допустим, есть шаблон в IPB - файл, в нем класс куска скина с какими-то функциями, которые добавляют в output какой-то html.

Ладно, как сделать простой вывод я понимаю. Это фигня.

 

А вот интересует, к примеру, передача каких-то переменных в функцию. Да и те же условия прямо в шаблоне, собственные.

 

тобишь есть код примерно такого содержания:

function blah( $a )
{
 return <<<EOF
Текст, переданный в функцию:
{$a}
EOF;
}

и {$a} заменяется текстом, передаваемым в функцию.

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

 

важно то, как вообще всё это работает, тоесть, происходит замена этой {$a} на передаваемый параметр.

вот в это я не врубаюсь и прошу знающих людей объяснить, как это происходит. на пальцах, можно не вдаваться в подробности.

 

покопался в class_template_engine.php и class_template.php и решил что лучше бы я их не смотрел :D

там слишком много всего наваяно, когда мне нужно узнать, в принципе, только эту фишку, как она реализована.

 

прошу сильно не ржать. я не волшебник, я только учусь.

ответы с советами использовать какие-нибудь уже существующие шаблонные движки мне не надо.

 

заранее благодарен за помощь балбесу =)

 

p.s. мне не важно, как делаел это именно IPB, можно что угодно. а лучше просто растолковать саму суть этой штуки

p.p.s. сорри за некоторую сумбурность. надеюсь, написал понятно =)

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

p.p.p.p.s. обещаю больше не писать пост-скриптумы

Ссылка на комментарий
Поделиться на других сайтах

В тексте, который в <<<EOF, PHP заменяет переменные так же, как и в тексте с двойными кавычками.

 

Сие хорошо демонстрирует следющий пример:

function blah( $a )
{
 return <<<EOF
Текст, переданный в функцию:
{$a}
EOF;
}
echo blah("text");

Если Вас интересует, как это делает PHP - то вопрос не совсем в этот форум надо постить.

 

Кстате, фигурные скобочки нужны только при вставке элемента массива или объекта -)

Ссылка на комментарий
Поделиться на других сайтах

прикольно. вот уж бы не подумал :D

сорри.

 

спасибо.

Да лан, я ж псих тупой, которого ты просил не отвечать на свои посты ;)

Ссылка на комментарий
Поделиться на других сайтах

хорошо, беру свои слова обратно и публично прошу прощения.

был не прав, извини.

 

хорошо, раз так просто оказалось с такой штукой, то рассмотрим те же условия вида.

<if="ipb.member['id']">
код
</if>

как тогда здесь код подменяется чем-то другим. ведь он подменяется? или как?

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

лоханулся с переменными я, конечно, здорово =)

надеюсь, с функциями не лоханусь так же =)

Ссылка на комментарий
Поделиться на других сайтах

А это уже шаблонным движком IPB заменяется. В smarty аналогичные конструкции мне нравяться больше :D
Ссылка на комментарий
Поделиться на других сайтах

http://php.net/preg

 

Крайне полезная информация.. Типа шаблон парситься, а в 2.1 даже помещается в многозначительно названный массив "compiled_templates".

 

PS: То, что я псих - я не отрицаю, а вот на знания лучше не наезжать - обижусь.

 

Сейчас подумал - если сюда еще подключить http://php.net/eval то задача будет намного проще и шире.

Ссылка на комментарий
Поделиться на других сайтах

не, такими функциями я пользоваться умею.

просто меня интересует, чем заменяются такие конструкции. php кодом? если да, то как они потом выполняются? если нет - то прямо в замене текста обдумывается что оставлять, а что нет?

 

аа, eval.

тогда ясно.

спасибо :D

Ссылка на комментарий
Поделиться на других сайтах

Насчёт IPB незнаю, а eval - это я сам придумал, я же говорю - никада не делал, просто знаю :D

 

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

 

Еще подумал, а ведь если поставить eval, то можно пихать в шаблоны будет PHP-код, о чём так много людей мечтает..

Ссылка на комментарий
Поделиться на других сайтах

В IPB такие конструкции преобразовываются в обычный php (регэкспы там или что попроще уже не помню). Скэшированный шаблон представляет собой обычный php код. Когда его подцепляет скрипт, он исполняется обычным образом.
Ссылка на комментарий
Поделиться на других сайтах

В IPB такие конструкции преобразовываются в обычный php (регэкспы там или что попроще уже не помню). Скэшированный шаблон представляет собой обычный php код. Когда его подцепляет скрипт, он исполняется обычным образом.

ИМХО - нах надо, когда можно делать так:

Через рег (ОДИН !!! ВСЕГО ОДИН, пишу с ходу - без гарантий) пример:

$template = <<<EOF
Hello <? echo $username ?> !
EOF;

Делаем примерно такой прег:

$template = preg_replace("/(\<\?)(.*)(\?\>)/",eval("\\1"),$template)

 

Вуалямс - всё круто :-)

 

PS: Знак $ следует закомментировать, если не хотите, чтобы оно заменилось на переменную, т.к. в функции с шаблоном может и не быть переменной.

 

___________________________________________________________

 

Хмм, не пашет, вобщем потыкаться надо, eval почему-то фигню берёт в качестве аргумента :-(

 

___________________________________________________________

 

Еще подумал понял - функция сначала берёт значения, а потом делает риплейс (т.е. eval() получает в качестве аргумента слеш (второй экранирует первый) и единицу...).. Жаль, надо менять тактику.

Ссылка на комментарий
Поделиться на других сайтах

На такую штуку не регэкспов ни вообще никакой этой байды не надо :D. Переменную же можно просто так вывести.

А если делаешь preg_replace, то там модификатор "e" есть. Постоянно заменять все подряд и делать eval имхо медленнее будет, чем сразу php код подхватывать.

Ссылка на комментарий
Поделиться на других сайтах

Хы, заработало...

 

$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;

Ссылка на комментарий
Поделиться на других сайтах

Попробуй без eval в качестве второго аргумента. Сам модификатор e по идее как eval действует.

Насчет чего пример?

Чисто теоретически eval работает медленнее чем стационарно прописанный код. Практически надо написать что-то более-менее грузящее и провести статистические исследования.

Ссылка на комментарий
Поделиться на других сайтах

Нифига не понял, ты можешь привести мне пример, как НАДО делать то, что делает мой пример?

 

Без eval'а кстате не пашет..

Ссылка на комментарий
Поделиться на других сайтах

Плохой пример на самом деле, тут гораздо проще сформировать необходимую строчку и подставить в качестве переменной.

Лишние eval отрицательно сказываются на производительности скрипта.

Чтобы регэксп не только в строчку понимал, там тоже модификатор есть, по-моему "i", но точно не помню, сам всегда за такими вещами в справку лезу :D.

Ссылка на комментарий
Поделиться на других сайтах

Не, i - это чтобы регистр, млин, не хочу справку -)

 

Слушай - у меня конкретная задача, чтобы в шаблоны встраивать PHP-код, почти чистый (переменные надо экранировать или не использовать EOF).

Ссылка на комментарий
Поделиться на других сайтах

Значит вероятно s.

 

Ну как вариант можешь делать обычный html с вкраплениями php и при его подцеплении делать ob_start/ob_end_clean и в нужную переменную.

Ссылка на комментарий
Поделиться на других сайтах

а как хоть оно заменяется-то?

это же функция?

вот это мне интересно.

В простейшом варианте eval (но говорят на евал, шаблонизаторы на сложных шаблонах работают шибко медленно).

Если другой вариант, это трансформация в пхп файл (так называемая компиляция) и подключение через инклюд.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.