Програмування на PHP. Сьомий випуск. Робота з шаблонами. Розробка власних і використання існуючих рішень.
У цьому випуску ми поговоримо про таку річ як темплейти (templates) - що це таке, навіщо це потрібно і чому майже всі це використовують. Але спочатку, як зазвичай, трохи новин.
А новини такі, що версія PHP 4.1.0. про створення якої я говорив в попередньому випуску вийшла. Правда поки що вона доступна лише у вигляді вихідних текстів (тобто windows binaries в розділі downloads на www.php.net шукати поки марно). До речі, крім усього іншого користувачів PHP на платформі Windows порадує той факт, що розробники PHP в цій версії говорять про цю версію як про значно більш швидко і стабільно рабоать під Windows. Повний список змін можна подивитися в офіційному анонсі (англійською). Запитуйте нову версію PHP на www.php.net і www.php4win.com.
А тепер повернемося безпосередньо до теми цього випуску.
Що таке templates
Як ви вже знаєте (про це було сказано ще в першому випуску), PHP - це вбудований (embedded) мову. Тобто його код поміщається всередину HTML сторінки і займається генерацією динамічного вмісту. Наведу простий приклад:
Отже, templates - це механізм, який дозволить вам в більшій чи меншій мірі позбутися від тісної прив'язки вашого коду до зовнішнього вигляду вашого сайту і допоможе вам полегшити задачу генерації динамічного HTML коду сторінок. Основна ідея цього механізму полягає в тому, щоб мати безліч "шматочків" HTML коду з яких ви потім, як з кубиків в конструкторі, зберете будь-яку сторінку вашого сайту.
найпростіші templates
Найпростіший спосіб використання tempates - це створення безлічі змінних, що містять шматочки HTML коду. Код самої сторінки при цьому самостійно займається об'єднанням HTML коду з цих змінних з необхідними даними для отримання результату. Подивимося, наприклад, як могла б виглядати генерація тієї ж самої сторінки за допомогою найпростіших темплейтов. Тут я не став використовувати жоден з поширених пакетів, тому що просто хочу продемонструвати вам основну ідею.
Файл templates.php содежіт опис всіх необхідних темплейтов. Якщо подивитися на вміст змінних, описаних в цьому файлі, то можна помітити, що це просто та ж сама сторінка, але розбита на безліч частин, між якими повинні бути вставлені дані.
Файл index.php містить сам код побудови сторінки
Звичайно цей коду виглядає просто жахливо і так (я сподіваюся) насправді ніхто не робить. Але основну ідею "збирання" HTML коду сторінки зі шматочків цей приклад демонструє досить добре.
Насправді основна проблема наведеного вище коду полягає в тому, що він не дозволяє вам повністю позбутися від HTML коду всередині PHP коду, адже тут кожна частинка HTML коду зберігається в окремій змінної. Уявіть, скільки довелося б мати подібних змінних для більш-менш складною сторінки. І, крім того, не дивлячись на те, що безпосередньо HTML код винесено в окремий файл, але його зв'язок з результатами роботи PHP коду жорстко задана всередині самого PHP коду (адже все об'єднання HTML і PHP коду жорстко прописані).
Більшість цих проблем можуть бути вирішені шляхом використання нескладної системи для підстановок даних в HTML темплейти. Одну з них ми розглянемо в наступному розділі.
Використання templates з підстановкою даних
Основною відмінністю систем, заснованих на підстановці даних, є те, що вони дозволяють, використовуючи певний синтаксис, визначати місця вставки даних в HTML темплейти. По суті всі наявні системи роботи з темплейт засновані саме на цьому принципі і єдине, що їх відрізняє - синтаксис, який використовується для завдання темплейтов і набір можливостей, що надається системою.
Але спочатку короткий опис синтаксису для опису шаблонів, що застосовується в даній системі. Я приведу його в EBNF-подібній системі і потім дам необхідні пояснення.
"Ключ" для підстановки:
Ключем для підстановки тут називається частина тексту темплейта, яка буде згодом замінена на деякі дані, передані функції - обробника темплейтов. Він складається з двох основних частин: імені (унікального в межах даного темплейта) і необов'язкового значення за умовчанням. Воно буде використовуватися в разі, якщо при обробці темплейта для нього не було задано значення. У разі, якщо значення за замовчуванням також не було задано - цей ключ буде замінений на порожній рядок.
Значення за замовчуванням може також бути використано для завдання спеціальної обробки. Нижче наведено 3 різних типи синтаксису, допустимі для використання стандартних значень:
Як бачите, тип обробки для використання стандартних значень вказується в першому символі.
Якщо це символ '#'. то все значення розглядається як "вставити результат обробки темплейта з ім'ям із заданими параметрами в якості значення для цього ключа підстановки ". Тобто обробник темплейтов буде викликаний рекурсивно для обробки тепмлейта з заданим ім'ям і лише за вибраними даних для підстановки, а результати обробки цього темплейти будуть використані в якості значення для підстановки.
Якщо це символ '!'. то процес обробки схожий на попередній, з тією лише різницею, що замість виклику обробника темплейтов здійснюється виклик для користувача функції з заданим ім'ям і їй як параметр передається масив даних, заданих в цьому ключі (структура масиву така ж, як і для самої функції обробки темплейтов ). Результати роботи функції будуть використані в якості значення для підстановки.
Символи, що мають спеціальне значення можуть бути вставлені в текст, використовуючи їх escaping sequences:
Escaping символів, що мають спеціальне значення
Поза ключів для підстановки
Тепер подивимося, як можна згенерувати ту ж саму найпростішу сторінку, використовуючи наведену вище функцію.
Файл templates.php содежіт опис всіх необхідних темплейтов. Дуже схоже на попередній варіант цього файлу, але тут в темплейт використовується описаний вище синтаксис для вставки тексту.
Файл index.php містить сам код побудови сторінки
Як бачите - код стає набагато більш компактним і логічним з застосуванням темплейтов. І, крім того, навіть така проста система обробки темплейтов значно спрощує вам роботу. Ви отримуєте можливість контролювати окремо логіку програми і окремо - її візуальну частину, чого ми, власне, і добивалися.
Системи роботи з темплейт
Як я вже говорив - наведена мною в попередньому розділі функція для обробки темплейтов занадто проста, щоб претендувати на роль реальної системи, придатної для практичного використання. Але в інтернеті ви можете знайти безліч подібних систем різного ступеня "навороченності". Я наведу лише кілька:
Історично однією з найперших подібних систем була FastTemplate. Вона написана ще для PHP3 і на даний момент, схоже, вже не підтримується. Всі інші варіюються за складністю і мощі підтримуваного ними синтаксису всередині темлейтов, а також наявністю додаткових сервісів.
Найпотужнішою системою на даний момент схоже є Smarty. Крім досить потужного і гнучкого мови (а такі розвинений синтаксис інакше як мовою назвати по-моєму просто не можна) вона має і ще радий особливостей, що виділяють її з усього ряду систем обробки шаблонів, наявних на даний момент. Самою чудовою її особливістю є можливість "компіляції" темплейтов безпосередньо в PHP скрипти! Тобто одного разу виконавши парсинг темплейта Smarty генерує PHP скрипт, який в подальшому виконує ту ж роботу значно швидше.
Оскільки сам я не користуюся жодної з систем обробки шаблонів, вважаючи за краще XML-технології, я надаю вам можливість самим спробувати і порівняти різні системи і вибрати ту, яка найбільш підійде саме вам.
Нагадаю, що ви можете завантажити вихідні тексти всіх прикладів, наведених в цій статті у вигляді ZIP архіву.
висновок
Надалі ми розглянемо альтернативу системам темплейтов - технології XML і XSLT. Ці технології є стандартами W3C і, отже мають серйозну підтримку, величезна кількість документації і прикладів, велика кількість програм для роботи з даними в цих форматах, їх створення, перевірки і т.п. PHP теж має розширення для роботи з цими технологіями і в майбутніх випусках ми розглянемо, як можна використовувати ці технології для генерації динамічних web-сторінок.