Комп’ютерна Академія “ШАГ”
Львівська Філія
вул. Замарстинівська 83А
тел.: 240-38-51, 067-480-77-24, 095-518-93-21
lviv@itstep.org
Шаблонізатор, який базується на понятті маркера
Богдан Любінський
Необхідність в розділенні php коду від html викликано тим, що такий підхід дозволить нам в якомусь обсязі розділити роботу дизайнера і програміста, код буде більш читабельний. На сьогоднішній день є велика кількість шаблонізаторів(SMARTY і тд), але мова буде йти не про їх огляд, а про деякі підходи, які використовуються в них.
Одним із таких підходів є підхід створення щаблонізатора на основі поняття маркера. Введемо деякі умовні терміни:
- маркер -це умовне позначення(наприклад ###OUTPUT###),
яке ми використаємо в тих місцях HTML коду, де б мали бути PHP вставки. - Шаблоном будемо вважати документ, який буде містити тільки HTML і маркери.
- Основним документом будемо вважати php скріпт.
Для прикладу давайте розглянемо тривіальну задачу, яка допоможе нам розібратись в цьому понятті. Нахай в нас є два текстові поля, необхідно значення яке є в першому полі перемістити в друге поле, при натисненні на кнопці відправки форми на сервер.
Класично в даному варіанті нам не обійтись без "змішування коду", тобто вставки в HTML PHP коду

Тепер розглянемо, як та сама задача вирішується з введенням шаблонізатора, який базується на понятті маркера.


Пояснення: стартовою сторінкою в нас буде index.php, а доступ до шаблону template.html можна обмежити на рівні прав на файли і каталоги
Одне з застосувань шаблонізації — бланки
В попередньому параграфі ми проілюстрували основний принцип шаблонізації з використанням маркерів. Грунтуючись на ньому, можна розробити доволі корисні рішення. Яскравий приклад — бланки (друковані форми) для WEB-додатків.
WEB-додатку, який лежить в основі автоматизації офісу, необхідно генерувати масу друкованих форм. Прихідні ордери, рахунки, договори...
Якщо задавати їх вигляд так, як веб-мастери-початківці будують сторінки — це винесе дуже багато часу, і програма буде нагадувати монстра Франкенштейна. Ось чому в цій ситуації гостро необхідно:
- Дати можливість веб-дизайнерам створити шаблон, не надаючись до програмування
- Уніфікувати генерацію бланка згідно шаблону
Текстом маркерів можуть бути назви властивостей і методів класу, який описує об'єкт бізнес-логіки. Цей клас може успадковуватись від базового класу. Назвемо його printable. Він і буде містити метод, що заміняє маркери на значення властивостей об'єкта й значення, які повертають методи.
Читання html-кода шаблона — тривіальна задача, яку до того ж ми вже розглянути в цій статті. Цікавішими є методи, які здійснюють заміну маркерів на значення. В них ми побачимо, що інтерпретація — не завжди погано. Ми побачимо неправдоподібну для мов, що компілюються, легкість рефлексії й пізнього зв'язку. Отже...
/* Заміняємо маркери властивостей*/ protected function blank_properties($html) { foreach($this as $name=>$value) //Ітератор: обхід властивостей { $re='/###'.$name.'###/'; $html=preg_replace($re,$value,$html); } return $html; } /* Заміняємо маркери методів */ protected function blank_methods($html) { $re='/###([a-z]\w*)\(\)###/'; preg_match_all($re,$html,$m,PREG_SET_ORDER); /* СКЛАД МАСИВА $m перший індекс -- номер знайденої відповідності $m[i][0] -- повний текст відповідності $m[i][1] -- назва метода */ for ($i=0;$i<count($m);$i++) { $re='/###'.$m[$i][1].'\(\)###/'; $method=$m[$i][1]; $replacement=$this->$method(); //Пізній зв'язок $html=preg_replace($re,$replacement,$html); } return $html; } /* магічний метод, який викликається, якщо не існує метода,
описаного маркером,
(дизайнер помилився...) */ public function __call($name, $arguments) { return ''; //"затираємо" помилковий маркер }
В методі blank_methods($html) ми зробили спрощення: не підтримали можливість вставити в маркер метод з параметрами (щось на зразок ###output(5)###). Це неважко зробити, але нам не хотілося ускладнювати приклад, який служить тільки для ілюстрації. Гадаю, навіть по спрощениму варіанту виникло багато питань. Пишіть, ми готові відповісти.










