формирование шаблонов

Crazy

Developer
Автор оригинала: tony2001
>А как именно ты используешь str_replace в этом случае?
мы уже когда-то флеймили на эту тему =)
На эту -- нет. :)

у шаблона есть список переменных, при парсинге этот список просто заменяется на значения, т.е. %var% => value.
все просто и знакомо.
Т.е. по одному str_replace на каждую переменную?
 

tony2001

TeaM PHPClub
Навскидку я уже предложил вариант:
копить переменные и их значения как индексы и значения элементов массива.
после этого ОДИН str_replace спасет все отцов русской демократии без всяких foreach'ей.
 

crow

Guest
Автор оригинала: Crazy
Многопроходная замена (все это вложена в foreach), а следовательно -- много лишних строковых операций.

Навскидку приходит в голову preg_replace_callback() -- так можно обработать шаблон за один проход.
боюсь что за один проход неполучится использование и переменных, находящихся в массиве типа - {DATA::MYVAL}
 

tony2001

TeaM PHPClub
>Т.е. по одному str_replace на каждую переменную?
нет, я же про это и говорю

PHP:
//this - это шаблон собсно =)
str_replace(array_keys($this->vars), array_values($this->vars), $this->temp_content);
андерстэнд ?
 

crow

Guest
> копить переменные и их значения как индексы и значения
это тоже цикл!
 

Crazy

Developer
Это цикл, но с меньшими расходами.

В общем -- логично. Хотя вариант с preg'ом лично мне нравится больше. На досуге надо будет замерить скорость...
 

tony2001

TeaM PHPClub
>это тоже цикл!
в каком месте ?
мой код видел ?
как это реализуется внутри str_replace мне все равно - си-шные циклы однозначно быстрее РНР-шных.

>боюсь что за один проход неполучится использование и
>переменных, находящихся в массиве типа - {DATA::MYVAL}
посмотри код.
 

crow

Guest
2tony2001:
если ты имеешь ввиду код вот этот
str_replace(array_keys($this->vars), array_values($this->vars), $this->temp_content);
тогда объясни как без дополнительных циклов по массивам в
$this->vars будут кеи с именами типа VAR2::SUBVAR1
 

tony2001

TeaM PHPClub
не понял
какие еще VAR2::SUBVAR1 ?
это на каком языке и что это означает ?
 

crow

Guest
Автор оригинала: tony2001
не понял
какие еще VAR2::SUBVAR1 ?
это на каком языке и что это означает ?
мой механизм позволяет иметь вложеные переменные, а переменные для обработки темплейта должны быть в виде массива:

Array(
[Name] => Hello world!
[Description] => Some Description
[MyData] => Array
(
[Data1] => item of array 1
[Data2] => item of array 2
[Data3] => item of array 3
)

)

где MyData - вложенные массив и доступ к его переменным из темплейта будет осуществлен как:

{MyData:: Data1}

я об этом уже писал...
 

csa

Guest
str_replace прокатит на простых шаблонах
а как быть, например, если нужно сгенерить таблицу?
 

crow

Guest
Автор оригинала: csa
str_replace прокатит на простых шаблонах
а как быть, например, если нужно сгенерить таблицу?
темлейт tablebody.html содержащий:
<table>
<tr><td>TITLE1</td><td>TITLE2</td><td>TITLE3</td></tr>
{ROWS}
</table>

темплейт tablerow.html:
<tr><td>{VALUE1}</td><td>{VALUE2}</td><td>{VALUE3}</td></tr>

сперва в цикле формируем переменную ROWS:
PHP:
$tablebodytemplate = LoadTemplate('tablebody.html'), 
$rowtemplate = LoadTemplate('tablerow.html'), 
while($vars=mysql_fetch_array($SQLres)) 
 $rows .= DoTemplate($rowtemplate,$vars); 
ShowTemplate($tablebodytemplate,array('ROWS'=>$rows));
 

csa

Guest
а хотелось бы именно вложенные... почему, надеюсь, объяснять не надо
 

Crazy

Developer
Любопытное наблюдение: есть две архитектуры/технологии работы с шаблонами: data-driven и presentation-driven.

В первом случае нужно заранее заготовить все о ображаемые данные (если нужны вложенные таблицы -- используем вложенные массивы) и заказываем отрисовку этих данных в шаблонах.

Во втором случае шаблон знает, ЧТО он хочет нарисовать. И шаблоны при отрисовке передаются фабрики данных, которые знают, КАКИМИ будут отрисовываемые данные.

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

crow

Guest
Автор оригинала: csa
а хотелось бы именно вложенные... почему, надеюсь, объяснять не надо
тогда выход один либо использовать готовый механизм шаблонов, имеющий какой-либо простой язык, либо делать доморощенный транслятор своего языка шаблонов...
самый простой вариант - со вложенными шаблонами я изложил выше...

ЗЫ: но упаси вас Бог, писать на интерпретаторе интерпретатор
 

csa

Guest
стронники разнных подходов вообще, имхо, струдом друг друга понимают :)
 

crow

Guest
Автор оригинала: csa
стронники разнных подходов вообще, имхо, струдом друг друга понимают :)
помоему все зависит от решаемой задачи и от данных!
 

csa

Guest
Автор оригинала: crow

темлейт tablebody.html содержащий:
...
темплейт tablerow.html:
[/php]
интересно, насколько оправдывает себя такой подход?
я имею в виду кучу мелких файлов с маленьким кусочком шаблона
и это действительно быстрее?
хотя можно комбинировать методы
 
Сверху