X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Написание шаблонизатора
Anonym
Anonym
Topic Starter сообщение 26.4.2013, 19:10; Ответить: Anonym
Сообщение #1


Хочу сделать что-то вроде шаблонизатора, так для себя, для практики. Но не приложу ума как сделать инициализацию переменных.
Ну чтобы я в php файла ее инициализировал $tpl->setVar("name", "value");
В TPL файле записал {$name} и выводом будет value.
Так вот функция вывода шаблонов:
function display($path){
include('templates/'.$path);

}
Все это в классе Templates и работает так:
$tpl->display('index.tpl');
Я так понял мне нужно заносить все шаблоны куда-то в одну переменную и там как-то регулярками выводить это все.
Как лучше это сделать?

Мне это для практики, велосипед не хочу изобретать :)
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
сообщение 26.4.2013, 19:20; Ответить: Den1xxx
Сообщение #2


Принцип работы — подгружаем шаблон, передаем параметры в виде массива.

Ну вот простейшая.
[PHP]function show_tpl($template,$parameters=array()){
// Формируем ответ из шаблона
$answer = file_get_contents($template);
//Если в шаблоне есть параметры, заменяем на их значения
if (!empty($parameters)) {
$answer=str_replace(array_keys($parameters),array_values($parameters),$answer);
$answer=str_replace("\r",'',$answer);
}
header('Content-Type: text/html; charset=utf-8');
print $answer;
}
[/PHP]
Применение:
[PHP]show_tpl('error_no_order.txt',array('{ORDER_ID}'=>11,'{SITE}'=>$_SERVER['HTTP_HOST']));
[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 26.4.2013, 23:05; Ответить: Arks
Сообщение #3


Den1xxx, фуфуфу.. это не шаблонизатор это пример использования str_replace.

А вот шаблонизатор работает так:
1. есть шаблон содержащий чудо-супер-теги понятные глупеньким верстальщикам которые не умеют/не любят писать/читать шаблон на обычном php
2. есть чудо-функция preg_replace_callback и страшный PCRE, которые заменяют чудо-супер-теги понятные глупеньким верстальщикам которые не умеют/не любят писать/читать шаблон на обычном php - на обычный php.
На этом работа шаблонизатора заканчивается т.к. заменой чудо-тегов на нормальный php получен валидный готовый для использования, нормализованный php-файл с исправленными ошибками грамматики и пунктуации - и он сохранен в кэш куда-то на диск, пока не изменится filemtime исходного tpl файла - тогда и скомпилированный шаблон придется компилировать заново.

ну дальше все просто
[PHP]
class MyFirstTemplateSystem implements SomeTemplatorInterface {
public function template($templateName, $templateVars) {
extract($templateVars);
unset($templateVars);
include(($this->isTemplateCompiledToCache($templateName) && $this->isTemplateActual($templateName)) ? $this->getCachedTemplate($templateName) : $this->compileAndReturnCompiledTemplate($templateName));
}
inherited abstract protected function isTemplateCompiledToCache...
inherited abstract protected function isTemplateActual...
inherited abstract protected function getCachedTemplate...
inherited abstract protected function compileAndReturnCompiledTemplate...
}[/PHP]
как видите при этом весь шаблон примущественно обрабатывается в стеке и в нем также автоматически будет доступна переменная $this класса которому принадлежит метод template, также в таком шаблоне можно смело использовать и сразу нормальный php, помимо тегов шаблонизатора. Всякие шаблонизаторы типа Smarty генерируют для этих целей не просто php-файлы содержащие php-код полученный из шаблона, а обертки содержащие php-код с прокси классами, с нужными данными и методами, которые уже и содержат аналог данной template-функции.

А теперь я еще поумничаю:
1. таким образом, php это шаблонизатор машинного кода
2. любой шаблонизатор включает в себя компилятор(в классическом случае в его роли выступает str_replace/preg_replace/preg_replace_callback)
3. обработка шаблонизатором шаблона по своей идеологии это не конечный результат работы алгоритма с конкретными данными, а промежуточный, и никакие данные кроме служебных сведений а шаблоне шаблонизатору при этом не нужны(т.е. не template->vars->result а high-lvl-template->low-lvl-template|->vars1->result1/vars2->result2/...).
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
Den1xxx
сообщение 27.4.2013, 11:02; Ответить: Den1xxx
Сообщение #4


(Arks @ 27.4.2013, 02:05) *
Den1xxx, фуфуфу

Будете смеяться, но это и есть ПРОСТЕЙШИЙ шаблонизатор.
На продакшене в нормальных проектах конечно такой вряд ли пригодится, но как пример и для обучения самое то.
Хотя подобный вполне себе работает в одном из моих модулей оплат, и есть не просит.
Зачем для 7 случаев ответов писать что-то более сложное?
(Arks @ 27.4.2013, 02:05) *
ну дальше все просто

Как раз совсем не просто в Вашем варианте.
Написано же ТС: для практики. Немножко поднатореет, тогда пусть и пишет что-то посерьёзнее.
А вообще, функции шаблонизации через инклюд файла намного гибче.
Но при ошибке во включаемом файле система не запустится вообще, так?
Ваши глупенькие верстальщики не понимающие ПХП будут очень недовольны.
Именно поэтому Смарти с чистым ПХП не работает, используя свои функции для замены.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 27.4.2013, 12:42; Ответить: Witu
Сообщение #5


Ёкараный бабай изобретатели колеса... чем вас не устраивает тот же Smarty? работа с условиями есть? с циклами? переменныеми?

Если стоит задача тупо подгругить шаблон то мне кажется самый простой метод это include "тут шаблон" у Вас уже будут объявлены все необходимые переменные так же можно будет работать с циклами

Если честно то я не совсем понимаю смысл смарти и тд
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
A1ex_hb
A1ex_hb
сообщение 27.4.2013, 14:31; Ответить: A1ex_hb
Сообщение #6


С включенными короткими php-тегами можно юзать сам php в качестве шаблонизатора
Вот простенький шаблонизатор:
[PHP]<?php
class Skin{
private $__Vars = array();
private $__Content = NULL;

public function Vars($__Vars=array()){
$this->__Vars = array_merge($this->__Vars,$__Vars);
}

public function Out($return = true){
if(!$return) echo $this->__Content;
else return $this->__Content;
}


public function Parse($__File){
ob_start();
extract($this->__Vars,EXTR_SKIP);//Можно закомментировать
include $__File.'.tpl.html';
$this->__Content.=ob_get_clean();
}



public function __isset($v){
return isset($this->__Vars[$v]);
}



public function __get($var){
if(isset($this->__Vars[$var]))return $this->__Vars[$var];
else return false;
}

}
[/PHP]


Можно юзать так:
[PHP]
$skin = new Skin();
$skin->Vars(['name'=>'Имя', 'homepage'=>'http://site.com']);
$skin->Parse('main');
echo $skin->Out(true);
[/PHP]


mail.tpl.html
<?if(isset($this->name)):?> Меня зовут: <?=$this->name?><br><?endif;?>
Благодаря функции extract можно обращаться к переменным так: <?=$homepage?><br>
Несуществующая переменная не выдаст ошибки: <?=$this->hello?>, a такая выдаст нотис: <?=$hello?>


Могут быть ошибки, не тестировал
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 27.4.2013, 18:01; Ответить: Arks
Сообщение #7


(Den1xxx @ 27.4.2013, 14:02) *
Но при ошибке во включаемом файле система не запустится вообще, так?

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

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

[PHP] public function Vars($__Vars=array()){ $this->__Vars = array_merge($this->__Vars,$__Vars);
[/PHP]
Я считаю такой код например, ошибкой(функция объявлена как public, все свойства экземпляра могут быть в контексте выполнения теоритечески переопределны значит не имеют ответственности за свои значения и ответственности за код обеспечивающий установку этих значений где-то раньше, значит любое дальнейшее использования свойств вообще не имеет смысла - вот вам и потенциальная ошибка).
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 27.4.2013, 22:48; Ответить: Arks
Сообщение #8


(HTMLandPHP @ 27.4.2013, 15:42) *
Если честно то я не совсем понимаю смысл смарти и тд

ну а ты код почитай... там кода(отвечающего за бизнес-логику) на полчаса изучения.

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Написание софта, разработка сайтов, моб. приложений и игр
3 BurzhuyXXi 2428 10.11.2023, 19:51
автор: BurzhuyXXi
Открытая тема (нет новых ответов) Написание и размещение отзывов
Заказываем отзывы
6 Blacktext 2188 3.3.2023, 17:52
автор: kontenta
Открытая тема (нет новых ответов) Написание софта, разработка сайтов, моб. приложений и игр
4 BurzhuyXXi 2306 25.2.2023, 14:35
автор: BurzhuyXXi
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыНаписание скриптов на PHP, в т.ч. модулей для CMS, и другие услуги
Создание модулей и хаков для DLE и других движков, перенос контента
170 Coppermine 118345 24.2.2023, 12:30
автор: boltuk
Открытая тема (нет новых ответов) SERM - написание отзывов/комментариев о компании, услуге, товаре.
8 GET_ini 4660 15.12.2022, 19:13
автор: GET_ini


 



RSS Текстовая версия Сейчас: 26.4.2024, 7:35
Дизайн