Smarty
Çàäà÷à îòäåëåíèÿ äèçàéíà îò îôîðìëåíèÿ ïîÿâèëàñü ïî÷òè ñðàçó ïîñëå ñîçäàíèÿ ïåðâîãî âåá-èíòåðïðåòàòîðà äëÿ äèíàìè÷åñêîãî ñàéòà. Ê ñîæàëåíèþ, ïñèõîëîãèÿ è êóëüòóðà ñîâðåìåííîãî îáùåñòâà õîòü è äîïóñêàþò ñîâìåùåíèå òàëàíòà äèçàéíåðà è óñèä÷èâîñòè òåõíè÷åñêîãî ñïåöèàëèñòà â îäíîì ëèöå, íî íà ñàìîì äåëå ñëó÷àè óäà÷íîãî ñîâìåùåíèÿ ðàáîòû ñ «êàðòèíêîé» è «êîäîì» äîñòàòî÷íî ðåäêè. ×òîáû ðàçäåëèòü ïðåäñòàâëåíèå ñàéòà îò äâèæêà åãî íàïîëíåíèÿ, òî÷íåå êîäîâîé ÷àñòè, áûëî âûäóìàíî òàê íàçûâàåìîå øàáëîííîå ðàçäåëåíèå. Ñàìà ïî ñåáå èäåÿ ðàçäåëèòü äîêóìåíò îò åãî îôîðìëåíèÿ âîçíèêëà ÷óòü ëè íå ðàíüøå ñîçäàíèÿ Windows ñ âåá-áðàóçåðîì Internet Explorer. Äåëî â òîì, ÷òî MFC (Microsoft Foundation Classes — îäíà èç îñíîâíûõ áèáëèîòåê-êîíöåïöèé MS Windows) ïðåäïîëàãàåò ðàçäåëåíèå íà äîêóìåíò è êîäîâóþ ÷àñòü. Äåëî î ðàçäåëåíèè äîøëî äî òîãî, ÷òî î÷åíü ïîïóëÿðíàÿ â îïðåäåëåííûõ äåëîâûõ êðóãàõ ïðîãðàììà "1C:Ïðåäïðèÿòèå" èìååò îòäåëüíûå ìîäóëè äëÿ ðàáîòû ñ ôîðìîé äîêóìåíòà è åãî àíàëèòè÷åñêîé ÷àñòüþ.
Smarty ïðåäñòàâëÿåò ñîáîé íå ïðîñòî íåêèé ïðîãðàììíûé ïðîäóêò äëÿ ñîçäàíèÿ âåá-ñàéòà è ðàçäåëåíèÿ òðóäà ðàçëè÷íûõ ñïåöèàëèñòîâ íà íèâå ðàçðàáîòêè ñàéòîâ. Ýòî öåëûé ðàçäåë âåá-ñàéòà èíòåðïðåòàòîðà PHP. Ýòî ìàññà ñïåöèàëüíûõ âîçìîæíîñòåé, êîòîðûå âêëþ÷åíû â èíòåãðèðîâàííûå ñðåäû äëÿ áûñòðîé PHP-ðàçðàáîòêè. Îäíàêî â ëþáîì ñëó÷àå èñïîëüçîâàíèå øàáëîííîãî ñòèëÿ ïðîãðàììèðîâàíèÿ âåá-ñàéòîâ ÿâëÿåòñÿ, íåñîìíåííî, îñíîâíûì ïðåäíàçíà÷åíèåì ýòîãî ìîíñòðà ìèðà ðàçäåëåíèÿ ñëîâà è îôîðìëåíèÿ â Ñåòè.
Èòàê, ïåðå÷èñëþ, êàêèå îñíîâíûå âîçìîæíîñòè ïðåäëàãàåò âàì ýòîò ìåõàíèçì:
- ìàñøòàáèðóåìûé òåìïëåéò-äâèæîê, â êîòîðîì åñòü âîçìîæíîñòü ðàñøèðåíèÿ è íàïèñàíèÿ ñîáñòâåííûõ ïîëüçîâàòåëüñêèõ ôóíêöèé;
- îòëàäî÷íûå âîçìîæíîñòè, âêëþ÷àþùèåñÿ ñ ïîìîùüþ óñòàíîâêè çíà÷åíèÿ åäèíñòâåííîãî ìåòîäà êëàññà;
- âîçìîæíîñòü èñïîëüçîâàíèÿ âñòðîåííûõ öèêëîâ, âåòâëåíèé è ðàçíîîáðàçíûõ ôóíêöèé;
- ìîäèôèêàòîðû ïåðåìåííûõ;
- êîíôèãóðàöèîííûå ïåðåìåííûå è ôàéëû, äîñòóïíûå äëÿ äèçàéíåðà.
Èçó÷åíèå òàêîãî øèðîêîìàñøòàáíîãî ìåõàíèçìà äîñòàòî÷íî ïðîñòî èìåííî ïî ïðè÷èíå åãî ìàñøòàáèðóåìîñòè. Ñàìûå ïðîñòûå âîçìîæíîñòè äîñòóïíû íåïîñðåäñòâåííî ïîñëå óñòàíîâêè äâèæêà. Ñêà÷àòü ïîñëåäíèé ðåëèç Smarty ìîæíî â ðàçäåëå «Çàãðóçêà» îôèöèàëüíîãî ñàéòà ñèñòåìû. Íà ìîìåíò íàïèñàíèÿ ñòàòüè ïîñëåäíèì ðåëèçîì Smarty áûë 2.6.13, âûïóùåííûé áîëåå ïîëóãîäà íàçàä. À ýòî îçíà÷àåò, ÷òî, åñëè âû õîòèòå ñàìóþ ïîñëåäíþþ (÷òî íå çíà÷èò ñòàáèëüíóþ) âåðñèþ ñèñòåìû, âàì ñëåäóåò èñïîëüçîâàòü ðåïîçèòàðèé CVS. Áîëåå ïîäðîáíî ïðî ìåòîäû, ñ ïîìîùüþ êîòîðûõ ìîæíî ðàáîòàòü ñ õðàíèëèùåì èñõîäíûõ êîäîâ ñèñòåìû, ðàñïèñàíî â óïîìÿíóòîì âûøå ðàçäåëå «Çàãðóçêà».
Óñòàíîâêà ñèñòåìû øàáëîííîãî ìåõàíèçìà èìååò ñìûñë îáû÷íî â êîíòåêñòå ðàçðàáîòêè èëè ìîäåðíèçàöèè âåá-ñàéòà. Êîíå÷íî, ìîæíî èñïîëüçîâàòü Smarty è äëÿ óäîáíîé ãåíåðàöèè html-ïèñåì äëÿ âàøåé ðàññûëêè, íî âñå-òàêè äàæå â ýòîì ðåæèìå ñìûñë ñâîäèòñÿ ê ãåíåðàöèè html-êîíòåíòà. Ïîñêîëüêó ñàì ïî ñåáå ðàçìåð èñõîäíûõ êîäîâ ïðîãðàìì Smarty äîñòàòî÷íî íåâåëèê è â ñëó÷àå èñïîëüçîâàíèÿ òîëüêî îñíîâíûõ åãî ôóíêöèé ñîñòàâëÿåò ÷óòü ìåíüøå 350 Êá â ðàñïàêîâàííîì âèäå, òî âñòðîèòü äâèæîê ìîæíî ïðàêòè÷åñêè â ëþáîå âåá-ïðèëîæåíèå. Èñïîëüçîâàíèå øàáëîííîé ñèñòåìû ñëåäóåò íà÷àòü ñ êîïèðîâàíèÿ íåîáõîäèìûõ ôàéëîâ â âàø âåá-êàòàëîã è ïðîïèñûâàíèÿ âûçîâîâ íåêîòîðûõ êëþ÷åâûõ ôóíêöèé ìåõàíèçìà. Èäåàëüíî, åñëè âàø ñàéò èìååò âñòðîåííûé âî âñå ñêðèïòû êîíôèãóðàöèîííûé ôàéë èëè ÷òî-òî âðîäå ýòîãî.  òàêîì ñëó÷àå ñàìà ïðîöåäóðà èíèöèàëèçàöèè ïîäêëþ÷åíèÿ øàáëîííîãî ìåõàíèçìà ñâîäèòñÿ ê áàíàëüíîìó ñîçäàíèþ íîâîãî ýêçåìïëÿðà êëàññà Smarty, êîòîðûé áóäåò îòâå÷àòü çà ðàáîòó âñåãî ìåõàíèçìà.
Äëÿ âûâîäà â íåñêîëüêèõ ìåñòàõ ñàéòà îäíîãî è òîãî æå çíà÷åíèÿ åñòü ñìûñë èñïîëüçîâàòü òàê íàçûâàåìûå ïåðåìåííûå øàáëîíà.  Smarty òàêèå ïåðåìåííûå áûâàþò ñëåäóþùèõ âèäîâ:
- ïåðåìåííûå, èíèöèàëèçèðîâàííûå â êîäå ïðîãðàììíîãî ìîäóëÿ;
- êîíôèãóðàöèîííûå ïåðåìåííûå, êîòîðûå óñòàíàâëèâàþòñÿ â ñïåöèàëüíûõ ôàéëàõ.
Êðîìå òîãî, äëÿ äîñòóïà ê ýëåìåíòàì ìàññèâîâ êóêèñîâ è òîìó ïîäîáíûì çàäà÷àì â øàáëîííîì ìåõàíèçìå åñòü ñïåöèàëüíàÿ îäíîèìåííàÿ ïåðåìåííàÿ $smarty.
Èíèöèàëèçàöèÿ ïåðåìåííîé â êîäå ïðîèñõîäèò c ïîìîùüþ âûçîâà ìåòîäà assign ïðèìåðíî ñëåäóþùèì îáðàçîì:
<?
require './smarty/Smarty.class.php';
$smarty = new Smarty;
$smarty->compile_check = true;
$smarty->assign("test", "Ñòðîêà òåñòà");
$smarty->display('index.tpl');
?>
Ñàì øàáëîí ðàñïîëàãàåòñÿ â ïîäêàòàëîãå templates è ìîæåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Òåñòîâàÿ ñòðîêà: {$test}
 âåðõíåì ðåãèñòðå: {$test|upper}
 íèæíåì ðåãèñòðå: {$test|lower}
Ñ ïîìîùüþ ýòîãî øàáëîíà è ïðèâåäåííîãî âûøå ñêðèïòà âûâîäèòñÿ ïðèáëèçèòåëüíî òàêîé òåêñò:
Òåñòîâàÿ ñòðîêà: Ñòðîêà òåñòà
 âåðõíåì ðåãèñòðå: ÑÒÐÎÊÀ ÒÅÑÒÀ
 íèæíåì ðåãèñòðå: ñòðîêà òåñòà
Ñëåäóåò îòìåòèòü, ÷òî ñ ïîìîùüþ ìåòîäà assign òàêæå ìîæíî ïðèñâîèòü ïåðåìåííîé øàáëîíà çíà÷åíèÿ, êîòîðûå èìåþò òèï PHP-ìàññèâà. Ýòî íåîáõîäèìî â ðÿäå ñëó÷àåâ äëÿ áîëåå ýôôåêòèâíîãî âûâîäà êîíòåíòà ñ ïîìîùüþ öèêëîâ è äðóãèõ ôóíêöèé.
Äëÿ áîëåå òî÷íîãî óïðàâëåíèÿ âîçìîæíîñòÿìè ïðîãðàììíîãî êîäà è ñïåöèàëüíî äëÿ îòëàäêè âåðñèè ñàéòà â Smarty ïðåäóñìîòðåíà ñïåöèàëüíàÿ âîçìîæíîñòü — îòëàäî÷íîå îêíî.  íàøåì òåñòîâîì ïðèìåðå çà åãî àêòèâàöèþ îòâå÷àåò ñëåäóþùàÿ ñòðîêà êîäà:
$smarty->debugging = true;
È åñëè âû âêëþ÷èòå âûçîâ òàêîãî ìåòîäà êëàññà øàáëîííîãî ìåõàíèçìà â âàøåì ïðèëîæåíèè, òî íà âûõîäå ïîëó÷èòå îêíî c îòëàäî÷íîé èíôîðìàöèåé. Ñàìî ñîáîé ðàçóìååòñÿ, ÷òî äëÿ ïðîñìîòðà îòëàäêè â áðàóçåðå íåîáõîäèìî ðàçðåøèòü âñïëûâàþùèå îêíà, ïî êðàéíåé ìåðå äëÿ õîñòèíãà, íà ïëîùàäêå êîòîðîãî âû áóäåòå çàïóñêàòü ñàéò ñî âñòðîåííûì Smarty.
Çà÷àñòóþ âåá-äèçàéíåð õî÷åò ïðèâíåñòè â ñîçäàâàåìûé èì ñàéò èíäèâèäóàëüíûå ÷åðòû. È çà÷àñòóþ ýòî òðåáóåò òàêæå íåêîòîðûõ óñèëèé îò ñîçäàòåëÿ êîäà. Íàïðèìåð, òàêàÿ òðèâèàëüíàÿ ïðîáëåìà, êàê îãðàíè÷åíèå âûâîäà êàêèì-ëèáî ÷èñëîì ñèìâîëîâ èëè ïðåîáðàçîâàíèå òåêñòà â âåðõíèé ðåãèñòð, â Smarty ìîæåò ðåøàòüñÿ íà óðîâíå îôîðìëåíèÿ.  ïðèâåäåííîì âûøå ïðèìåðå ÷åðåç âåðòèêàëüíóþ ÷åðòó óêàçàíû òàê íàçûâàåìûå ìîäèôèêàòîðû ñòðîê. Îíè âñòðîåíû â øàáëîííûé ïðîöåññîð èçíà÷àëüíî è ïðåäíàçíà÷åíû äëÿ ðàáîòû ñ ëþáûìè ïåðåìåííûìè. Âîò ëèøü íåáîëüøîé ñïèñîê âîçìîæíûõ îïåðàöèé, êîòîðûå îíè ïîçâîëÿþò âûïîëíèòü:
- capitalize — ïðèâåñòè ïåðâûé ñèìâîë ñòðîêè ê âåðõíåìó ðåãèñòðó;
- cat — äîáàâèòü ê âûâîäó ñòðîêó;
- date_format — ôîðìàòèðîâàòü â âèäå äàòû;
- default — èñïîëüçóåòñÿ äëÿ çàäàíèÿ çíà÷åíèÿ ïåðåìåííîé ïî óìîë÷àíèþ, åñëè îíà ÿâíî íå èíèöèàëèçèðîâàííàÿ ãäå-ëèáî åùå;
- lower — ïåðåâîä òåêñòà â íèæíèé ðåãèñòð;
- spacify — óâåëè÷èòü äëèíó ñòðîêè ïóòåì âñòàâêè ïðîáåëîâ ìåæäó ñèìâîëàìè;
- wordwrap — ðàçáèòü ñòðîêó ñ ïîìîùüþ ïåðåíîñîâ ïî óêàçàííîé äëèíå.
Êðîìå ïåðå÷èñëåííûõ Smarty ïîçâîëÿåò èñïîëüçîâàòü åùå íåñêîëüêî ìîäèôèêàòîðîâ. Èõ ïîëíûé ïåðå÷åíü ìîæíî ïðîñìîòðåòü â ñîîòâåòñòâóþùåì ðàçäåëå ðóññêîÿçû÷íîé îíëàéí-äîêóìåíòàöèè ïî ñèñòåìå Smarty.
 çàâèñèìîñòè îò îïðåäåëåííûõ óñëîâèé øàáëîí ìîæåò âûâîäèòü òå èëè èíûå çíà÷åíèÿ. ßðêèì ïðèìåðîì òàêîé íåîáõîäèìîñòè ÿâëÿåòñÿ âûâîä àäìèíèñòðàòèâíûõ ñåêöèé ìåíþ â ñëó÷àå óäà÷íîé àóòåíòèôèêàöèè â ñèñòåìå. Äëÿ âñòàâêè îïðåäåëåííîãî êóñêà äèçàéíà â çàâèñèìîñòè îò îïðåäåëåííûõ óñëîâèé Smarty ïîçâîëÿåò ïðèìåíÿòü òàê íàçûâàåìûå óñëîâèÿ:
{if $name eq "admin"}
Àäìèíèñòðàòîð.
{else}
Ïîëüçîâàòåëü.
{/if}
Ôóíêöèÿ {if} ÿâëÿåòñÿ îäíîé èç íåñêîëüêèõ, êîòîðûå âñòðîåíû â Smarty èçíà÷àëüíî. Êðîìå íåå åñòü (óæå ïðèâåäåííûå âûøå) ôóíêöèè äëÿ îðãàíèçàöèè öèêëîâ, çàãðóçêè êîíôèãóðàöèîííûõ ôàéëîâ, íåïîñðåäñòâåííîãî âûïîëíåíèÿ PHP-êîäà è íåêîòîðûå äðóãèå. Îäíàêî, íàâåðíîå, îäíèìè èç ñàìûõ âîñòðåáîâàííûõ áóäóò ÿâëÿòüñÿ ôóíêöèè äëÿ îðãàíèçàöèè öèêëîâ.
Íèæå ïðèâåäåí ïî÷òè êíèæíûé ïðèìåð, êàê ìîæåò âûãëÿäåòü ïðîöåäóðà öèêëè÷íîãî âûâîäà äàííûõ ñ ïîìîùüþ Smarty:
<?
require './smarty/Smarty.class.php';
$smarty = new Smarty;
$smarty->compile_check = true;
$smarty->debugging = true;
$smarty->assign("test", array("Ãåðìàíèè","Óêðàèíå","Ïîëüøå","Ôðàíöèè","Àíãëèè"));
$smarty->display('index.tpl');
?>
Ïðèâåäåííûé êîä ðàññ÷èòàí íà òî, ÷òî âû ñêîïèðîâàëè áèáëèîòåêè âàøåãî øàáëîííîãî ìåõàíèçìà, êîòîðûå íàõîäÿòñÿ â ïîäêàòàëîãå libs âàøåãî èíñòàëëÿöèîííîãî ïàêåòà, â ïîäêàòàëîã smarty âàøåãî âåá-ïðèëîæåíèÿ. Òàêàÿ ïðîñòåéøàÿ ïðîöåäóðà âûçîâà ïîäðàçóìåâàåò, ÷òî áóäåò èñïîëüçîâàí øàáëîí index.tpl, â êîòîðîì áóäåò ðàñïîëàãàòüñÿ âñÿ íåîáõîäèìàÿ äëÿ âûâîäà ðàçìåòêà.  ïðîñòåéøåì ñëó÷àå äëÿ âûâîäà ýëåìåíòîâ ìàññèâà test, êîòîðîìó â êà÷åñòâå çíà÷åíèÿ ïðèñâîåíû íàçâàíèÿ ñòðàí, øàáëîí templates/index.tpl ìîæíî ñîñòàâèòü ñëåäóþùèì îáðàçîì:
Íàø ïðîäóêò ïðîäàåòñÿ â
<ul>
{section name=ch1 loop=$test}
<li>{$test[ch1]}</li>
{/section}
</ul>
![]() |
Âîò òàê âûãëÿäÿò îêíî îòëàäêè è òåñòîâûé ïðèìåð |
Íåñìîòðÿ íà âñþ ïðîñòîòó ïðèâåäåííîãî òåñòîâîãî ïðèìåðà, â íåì ïîêàçàíà îäíà èç âàæíåéøèõ ôóíêöèé, êîòîðàÿ çàëîæåíà ðàçðàáîò÷èêàìè Smarty â ñâîé äâèæîê. Ðå÷ü èäåò î âñòðîåííûõ öèêëàõ. Ñàìà êîíñòðóêöèÿ ñèíòàêñèñà èìååò ñëåäóþùèé âèä:
{section name=ÈìÿÑåêöèè loop=$Ìàññèâ}
<li>{$Ìàññèâ[ÈìÿÑåêöèè]}</li>
{/section}
Íàçâàíèå ÈìÿÑåêöèè — ýòî ïðîèçâîëüíî âûáðàííîå èìÿ öèêëà è îäíîâðåìåííî íàçâàíèå ñ÷åò÷èêà â ýòîì öèêëå. Ñàì ïî ñåáå öèêë âûïîëíÿåòñÿ â ïðîñòåéøåì ñëó÷àå ïî âñåì çíà÷åíèÿì, êîòîðûå äîëæíû áûòü ïðåäâàðèòåëüíî çàíåñåíû â ìàññèâ PHP.
Êàê ïðàâèëî, òàêîé ïðîñòîé ïðèìåð, êàê öèêë ñ åäèíè÷íîé âëîæåííîñòüþ, èñïîëüçóåòñÿ íå òàê ÷àñòî, êàê õîòåëîñü áû ðàçðàáîò÷èêàì êîäà. Áîëåå ñëîæíûì ÿâëÿåòñÿ âëîæåííûé öèêë, êîòîðûé ìîæíî èñïîëüçîâàòü, íàïðèìåð, äëÿ âûâîäà ìåíþ âàøåãî ñàéòà. Ñàìî ñîáîé, ÷òî, äëÿ òîãî ÷òîáû âûâåñòè êàêîå-ëèáî çíà÷åíèå, åãî íàäî ñíà÷àëà ïîäãîòîâèòü.  ïðîñòåéøåì ñëó÷àå ïîäãîòîâêà äâóõóðîâíåâîãî ìàññèâà ê âûâîäó áóäåò âûãëÿäåòü, íàïðèìåð, ñëåäóþùèì îáðàçîì:
<?
require './smarty/Smarty.class.php';
$smarty = new Smarty;
$smarty->compile_check = true;
$smarty->debugging = true;
$testa = array
(
0=>array("Ãëàâíàÿ"),
1=>array("Íîâîñòè", array("Îòå÷åñòâåííûå","Çàðóáåæíûå")),
2=>array("Ñòàòüè", array("LAMP","1C","Oracle"))
);
$smarty->assign("test", $testa);
$smarty->display('index.tpl');
?>
Äëÿ âûâîäà òàêîãî ìàññèâà ñëåäóåò ïðèìåíÿòü øàáëîí ñ âëîæåííûì öèêëîì, Smarty îòëè÷íî ñïðàâëÿåòñÿ è ñ ýòîé îáÿçàííîñòüþ:
Êàðòà ñàéòà:<br>
<ul>
{section name=ch1 loop=$test}
<li>{$test[ch1][0]}</li>
<ul>
{section name=ch2 loop=$test[ch1][1]}
<li>{$test[ch1][1][ch2]}</li>
{/section}
</ul>
{/section}
</ul>
![]() |
Âîò òàê âûâîäèòñÿ ïðèìåð ñ äâîéíûì öèêëîì |
Àðñåíàë ñèñòåìû îðãàíèçàöèè øàáëîíîâ Smarty äîñòàòî÷íî øèðîê. Çäåñü åñòü âñå ýëåìåíòû, êîòîðûå ïðèñóùè âçðîñëîìó ÿçûêó ïðîãðàììèðîâàíèÿ, à íå îáû÷íîé áèáëèîòåêå. Ãëàâíûì ïðåèìóùåñòâîì Smarty ÿâëÿåòñÿ âîçìîæíîñòü äîñòàòî÷íî ïðîñòîãî ñòàðòà. Äëÿ íà÷àëà ðàáîòû ñ ñèñòåìîé íàäî âñåãî ëèøü ñêîïèðîâàòü íåáîëüøîå êîëè÷åñòâî êîäà è ïðîïèñàòü èíèöèàëèçàöèþ ïåðåìåííîé êëàññà.  èòîãå íà÷àëî ðàáîòû ñ ñèñòåìîé ìîæíî ïîëîæèòü â ëþáîé ìîìåíò âàøåé ðàçðàáîòêè, ÷åì çíà÷èòåëüíî óïðîñòèòü æèçíü ñåáå è ñâîåìó âåá-ìàñòåðó.