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 ÿâëÿåòñÿ âîçìîæíîñòü äîñòàòî÷íî ïðîñòîãî ñòàðòà. Äëÿ íà÷àëà ðàáîòû ñ ñèñòåìîé íàäî âñåãî ëèøü ñêîïèðîâàòü íåáîëüøîå êîëè÷åñòâî êîäà è ïðîïèñàòü èíèöèàëèçàöèþ ïåðåìåííîé êëàññà.  èòîãå íà÷àëî ðàáîòû ñ ñèñòåìîé ìîæíî ïîëîæèòü â ëþáîé ìîìåíò âàøåé ðàçðàáîòêè, ÷åì çíà÷èòåëüíî óïðîñòèòü æèçíü ñåáå è ñâîåìó âåá-ìàñòåðó.