Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11650
Последний выпуск: 19.06.2015

Реализация шаблонов на PHP

Автор: Овчинников Сергей
Сайт автора: www.web-faq.ru
28 сентября 2006 года

Вступление.

Добрый день уважаемые господа! В данной статье я хотел бы затронуть очень важную тему, а именно шаблоны в PHP. В этой статье я приведу простой, но работающий пример "шаблонов", также мы рассмотрим все за и против использования шаблонов.

Использование шаблонов.

Прежде чем использовать шаблоны, подумайте, действительно ли они вам так нужны? В данный момент существует огромное количество коммерческих вариантов шаблонов. Все они работают по одному принципу (значение, замена), но имеют огромное количество наворотов, таких как автоматическое изменения регистра переменных, поиск по регулярным выражениям и т.д., все это конечно хорошо и легко реализуемо. Когда я решил посмотреть "коммерческий" шаблон, я ужаснулся, один его класс весил 398 КБ. Это нормально? Также в сети можно найти множество бесплатных вариантов шаблонов (классы шаблонов в PHPBB, IPB:), но все они много весят и работают не слишком быстро. Я предлагаю вам простой каркас "шаблонов" на PHP, с его помощью можно сделать свой классный шаблонизатор, со всеми необходимыми вам функциями.

За и против.

Приведу вам жизненный пример, не так давно я занимался разработкой программы для одного человека, заранее было обговорено, что я пишу программу, а дизайн это его дело. Через некоторое время, мой заказчик пишет мне, что дизайн для моей программы сделать невозможно. Конечно, человек ничего не знающий в web-программировании будет испытывать огромные затруднения, при построении дизайна в PHP-программе. Главная задача 'шаблонов' - это облегчить жизнь дизайнеру. Безусловно, главным плюсом использования шаблонов можно считать то, что дизайнер без помощи программиста сможет изменять свой web-проект. Также мне нравится само разделение - программа и дизайн.

Я не использую шаблоны в своих личных проектах, т.к. они дают дополнительную "нагрузку". Шаблоны это хорошо, но использовать их надо только если пишешь какой, то публичный проект или выполняешь работу на заказ.

Реализация шаблонов на PHP.

И так приступим. Всего у нас будет 2 ключевых файла.

  • 1) file2compile.tpl – файл который мы будем парсить
  • 2) template.php – главный файл содержащий класс шаблонов

Листинг файла file2compile.tpl:

<html>
<head>{TITLE}</head>
<body bgcolor={BGCOLOR}>

{SOMETPLTAGS}

</body>
</html>

Листинг файла template.php:

<?php
class parse_class
    {
    var $vars     = array();
    var $template;

    function get_tpl($tpl_name)
      {
      if(empty($tpl_name) || !file_exists($tpl_name))
        {
        return false;
        }
      else
        {
        $this->template  = file_get_contents($tpl_name);
        }
      }
    function set_tpl($key,$var)
      {
      $this->vars[$key] = $var;
      }
    function tpl_parse()
      {
      foreach($this->vars as $find => $replace)
             {
             $this->template = str_replace($find, $replace, $this->template);
             }
      }
    }
$parse = new parse_class;
?>

Теперь я подробно опишу содержание этих двух файлов.

Файл: file2compile.tpl

Тут приведен обычный HTML код. В данном файле можно найти переменные вида {TITLE}. Это как раз именно те переменные которые мы будем заменять на нужное нам значение.

Файл: template.php

Мы имеем PHP класс, разделенный на 3 функции. В самом начале файла мы объявляем классовые переменные.

  • $vars – массив со значениями (переменная, замена).
  • $template – файл который мы будем парсить.

Теперь перейдем к описанию функций.

Функция: get_tpl

В качестве аргумента функция принимает имя файла. В теле функции мы проверяем задан ли аргумент и существует ли файл. Если аргумент не задан и файл не существует мы возвращаем значение FALSE. В противном случае мы заполняем классовую переменную(template) содержанием файла.

Функция set_tpl

Функция принимает 2 значения, это переменная (напр. {TITLE)} и значение на которое мы будем ее заменять.

Функция tpl_parse

Функция не принимает никаких значений. В теле функции мы считывает массив $vars и производим замену установленных переменных на заданные значения.

Использование класса.

Для вывода на экран используйте следующие команды:

<?php
require('template.php'); // Подключаем файл с классом
$parse->get_tpl('template.tpl'); //Файл который мы будем парсить
$parse->set_tpl('{TITLE}','Супер сайт'); //Установка переменной {TITLE}
$parse->set_tpl('{BGCOLOR}','#F2F2F2'); //Установка переменной { BGCOLOR }
$parse->set_tpl('{SOMETPLTAGS}','<font color=red>Это текст
обрамленый красным  цветом</font>'); //Установка переменной {SOMETPLTAGS}
$parse->tpl_parse(); //Парсим
print $parse->template; //Выводим нашу страничку
?>

Заключение.

Надеюсь, моя статья поможет вам лучше понять, что такое шаблоны.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
98K
28 марта
Андрей Аршинов
0 / / 28.03.2017
+1 / -0
Мне нравитсяМне не нравится
28 марта 2017, 19:06:23
Для понимания принципов шаблонизации - статья отличная, имена переменных понятны и логичны.
Для более продвинутой работы следует уточнить :

1. str_replace для большого HTML-файла будет жутко тормозить, ведь каждый раз(сколько "переменных" столько и раз) будет происходить поиск строки $find с самого начала HTML-файла
2. Предложенный вариант в комментариях require($template); весьма удобен, но как быть, если этот шаблон нужно использовать несколько раз(например, это шаблон "плитки" видео которых на странице 30 или больше)?
3. Регулярные выражения использовать нежелательно, тормоза обеспечены.
4. Идеального варианта нет, я написал свой парсер(тормоза при больших HTML-файлах) :
- вместо "переменных" - "макросы" которые состоят из инструкций(знакомые с ассемблером поймут)
- можно задавать переменные и выводить значения других
- можно вызывать методы у расширений(у классов)
- список инструкций можно дополнять
- есть контроль длины, количества и соответствия типов операндов

выглядит это всё вот так :

HTML-код
<~
set |digVar|, '25';
set |strVar|, 'i\'am almost ';
set |anyVar|, |strVar|, |digVar|, 'yr. old';
write |anyVar|;
~>
HTML-код

Но, как я уже сказал, это тоже тормозит.

Нет идеального решения, есть решение подходящие под конкретные нужды.
2.
95K
15 июня 2015 года
Юрий Кононенко
0 / / 15.06.2015
+2 / -0
Мне нравитсяМне не нравится
15 июня 2015, 14:08:42
Уважаемые чайники)))
Хочу сказать, что статья довольно актуальная и неплохо написана, все чётко и понятно, а если Вы ничего не понимаете в php, то лучше перечитайте ещё раз, а не спешите закидать статью плохими отзывами...
3.
94K
17 сентября 2014 года
Александр Кустов
0 / / 17.09.2014
+0 / -2
Мне нравитсяМне не нравится
17 сентября 2014, 21:12:45
Код шаблона


<html>
<head></head>
<body>
<?php echo $content; ?>
</body>
</html>
4.
94K
17 сентября 2014 года
Александр Кустов
0 / / 17.09.2014
+2 / -0
Мне нравитсяМне не нравится
17 сентября 2014, 21:11:38
оужас
не легче сделать чтото такое?
<code php>
<?php
function theme($template, $data) {
foreach ($data as $key => $value) {
${$key} = $value;
}
require($template);
}
$data = array('content' => 'azazazaza');
theme('test.tpl.php', $data);

?>
</code>
5.
91K
29 июля 2013 года
Денис Sitnik
0 / / 29.07.2013
Мне нравитсяМне не нравится
29 июля 2013, 14:37:46
Для понимания, так сказать для чайников....
Код:
<?

$title = '[TITLE]';

$Btitle = 'Использование шаблонов.';

$descr = '[DESCR]';

$Bdescr = 'Прежде чем использовать шаблоны, подумайте, действительно ли они вам так нужны?';

$homepage = file_get_contents('template/main.tpl');

$template = str_replace($title, $Btitle, $homepage);

$template = str_replace($descr, $Bdescr, $template);

echo $template;

?>
6.
90K
30 марта 2013 года
Юрий Усенко
0 / / 30.03.2013
+1 / -0
Мне нравитсяМне не нравится
30 марта 2013, 22:10:35
тут запутанно как то, нужно разбираться... это статья не для чайников, хоть в пхп я уже чтото)))
7.
88K
09 января 2013 года
0 / / 09.01.2013
Мне нравитсяМне не нравится
9 января 2013, 15:52:41
Статья просто супер, спасибо большое, автор!
8.
87K
02 декабря 2012 года
Егор Манакин
0 / / 02.12.2012
+0 / -1
Мне нравитсяМне не нравится
2 декабря 2012, 11:44:34
Не помогла ваша статья
9.
82K
09 апреля 2012 года
3d_killer
0 / / 09.04.2012
+2 / -0
Мне нравитсяМне не нравится
12 апреля 2012, 11:03:01
Интересно а как заменять со стилями блок который будет копироваться если используется рекурсивная функция в меню допустим или еще похожих блоков когда заранее неизвестно сколько будет блочков?
10.
75K
20 сентября 2011 года
_McSim
0 / / 20.09.2011
+2 / -0
Мне нравитсяМне не нравится
20 сентября 2011, 14:36:56
не плохо :) давно хочу уйти со смарти... разбирать его особо времени нету, а тут такая полезная статья :)
11.
334
09 октября 2007 года
Kesano
451 / / 09.10.2007
+2 / -0
Мне нравитсяМне не нравится
3 мая 2011, 01:22:47
Автор молодец, весьма показательно всё расписал, и суть ясна.
Да, Смарти это достаточно удобно, там есть свои IF, FOREACH, etc.
Но это опять уже получается программинг. Т.е. простому верстальщику просто так не всунешь в руки Смарти и не скажешь "Сверстай сюда",.. Потому что потом за это дело всё равно возмется ПХП-программер, который будет расставлять ПХП...

Я не вижу причин критиковать эту статью (пусть она и написана в бородатом 2006 году), потому что она позволяет ПОНЯТЬ принцип работы шаблонизатора и потом перейти к Смарти, Codeigniter и т.д...
12.
66K
10 декабря 2010 года
chernetsky
0 / / 10.12.2010
+3 / -0
Мне нравитсяМне не нравится
10 декабря 2010, 13:14:57
Отличная, между прочим, статья. Главное. что идея показана.
Лично мне очень пригодилась! Спасибо автору!
13.
55K
29 ноября 2009 года
anonimSMS
0 / / 29.11.2009
Мне нравитсяМне не нравится
19 января 2010, 10:46:59
Это точно, емае, че все изобретают велосипед! Смарти же есть!
14.
45K
15 декабря 2008 года
Reaper`
2 / / 15.12.2008
+2 / -0
Мне нравитсяМне не нравится
15 декабря 2008, 15:42:27
Овчинников Сергей, молодец!
Хотелось бы узнать про реализацию динамичного вывода контента..
15.
41K
30 сентября 2008 года
Trasn
11 / / 30.09.2008
+2 / -0
Мне нравитсяМне не нравится
30 сентября 2008, 15:48:23
Статья дает понять что такое шаблоны.
Smarty, может и отсутствовать у хостера.
$parse->get_tpl('template.tpl'); //Файл который мы будем парсить
file2compile.tpl – файл который мы будем парсить
16.
13K
24 января 2006 года
zxspectrum128k
9 / / 24.01.2006
Мне нравитсяМне не нравится
30 июля 2007, 17:23:05
Даешь примеры использования SMarty!
17.
8
15 июня 2005 года
mfender
3.5K / / 15.06.2005
+1 / -2
Мне нравитсяМне не нравится
29 ноября 2006, 15:39:04
Ахинея какая-то. Для понимания шаблонизаторов нужно взять шаблонизатор, мануальчик к нему и всё встанет на свои места. А тут расписано, как заменить строку в тексте другой строкой. И где тут шаблон?
18.
23K
29 ноября 2006 года
PHPGuru
2 / / 29.11.2006
+4 / -8
Мне нравитсяМне не нравится
29 ноября 2006, 14:39:23
Статья - редкостная бредятина.
Начиная от детсадовских предпосылок "шаблон нужен для облегчения жизни дизайнера" и "шаблоны создают нагрузку" и заканчивая полной неприспособленностью этой недоделки к реальной жизни.

Автору надо годика три поработать программистом, чтобы начать понимать, что такое шаблоны и зачем они нужны.
а не статьи писать.
А сайту codenet.ru должно быть просто стыдно выкладывать такие поделки.

Если в шаблоне изначально заложено то, что HTML код пишется в коде скрипта, то это не шаблон, а профанация.
Я уже в пятый раз отвечаю на вопросы несчастных читаталей этой статьи - а как им вывести с помощью этого "шаблона" таблицу? Причем читатели, в отличие от автора, понимают, что в скрипте не должно быть HTML. Иначе весь смысл шаблона потеряется. А данный скрипт без этого использовать невозможно.

И не надо делать из Смарти пугало. Есть много движков и не таких монстрообразных, как Смарти. но в которых есть хотя бы обработка блоков, чтобы можно было вынести HTML из кода.
19.
1.6K
02 апреля 2003 года
Jimmy
58 / / 02.04.2003
Мне нравитсяМне не нравится
10 октября 2006, 10:25:03
Пример неплохой!
Но как мне кажется, немного не корректный!

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

И что? Как он изменит <font color=red>, да никак!

Поэтому автор должен был бы показать file2compile.tpl так:

<html>
<head>{TITLE}</head>
<body bgcolor={BGCOLOR}>

<font color=red>{SOMETPLTAGS}</font>

</body>
</html>

а в PHP файле, строка парсинга переменной {SOMETPLTAGS}
была бы

$parse->set_tpl('{SOMETPLTAGS}','Это текст'); //Установка переменной {SOMETPLTAGS}

Кто-то может скажет, а как же {BGCOLOR}, ведь это относится к дизайну?
Отвечаю: я оставил это потому, что данные об обще-сайтовой гамме могли бы находиться в базе например, и управляться из админки.

С критикой [shaelf / 07 октября 2006, 00:42:01] частично согласен.
Почему частично? Ничего не могу сказать о Smarty ;)
20.
15
04 мая 2005 года
shaelf
2.7K / / 04.05.2005
Мне нравитсяМне не нравится
7 октября 2006, 00:42:01
>>Автор ведь написал, что в готовых системах много лишнего и совершенного ненужного.
Не кто не мешает убрать. К тому же в Smarty всё подключается плагинами и они легко убираются.
>>Задача была поставлена так - отделить код от дизайна, и она была выполнена.
Наверное вот этим
>>$parse->set_tpl('{SOMETPLTAGS}','<font color=red>Это текст
обрамленый красным цветом</font>'); //Установка переменной {SOMETPLTAGS}
Только тут уже HTML'om занимается программер). Более того, он задаёт внешний вид. Но это не существенно, не так ли?))
>>А Smarty - это всё же фреймворк
С этого места поподробнее прошу.
>>дизайнер должен только писать ХТМЛ
Молодой человек, Вам не смешно? С каких это пор дизайнер должен писать HTML? Мне всегда казалось, что этим занимаются верстальщики))) Нужно пересмотреть свою версию на этот счёт)
>>В смарти можно сказать так: "Смарти тот же ПХП толькос другим синтаксисом"
Конечно можно, только окуратно, а то помидоры ещё не кто не отменял). Относительно недавно разговаривал с человеком (программирует на Перле) и он мне сказал, что РНР то же самое, что и HTML. Может конечно где-то он и прав, только вот это "где-то", я найти так и не смог.
21.
6.5K
02 апреля 2005 года
viTTas
20 / / 02.04.2005
Мне нравитсяМне не нравится
6 октября 2006, 05:30:00
> А чем Smarty не угодил?)))
Smarty - это вообще компилируемый шаблонизатор, а это противоречит самой идеологии шаблонов: "дизайнер должен только писать ХТМЛ и ему нет дела до программинга". В смарти можно сказать так: "Смарти тот же ПХП толькос другим синтаксисом"
22.
237
27 июля 2005 года
foxweb
995 / / 27.07.2005
+1 / -0
Мне нравитсяМне не нравится
5 октября 2006, 12:51:03
Автор ведь написал, что в готовых системах много лишнего и совершенного ненужного. Задача была поставлена так - отделить код от дизайна, и она была выполнена. А Smarty - это всё же фреймворк.

Статья хорошая, думаю направит начинающих по верному пути.
23.
15
04 мая 2005 года
shaelf
2.7K / / 04.05.2005
+1 / -1
Мне нравитсяМне не нравится
4 октября 2006, 23:53:55
А чем Smarty не угодил?)))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог