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

fender

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

У меня такой вопрос...
Я хочу найти пример реализации "абстракции от шаблонизатора".
Слышал что в некоторых фреймворках сделано так, что можно быстро и легко переключаться с одного
шаблонного движка на другой, меняя например аргумент конструктора или конфигурационный параметр.
PHP:
$t = new Template('smarty'); 
$t->SetTemplateDir(...); 
$t->SetCompileDir(...); 

$t = new Template('wact'); 
$t->SetTemplateDir(...); 
$t->SetCompileDir(...);
что-то в общем в этом духе
то есть имеется класс Template, интерфейс которого реализуют адаптированные к шаблонизатору классы
То что касается PHP-кода более менее понятно, но есть масса других связанных с этим ньаносов и хотелось бы максимально их рюхнуть

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

Фанат

oncle terrible
Команда форума
IMHO, такая же глупость, как и абстракция от баз данных.
Выглядит так, как будто открывается куча головокружительных возможностей. На деле оказывается, что
а) тормоз.
б) В случаях, отличных от хресотматийных, все равно приходится править с помощью лома и какой-то матери. Через некотрое время объем кода, обходящего недостатки фреймворка, превышает код самого фреймворка со всеми драйверами. Не говоря уже о коде простых, изначально выбранных шаблонов
 

whirlwind

TDD infected, paranoid
При нормальном дизайне, "не хрестоматийные" обрабатываются как и обычно - $t->getTemplateEngine()->toDo ... и вперед. Если "не хрестоматийных ситуаций" больше чем хотелось бы, значит интерфейс Template спроектирован неудачно.
 

Alexandre

PHPПенсионер
Принципиально согласен с Фaнатом...

но если очень хочется, то теоретически можно использовать шаблон "Фабрика" и "Обертка"

Фабрика тебе генерит необходимый экземпляр класса, а "Обертка" вызывает типовые методы.

У меня так сделано для БД:
Код:
  $db = IndigoDB::GetInstance();
  
  $db->GetInstanceDB('mysql','localhost','cms','cms','cms');
  
  $row = $db->FetchOneRow('select * from test');
  print_r( $row);
 

fender

Новичок
о необходимости использования указанных Alexandre паттернов и о возможности появления обозначенных *****ом проблем догадываюсь. Хочется в первую очередь увидеть более-менее законченную реализацию в реальном проекте.
 

Sender

Новичок
fender
Каждому View соответствует свой DataCollector
Например:
SmartyView => ArrayDataCollector
XSLTView => XMLDataCollector
AjaxView => ArrayDataCollector

Каждый View знает как обработать данные, которые хранит DataCollector. Каждый DataCollector знает как ему записать поступившие данные. Модуль вообще не знает какой ДатаКоллектор используется, он просто вызывает Set

Все данные собираются в коллекторе, потом подаются в View
 

whirlwind

TDD infected, paranoid
Sender +1

ЗЫ. new Template('some') - это малополезно. Вот инжект например new MyViews($template) с единым интерфейсом на шаблонизатор - это гут
 

Alexandre

PHPПенсионер
Хочется в первую очередь увидеть более-менее законченную реализацию в реальном проекте.
чего? Шаблонов или куска из БД?
у меня реализованно три класса
IndigoDB
IndigoMySqlDb
IndigoMySqliDb
в зависимости от установленного модуля подключается необходимая БД.

Обращение происходит здесь IndigoDB
а конкретная реализация здесь (IndigoMySqlDb и IndigoMySqliDb)

кусок кода http://phpclub.ru/paste/1757
соответственно все названия и вызовы методов классов должны совпадать IndigoMySqlDb и IndigoMySqliDb (Open, Close, SelectDB, FetchRow ... ).
 

fender

Новичок
кусок кода малоинтересен.
интересно знать, в каком проекте полноценно реализована абстракция от шаблонизатора
- Simphony?
- CakePHP?
- LIMB?
- другой ?

Не подскажите, если кто знает, в каких фреймворках это реализовано наиболее правильно и красиво, чтобы можно
было на этом поучиться?
-~{}~ 06.07.07 13:31:

Sender
Твой пример не осилил.
Где можно почитать / просмотреть примеры?
 

Alexandre

PHPПенсионер
fender тебе дали внятные ответы и Sender привел правильную идею относительно использования DataCollector, я привел кусок кода как это реализованно для разных типов БД ( а не все-ли равно на чем применять идею подключению нескольких типов разных модулей, имеющих одну функциональность: БД, шаблоны или сессии или много чего еще? )
Про шаблоны проектирования ты знаешь, что - теперь проблема в ДНК?
 

fender

Новичок
Alexandre
Твою инфу видел, учел, спасибо
Жаль, что ты не знаешь как ответить на основной вопрос топика.
Так что я пока подожду.
Может зайдет тот кто знает.
 

Фанат

oncle terrible
Команда форума
Alexandre
он хочет название. не советы, а название системы, где это реализовано.
 

fender

Новичок
именно так
я нашел через google.com/codesearch несколько проектов, где есть что-то похожее на это.
Но я не могу знать хорошая там реализация или нет.
Поэтому решил обратиться к сообществу.
 

whirlwind

TDD infected, paranoid
> интересно знать, в каком проекте полноценно реализована абстракция от шаблонизатора

ну глянь, если интересно

svn://svn.prolib.ru/trunk/classes/mvc/io/IOutputDriver.php - абстракт
svn://svn.prolib.ru/trunk/classes/mvc/io/OutSmarty.php - драйвер смарти
 

crocodile2u

http://vbolshov.org.ru
fender
Посмотри на Zend_Framework. Там "по умолчанию" используется plain-php-шаблоны - но есть возможность легко и непринужденно перейти на Смарти. В Лимб, я точно знаю, были планы организовать такую штуку. Насколько они продвинулись - не знаю, спроси у pachanga, есил интересно
 

Фанат

oncle terrible
Команда форума
fender
Я правильно понимаю, что ищется решение, которое, грубо говоря, обеспечивает возможность написать пхп-код, который оттранслируется в код смарти, которая оттранслирует его в пхп код?
 

fender

Новичок
whirlwind
checkout done =)
спасибо, очень интересно, посмотрю

crocodile2u
также сенкс
как-то про Zend Framework я забыл!

Фaнат
не совсем понял о чем ты
но это точно не то
 

Фанат

oncle terrible
Команда форума
whirlwind
а можно в двух словах - каким образом происходит работа драйвера? он транслирует псевдокод псевдошаблонизатора в команды управления смарти?
 

whirlwind

TDD infected, paranoid
Нет, драйвер это слой между Input - Controller - View. Он позволяет формализовать работу с данными независимо от источника/формата ввода/вывода. Было

PHP:
$ctrl = new MyController();
$ctrl->run(new InHttp(),new OutSmarty());
стало

PHP:
$ctrl->run(new InStdin(),new StdOut());
...другой шаблонизатор, или что нибудь еще - смысл в том, что код контроллера остается неизменным и не зависит от того, откуда приходят данные и куда их нужно отправить. Если запуск контроллера формализован на проект (например FrontController), то переход на другой шаблонизатор занимает исправление ровно одной строки кода.
 

HraKK

Мудак
Команда форума
Извините за тупость, но..
Чем это улучше обвертки+фабрики?
 
Сверху