Smarty – íå ïðîñòî øàáëîíû

Ñîäåðæàíèå

Âñòóïëåíèå
Êîìïîíåíòíàÿ ìîäåëü
Îáùèå êëàññû
Ôóíêöèÿ «Êîìïîíåíò»
Êîìïîíåíò
Îáìåí äàííûìè ìåæäó êîìïîíåíòàìè
Èòîãè

Âñòóïëåíèå

Ñêàæåì ñðàçó, ýòîò ìàòåðèàë íå áóäåò âàñ ó÷èòü ïîëüçîâàòüñÿ áàçîâûìè âîçìîæíîñòÿìè äàííîé áèáëèîòåêè. Íàïðîòèâ, ÿ êàïíó ãîðàçäî ãëóáæå. Öåëü ýòîãî ìàòåðèàëà âçãëÿíóòü íà øàáëîíèçàòîð Smarty ñ äðóãîé ñòîðîíû, è óâèäåòü â íåì íå ïðîñòî î÷åíü óäîáíûé è ìîùíûé øàáëîííûé äâèæåê, à íåêèé ôðåéìâîðê äëÿ ðàçðàáîòêè âàøèõ ïðèëîæåíèé.

×àñòî, ãîâîðÿ î Smarty, íåçàñëóæåííî îáâèíÿþò åãî â íèçêîé ïðîèçâîäèòåëüíîñòè è «òîðìîçíóòîñòè», ÷òî æ – àâòîð äàííîãî ìàòåðèàëà ñ óêàçàííûìè òîâàðèùàìè íå ñîãëàñåí. Íàïðîòèâ, ðàç óæ ìû ïðèíÿëè ðåøåíèå èñïîëüçîâàòü â ñâîåì ïðèëîæåíèè ýòó áèáëèîòåêó, ÿ ïðåäëàãàþ âàì íà ïîëíóþ êàòóøêó çàäåéñòâîâàòü åå âîçìîæíîñòè, îòäàâ íà îòêóï øàáëîíèçàòîðó êàê âûâîä èíôîðìàöèè ïîëüçîâàòåëþ, òàê è óïðàâëåíèå ýòîé èíôîðìàöèåé.

Êîìïîíåíòíàÿ ìîäåëü

Îäíà èç ñèëüíûõ ñòîðîí Smarty – ýòî âîçìîæíîñòü ñîçäàâàòü ñâîè ïëàãèíû è ðàñøèðåíèÿ. Âîñïîëüçóåìñÿ ýòîé åãî âîçìîæíîñòüþ â ïîëíîé ìåðå è ïîïðîáóåì ðåàëèçîâàòü íà åå îñíîâå êîìïîíåíòíóþ ìîäåëü ñàéòà.

×òî òàêîå â íàøåì ïîíèìàíèè êîìïîíåíò? Ïîä êîìïîíåíòîì ÿ áóäó ïîäðàçóìåâàòü îáîñîáëåííûé áëîê ñàéòà, êîòîðûé óìååò âûïîëíÿòü ñòðîãî îïðåäåëåííûé íàáîð äåéñòâèé è, â ðåçóëüòàòå ñâîåé ðàáîòû, ëèáî âûâîäèòü ÷òî-ëèáî íà ýêðàí, ëèáî ãîòîâèòü êàêèå-òî äàííûå äëÿ äðóãèõ êîìïîíåíòîâ.

Êîìïîíåíò – ýòî ýëåìåíò ñàéòà, êîòîðûé, âî-ïåðâûõ, òî÷íî çíàåò êàêèå äåéñòâèÿ îí ìîæåò ñîâåðøàòü, âî-âòîðûõ, êàêèå áèáëèîòåêè äëÿ ñîâåðøåíèÿ ýòèõ äåéñòâèé åìó íóæíû.

 ðåçóëüòàòå ñàéò áóäåò ñîñòîÿòü èç ÿäðà - íàáîðà áèáëèîòåê (êëàññîâ), êîòîðûå ñîäåðæàò â ñåáå êàêèå-òî íèçêîóðîâíåâûå äåéñòâèÿ, íàïðèìåð ðàáîòàþò ñ áàçîé, – è êîìïîíåíòû, êîòîðûå ïîäêëþ÷àþò ýòè áèáëèîòåêè è, â íóæíîì ïîðÿäêå, âûçûâàþò òå èëè èíûå èõ ìåòîäû.

 ÷åì ïîëîæèòåëüíàÿ ñòîðîíà òàêîãî ïîäõîäà?

  1. âû ïèøèòå ñïåöèàëüíûå êëàññû (îáúåêòû) ÿäðà ñâîåãî ñàéòà, îíè íèêàê íå çàâèñÿò îò âûâîäà íà ýêðàí, à ïðîñòî ïîäãîòàâëèâàþò è îáðàáàòûâàþò äàííûå, òåì ñàìûì îáåñïå÷èâàåòñÿ âûñîêàÿ ïåðåíîñèìîñòü êîäà è âîçìîæíîñòü åãî ïîâòîðíîãî èñïîëüçîâàíèÿ;
  2. â ñëó÷àå êîìàíäíîé ðàáîòû, âàì íå íàäî çàáîòèòüñÿ î òîì, ÷òî äåëàåò ñîñåäíèé ïðîãðàììèñò, êîòîðûé ïèøåò ñâîé êîìïîíåíò;
  3. ñòàíäàðòèçàöèÿ êîäà – âû ìîæåòå ñîçäàòü èíòåðôåéñ êîìïîíåíòà è ñòðîãî ñëåäîâàòü åãî òðåáîâàíèÿì, ÷òî ïîçâîëèò îäíîìó ïðîãðàììèñòó ëåãêî ðàçîáðàòüñÿ â êîìïîíåíòå äðóãîãî ïðîãðàììèñòà.

Ýòî îñíîâíûå ïðåèìóùåñòâà äàííîãî ïîäõîäà.

Îáùèå êëàññû

Áåçóñëîâíî, â êàæäîì ïðèëîæåíèè åñòü íàáîð êëàññîâ, êîòîðûå íóæíû âñåì, èëè áîëüøèíñòâó êîìïîíåíòîâ, íàïðèìåð, êëàññ äëÿ ðàáîòû ñ áàçîé. Êàê ïîñòóïèòü â òàêîì ñëó÷àå? È äëÿ ýòîé ïðîáëåìû â Smarty åñòü óäà÷íîå ðåøåíèå. Âïðî÷åì, äàâàéòå ïî ïîðÿäêó.

Ñíà÷àëà èíèöèàëèçèðóåì êëàññ Smarty:

<?php
/** Ïóòü äî Smarty */
define('SMARTY_DIR', '/smarty/');

/** Ïóòü äî Smarty øàáëîíîâ */
define('TEMPLATES', '/templates/');

/** Ïóòü äî Smarty êîìïèëèðîâàííûõ øàáëîíîâ */
define('TEMPLATES_C', '/templates_c/');

require_once(
SMARTY_DIR . 'Smarty.class.php');
$smarty = new Smarty;
$smarty->compile_check = TRUE;
$smarty->force_compile = TRUE;
$smarty->template_dir = TEMPLATES;
$smarty->compile_dir = TEMPLATES_C;
$smarty->plugins_dir[] = LIBS_PATH;
$smarty->caching = FALSE;
?>

Èòàê, Smarty ãîòîâ ê ðàáîòå. ×òî íåîáõîäèìî ñäåëàòü ñ îáùèìè êëàññàìè, ÷òîáû îáåñïå÷èòü äîñòóï ê íèì âíóòðè ëþáîãî êîìïîíåíòà?

Ñêàæåì, ó íàñ åñòü íåñêîëüêî îáùèõ êîìïîíåíòîâ:

  1. adodb – êëàññ äëÿ ðàáîòû ñ áàçîé;
  2. session – êëàññ äëÿ ðàáîòû ñ ñåññèÿìè;
  3. errors – êëàññ äëÿ îáðàáîòêè îøèáîê;
  4. variables – êëàññ äëÿ õðàíåíèÿ è îáðàáîòêè ñîñòîÿíèÿ ìàññèâîâ $_GET è $_POST.

Ïåðâûì äåëîì, íàì íåîáõîäèìî ñîçäàòü îáúåêòû äàííûõ êëàññîâ (ïàðàìåòðû êîíñòðóêòîðîâ çàâèñÿò îò âàøåé êîíêðåòíîé ðåàëèçàöèè). Â öåëîì, ýòî äåëàåòñÿ ñòàíäàðòíûì îáðàçîì:

<?php
require_once(CLASSES_DIR . '/variables.class.php');
$vars = new Variables();

require_once(
CLASSES_DIR . '/errors.class.php');
$errors = new Errors($smarty);

require_once(
CLASSES_DIR . '/security.class.php');
$security = new Security($adodb);

// è òàê äàëåå...
?>

Îáúåêòû ñîçäàíû è òåïåðü íåîáõîäèìî îáåñïå÷èòü äîñòóï ê íèì â ëþáîì êîìïîíåíòå íàøåãî ïðèëîæåíèÿ. Äëÿ ýòîãî íåîáõîäèìî çàðåãèñòðèðîâàòü äàííûå îáúåêòû â Smarty:

<?php
$smarty
->register_object('adodb', $adodb);

$smarty->register_object('vars', $vars);

$smarty->register_object('errors', $errors);

$smarty->register_object('security', $security);
?>

Äëÿ ðåãèñòðàöèè îáúåêòîâ ìû èñïîëüçóåì ìåòîä Smarty register_object(). Ïîñëå ÷åãî âàø îáúåêò ñòàíåò äîñòóïíûì âåçäå, ãäå îí ìîæåò ïîíàäîáèòüñÿ. Êàê «äîñòàòü» íóæíûé âàì çàðåãèñòðèðîâàííûé îáúåêò ìû ðàññìîòðèì â ñëåäóþùåé ÷àñòè.

Ôóíêöèÿ «Êîìïîíåíò»

Ê òåêóùåìó ìîìåíòó Smarty íè÷åãî íå çíàåò î êàêèõ-ëèáî êîìïîíåíòàõ, è íàì íàì íàäî íàó÷èòü åãî ðàáîòàòü ñ íèìè. Äëÿ ýòîãî ìû äîáàâëÿåì ê ñèíòàêñèñó øàáëîíîâ íîâûé òåã – {component}. ×òîáû Smarty íàó÷èëñÿ îáðàáàòûâàòü ýòîò òåã – ïèøåì ïðîñòóþ ôóíêöèþ:

<?php
// Smarty function Component
//
// @author Feskov Kuzma

function smarty_function_component($params, &$smarty) {
    
$adodb = &$smarty->get_registered_object('adodb');
    
$vars = &$smarty->get_registered_object('vars');
    
$errors = &$smarty->get_registered_object('errors');
    
$security = &$smarty->get_registered_object('security');

    if (empty(
$params['name'])) {
        
$params['name'] = 'site_view';
    }
    if (
is_file(ADMIN_LIBS_PATH . '/' . $params['name'] . '.component.php')) {
        require(
ADMIN_LIBS_PATH . '/' . $params['name'] . '.component.php');
    } else {
        echo
'Component <strong>' . $params['name'] . '</strong> not found';
    }
    unset(
$adodb, $errors, $security, $vars);
}
?>

Äàâàéòå ðàçáåðåìñÿ, ÷òî äåëàåò äàííàÿ ôóíêöèÿ. Âî-ïåðâûõ, îíà ñîçäàåò îáðàáîò÷èê äëÿ íîâîãî òåãà – {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
// News component
//
// @author Feskov Kuzma

// Ïîäêëþ÷àåì íåîáõîäèìûé íàì êëàññ
// è ñîçäàåì îáúåêò
require_once(CLASSES_DIR . '/news.class.php');
$news = new News($adodb);

// Îáðàáàòûâàåì âîçìîæíûå äåéñòâèÿ
switch ($params['action']) {
    
// --- View news ---
    
case 'view':
    
// Ïîëó÷àåì 5 ïîñëåäíèõ íîâîñòåé
    
$data = $news->NewsList($params['count']);
    if (
false === $data) {
        
// Âûâîäèì îøèáêó
        
$errors->ComponentErrPrint('Êîìïîíåíò news, äåéñòâèå ' . $params['action'], $news->ERROR);
    }
    
    
// Ïðîâåðÿåì - åñòü ëè òàêîé øàáëîí
    
if(is_file(TEMPLATES . '/' . $params['tpl'])) {
        
// Âûâîäèì íîâîñòè íà ýêðàí
        
$smarty->assign('data', $data);
        
$smarty->display($params['tpl']);
    } else {
        
// Âûâîäèì îøèáêó
        
$errors->ComponentErrPrint('Êîìïîíåíò news, äåéñòâèå ' . $params['action'], 'Øàáëîí íå íàéäåí');
    }
    break;
    
// --- Default action ---
    
default:
    
// Åñëè íèêàêîãî äåéñòâèÿ íå çàäàëè, âûâîäèì îøèáêó
    
$errors->ComponentErrPrint('news_view', 'Íåèçâåñòíîå äåéñòâèå');
    break;
}
?>

Ýòîò ïðèìåð ïîêàçûâàåò óïðîùåííóþ ñõåìó ðàáîòû êîìïîíåíòà. Âû âïîëíå ìîæåòå åå ðàçâèòü è èçìåíèòü ïîä ñâîè íóæäû.

Êîëè÷åñòâî äåéñòâèé, êîòîðûå ìîæåò âûïîëíèòü êîìïîíåíò îãðàíè÷åíî ëèøü âàøåé ôàíòàçèåé, ðîâíî êàê è êîëè÷åñòâî è íàçâàíèÿ ïàðàìåòðîâ, êîòîðûå âû ìîæåòå ïåðåäàòü èç øàáëîíà â êîìïîíåíò.

Îáìåí äàííûìè ìåæäó êîìïîíåíòàìè

Íåìíîãî îñòàíîâëþñü íà ðàçäåëåíèè êîìïîíåíòîâ íà òèïû: prepare – ýòè êîìïîíåíòû íè÷åãî íå âûâîäÿò íà ýêðàí, îíè òîëüêî ïîäãîòàâëèâàþò äàííûå äëÿ äðóãèõ êîìïîíåíòîâ èëè îáùåãî (ãëàâíîãî) øàáëîíà, è view – ýòè êîìïîíåíòû îáÿçàòåëüíî â ðåçóëüòàòå ñâîåé ðàáîòû ÷òî-òî âûâîäÿò íà ýêðàí.

Äàâàéòå ïîñìîòðèì, êàêèì îáðàçîì êîìïîíåíò prepare ìîæåò ïîäãîòîâèòü äàííûå äëÿ êîìïîíåíòà view.

<?php
// --- Ôðàãìåíò êîìïîíåíòà prepare ---
$smarty->assign('prepare_data', $prepare_data);
?>

Èç äàííîãî ôðàãìåíòà âèäíî, ÷òî êîìïîíåíò prepare ñîçäàë êàêîé-òî íàáîð äàííûõ è àññèãíóë (assign) åãî â ãëàâíûé øàáëîí, ïðèñâîèâ ýòèì äàííûì èìÿ 'prepare_data'.

Òåïåðü äàâàéòå âçãëÿíåì íà ãëàâíûé øàáëîí:

<!-- Ôðàãìåíò ãëàâíîãî øàáëîíà -->

<!-- Âûçûâàåì êîìïîíåíò prepare -->
{component name='prepare'}

<!-- Âûçûâàåì êîìïîíåíò view -->
{component name='view' prepare_data=$prepare_data}

Êàê âèäíî èç ýòîãî ôðàãìåíòà, ñíà÷àëà ìû âûçâàëè êîìïîíåíò prepare, à çàòåì êîìïîíåíò view.  êà÷åñòâå ïàðàìåòðà ïåðåäàëè â view ïðîäóêò äåÿòåëüíîñòè êîìïîíåíòà prepare.

<?php
// --- Ôðàãìåíò êîìïîíåíòà view ---
print_r($params['prepare_data']);
?>

 ñâîþ î÷åðåäü, êîìïîíåíòó view ýòè äàííûå ñòàëè äîñòóïíû ïîñðåäñòâàì ìàññèâà $params, â êîòîðîì ïîÿâèëñÿ íîâûé èíäåêñ – prepare_data.

Èòîãè

Èòàê, çäåñü ìû ñ âàìè ðàññìîòðåëè íåñêîëüêî íåîáû÷íóþ ðîëü øàáëîíèçàòîðà Smarty â ðàçðàáîòêå ïðèëîæåíèé: ïîðó÷èëè Smarty áûòü íå òîëüêî óäîáíûì øàáëîíèçàòîðîì, íî è äèñïåò÷åðîì íàøåãî ïðèëîæåíèÿ, îòäàëè åìó íà îòêóï ôîðìèðîâàíèå ñàéòà.

Òàêèì îáðàçîì, èñïîëüçóÿ ýòó òåõíîëîãèþ, âû ëåãêî ìîæåòå ìåíÿòü ëîãèêó è âèä ñâîåãî ïðèëîæåíèÿ èçìåíÿÿ òîëüêî åãî øàáëîíû äëÿ âûâîäà íà ýêðàí, ÷òî ïîçâîëÿåò äîâîëüíî ÷àñòî ýêîíîìèòü âðåìÿ ïðè ðàçðàáîòêå êàê ïðîñòûõ, òàê è ñëîæíûõ ïðèëîæåíèé. Òàêæå, òàêîé ïîäõîä ïîçâîëÿåò ìàêñèìàëüíî àáñòðàãèðîâàòü ÿäðî âàøåãî ñàéòà (êëàññû) îò âûâîäà èíôîðìàöèè íà ýêðàí, ÷òî äàåò äîïîëíèòåëüíûå ïðåèìóùåñòâà äëÿ ñîçäàíèÿ ïåðåíîñèìîãî êîäà è ïîçâîëÿåò ðàçâåðòûâàòü íîâûå ïðèëîæåíèÿ íà áàçå ñòàðûõ.

Êîìïîíåíòíàÿ ìîäåëü ðàçðàáîòêè ïîçâîëÿåò äîáèòüñÿ ñóùåñòâåííîãî ðàçãðàíè÷åíèÿ òðóäà ïðîãðàììèñòîâ, ðàáîòàþùèõ â êîìàíäå.

Íà ýòîì âñå, íàäåþñü ýòîò ìàòåðèàë äàñò âàì ïîâîä äëÿ íîâûõ èçûñêàíèé è èäåé.