Несомненно, один из наиболее часто задаваемых вопросов в списках рассылки PHP - "Как мне сделать свои PHP-скрипты независимыми от дизайна?". Хотя PHP называют "скриптовым языком, встраиваемым в HTML", после написания нескольких проектов, в которых PHP и HTML свободно перемешиваются, многие понимают, что отделение формы от содержания - это Хорошая Вещь [TM]. Кроме того, во многих компаниях должности дизайнера и программиста разделены между собой. Так начинается поиск обработчика шаблонов...
Например, в нашей компании разработка приложения идёт таким образом: после того, как готова вся проектная документация, дизайнер интерфейса создаёт макеты и передаёт их программисту. Программист реализовывает логику приложения на PHP и использует макеты интерфейса для создания базовых шаблонов. Затем проект передаётся HTML-дизайнеру/верстальщику, который доводит шаблоны до совершенства. Проект может несколько раз переходить из этапа HTML-вёрстки к этапу программирования и обратно. Таким образом, важно иметь хорошую поддержку шаблонов, потому что программисты не хотят иметь дела с HTML и не хотят, чтобы HTML-дизайнеры копались в PHP-коде. Дизайнерам нужна поддержка конфигурационных файлов, динамических блоков и прочих интерфейсных нюансов, но они не хотят иметь дела со сложностями языка программирования PHP.
Глядя на множество обработчиков шаблонов, доступных сегодня для PHP, большинство из них предоставляет базовые возможности подстановки переменных в шаблоны и имеет ограниченную поддержку динамических блоков. Но нам требовалось нечто большее. Мы хотели, чтобы программисты ВООБЩЕ не имели дела с HTML, но это было практически неизбежно. К примеру, если дизайнер хотел, чтобы два фоновых цвета чередовались при отображении динамических блоков, эту задачу необходимо было решать вместе с программистом. Нам также требовалось, чтобы дизайнеры могли использовать собственные конфигурационные файлы и вставлять переменные из этих файлов в шаблоны. И так далее.
Мы начали написание спецификации для обработчика шаблонов ещё в 1999 году. Когда мы закончили спецификацию, мы начали работать над обработчиком шаблонов, написанным на Си, которому, как мы надеялись, разрешат стать частью PHP. Мы не только наткнулись на множество технических барьеров, но было и большое количество споров относительно того, что должен и не должен делать обработчик шаблонов. Благодаря этому опыту мы решили, что обработчик шаблонов должен быть написан на PHP в виде класса, чтобы каждый мог использовать его так, как хочет. Затем мы написали движок, который соответствовал этим требованиям и SmartTemplate™ появился на свет (примечание: этот класс никогда не был опубликован). Это был класс, который делал практически всё, что нам требовалось: обыкновенная подстановка переменных, поддержка подключения других шаблонов, интеграция с конфигурационными файлами, встраивание PHP-кода, ограниченная поддержка условий 'if' и улучшенная поддержка вложенных динамических блоков. Всё это достигалось использованием регулярных выражений и в итоге у нас получился код, который, скажем так, не позволял вносить в себя какие-либо изменения. Кроме того, он прилично тормозил в крупных приложениях из-за большого количества парсинга и регулярных выражений, которые обрабатывались при каждом запросе. Наибольшей проблемой с программистской точки зрения была та работа, которую нужно было провести над PHP-скриптом для настройки и обработки шаблонов и динамических блоков. Как же мы можем упростить это?
Затем пришло видение того, что в последствии переросло в Smarty. Мы знали, как быстр PHP-код, если его не перегружать обработкой шаблонов. Мы также знали, как всеобъемлюще и непонятно может выглядить язык PHP для среднестатистического дизайнера, и что это можно замаскировать при помощи более простого синтаксиса шаблонов. А почему бы нам не объединить две эти силы? Так и родился Smarty... :-)