Преди няколко месеца един преподавател в университета ни препоръча преди да сядаме и да пишем дадена програма или библиотека да проверим дали някой вече не е написал. Както се изрази тогава той, "Никой няма нужда от това, да преоткривате топлата вода". И въпреки, че в повечето случай аз предпочитам да си пиша нещата, вместо да използвам готови, има един фреймуорк, който ми стана любим за една област, в която нямам особен интерес и познания - буквичката "V" от абревиатурата "MVC" - view компонента. Това е Smarty Template Engine - прекрасен и лесен за употреба фреймуорк, написан на PHP, с който бързо и лесно може да се създаде система за шаблони за вашето уеб приложение или сайт.
Както е заложено и в името, освен бързо и лесно, view часта се изгражда и умно - Smarty кешира html и php кода, което го прави бърз при изпълнение, след като вече веднъж сте изградили изгледа на конкретната страница. Това е едно от нещата, които го правят една от най-използваните системи за шаблони. Доказателство за качеството идва от факта, че сайтът на Zend Corp., фирмата, която разработва PHP, се задвижва чрез Smarty, въпреки техния огромен PHP Zend Framework, разполагащ с няколко вида допълнения за създаване на шаблони. Друг голям проект, който използва този фреймуорк за разработка на темите си е системата за електронна търговия PrestaShop.
Как се работи със Smarty? Най-простия начин на работа е следния:
Сваляме Smarty от сайта им и го поставяме на желано място във файловата система на приложението ни. Добавяме Smarty.class.php към файловете на приложението ни, било то чрез include/require или __autoload() функцията. Между другото, може да възникне проблем с ваша __autoload() и Smarty, тъй като фреймуорка използва собствена такава, която може да препокрие вашата. Това се оправя като прекръстите вашата __autoload() на нещо друго, например my_auotload_function() и веднага след декларацията й я добавите към SPL autoload регистъра чрез spl_autoload_register("вашата–функция").
Създаваме си файл за изглед, съдържащ html кода, като там, където искате да е информацията от php променливите слагате имената им, оградени с големи скоби - { и }.
В контролера на вашето приложение (или там, където създавате бизнес-логиката) извличате и обработвате информацията по ваши алгоритми, критерии и други начини и задавате стойностите на променливите, които се използвали във файла с изгледа.
Създавате обект от тип Smarty и чрез метода му assign() задавате за кое име на променлива от файла с изглед, каква стойност да има.
Накрая извиквате метода display() на същия обект, като задавате пътя до файла с изгледа и хоп! - Работи!
Да погледнем един много прост пример: малък сайт, при когото съдържанието е записано в база данни, изгледа се състои от три основни части - хедър, основно съдържание и футър, като хедъра и футъра обяснимо са едни и същи за всяка страница. Те също са записани в базата данни, за да може администратора на страницата да си ги променя, когато му е кеф.
Няма да се спирам на извличането на информацията от базата данни, защото не ни е това целта в момента, а ще обърнем внимание на показване на страницата с шаблон, манипулиран чрез Smarty.Да погледнем първо към файлът с изгледа. Той си е обикновен файл, съдържащ html-а за нашите страници, като на мястото на съдържанието, което ще е различно за различните страници ще сложим променливите от php. Такива променливи ще бъдат името на сайта, мотото в хедъра, текстът във футъра (Copyright, алабала), заглавие на съдържанието и основното съдържание. Използваме следните имена за тях:
$header_text - текст в хедъра (мото),
$content_title - заглавие на съдържанието,
$content - основното съдържание на страницата,
$footer_text - текст във футъра.
Страницата за примера ще бъде статия със заглавие "Създаване на приложения", мотото ще е "Моя сайт за програмиране", текста във футъра - "Създаден от мен през 2012 година".
В контролера извличаме тези стойности от базата данни:
// Извеждане стойностите от базата данни чрез даден алгоритъм и критерии
// и получаваме променливи със следните стойности:
$header_text = "Моят сайт за програмиране";
$content_title = "Създаване на приложения";
$content = "Някакво съдържание за създаване на приложения, извлечено от базата данни";
$footer_text = "Създадено от мен през 2012";
// Още код тук след малко...
?>
Сега да направим изгледа. Smarty използва текстови файлове с каквото и да е разширение, но най-често се използва tpl разширение. Аз по-често използвам html разширение, но сега ще използваме общоприетото tpl. Създаваме файл с име view.tpl, който се намира в папка templates. В него въвеждаме следното:
<title>{$content_title}</title>
</head>
<body>
<div id="header">{$header_text}</div>
<div id="content">
<h1>{$content_title}</h1>
<div>{$content}</div>
</div>
<div id="footer">{$footer_text}</div>
</body>
</html>
Сега се връщаме отново към контролера с php кода от преди малко.
След като сме получили стойности на променливите, описани по-горе, продължаваме под тях, като си създаваме Smarty обекта, свързваме променливите от изгледа със стойностите на променливите, които изведохме от базата данни и показваме на екрана шаблонния файл:
<?php
// ...
// Създаваме Smarty обект (Файлът Smarty.class.php трябва да е включен в текущия файл):
$view = new Smarty();
// Свързваме имена на променливи със стойности от нашите променливи.
// Това става чрез метода на Smarty обекта assign(), който приема два параметъра:
// първият - низ, с име на променливата в шаблона,
// вторият - стойност на променливата в шаблона, може да е php променлива, функция,
// конкретна стойност или всякакъв валиден израз.
$view->assign("header_text",$header_text);
$view->assign("content_title",$content_title);
$view->assign("content",$content);
$view->assign("footer_text",$footer_text);
// Методът assign може да приема за стойности и масиви, като за първи параметър
// се дава масив с имена, а за втори - масив със стойности.
// Горните извиквания могат да се заместят с:
// $view->assign(array("header_text","content_title","content","footer_text"),array($header_text,$content_title,$content,$footer_text));
// Остана да изобразим шаблонният файл на екрана.
// Това става чрез извикване на метода display() на Smarty обекта,
// който прима параметър низ, с пътя до файла. Пътя може да е
// относителен и пълен.
// Нашият шаблонен файл view.tpl се намира в папка templates:
$view->display("templates/view.tpl");
?>
Сега остана само да извикаме нашата страница през браузъра и готово. Това е най-простата употреба на Smarty. Разбира се, той има далеч повече възможности - масиви, цикли, функции, модификатори, за които ще става дума в следващи публикации. За сега толкова, ако ви е станало интересно може да разгледате сайта на Smarty - smarty.net за сваляне на фреймуорка и документация. Скоро ще разгледаме и по-интересните възможности, даващи голяма свобода на действие, по-малко писане, повече преизползване и разширение на фреймуорка - всичко това, което прави кодирането със Smarty наистина умно и удобно.