витоки шаблонізаціі
Логіка програми та логіка відображення
Ця нехитра операція по праву може називатися бізнес-логікою або логікою програми. Інакше кажучи - це суть програми. Нічого більше від програми не потрібно, крім як обчислити суму двох доданків. В кінцевому підсумку дана програма (за умови, що значення змінних $ a і $ b визначені) може отримати два різних типи значення - або нуль, або негативне або позитивне число.
Оскільки програма використовується в web, то логічно було б віддавати результат її виконання у вигляді HTML. При цьому хотілося б застосувати деяку логіку, якщо розпечатати HTML-коду - якщо результат не дорівнює нулю - вивести результат синенькі текстом, інакше вивести повідомлення червоним кольором, що мовляв вибачте, "бублик", тобішь нуль.
Розглянемо рішення даного завдання новачком. Новачок нічого не чув про відділення php-коду скрипта від html-коду шаблону і напевно напише програму приблизно так:
Які помилки зробив новачок? Він змішав PHP код (логіку додатка) і логіку відображення. Що таке логіка відображення? Ця умова в керуючої конструкції if-else, що виводить HTML-код в залежності від отриманого результату. Логіка відображення ніяк не пов'язана з логікою програми. вона навіть не знає, як був отриманий $ result - через додавання двох змінних або через складні математичні алгоритми, що супроводжуються вибірками з бази і запитами до стороннього сервера. Їй це все одно, у логіки відображення інше завдання - показати користувачеві результат роботи програми.
Примітка: крім усього іншого новачок вивів HTML через echo уклавши HTML в подвійні лапки, що призвело до екранування подвійних лапок в HTML-коді. Вийшла суміш з HTML і PHP коду, важко читається, важко підтримувана і зовсім не красива.
Тепер уявімо, що новачок написав цілий інтернет-магазин в подібному стилі, змішавши воєдино вибірки з бази, алгоритми і HTML. Потім верстальщику знадобилося змінити значну частину HTML коду і вуаля - код підтримувати неможливо, не тільки верстальником, а й самим програмістом. Бізнес-логіка переплетена в логікою відображення, змішалися в купу коні, люди.
Рано чи пізно веб-програміст починає ставати досвідченішими і до нього приходить розуміння, що відокремлювати HTML-код від PHP-коду все ж потрібно. Проштудіювавши форуми і деякі керівництва (а можливо і з власної кмітливості) програміст пише програму, яка в коді HTML-шаблону, на місці певних міток типу% var% або. підставляє значення, отримані від PHP-скрипта:
Що виходить? Основний каркас сторінки лежить в окремому файлі і вже не пов'язаний з PHP-кодом, вже краще. Але в скрипті script.php як і раніше присутня HTML-код і логіка відображення. Виходить, проміняли "шило на мило". HTML тепер розмазаний як по скрипту, так і за основним шаблоном, що не дуже відрізняється від коду "Новачка" з прикладу вище.
Наступний крок - це термінальна стадія, коли програміст в спробі відокремити PHP від HTML починає писати свій власний шаблонизатор - набір правил для шаблону, які могли б виконувати хоча б мінімальні логічні операції з даними, отриманими з PHP-скрипта:
Шаблон тепер виглядає так:
У шаблоні з'являється IF-подібна конструкція, яку обробляє призначений для користувача шаблонизатор super_mega_template_engine. І начебто вона працює - виводить значення в залежності від значення змінної body. Але далі починається найвеселіше - з ускладненням логіки відображення потрібно створити в шаблонизатор конструкції, обробні масиви - цикли. Тривіального IF-подібного синтаксису починає не вистачати - потрібні рівні вкладеності і багато іншого. В кінцевому підсумку програміст приходить на форум і задається питанням - як написати свій власний шаблонизатор на PHP.
А вся справа в.
PHP сконструйований спеціально для ведення Web-розробок і його код може впроваджуватися безпосередньо в HTML - php.net.
Що з цього випливає? PHP - сам по собі є не тільки дуже потужним мовою програмування, але і самодостатнім шаблонізатором. що дозволяє робити якісні шаблони без шкоди для логіки додатка. Для цього треба дотримати наступні умови:
- Не використовувати в шаблонах логіку додатка, передавати в шаблони тільки дані, отримані з скрипта - скаляри, масиви, об'єкти. Ніяких викликів до бази, алгоритмів не пов'язаних з логікою відображення і т.п.
- Використовувати в шаблонах структури управління PHP. необхідні для логіки відображення - IF / ELSEIF / ELSE, FOR / FOREACH, INCLUDE / REQUIRE.
- Використовувати для структур управління альтернативний синтаксис - він дуже легко розпізнати об'єкти HTML-шаблонів.
- Намагатися не використовувати вбудовані функції в шаблонах. Якщо навіть вам потрібно застосувати в шаблоні досить часто використовувану функцію htmlspecialchars. то не полінуйтеся обернути її в статичний метод класу-помічника або в функцію. Це в подальшому дасть більший простір для рефакторинга і просто створить однозгідно стиль вашого API.
Такий стиль шаблонізаціі на PHP називається pure-шаблонізаціі, тобто чиста шаблонізаціі, заснована на можливостях самого PHP.
Використовуючи pure-шаблонізаціі код нашого скрипта і шаблону міг би виглядати так:
Погодьтеся, красиво і абсолютно просто! Ми розділили логіку програми та логіку відображення. Тепер верстальник, хоч трохи знайомий з тривіальними керуючими конструкціями будь-якої мови програмування, може з легкістю підтримувати HTML-код, а програмісту немає необхідності що-небудь знати про те, як і де буде виведений результат роботи програми. Ми розділили обов'язки і створили підтримуваний код, який легко модифікувати.
Звичайно, наш приклад дуже простий, але переваги pure-шаблонізаціі дуже помітні на реальних проектах.
Приклад шаблону складніше - гостьова книга, висновок записів
Як приклад складніше можна привести шаблон гостьової книги, що виводить записи з заздалегідь сформованого масиву $ guestbook_messages. Виводяться записи як зареєстрованих, так і незареєстрованих користувачів. Крім того, можливий висновок повідомлення адміністратора гостьової книги (якщо воно є) під певним повідомленням користувача.
У масиві присутні наступні ключі:
Екранування даних, які прийшли ззовні
На окрему увагу заслуговує тема екранування даних. Хороший тон веб-програмування - записувати прийшли від користувача дані "як є", а при виведенні піддавати їх обробці, в залежності від необхідного формату виведення. Наприклад, якщо це стандартне веб-додаток, то необхідно екранувати спецсимволи, що використовуються в HTML через функцію htmlspecialchars. що б запобігти XSS -уязвімості. Навпаки, для Excel / Word формату немає необхідності застосовувати htmlspecialchars для даних з бази веб-додатки. Тобто кожен формат, в якому будуть виводиться дані, диктує свої правила обробки цих даних.
Результат відображення в браузері: