пример реализации "абстракции от шаблонизатора"

whirlwind

TDD infected, paranoid
HraKK если вопрос ко мне, то поподробней плз. я не понял что такое "это"? можно на примере
 

Alexandre

PHPПенсионер
Чем это улучше обвертки+фабрики?
для использования обвертки+фабрики для шаблонизатора недостаточно, по этому необходим еще один логический уровень - формирование данных.

Пусть необходимо вывести таблицу, мы имеем
PHP:
$t = MyTemplate::GetInstance();
$t->GetInstanceTmpl->GetInstance('smarty', $settings);  
$t->Assign( 'tmp', $arrOfvar );
echo $t->Fetch( 'test.tpl' );
// code 2
$t->GetInstanceTmpl->GetInstance('xslt', $settings);  
$t->Assign( 'tmp', $xmlOfvar );
echo $t->Fetch( 'test.xsl' );
Для первого случая мы в переменной $arrOfvar формируем двухмерный массив,
во втором примере мы в переменной $xmlOfvar формируем XML

если использовать третий вид шаблонизатора, то придется формировать еще какой-то иной вид данных.

По этому нужен некий промежуточный вид представления данных и некий класс-контрейнер, который бы его приведил к соответствующему виду для шаблонизатора.
что-то типа
Код:
 $t->GetInstanceTmpl->GetInstance('smarty', $settings, new ArrayCollector ($inputData));  
$t->GetInstanceTmpl->GetInstance('xslt', $settings, new XMLCollector ($inputData));
вопрос, что делать с Методом $t->Assign( );

Это я к тому, что может появиться куча дополнительных производных классов
ArrayCollector ($inputData)
ArrayVlibCollector ($inputData)
ArrayWactCollector ($inputData)
которые приводят данные в соответствии с интерфейсами, с учетом ньюансов каждого шаблонизатора.

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

Про это и говорил Фaнат, когда имел ввиду, что если начнешь писать что-то уневерсальное, то кол-во ньюансов кода превысит реализацию самого ядра.

Вопрос - нужно-ли это?
 

crocodile2u

http://vbolshov.org.ru
Согласен с Alexandre. А вот к whirlwind у меня вопрос: неужели прямо-таки всего один кусочек понадобится изменить, что перейти на новый шаблонизатор?

Рассмотрим переход со Смарти на php_templates (или другой шаблон с минимальной логикой, напр., HTML_Template_Sigma):
в пхп-темплейтах нам необходимо задавать контекст переменной (только прошу не цепляться к словам), в смарти - нет. Стало быть, нам понадобится прослойка, которая будет управлять запихиванием переменных в шаблон. Фактически, получится, что шаблон распадется на две составляющие - контроллер шаблона и собственно шаблон. Все эти контроллеры надо будет писать - писать программистам. Так что "изменением одной строчки кода" не обойтись.
 

Фанат

oncle terrible
Команда форума
whirlwind
честно говоря, мне не хочется выглядеть идиотом.
как и любому другому человеку.
но кодер, который разговаривает с архитектором, обречен на комплекс неполноценности. поскольку контроллеры, модели и мотороллеры - это очень, очень круто. А оператор echo - это для лохов.
И когда кодера интересует практическая сторона, архитектор ему отвечает все там же набором слов: драйвер - это слой между контроллером.
Большое спасибо за объяснение.
 

whirlwind

TDD infected, paranoid
> Стало быть, нам понадобится прослойка, которая будет управлять запихиванием переменных в шаблон.

Это и есть драйвер. Там, по сути, один важный метод - translateRequisite().


> Фактически, получится, что шаблон распадется на две составляющие - контроллер шаблона

неверно. Шаблон вообще никаким боком отношения к контроллеру не имеет. Контроллер - это логика обработки ввода и вывода (нужное подчеркнуть) и точка. Никаких шаблонов в контроллере нет.
 

Фанат

oncle terrible
Команда форума
crocodile2u
я тут подумал, что работа с шаблонизатором сводится, по сути, только к ассигнам.
а их первести с одного на другой - действительно, несложно.
форич (вся ДАТА) смарти-ассигн(кей,валуе)
 

Alexandre

PHPПенсионер
я тут подумал, что работа с шаблонизатором сводится, по сути, только к ассигнам.
а их первести с одного на другой - действительно, несложно.
Фaнат в одном из проектов, я хотел уйти от смарти и перелезть на blitz (в смарти слишком уж сбоил),
когда я практически начал переводить шаблоны, то понял в какую тухлятину я влез...
 

crocodile2u

http://vbolshov.org.ru
Alexandre, *****:
В своем примере я думал было привести блитц - но решил, что буду уж говорить о шаблонизаторе, с которым больше имел дело. Для таких шаблонизаторов ассигнами НИКАК не ограничиться - нужна работа с блоками, контекстами и т. д. и т. п.

whirlwind
Вот смотри.. простой пример.

Смарти-шаблон:
PHP:
{foreach item=row from=rowset}
    {$row.name}<br />
{/foreach}
Управляющий код для смарти:
PHP:
$view->assign('rowset', $myPDO->query("SELECT * FROM news"));
Теперь мы решили использовать php_templates...
Шаблон:
PHP:
<tmpl:row>
    {name}<br />
</tmpl:row>
Для такого шаблона уже НЕдостаточно простых ассигнов.
Нужно сказать ему что-то вроде такого:
PHP:
foreach ($myPDO->query("SELECT * FROM news") as $row) {
    tmpl_iterate($view, 'row');
    tmpl_set($view, 'name', $row['name']);
}
Неужели твой волшебный драйвер способен состряпать что-то вроде такого - по автомату для всех шаблонов и для любых передаваемых в шаблон переменных?

Я не верю в это. Драйвер придется писать для каждого шаблона в отдельности - и получится, что ты просто называешь словом "драйвер" то, что я назвал "контроллер шаблона".
 

Фанат

oncle terrible
Команда форума
Alexandre
переделка САМИХ шаблонов тут не обсуждается.
подразумевается, что шаблоны волшебным образом оттранслируются сами.
речь идет только о вызове шаблонов

-~{}~ 06.07.07 16:21:

crocodile2u, whirlwind
вы договоритесь о терминологии.
Контроллер - с большой буквы К - понятие идеологическое (теологическое).
контроллер - с маленькой - понятие технологическое. может быть даже у джойстика в компьютерной игрушке. А не только у шаблона. О чем некоторые высокоученые граждане начинают забывать

-~{}~ 06.07.07 16:24:

crocodile2u
у тебя неудачный пример.
я тебе объясню.
код, который ты привел - это ЧАСТЬ ШАБЛОНА. пишется вместе с ним, и является его неотъемлемой частью.
поэтому корректным примером работы с этим шаблоном будет что-то вроде
$mydata=$myPDO->query("SELECT * FROM news");

а в шаблоне уже
foreach ($mydata бла-бла

в результате все получается одинакого
 

whirlwind

TDD infected, paranoid
> Для такого шаблона уже НЕдостаточно простых ассигнов.

ну дык я кажись ссылки давал. Посмотри на интерфейс, там ты увидешь enableListMode? И ничто тебе не помешает написать драйвер для php_templates в котором метод nextSet() будет выполнять tmpl_iterate('название списка который был enabled')

PS. Все эти шаблонизаторы теже яйца, тока в профиль.
PPS. А если ему требуется дополнительные телодвижения типа tmpl_iterate, кому как - но по мне так это гемор, потому что лишняя связь логики программы и представления.
 

Фанат

oncle terrible
Команда форума
мля.
объясняю, как маленькому.
есть система.
продается за баблосы. РАЗНЫМ - ты не поверишь - заказчикам.
причем шаблоны от одного заказчика - вот сюрприз - не подходят для другого!
при том, что сама система одинаковая, делает одно и то же.

сколько надо переделать кода, чтобы сделать шаблоны для другого заказчика, который хочет не спарти а блитз? ЕМУ ВСЕ РАВНО ПРИДЕТСЯ ПИСАТЬ С НУЛЯ
 

Alexandre

PHPПенсионер
код, который ты привел - это ЧАСТЬ ШАБЛОНА. пишется вместе с ним, и является его неотъемлемой частью
я так понимаю, что это не часть шаблона, а часть водителя, т.е. драйвера.
 

Alexandre

PHPПенсионер
сколько надо переделать кода, чтобы сделать шаблоны для другого заказчика
согласен, мы просто не так понялии друг друга...
я про А, т.е. то что я переделывал проект, перелезал на др. шаблонизатор
ты про Б, т.е. про новый проект
 

Фанат

oncle terrible
Команда форума
Я ВООБЩЕ НЕ ПРО ЭТО.
и никто, кроме тебя, про сами шаблоны, не говорит. только про их вызов
 

Alexandre

PHPПенсионер
неправильно понимаешь
почему это не двайвер а класс шаблона?

за подготовку данных отвечает драйвер, в своих примерах я их назвал ArraySmartyCollector() , ArrayVlibCollector() и тд..
они то и отвечают за подготовку данных для конкретного шаблонизатора.

-~{}~ 06.07.07 16:42:

У меня еще вопрос для архитекторов?

у нас на странице выводится:
- блок новостей
- блок голосования
- блок погоды

как нам собирать данные в этом случае?
 

Фанат

oncle terrible
Команда форума
почему это не двайвер а класс шаблона?
не класс, а часть.
потому что это ФАКТ.
шаблон типа пхп_темплатес состоит из ДВУХ файлов. и оба файла относятся к шаблонам.
 

Sender

Новичок
Alexandre
:)
Fire OnData
Call data provider EngineLocalizer->OnData() for 3.00407409668E-005
Call data receiver EngineXMLDataCollector->OnDataReceive() for 0.000247001647949
Call data provider EnginePage->OnData() for 2.69412994385E-005
Call data receiver EngineXMLDataCollector->OnDataReceive() for 0.00108408927917
Call data provider ContentController->OnData() for 0.00089693069458
Call data receiver EngineXMLDataCollector->OnDataReceive() for 0.000508069992065
Call data provider NavigationController->OnData() for 0.00138592720032
Call data receiver EngineXMLDataCollector->OnDataReceive() for 0.0015389919281
Call data provider CartController->OnData() for 0.00533080101013
Call data receiver EngineXMLDataCollector->OnDataReceive() for 0.0013370513916
Fired OnData for 0.0126130580902
Fire OnView
Call data provider EngineXMLDataCollector->GetData() for 3.00407409668E-005
Call data receiver EngineXSLTView->OnView() for 0.0201590061188

и т.п.
 

С.

Продвинутый новичок
По идее в шаблонизатор передается только массив данных. И все! Весь вопрос лишь в структуре этого массива. Никаких таких навороченных API там в помине не нужно.

Но у нас есть "умненькие" шаблоны, которые подмяли под себя некоторые функции фреймворка. То, о чем вы спорите это попытка скрещивание двух недоделанных фреймворков, а не встраивание шаблонизатора.
 
Сверху