Как вставить 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 - создание страницы с помощью вложенных шаблонов . Например, для решения нашей задачи можно создать три файла шаблона :
- 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 ?
Ваш пример тоже не сработал. Я хочу вывести на главной странице меню, которое будет доступно только для гостей. Но пользователи его видеть не должны (только гости). Так вот, в шаблоне по умолчания на главной отображается компонент, и модуль туда поставить не могу (решения не нашли). Как раз данный модуль -меню, должен быть поверх компонента, который размещается на главной странице.
В настройках модуля есть пункт "доступ". Можно показывать только гостям:Но пользователи его видеть не должны (только гости).
@Dina
Как раз данный модуль -меню, должен быть поверх компонента, который размещается на главной странице.
@Dina
Так вставьте этот модуль меню на главную до или после компонента и стилями сдвиньте поверх компонента. А чтобы был поверх z-index поставьте.
Вот модуль доски почета, сдвинутый поверх ленты активности:
Так вот, в шаблоне по умолчания на главной отображается компонент, и модуль туда поставить не могу (решения не нашли)
@Dina
Скрипт нужно вставить в модуль?
чем не годится?
Спасибо за советы но это не совсем то. Задам вопрос по другому, например есть кнопка <a style="xxx"href="xxx">Кнопка</a> Как мне сделать на эту кнопку ограничение, чтобы данную кнопку видели только гости и админы?В настройках модуля есть пункт "доступ". Можно показывать только гостям:
Ris
Переменные $user_id и $is_admin нужно передать в модуль. Поправьте если что, первую ветку уже забыл совсем… Но там много написанных модулей, можно в них подсмотреть как условия писать.Задам вопрос по другому, например есть кнопка <a style="xxx"href="xxx">Кнопка</a> Как мне сделать на эту кнопку ограничение, чтобы данную кнопку видели только гости и админы?
@Dina
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 вручную.. Хочу автоматизировать это дело.
Читайте также: