Smarty – íå ïðîñòî øàáëîíû
Ñîäåðæàíèå
Âñòóïëåíèå
Êîìïîíåíòíàÿ ìîäåëü
Îáùèå êëàññû
Ôóíêöèÿ «Êîìïîíåíò»
Êîìïîíåíò
Îáìåí äàííûìè ìåæäó êîìïîíåíòàìè
Èòîãè
Âñòóïëåíèå
Ñêàæåì ñðàçó, ýòîò ìàòåðèàë íå áóäåò âàñ ó÷èòü ïîëüçîâàòüñÿ áàçîâûìè âîçìîæíîñòÿìè äàííîé áèáëèîòåêè. Íàïðîòèâ, ÿ êàïíó ãîðàçäî ãëóáæå. Öåëü ýòîãî ìàòåðèàëà âçãëÿíóòü íà øàáëîíèçàòîð Smarty ñ äðóãîé ñòîðîíû, è óâèäåòü â íåì íå ïðîñòî î÷åíü óäîáíûé è ìîùíûé øàáëîííûé äâèæåê, à íåêèé ôðåéìâîðê äëÿ ðàçðàáîòêè âàøèõ ïðèëîæåíèé.
×àñòî, ãîâîðÿ î Smarty, íåçàñëóæåííî îáâèíÿþò åãî â íèçêîé ïðîèçâîäèòåëüíîñòè è «òîðìîçíóòîñòè», ÷òî æ – àâòîð äàííîãî ìàòåðèàëà ñ óêàçàííûìè òîâàðèùàìè íå ñîãëàñåí. Íàïðîòèâ, ðàç óæ ìû ïðèíÿëè ðåøåíèå èñïîëüçîâàòü â ñâîåì ïðèëîæåíèè ýòó áèáëèîòåêó, ÿ ïðåäëàãàþ âàì íà ïîëíóþ êàòóøêó çàäåéñòâîâàòü åå âîçìîæíîñòè, îòäàâ íà îòêóï øàáëîíèçàòîðó êàê âûâîä èíôîðìàöèè ïîëüçîâàòåëþ, òàê è óïðàâëåíèå ýòîé èíôîðìàöèåé.
Êîìïîíåíòíàÿ ìîäåëü
Îäíà èç ñèëüíûõ ñòîðîí Smarty – ýòî âîçìîæíîñòü ñîçäàâàòü ñâîè ïëàãèíû è ðàñøèðåíèÿ. Âîñïîëüçóåìñÿ ýòîé åãî âîçìîæíîñòüþ â ïîëíîé ìåðå è ïîïðîáóåì ðåàëèçîâàòü íà åå îñíîâå êîìïîíåíòíóþ ìîäåëü ñàéòà.
×òî òàêîå â íàøåì ïîíèìàíèè êîìïîíåíò? Ïîä êîìïîíåíòîì ÿ áóäó ïîäðàçóìåâàòü îáîñîáëåííûé áëîê ñàéòà, êîòîðûé óìååò âûïîëíÿòü ñòðîãî îïðåäåëåííûé íàáîð äåéñòâèé è, â ðåçóëüòàòå ñâîåé ðàáîòû, ëèáî âûâîäèòü ÷òî-ëèáî íà ýêðàí, ëèáî ãîòîâèòü êàêèå-òî äàííûå äëÿ äðóãèõ êîìïîíåíòîâ.
Êîìïîíåíò – ýòî ýëåìåíò ñàéòà, êîòîðûé, âî-ïåðâûõ, òî÷íî çíàåò êàêèå äåéñòâèÿ îí ìîæåò ñîâåðøàòü, âî-âòîðûõ, êàêèå áèáëèîòåêè äëÿ ñîâåðøåíèÿ ýòèõ äåéñòâèé åìó íóæíû.
 ðåçóëüòàòå ñàéò áóäåò ñîñòîÿòü èç ÿäðà - íàáîðà áèáëèîòåê (êëàññîâ), êîòîðûå ñîäåðæàò â ñåáå êàêèå-òî íèçêîóðîâíåâûå äåéñòâèÿ, íàïðèìåð ðàáîòàþò ñ áàçîé, – è êîìïîíåíòû, êîòîðûå ïîäêëþ÷àþò ýòè áèáëèîòåêè è, â íóæíîì ïîðÿäêå, âûçûâàþò òå èëè èíûå èõ ìåòîäû.
 ÷åì ïîëîæèòåëüíàÿ ñòîðîíà òàêîãî ïîäõîäà?
- âû ïèøèòå ñïåöèàëüíûå êëàññû (îáúåêòû) ÿäðà ñâîåãî ñàéòà, îíè íèêàê íå çàâèñÿò îò âûâîäà íà ýêðàí, à ïðîñòî ïîäãîòàâëèâàþò è îáðàáàòûâàþò äàííûå, òåì ñàìûì îáåñïå÷èâàåòñÿ âûñîêàÿ ïåðåíîñèìîñòü êîäà è âîçìîæíîñòü åãî ïîâòîðíîãî èñïîëüçîâàíèÿ;
- â ñëó÷àå êîìàíäíîé ðàáîòû, âàì íå íàäî çàáîòèòüñÿ î òîì, ÷òî äåëàåò ñîñåäíèé ïðîãðàììèñò, êîòîðûé ïèøåò ñâîé êîìïîíåíò;
- ñòàíäàðòèçàöèÿ êîäà – âû ìîæåòå ñîçäàòü èíòåðôåéñ êîìïîíåíòà è ñòðîãî ñëåäîâàòü åãî òðåáîâàíèÿì, ÷òî ïîçâîëèò îäíîìó ïðîãðàììèñòó ëåãêî ðàçîáðàòüñÿ â êîìïîíåíòå äðóãîãî ïðîãðàììèñòà.
Ýòî îñíîâíûå ïðåèìóùåñòâà äàííîãî ïîäõîäà.
Îáùèå êëàññû
Áåçóñëîâíî, â êàæäîì ïðèëîæåíèè åñòü íàáîð êëàññîâ, êîòîðûå íóæíû âñåì, èëè áîëüøèíñòâó êîìïîíåíòîâ, íàïðèìåð, êëàññ äëÿ ðàáîòû ñ áàçîé. Êàê ïîñòóïèòü â òàêîì ñëó÷àå? È äëÿ ýòîé ïðîáëåìû â Smarty åñòü óäà÷íîå ðåøåíèå. Âïðî÷åì, äàâàéòå ïî ïîðÿäêó.
Ñíà÷àëà èíèöèàëèçèðóåì êëàññ Smarty:
<?php |
Èòàê, Smarty ãîòîâ ê ðàáîòå. ×òî íåîáõîäèìî ñäåëàòü ñ îáùèìè êëàññàìè, ÷òîáû îáåñïå÷èòü äîñòóï ê íèì âíóòðè ëþáîãî êîìïîíåíòà?
Ñêàæåì, ó íàñ åñòü íåñêîëüêî îáùèõ êîìïîíåíòîâ:
- adodb – êëàññ äëÿ ðàáîòû ñ áàçîé;
- session – êëàññ äëÿ ðàáîòû ñ ñåññèÿìè;
- errors – êëàññ äëÿ îáðàáîòêè îøèáîê;
- variables – êëàññ äëÿ õðàíåíèÿ è îáðàáîòêè ñîñòîÿíèÿ ìàññèâîâ $_GET è $_POST.
Ïåðâûì äåëîì, íàì íåîáõîäèìî ñîçäàòü îáúåêòû äàííûõ êëàññîâ (ïàðàìåòðû êîíñòðóêòîðîâ çàâèñÿò îò âàøåé êîíêðåòíîé ðåàëèçàöèè). Â öåëîì, ýòî äåëàåòñÿ ñòàíäàðòíûì îáðàçîì:
<?php |
Îáúåêòû ñîçäàíû è òåïåðü íåîáõîäèìî îáåñïå÷èòü äîñòóï ê íèì â ëþáîì êîìïîíåíòå íàøåãî ïðèëîæåíèÿ. Äëÿ ýòîãî íåîáõîäèìî çàðåãèñòðèðîâàòü äàííûå îáúåêòû â Smarty:
<?php |
Äëÿ ðåãèñòðàöèè îáúåêòîâ ìû èñïîëüçóåì ìåòîä Smarty register_object(). Ïîñëå ÷åãî âàø îáúåêò ñòàíåò äîñòóïíûì âåçäå, ãäå îí ìîæåò ïîíàäîáèòüñÿ. Êàê «äîñòàòü» íóæíûé âàì çàðåãèñòðèðîâàííûé îáúåêò ìû ðàññìîòðèì â ñëåäóþùåé ÷àñòè.
Ôóíêöèÿ «Êîìïîíåíò»
Ê òåêóùåìó ìîìåíòó Smarty íè÷åãî íå çíàåò î êàêèõ-ëèáî êîìïîíåíòàõ, è íàì íàì íàäî íàó÷èòü åãî ðàáîòàòü ñ íèìè. Äëÿ ýòîãî ìû äîáàâëÿåì ê ñèíòàêñèñó øàáëîíîâ íîâûé òåã – {component}. ×òîáû Smarty íàó÷èëñÿ îáðàáàòûâàòü ýòîò òåã – ïèøåì ïðîñòóþ ôóíêöèþ:
<?php |
Äàâàéòå ðàçáåðåìñÿ, ÷òî äåëàåò äàííàÿ ôóíêöèÿ. Âî-ïåðâûõ, îíà ñîçäàåò îáðàáîò÷èê äëÿ íîâîãî òåãà – {component}, âî-âòîðûõ, äîñòàåò (get_registered_object()) è äåëàåò äîñòóïíûìè âûçâàííîìó êîìïîíåíòó çàðåãèñòðèðîâàííûå ðàíåå îáùèå îáúåêòû.
Íåìíîæêî òåîðèè. ×òîáû âûçâàòü äàííóþ ôóíêöèþ ê æèçíè, íåîáõîäèìî â ëþáîì øàáëîíå íàïèñàòü òýã {component}. Ïîñêîëüêó ôóíêöèÿ íå âûïîëíÿåò íèêàêèõ ïðîäóêòèâíûõ äåéñòâèé, è ñëóæèò èñêëþ÷èòåëüíî äèñïåò÷åðîì êîìïîíåíòîâ, ïðîñòî íàïèñàòü {component} íåäîñòàòî÷íî, ïîñêîëüêó ýòà êîìàíäà íåèíôîðìàòèâíà. Êîíå÷íî, ôóíêöèÿ íå äàñò ñáîÿ, è çàïóñòèò ïðèíÿòûé ïî óìîë÷àíèþ êîìïîíåíò 'site_view'. Êàêèì îáðàçîì óòî÷íèòü, êàêîé èìåííî êîìïîíåíò âàì òðåáóåòñÿ è êàê ïåðåäàòü åìó äîïîëíèòåëüíûå ïàðàìåòðû? Âñå î÷åíü ïðîñòî, ìû íåñêîëüêî èçìåíè âûçîâ êîìïîíåíòà â øàáëîíå:
{component name='èìÿ òðåáóåìîãî êîìïîíåíòà' var1='çíà÷åíèå ïàðàìåòðà' var2='çíà÷åíèå äðóãîãî ïàðàìåòðà'} |
È òàê äàëåå, êàê âû ïîíèìàåòå, name, var1, var2 – ýòî äîïîëíèòåëüíûå ïàðàìåòðû äëÿ íàøåãî êîìïîíåíòà. Name, íàïðèìåð, óêàçûâàåò èìÿ êîìïîíåíòà, êîòîðûé ìû õîòèì âûçâàòü, à îñòàëüíûå ïàðàìåòðû – ýòî äîïîëíèòåëüíûå äàííûå äëÿ âûçûâàåìîãî êîìïîíåíòà, èõ êîëè÷åñòâî ìîæåò áûòü ëþáûì, ðîâíî êàê è èõ èìåíà. Ïîñëå òîãî, êàê â øàáëîíå âñòðåòèòñÿ óêàçàííûé âûøå òåã, ïðîèçîéäåò âûçîâ íàøåé ôóíêöèè, êîòîðàÿ, â ñâîþ î÷åðåäü, âûçîâåò íóæíûé âàì êîìïîíåíò. Âñå äîïîëíèòåëüíûå ïàðàìåòðû áóäóò äîñòóïíû êàê â íàøåé ôóíêöèè òàê è â âûçûâàåìîì êîìïîíåíòå, îíè áóäóò ñîäåðæàòüñÿ â ìàññèâå $params, ãäå êëþ÷ – ýòî íàçâàíèå ïàðàìåòðà, à çíà÷åíèå – ñîîòâåòñòâåííî – åãî çíà÷åíèå.
Ìû ïðèíÿëè, ÷òî ôàéëû íàøèõ êîìïîíåíòîâ èìåíóþòñÿ ñëåäóþùèì îáðàçîì:
name.component.php |
ãäå name – ýòî íàø ïàðàìåòð name.
Ôóíêöèÿ èùåò â óêàçàííîé ïàïêå ôàéë ñ èìåíåì, ñôîðìèðîâàííûì óêàçàííûì îáðàçîì è èñïîëíÿåò åãî.  ñëó÷àå îòñóòñòâèÿ ïàðàìåòðà name çàïóñêàåò êîìïîíåíò, íàçíà÷åííûé ïî óìîë÷àíèþ, â ïðîòèâíîì ñëó÷àå – âûäàåò îøèáêó.
Ïîìèìî çàðåãèñòðèðîâàííûõ ðàíåå îáùèõ îáúåêòîâ, íàøèì êîìïîíåíòàì ïîëíîñòüþ äîñòóïíà âñÿ ìîùü øàáëîíèçàòîðà Smarty – ó âàñ åñòü îáúåêò $smarty. Îáðàùàþ òàêæå âíèìàíèå, ÷òî âñå ÷òî âû àññèãíèòå (assign) â îáúåêò $smarty, áóäåò òàêæå äîñòóïíî íå òîëüêî âàøåìó êîìïîíåíòó, íî è îáùåìó (âûçûâàþùåìó) øàáëîíó, à ýòî çíà÷èò, ÷òî êîìïîíåíòû âîâñå íå îáÿçàíû âñåãäà âûâîäèòü ÷òî-ëèáî íà ýêðàí, îíè âïîëíå ìîãóò ïåðåäàâàòü ïîäãîòîâëåííûå äàííûå â îáùèé øàáëîí, à îí, â ñâîþ î÷åðåäü, ìîæåò ïåðåäàòü èõ äðóãîìó êîìïîíåíòó, êîòîðûé íà îñíîâå èõ ìîæåò ÷òî-ëèáî âûâåñòè íà ýêðàí.
Äîïîëíèòåëüíûì ïðåèìóùåñòâîì òàêîãî ïîäõîäà îêàçûâàåòñÿ âîçìîæíîñòü ìîäåëèðîâàíèÿ ñàéòà ïóòåì íåõèòðîãî èçìåíåíèÿ åãî øàáëîíîâ – òî åñòü ïîëó÷àåòñÿ èíòåðåñíàÿ âçàèìîñâÿçü äèçàéíà è ëîãèêè. Ìû ïðèâûêëè, ÷òî ëîãèêà óïðàâëÿåò âûâîäîì, à çäåñü, îò÷àñòè, âûâîä óïðàâëÿåò ëîãèêîé.
Òàêæå îòìå÷ó, ÷òî âëîæåííîñòü êîìïîíåíòîâ ìîæåò áûòü áåñêîíå÷íîé. Òî åñòü êîìïîíåíò â ñâîåé ðàáîòå ìîæåò çàïóñòèòü êàêîé-òî ñâîé øàáëîí, êîòîðûé, â ñâîþ î÷åðåäü, ìîæåò âûçâàòü äðóãîé êîìïîíåíò.
Êîìïîíåíò
Íàñòàëî âðåìÿ ïîñìîòðåòü, ÷òî æå ó íàñ ïðåäñòàâëÿåò ñîáîé êîìïîíåíò. Êîìïîíåíò âûïîëíÿåò ðîëü äèñïåò÷åðà, îí áóäåò îáðàáàòûâàòü äåéñòâèÿ, êîòîðûå âû åìó îïðåäåëèòå, âûçûâàÿ òå èëè èíûå ìåòîäû ðàçíûõ êëàññîâ.
Ðàçóìååòñÿ, âàøà ðåàëèçàöèÿ êîìïîíåíòà ìîæåò áûòü ïîëíîñòüþ îòëè÷íà îò ìîåé – ÿ ïðèâåäó âàì ëèøü èëëþñòðèðóþùèå ïðèìåðû, ïîñêîëüêó öåëüþ äàííîé ñòàòüè íå ÿâëÿåòñÿ íàïèñàíèå êàêîãî-òî ðàáî÷åãî ïðèëîæåíèÿ.
Äàâàéòå ïðåäïîëîæèì, ÷òî íàø êîìïîíåíò âûâîäèò íîâîñòè íà ãëàâíóþ ñòðàíèöó. Íîâîñòåé òàì ìîæåò áûòü íå áîëåå 5 çà ðàç.
 øàáëîíå íàïèøåì òàê:
{component name='news' action='view' count=5 tpl='news_mainpage.tpl'} |
Ïàðàìåòð name óêàçûâàåò íà íóæíûé íàì êîìïîíåíò, action îáîçíà÷àåò äåéñòâèå, êîòîðîå òðåáóåòñÿ ñîâåðøèòü, count – ýòî ôèëüòð êîëè÷åñòâà íîâîñòåé, è tpl – íàçâàíèå øàáëîíà, êîòîðûé áóäåò èñïîëüçîâàí äëÿ ôîðìèðîâàíèÿ âûâîäà íîâîñòåé íà ýêðàí.
Òåïåðü äàâàéòå ïîñìîòðèì, êàê ìîã áû âûãëÿäåòü íàø êîìïîíåíò:
<?php |
Ýòîò ïðèìåð ïîêàçûâàåò óïðîùåííóþ ñõåìó ðàáîòû êîìïîíåíòà. Âû âïîëíå ìîæåòå åå ðàçâèòü è èçìåíèòü ïîä ñâîè íóæäû.
Êîëè÷åñòâî äåéñòâèé, êîòîðûå ìîæåò âûïîëíèòü êîìïîíåíò îãðàíè÷åíî ëèøü âàøåé ôàíòàçèåé, ðîâíî êàê è êîëè÷åñòâî è íàçâàíèÿ ïàðàìåòðîâ, êîòîðûå âû ìîæåòå ïåðåäàòü èç øàáëîíà â êîìïîíåíò.
Îáìåí äàííûìè ìåæäó êîìïîíåíòàìè
Íåìíîãî îñòàíîâëþñü íà ðàçäåëåíèè êîìïîíåíòîâ íà òèïû: prepare – ýòè êîìïîíåíòû íè÷åãî íå âûâîäÿò íà ýêðàí, îíè òîëüêî ïîäãîòàâëèâàþò äàííûå äëÿ äðóãèõ êîìïîíåíòîâ èëè îáùåãî (ãëàâíîãî) øàáëîíà, è view – ýòè êîìïîíåíòû îáÿçàòåëüíî â ðåçóëüòàòå ñâîåé ðàáîòû ÷òî-òî âûâîäÿò íà ýêðàí.
Äàâàéòå ïîñìîòðèì, êàêèì îáðàçîì êîìïîíåíò prepare ìîæåò ïîäãîòîâèòü äàííûå äëÿ êîìïîíåíòà view.
<?php |
Èç äàííîãî ôðàãìåíòà âèäíî, ÷òî êîìïîíåíò prepare ñîçäàë êàêîé-òî íàáîð äàííûõ è àññèãíóë (assign) åãî â ãëàâíûé øàáëîí, ïðèñâîèâ ýòèì äàííûì èìÿ 'prepare_data'.
Òåïåðü äàâàéòå âçãëÿíåì íà ãëàâíûé øàáëîí:
<!-- Ôðàãìåíò ãëàâíîãî øàáëîíà --> |
Êàê âèäíî èç ýòîãî ôðàãìåíòà, ñíà÷àëà ìû âûçâàëè êîìïîíåíò prepare, à çàòåì êîìïîíåíò view.  êà÷åñòâå ïàðàìåòðà ïåðåäàëè â view ïðîäóêò äåÿòåëüíîñòè êîìïîíåíòà prepare.
<?php |
 ñâîþ î÷åðåäü, êîìïîíåíòó view ýòè äàííûå ñòàëè äîñòóïíû ïîñðåäñòâàì ìàññèâà $params, â êîòîðîì ïîÿâèëñÿ íîâûé èíäåêñ – prepare_data.
Èòîãè
Èòàê, çäåñü ìû ñ âàìè ðàññìîòðåëè íåñêîëüêî íåîáû÷íóþ ðîëü øàáëîíèçàòîðà Smarty â ðàçðàáîòêå ïðèëîæåíèé: ïîðó÷èëè Smarty áûòü íå òîëüêî óäîáíûì øàáëîíèçàòîðîì, íî è äèñïåò÷åðîì íàøåãî ïðèëîæåíèÿ, îòäàëè åìó íà îòêóï ôîðìèðîâàíèå ñàéòà.
Òàêèì îáðàçîì, èñïîëüçóÿ ýòó òåõíîëîãèþ, âû ëåãêî ìîæåòå ìåíÿòü ëîãèêó è âèä ñâîåãî ïðèëîæåíèÿ èçìåíÿÿ òîëüêî åãî øàáëîíû äëÿ âûâîäà íà ýêðàí, ÷òî ïîçâîëÿåò äîâîëüíî ÷àñòî ýêîíîìèòü âðåìÿ ïðè ðàçðàáîòêå êàê ïðîñòûõ, òàê è ñëîæíûõ ïðèëîæåíèé. Òàêæå, òàêîé ïîäõîä ïîçâîëÿåò ìàêñèìàëüíî àáñòðàãèðîâàòü ÿäðî âàøåãî ñàéòà (êëàññû) îò âûâîäà èíôîðìàöèè íà ýêðàí, ÷òî äàåò äîïîëíèòåëüíûå ïðåèìóùåñòâà äëÿ ñîçäàíèÿ ïåðåíîñèìîãî êîäà è ïîçâîëÿåò ðàçâåðòûâàòü íîâûå ïðèëîæåíèÿ íà áàçå ñòàðûõ.
Êîìïîíåíòíàÿ ìîäåëü ðàçðàáîòêè ïîçâîëÿåò äîáèòüñÿ ñóùåñòâåííîãî ðàçãðàíè÷åíèÿ òðóäà ïðîãðàììèñòîâ, ðàáîòàþùèõ â êîìàíäå.
Íà ýòîì âñå, íàäåþñü ýòîò ìàòåðèàë äàñò âàì ïîâîä äëÿ íîâûõ èçûñêàíèé è èäåé.