Как вставить php в tpl файл

Обновлено: 05.07.2024

Что такое шаблон в языке программирования? Можно сказать, что шаблон - это текст с переменными внутри него. При обработке шаблона происходит замена переменных на их значения.

В одной из лекций мы уже рассматривали пример шаблона . Это был шаблон для отображения документов. Пользователь создавал строку текста, размеченного с помощью html-тегов, и вставлял в нее специальные метасимволы (вида <!имя элемента> ), которые наша программа впоследствии заменяла на значения соответствующих элементов. Для чего нам был нужен такой шаблон ? Чтобы, например, можно было изменить стиль отображения документа, не меняя кода программы.

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

Приведенный пример шаблона - один из самых простых. Для его обработки используется только функция подстановки str_replace() . Чаще всего для того, чтобы работать с шаблонами , создают библиотеки классов. В принципе создавать свою библиотеку не обязательно, поскольку существует множество свободно распространяемых библиотек шаблонов , над функциональностью которых трудятся большие коллективы разработчиков, стараясь сделать их универсальными, мощными и быстрыми. Некоторые из таких библиотек мы и рассмотрим. Но для начала сформулируем задачу, на примере решения которой будем демонстрировать использование различных шаблонов .

Требуется сгенерировать web-страницу со списком статей, имеющихся в базе данных . Для простоты считаем, что статья имеет название title , автора author , краткое содержание abstract и полное содержание fulltext , которое представлено либо в виде текста в базе данных, либо в виде ссылки на файл. Список должен быть организован так, чтобы при щелчке мышью на названии статьи ее полное содержание появлялось в новом окне.

Шаблоны подстановки

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

Нужно придумать шаблон для этой страницы и где-то его хранить (в файле или в базе данных ). Очевидно, что мы не можем придумать шаблон для всей страницы, потому что не знаем, сколько статей в базе данных. В шаблоне же мы договорились использовать только html и метасимволы <!имя элемента> . Поэтому мы можем написать только шаблон для одной строки списка, который уже программно надо преобразовать в нужное количество строк.

Кроме того, здесь есть еще одна загвоздка - с отображением ссылки на полный текст статьи. Если мы будем действовать по правилу подстановки (менять все метасимволы на их значения из базы данных ), то может получиться, что вместо <!fulltext> вставим не ссылку на текст, а сам текст. То есть для этого элемента нужна дополнительная проверка перед заменой и какие-то дополнительные действия в случае, если в поле fulltext содержится текст статьи, а не ссылка на файл. Не будем усложнять себе жизнь и договоримся, что в поле fulltext всегда содержится только ссылка на файл. Тогда задачу можно решить следующим образом:

Если шаблон был такой, как приведен выше, то получим примерно следующее.

В принципе метод достаточно прост и удобен, но требует дополнительных усилий программиста при возникновении задач более сложных, чем простая подстановка значений. Для решения задач, где требуется делать подстановку целых блоков или даже проверять условия, создают классы шаблонов , такие как FastTemplate и Smarty . Обсудим их подробнее.

Шаблоны FastTemplate

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

Что представляет собой файл шаблона FastTemplate ? Это обычный html-файл, в котором могут встречаться переменные особого вида, впоследствии обрабатываемые методами класса FastTemplate .

Синтаксис переменных в шаблонах FastTemplate описывается следующим выражением:

Пример 15.1. Вычисление переменной с помощью закрывающей фигурной скобки ">" (html, txt)

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

  1. main.tpl (Этот шаблон будет выводить страницу в целом)

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

Перед началом работы с шаблонами FastTemplate нужно подключить этот набор классов к нашей программе. В реальной жизни набор классов FastTemplate записан в один файл, как правило, с названием class.FastTemplate.php3 , поэтому подключить его можно, например, с помощью команды:

Следующий важный шаг - это создание объекта класса FastTemplate , с которым впоследствии мы будем работать:

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

Методы FastTemplate

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

Для работы с FastTemplate нужно знать четыре основных метода : define , assign , parse и FastPrint .

Метод define

Метод define() связывает имя файла шаблона с более коротким именем, которое можно будет использовать в программе. То есть "ключ" - это имя, которое мы будем использовать в программе для ссылки на файл шаблона , имя которого записано в строке "значение". Реальные имена файлов шаблонов не рекомендуется использовать нигде, кроме метода define . При вызове метода define() происходит загрузка всех определенных в нем шаблонов .

Здесь мы задаем псевдонимы именам файлов шаблонов . Эти псевдонимы, т.е. переменные main , list_f и list_el , будут использоваться в программе вместо соответствующих имен файлов main. tpl , list. tpl и list_element. tpl .

Метод assign

Метод assign() присваивает переменным значения, "ключ" - это имя переменной , а "значение" - значение, которое ей нужно присвоить. Чтобы переменная в шаблоне была заменена значением, это значение нужно задать ей с помощью метода assign() . Согласно синтаксису этот метод можно использовать в двух различных формах. В FastTemplate есть только один массив, поэтому, если вы повторно задаете значение одному и тому же ключу, оно будет перезаписано.

Здесь мы дважды устанавливаем значение переменной , доступной в файлах шаблона по имени TITLE . Эта переменная будет иметь последнее присвоенное ей значение, т.е. она равна строке "Введение в PHP" .

Метод parse

Метод parse() - самый основной в FastTemplate . Он устанавливает значение возвращаемой переменной равным обработанным шаблонам из указанных источников. Метод может использоваться в трех формах: простой, составной и присоединяющей.

В простой форме шаблон с псевдонимом "main" загружается (если еще не был загружен), все его переменные подставляются, и результат сохраняется как значение переменной MAIN . Если переменная появится в более поздних шаблонах , то вместо нее будет подставлено значение, полученное в результате обработки шаблона "main". Это позволяет создавать вложенные шаблоны .

Составная форма метода parse() создана для того, чтобы упростить вложение шаблонов друг в друга. Следующие записи эквивалентны:

это то же самое что и

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

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

Метод FastPrint

Метод FastPrint() печатает содержимое переданной в него обработанной переменной . Если он вызван без параметров, то печатается последняя использованная методом parse() переменная .

Если нужно печатать не на экран, а, например, в файл, то получить ссылку на данные можно с помощью метода fetch() .

Решение задачи с помощью шаблонов FastTemplate

Теперь попробуем собрать воедино все изученные методы , чтобы решить нашу задачу.

Листинг 15.4.1. Решение задачи с помощью шаблонов FastTemplate (html, txt)

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

Этот класс шаблонов появился еще до выхода PHP4 для работы с PHP3 . Чтобы протестировать приведенные примеры, нужно скачать библиотеку классов FastTemplate и скопировать этот файл в свою рабочую директорию. Если вы работаете с PHP4 , то в файл class.FastTemplate.php3 нужно внести пару изменений, о которых написано в документации, поставляющейся вместе с этой библиотекой.

Шаблоны Smarty

Рассмотрим некоторые основные конструкции механизма шаблонов Smarty .

Установка

Первое, с чего мы начнем, - это установка Smarty . Здесь все не так просто, как с FastTemplate . Smarty состоит не из одного php-файла с описанием класса, а из целого набора различных файлов-библиотек. Для того чтобы работать с шаблонами Smarty , нужно сделать эти библиотеки доступными для всех ваших программ. Находятся они в каталоге /libs/ дистрибутива Smarty . Файл, в котором содержится определение самого класса Smarty , называется Smarty.class.php. Чтобы проверить, доступны ли библиотеки класса Smarty , нужно написать такой скрипт:

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


Механизм работы очень прост: допустим Вы занимаетесь разработкой типовых сайтов, страницы которых содержат какой-то статичный контент (контент, который не будет изменяться) и изменяющийся контент.
Вместо того чтоб каждый раз создавать новые файлы, мы создадим tpl-файл, в котором заменим строки c изменяющимся контентом на переменные (они пишутся в фигурных скобках <> ) и создадим php-скрипт, который будет вставлять в эти переменные то, что нам нужно и выводить готовые странички.


Предположим что ваша страничка выглядит так:


Менять нужно записи — «Новый сайт», «Крутой сайт», «Ещё какой-то контент. ».


Создаём tpl-файл (он же tpl-шаблон) — index.tpl. Собственно расширение .tpl условное (происходит от слова template — шаблон), то есть никто не запрещает написать — .lpt, просто так принято.

Мы заменили наши записи на переменные ( , , ), на их место наш будущий php-скрипт будет подставлять нужные данные.

Создаём страничку — index.html, из которой мы будем работать с нашим шаблоном.

Для красоты создайте css-файл:

Откройте index.html в браузере:


После нажатия кнопки «Создать» заполненные поля передаются скрипту build.php для обработки.

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

Осталось создать скрипт-обработчик — script.php, который подключается в файле build.php и выполняет основную работу — замену переменных нашими данными.



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


Сейчас вновь сформированную страницу можно увидеть только в браузере. Чтобы она сохранилась на диске, нужно в конец файла build.php добавить пару строк…


В итоге должно получится так…


После отработки скрипта в рабочей директории появится файл — my.html.


Помимо создания html-файла, можно создать ещё один tpl-файл или скрипт и продолжать работу уже с ними. Так же можно добавить сюда работу с базой или подключать несколько шаблонов и формировать из них странички. Иными словами — можно делать что угодно…

Ris


Dost,
В 1.10.6 такое уже не прокатывает.
@Dina,
Я что-то вообще не пойму, что Вы делаете?
У вас есть модуль 'menugosti' ?
Ну так вытащите его в админке на главную страницу куда надо и всё.
Зачем нужно в файле .tpl писать printModules ?

Ris

Ваш пример тоже не сработал. Я хочу вывести на главной странице меню, которое будет доступно только для гостей. Но пользователи его видеть не должны (только гости). Так вот, в шаблоне по умолчания на главной отображается компонент, и модуль туда поставить не могу (решения не нашли). Как раз данный модуль -меню, должен быть поверх компонента, который размещается на главной странице.

Но пользователи его видеть не должны (только гости).

@Dina
В настройках модуля есть пункт "доступ". Можно показывать только гостям:

Как раз данный модуль -меню, должен быть поверх компонента, который размещается на главной странице.

@Dina

Так вставьте этот модуль меню на главную до или после компонента и стилями сдвиньте поверх компонента. А чтобы был поверх z-index поставьте.

Вот модуль доски почета, сдвинутый поверх ленты активности:

Ris

Так вот, в шаблоне по умолчания на главной отображается компонент, и модуль туда поставить не могу (решения не нашли)

@Dina

Скрипт нужно вставить в модуль?

чем не годится?

Нил™

В настройках модуля есть пункт "доступ". Можно показывать только гостям:

Ris
Спасибо за советы но это не совсем то. Задам вопрос по другому, например есть кнопка <a style="xxx"href="xxx">Кнопка</a> Как мне сделать на эту кнопку ограничение, чтобы данную кнопку видели только гости и админы?

Задам вопрос по другому, например есть кнопка <a style="xxx"href="xxx">Кнопка</a> Как мне сделать на эту кнопку ограничение, чтобы данную кнопку видели только гости и админы?

@Dina
Переменные $user_id и $is_admin нужно передать в модуль. Поправьте если что, первую ветку уже забыл совсем… Но там много написанных модулей, можно в них подсмотреть как условия писать.
SmartControl
@Dina, не делайте ничего.
Вы спрашивайте как решить задачу которая стоит перед вами способом, который вы придумали.
А вы попробуйте описать задачу и попросить её решение.
Каждый из писавших выше, решит её "на раз", при этом без всяких позиционирований, слойности, скриптов и тому подобной нечисти.

Олег Васильевич я

Олег Васильевич я


@Dina, не делайте ничего.
Вы спрашивайте как решить задачу которая стоит перед вами способом, который вы придумали.
А вы попробуйте описать задачу и попросить её решение.
Каждый из писавших выше, решит её "на раз", при этом без всяких позиционирований, слойности, скриптов и тому подобной нечисти.

Олег Васильевич я

Помогите, пожалуйста.. Я в php новичок. Через "поиск" подходящей темы не нашел..

Как вставить код php в шаблон tpl внутри phpbb?

Пошел таким путем:

В файле ./includes/page_header.php создал переменную

Потом тегу присвоил переменную:

Теперь, при размещении в шаблоне tpl тега

я могу видеть в нужном месте форума слово "test".

Нужно чтобы вместо "test" использовалось (показывалось) содержимое страницы, например ./includes/test2.php

В php ничего не понимаю. Очень прошу объяснить простым языком или показать примеры.

хотя в таком случае страница test2.php не обработается как php

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

Спасибо, Yanzhula! Совет хороший, и он мне пригодится )) Но, что-то не так.. То есть текст с указанной страницы вставляется в шаблон, а вот php-код работать не хочет. Надо еще поколдовать, возможно, я где-то пути не так прописал.. А на phpbbguru обязательно мод поищу! Спасибо.

Вы бы написали что в test2.php. Может обычный инклюд + запись результата в переменную поможет решить вашу проблему

Включите обработку php в админпанели и не забывайте после произведенных изменений в папке cache удалять все файлы, кроме .htaccess (или через админпанель почистите кэш, без разницы). Иначе изменения не вступят в силу.

xpert13, в test2 лежит код, вызывающий на страницу html-коды рекламных сслылок:

mavpa, у меня phpbb 2.0.x. в нём нет возможностей "включить обработку php" через админпанель. А мода для этой цели я не нашел. Рекомендуете phpbb 3.0.х.

nikspb:
xpert13, в test2 лежит код, вызывающий на страницу html-коды рекламных сслылок:

mavpa, у меня phpbb 2.0.x. в нём нет возможностей "включить обработку php" через админпанель. А мода для этой цели я не нашел. Рекомендуете phpbb 3.0.х.

Последнюю стороку, где echo(CLXru_link()); - замените на $test2 = CLXru_link();

И весь этот код добавьте, затем и переменную передайте

xpert13, мне бы пример.

ivtrans, нет, не получается. ошибок нет, но результаты php со страницы test2 не отображаются. И не отображается текст, если написать его в той странице.

Сегодня мне дали еще одну идею по запуску php из страницы:

Но в этом случае вообще появляется ошибка: Parse error: syntax error, unexpected T_IF

Ребята, помогите разобраться новичку. Это код (в test2.php) отображает рекламные ссылки в автоматическом режиме. Без этого кода, приходится размещать html вручную.. Хочу автоматизировать это дело.

Читайте также: