#1 2010.08.12 18:36

Morgan
Участник
Зарегистрирован: 2009.03.31
Сообщений: 333
Карма: 10
Профиль Веб-сайт

Доделать шаблонизатор

Обращаюсь за помощью к форумчанам.
Требуется допилить один (небольшой) класс.
Данный класс используется для реализации MVC модели.
Есть шаблоны (tpl-файлы), есть сгенерированные шаблоны (tpl.php - файлы) с нативным PHP - синтаксисом.

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

Известные баги :
1. Неверная обрезка кода шаблонов, а конкретно, кода, который следует после последнего блока.
2. Проблема с условиями, не обрабатывает конструкции типа

Код:

1
{if !~$a}***{/if !~$a}

Начало работы :

Код:

1
span style="color: #0000BB"><?phpinclude 'SomeTemplate.class.php';// создаем экземпляр класса$template = new SomeTemplate;// добавление переменной$template -> somevar = 'somevalue';$template -> assign('somevar', 'somevalue');// указываем текущий блок$template -> block = 'index';// обработка и вывод шаблона$template -> display('template');?>

Папку с шаблонами, папку для сгенерированных файлов и расширение шаблонов можно указать при создании экземляра.

Код:

1
span style="color: #0000BB"><?php$template = new SomeTemplate('/templates_dir/', '/compiled_templates_dir/', '.tpl');?>

Описание команд :

1. Блоки

Код:

1
2
3
{block *somename*}
// разный код
{/block *somename*}

Аналогичен коду на PHP (конечно же с switch(){***} и endswitch;)

Код:

1
2
3
case '*somename*':
// разный код
break;

Если использовать модификатор ! (block !*somename*), то это будет ознать не соотвествие указанному блоку.
2. Циклы

Код:

1
2
3
{foreach $array}
{$array.text}
{/foreach $array}

~PHP

Код:

1
2
3
4
for($i = 0;$i < count($array);$i ++)
{
echo $array[$i]['text'];
}

3. Условия

Код:

1
2
3
{if $somevar}
// результат
{/if $somevar}

~PHP

Код:

1
2
3
4
if($somevar === true)
{
// результат
}

Можно использовать модификаторы :
if !$somevar =

Код:

1
if($somevar !== true)

if ~$somevar =

Код:

1
if((bool)$somevar)

if !~$somevar =

Код:

1
if(!(bool)$somevar)

4. Переменные

Код:

1
{$somevar}

~PHP

Код:

1
echo $somevar;

За говнокод можете пинать big_smile

P.S: Есть рабочий вариант этого класса, только без генерации php файлов, т.е, выполнения по ходу разбора.


Вложения

Отредактировано Morgan (2010.08.13 08:34)


Натан ротшильд :
Кто владеет информацией, тот владеет миром

Неактивен

#2 2010.08.12 18:42

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 805
Карма: 11
Профиль Веб-сайт

Re: Доделать шаблонизатор

А че там их составлять? домой приеду, дам уже готовые решения! когда то сам пытался писать шаблонизатор, но понял что это неблагодарное дело!


Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#3 2010.08.12 18:45

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6594
Карма: 107
Профиль Веб-сайт

Re: Доделать шаблонизатор

откоментил бы класс, что делает метод, что ему подавать на вход, что должно быть на выходе. так много проще разобраться будет.
Добавлено спустя   1 минуту  30 секунд:

Nu3oN написал:

понял что это неблагодарное дело!

тоже когда-то очень давно пытался, но до сих пор помню, что сложновато было.

Неактивен

#4 2010.08.12 18:52

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 805
Карма: 11
Профиль Веб-сайт

Re: Доделать шаблонизатор

ну да... я пока писал цикл, у меня ушло на него чуть ли не неделя! сколько было психов...

Отредактировано Nu3oN (2010.08.12 18:53)


Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#5 2010.08.12 19:04

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 805
Карма: 11
Профиль Веб-сайт

Re: Доделать шаблонизатор

А не лучше указывать путь к шаблонам так $template -> dir = 'template/'; по мне так удобней! и __конструкт() юзать не надо

Отредактировано Nu3oN (2010.08.12 19:06)


Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#6 2010.08.12 19:23

Morgan
Участник
Зарегистрирован: 2009.03.31
Сообщений: 333
Карма: 10
Профиль Веб-сайт

Re: Доделать шаблонизатор

Nu3oN, ну я писал под свои нужды.
тем более, можно указать так

Код:

1
span style="color: #0000BB"><?phpdefine('SOMETEMPLATE_DEFAULT_DIR', 'templates/');?>

Натан ротшильд :
Кто владеет информацией, тот владеет миром

Неактивен

#7 2010.08.12 20:25

Morgan
Участник
Зарегистрирован: 2009.03.31
Сообщений: 333
Карма: 10
Профиль Веб-сайт

Re: Доделать шаблонизатор

Gemorroj
прокомментировал


Натан ротшильд :
Кто владеет информацией, тот владеет миром

Неактивен

#8 2010.08.12 20:52

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 805
Карма: 11
Профиль Веб-сайт

Re: Доделать шаблонизатор

Собственно вот простенький шаблонизатор!
написал сейчас по памяти! свой походу удалил...
Ша тогда буду писать, и выкладывать...

Код:

1
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:52)


Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#9 2010.08.12 20:58

Morgan
Участник
Зарегистрирован: 2009.03.31
Сообщений: 333
Карма: 10
Профиль Веб-сайт

Re: Доделать шаблонизатор

Nu3oN
и зачем он нам?)


Натан ротшильд :
Кто владеет информацией, тот владеет миром

Неактивен

#10 2010.08.12 21:12

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 805
Карма: 11
Профиль Веб-сайт

Re: Доделать шаблонизатор

Morgan написал:

и зачем он нам?)

Ну тебе ж нужно было:

Morgan написал:

3. Условия
{if $somevar}
// результат
{/if $somevar}
-----------
4. Переменные
{$somevar}

или я тебя не так понимаю?
Добавлено спустя   3 минуты  50 секунд:
Все понял... я дурко big_smile

Отредактировано Nu3oN (2010.08.12 21:24)


Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

Дополнительно

forum.wapinet.ru

PunBB Mod v0.6.2
0.012 s