сряда, 4 април 2012 г.

Smarty Template Engine - кодирай умно!

Преди няколко месеца един преподавател в университета ни препоръча преди да сядаме и да пишем дадена програма или библиотека да проверим дали някой вече не е написал. Както се изрази тогава той, "Никой няма нужда от това, да преоткривате топлата вода". И въпреки, че в повечето случай аз предпочитам да си пиша нещата, вместо да използвам готови, има един фреймуорк, който ми стана любим за една област, в която нямам особен интерес и познания - буквичката "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 година".
В контролера извличаме тези стойности от базата данни:

<?php

// Извеждане стойностите от базата данни чрез даден алгоритъм и критерии
// и получаваме променливи със следните стойности:
$header_text = "Моят сайт за програмиране";
$content_title = "Създаване на приложения";
$content = "Някакво съдържание за създаване на приложения, извлечено от базата данни";
$footer_text = "Създадено от мен през 2012";

// Още код тук след малко...

?>

Сега да направим изгледа. Smarty използва текстови файлове с каквото и да е разширение, но най-често се използва tpl разширение. Аз по-често използвам html разширение, но сега ще използваме общоприетото tpl. Създаваме файл с име view.tpl, който се намира в папка templates. В него въвеждаме следното:

<html>
<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>
Разбира се, html кодът може да бъде много по-богат. Всъщност, може се да използва всичко, що ви хрумне, свързано с HTML, CSS, JavaScript и прочее. Единственото условие за употребата на CSS и JavaScript директно във файла с изгледа (чрез таговете <style> ... и <script> ...) е кода им да е заграден в Smarty блока (за блоковете малко по-късно) {literal} вашият css/javascript код {/literal}, защото Smarty ще се опита да разпознае използваните големи скоби в двата вида код като променливи или други части на фреймуорка и ще доведе до грешка.

Сега се връщаме отново към контролера с 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 наистина умно и удобно.