Помощник
|
Написание шаблонизатора |
Anonym
|
Сообщение
#1
|
||
|
|
||
|
|||
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 |
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 |
27.4.2013, 11:02;
Ответить: Den1xxx
Сообщение
#4
|
|
Den1xxx, фуфуфу Будете смеяться, но это и есть ПРОСТЕЙШИЙ шаблонизатор. На продакшене в нормальных проектах конечно такой вряд ли пригодится, но как пример и для обучения самое то. Хотя подобный вполне себе работает в одном из моих модулей оплат, и есть не просит. Зачем для 7 случаев ответов писать что-то более сложное? ну дальше все просто Как раз совсем не просто в Вашем варианте. Написано же ТС: для практики. Немножко поднатореет, тогда пусть и пишет что-то посерьёзнее. А вообще, функции шаблонизации через инклюд файла намного гибче. Но при ошибке во включаемом файле система не запустится вообще, так? Ваши глупенькие верстальщики не понимающие ПХП будут очень недовольны. Именно поэтому Смарти с чистым ПХП не работает, используя свои функции для замены. |
|
|
Witu |
27.4.2013, 12:42;
Ответить: Witu
Сообщение
#5
|
|
Ёкараный бабай изобретатели колеса... чем вас не устраивает тот же Smarty? работа с условиями есть? с циклами? переменныеми?
Если стоит задача тупо подгругить шаблон то мне кажется самый простой метод это include "тут шаблон" у Вас уже будут объявлены все необходимые переменные так же можно будет работать с циклами Если честно то я не совсем понимаю смысл смарти и тд |
|
|
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 |
27.4.2013, 18:01;
Ответить: Arks
Сообщение
#7
|
|
Но при ошибке во включаемом файле система не запустится вообще, так? не так, ибо есть шаблонизатор как промежуточное звено перед построением исполняемого php-кода A1ex, Вы не написали ничего нового по сравнению с моим постом выше, только код чуть более детализировали, и то с ошибками. [PHP] public function Vars($__Vars=array()){ $this->__Vars = array_merge($this->__Vars,$__Vars); [/PHP] Я считаю такой код например, ошибкой(функция объявлена как public, все свойства экземпляра могут быть в контексте выполнения теоритечески переопределны значит не имеют ответственности за свои значения и ответственности за код обеспечивающий установку этих значений где-то раньше, значит любое дальнейшее использования свойств вообще не имеет смысла - вот вам и потенциальная ошибка). |
|
|
Arks |
27.4.2013, 22:48;
Ответить: Arks
Сообщение
#8
|
|
|
Если честно то я не совсем понимаю смысл смарти и тд ну а ты код почитай... там кода(отвечающего за бизнес-логику) на полчаса изучения.
|
|
|
||
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Написание софта, разработка сайтов, моб. приложений и игр | 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 |
Текстовая версия | Сейчас: 26.4.2024, 7:35 |