Вы не зашли.
Главная » PHP » Доделать шаблонизатор
#1. Morgan Off (10)
Участник
2010.08.12 18:06
Обращаюсь за помощью к форумчанам.
Требуется допилить один (небольшой) класс.
Данный класс используется для реализации MVC модели.
Есть шаблоны (tpl-файлы), есть сгенерированные шаблоны (tpl.php - файлы) с нативным PHP - синтаксисом.

Основная проблема состоит в кривом построении регулярок (да да, я их не умею делать).

Известные баги :
1. Неверная обрезка кода шаблонов, а конкретно, кода, который следует после последнего блока.
2. Проблема с условиями, не обрабатывает конструкции типа
Код:
{if !~$a}***{/if !~$a}
Начало работы :
Код:
span style="color: #0000BB"><?phpinclude 'SomeTemplate.class.php';// создаем экземпляр класса$template = new SomeTemplate;// добавление переменной$template -> somevar = 'somevalue';$template -> assign('somevar', 'somevalue');// указываем текущий блок$template -> block = 'index';// обработка и вывод шаблона$template -> display('template');?>
Папку с шаблонами, папку для сгенерированных файлов и расширение шаблонов можно указать при создании экземляра.
Код:
span style="color: #0000BB"><?php$template = new SomeTemplate('/templates_dir/', '/compiled_templates_dir/', '.tpl');?>
Описание команд :

1. Блоки
Код:
{block *somename*}
// разный код
{/block *somename*}
Аналогичен коду на PHP (конечно же с switch(){***} и endswitch;)
Код:
case '*somename*':
// разный код
break;
Если использовать модификатор ! (block !*somename*), то это будет ознать не соотвествие указанному блоку.
2. Циклы
Код:
{foreach $array}
{$array.text}
{/foreach $array}
~PHP
Код:
for($i = 0;$i < count($array);$i ++)
{
echo $array[$i]['text'];
}
3. Условия
Код:
{if $somevar}
// результат
{/if $somevar}
~PHP
Код:
if($somevar === true)
{
// результат
}
Можно использовать модификаторы :
if !$somevar =
Код:
if($somevar !== true)
if ~$somevar =
Код:
if((bool)$somevar)
if !~$somevar =
Код:
if(!(bool)$somevar)
4. Переменные
Код:
{$somevar}
~PHP
Код:
echo $somevar;
За говнокод можете пинать big_smile

P.S: Есть рабочий вариант этого класса, только без генерации php файлов, т.е, выполнения по ходу разбора.
Вложения
new_SomeTemplate.class.php.txt 15kb [загрузок: 664]
Отредактировано Morgan (2010.08.13 08:08)
Натан ротшильд :
Кто владеет информацией, тот владеет миром
#2. Nu3oN Off (11)
Moderator
2010.08.12 18:06
А че там их составлять? домой приеду, дам уже готовые решения! когда то сам пытался писать шаблонизатор, но понял что это неблагодарное дело!
Я буду лучше голоден, но между креслом и рулем и на дороге.
#3. Gemorroj Off (107)
Administrator
2010.08.12 18:06
откоментил бы класс, что делает метод, что ему подавать на вход, что должно быть на выходе. так много проще разобраться будет.
Добавлено спустя   1 минуту  30 секунд:
Nu3oN написал:
понял что это неблагодарное дело!
тоже когда-то очень давно пытался, но до сих пор помню, что сложновато было.
#4. Nu3oN Off (11)
Moderator
2010.08.12 18:06
ну да... я пока писал цикл, у меня ушло на него чуть ли не неделя! сколько было психов...
Отредактировано Nu3oN (2010.08.12 18:06)
Я буду лучше голоден, но между креслом и рулем и на дороге.
#5. Nu3oN Off (11)
Moderator
2010.08.12 19:07
А не лучше указывать путь к шаблонам так $template -> dir = 'template/'; по мне так удобней! и __конструкт() юзать не надо
Отредактировано Nu3oN (2010.08.12 19:07)
Я буду лучше голоден, но между креслом и рулем и на дороге.
#6. Morgan Off (10)
Участник
2010.08.12 19:07
Nu3oN, ну я писал под свои нужды.
тем более, можно указать так
Код:
span style="color: #0000BB"><?phpdefine('SOMETEMPLATE_DEFAULT_DIR', 'templates/');?>
Натан ротшильд :
Кто владеет информацией, тот владеет миром
#7. Morgan Off (10)
Участник
2010.08.12 20:08
Gemorroj
прокомментировал
Натан ротшильд :
Кто владеет информацией, тот владеет миром
#8. Nu3oN Off (11)
Moderator
2010.08.12 20:08
Собственно вот простенький шаблонизатор!
написал сейчас по памяти! свой походу удалил...
Ша тогда буду писать, и выкладывать...
Код:
lt;?class Template { private $_arr = array(); private $_content; public $template_dir = 'templates/'; private function __set($var, $name) { $this -> _arr[$var] = $name; } private function _ifElse($clause, $oneBlock, $twoBlock) { if (strpos($this -> _content, $clause)) { return $oneBlock; } else { return $twoBlock; } } public function displey($tpl) { if (is_file($this -> template_dir.$tpl)) { $this -> _content = file_get_contents($this -> template_dir.$tpl); foreach ($this -> _arr as $key => $name) { $this -> _content = str_replace('{$'.$key.'}', $name, $this -> _content); } if (trim(strpos($this -> _content, '{if '))) { $this-> _content = preg_replace('#{if (.*?)}(.*?){else}(.*?){/if}#se', '$this -> _ifElse("\\1", "\\2", "\\3")', $this -> _content); } echo $this -> _content; } else { echo '<p> Неверный путь к шаблону "'.$this -> template_dir.$tpl.'" </p>'; } }}?>
Отредактировано Nu3oN (2010.08.12 20:08)
Я буду лучше голоден, но между креслом и рулем и на дороге.
#9. Morgan Off (10)
Участник
2010.08.12 20:08
Nu3oN
и зачем он нам?)
Натан ротшильд :
Кто владеет информацией, тот владеет миром
#10. Nu3oN Off (11)
Moderator
2010.08.12 21:09
Morgan написал:
и зачем он нам?)
Ну тебе ж нужно было:

Morgan написал:
3. Условия
{if $somevar}
// результат
{/if $somevar}
-----------
4. Переменные
{$somevar}
или я тебя не так понимаю?
Добавлено спустя   3 минуты  50 секунд:
Все понял... я дурко big_smile
Отредактировано Nu3oN (2010.08.12 21:09)
Я буду лучше голоден, но между креслом и рулем и на дороге.
Страниц: 1 2 Все
Главная
WEB
PunBB Mod v0.6.2
0.016 s