<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IMS Blog - blog o modernom programovaní od Tibor Piňo &#187; Model View Controller</title>
	<atom:link href="http://ims.rockretail.com/tag/model-view-controller/feed/" rel="self" type="application/rss+xml" />
	<link>http://ims.rockretail.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Thu, 18 Feb 2010 10:11:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>5. Tvoríme CMS s CakePHP &#8211; Controller a View</title>
		<link>http://ims.rockretail.com/2008/06/11/5-tvorime-cms-s-cakephp-controller-a-view/</link>
		<comments>http://ims.rockretail.com/2008/06/11/5-tvorime-cms-s-cakephp-controller-a-view/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 14:16:40 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Začíname s CakePHP]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Model View Controller]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[V predchádzajúcej časti seriálu sme si navrhli a vytvorili databázu, ku každej databázovej tabuľke sme si vytvorili model a veľmi stručne sme si predstavili controller. V dnešnej časti sa budeme controlleru venovať podrobne a predstavíme si taktiež ďalšiu časť architektúry MVC a to konkrétne view.

Ako som už spomínal, v predchadzajúcej časti seriálu sme si controller [...]]]></description>
			<content:encoded><![CDATA[<p>V predchádzajúcej časti seriálu sme si navrhli a vytvorili databázu, ku každej databázovej tabuľke sme si vytvorili model a veľmi stručne sme si predstavili controller. V dnešnej časti sa budeme controlleru venovať podrobne a predstavíme si taktiež ďalšiu časť architektúry MVC a to konkrétne view.</p>
<p><span id="more-46"></span></p>
<p>Ako som už spomínal, <a href="/2008/03/17/4-tvorime-cms-s-cakephp-model">v predchadzajúcej časti seriálu</a> sme si controller stručne predstavili, v tomto prípade sme si ukázali použitie tzv. scaffolding. V tejto časti si controller predstavíme podrobne.</p>
<h2>URL ako rozhranie aplikácie</h2>
<p>Controller je tá časť aplikácie, ktorá ako prvá prichádza do styku s požiadavkami, ktoré prichádzajú do našej aplikácie z vonkajšieho sveta. Najčastejším prípadom takéhoto požiadavku z vonkajšieho sveta je URL adresa. Ak teda budeme pristupovať k našej aplikácii prostredníctvom URL, potrebujeme nejaký mechanizmus, ktorý nám na základe tejto URL určí, že aplikácia „pozná“ na aké prvky aplikácie má smerovať dané požiadavky. Takýto mechanizmus sa nazýva <strong>routing</strong>.</p>
<p>V minulosti sa formátu URL adresy veľká pozornosť nevenovala. Často sme boli svedkami podobných URL ako môžeme vidieť na ukážke</p>
<pre><code>http://www.example.com/index.php?action=list&amp;template=comments&amp;page=2&amp;order=DESC</code></pre>
<p>URL adresa v takomto tvare bola možno jednoduchá pre programátora, určite však nie pre užívateľa. V súčasnosti je trend iný a hlavne moderné frameworky sa snažia vytvárať a používať tzv. <strong>user friendly url</strong>. Príklad takejto adresy môžeme vidieť na ukážke</p>
<pre><code>http://www.example.com/articles/mvc-model-view-controller-v-cakephp</code></pre>
<p>Určite nám je jasné, že takáto adresa je oveľa viac čitateľnejšia a zrozumiteľnejšia nie len pre užívateľa. Bližšie štúdium o tejto problematike ponechám na samotných čitateľov, pretože by to presahovalo záber tohto článku. Avšak výhody takýchto URL sú nespochybniteľné. Ako sme už určite vytušili, CakePHP používa taktiež <strong>user friendly url</strong>. Poďme sa teda bližšie pozrieť, akým spôsobom pristupujeme v CakePHP k našej aplikácii prostredníctvom url</p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/cakephp-url.png" alt="" /></div>
<p>V našom prípade by url adresa pre zobraznie článku v aplikácii v CakePHP mohla napríklad vypadať tak, ako môžeme vidieť na obrázku vyššie. Z url nám môže byť napríklad hneď jasné, že sa bude jednať o zobrazenie určitého článku. Obrázok taktiež demonštruje fungovanie routingu v samotnom CakePHP. Prvá časť adresy označená zelenou farbou nám určuje konkrétny controller v našej aplikácii, druhá časť označená červenou farbou nám určuje konkrétnu akciu v controlleri a posledná časť označená modrou farbou nám určuje parameter vkladaný do tejto akcie. Aby sme si vedeli túto situáciu predstaviť konkrétne, pozrime sa na nasledovný kód, ktorý by bol vykonaný pri použití url adresy z obrázku</p>
<pre><code>class ArticlesController extends AppController{
     var $name="Articles";
     function show($id){
           $this­&gt;set("article",$this­&gt;Article­&gt;findById($id));

     }
}</code></pre>
<p>Mechanizmus routingu by zabezpečil, že by sa zavolala metóda <em>show</em> triedy <em>ArticlesContro­ller</em> a zároveň by bol metóde predaný parameter s hodnotou <em>43</em>.</p>
<h3>Url 100-krát inak</h3>
<p>CakePHP nám v súvislosti s routingom ponúka ešte jednú veľmi užitočnú vlastnosť a to sú tzv. routovacie pravidlá. Na základe týchto pravidiel môžeme ovplyvňovať samotné routovanie a v neposlednom rade nás routovacie pravidlá zbavujú povinnosti ručne modifikovať súbory <em>.htaccess</em>, čím nám značne uľahčujú prácu, pretože používajú oveľa prehľadnejšiu syntaxu. Treba však poznamenať, že routavacie pravidlá zďaleka nenahradzajú možnosti súboru .htaccess, pretože to nie je ani ich cieľom. Ich cieľom je poskytnúť z jednodušenú syntaxu pri pravidlách, ktoré sa týkajú routovania a spracovávania samotných url adries.</p>
<p>Samotné routovacie pravidlá sa definujú v súbore <em>app/config/rou­tes.php</em>. Pozrime sa na ukážkový kód</p>
<pre><code>Router::connect('/sites/*', array('controller' =&gt; 'articles', 'action' =&gt; 'index'));
Router::connect('/', array('controller' =&gt; 'articles', 'action' =&gt; 'index'));</code></pre>
<p>Pomocou vyššie uvedených pravidiel sme určili, že url v tvare <em><a href="http://www.example.com/sites/">www.example.com/sites/</a>*</em> (kde znak * značí ľubovoľný tvar zvyšku adresy) bude routovaná na controller <em>articles</em> a že sa bude v tomto controlleri volať metóda <em>index</em>. Taktiež sme určili, že url v tvare <em><a href="http://www.example.com">www.example.com</a></em> bude routovaná na vyšie spomínaný controller <em>articles</em> a jeho metódu <em>index</em>. Podrobné vysvetlenie všetkých možností použitia routovacích pravidiel je nad rámec tohto článku, ale určite v budúcnosti pripravím článok, ktorý vás kompletne prevedie svetom routovacích pravidiel v CakePHP.</p>
<p>Na záver tejto časti pripomeniem, že celý mechanizmus spracovávania požiadavku v CakePHP som rozoberal v článku <a href="http://ims.rockretail.com/articles/2008/04/01/mvc-model-view-controller-v-cakephp">MVC model view controller v CakePHP.</a></p>
<h2>Vytvárame controller</h2>
<p>Od <a href="/articles/2008/03/17/4-tvorime-cms-s-cakephp-model">minulého článku</a> máme vytvorené jednotlivé controllere a to konkrétne <em>ArticlesContro­ller</em>, <em>UsersController</em>, <em>CommentsContro­ller</em> a <em>TagsController</em>. Avšak ako môžeme vidieť, naše controllere neobsahujú žiadne metódy resp. akcie, ktoré sú potrebné na správne fungovanie aplikácie tak, ako sme to spomínali v časti preberanej vyššie (aplikácia nám samozrejme fungovala aj tak, pretože sme využili <strong>scaffolding</strong>). Poďme si preto jednotlivé metódy vytvoriť a pripraviť si tak pôdu pre ich zobrazenie vo view.</p>
<p>V controlleri <em>ArticlesContro­ller</em> si vytvoríme dve metódy <em>index</em> a <em>view</em>, kde prvá bude reprezentovať akciu zobrazenie všetkých článkov a druhá bude reprezentovať akciu zobrazenie konkrétneho článku. Kód bude vypadať následovne</p>
<pre><code>class ArticlesController extends AppController {

        var $name = 'Articles';
        var $helpers = array('Html', 'Form');

        function index() {
                $this-&gt;set('articles', $this-&gt;paginate());
        }

        function view($id = null) {
                if (!$id) {
                        $this-&gt;Session-&gt;setFlash(__('Invalid Article.', true));
                        $this-&gt;redirect(array('action'=&gt;'index'));
                }
                $this-&gt;set('article', $this-&gt;Article-&gt;read(null, $id));
        }
}</code></pre>
<p>V controlleri <em>CommentsContro­ller</em> si vytvoríme 3 metódy, kde metóda <em>index</em> sa bude starať o zobrazenie všetkých komentárov, druhou metódou bude metóda <em>view</em>, ktorá sa bude starať o zobrazenie konkrétneho komentára a poslednou treťou metódou bude metóda <em>add</em> ktorá nám pridá nový komentár. Kód bude vypadať následovne</p>
<pre><code>class CommentsController extends AppController {

        var $name = 'Comments';
        var $helpers = array('Html', 'Form');

        function index() {
                $this-&gt;Comment-&gt;recursive = 0;
                $this-&gt;set('comments', $this-&gt;paginate());
        }

        function view($id = null) {
                if (!$id) {
                        $this-&gt;Session-&gt;setFlash(__('Invalid Comment.', true));
                        $this-&gt;redirect(array('action'=&gt;'index'));
                }
                $this-&gt;set('comment', $this-&gt;Comment-&gt;read(null, $id));
        }

        function add() {
                if (!empty($this-&gt;data)) {
                        $this-&gt;Comment-&gt;create();
                        if ($this-&gt;Comment-&gt;save($this-&gt;data)) {
                                $this-&gt;Session-&gt;setFlash(__('The Comment has been saved', true));
                                $this-&gt;redirect(array('action'=&gt;'index'));
                        } else {
                                $this-&gt;Session-&gt;setFlash(__('The Comment could not be saved. Please, try again.', true));
                        }
                }
                $articles = $this-&gt;Comment-&gt;Article-&gt;find('list');
                $this-&gt;set(compact('articles'));
        }
}</code></pre>
<p>Posledným upravovaným controllerom bude controller <em>TagsController</em>, ktorému pre jednoduchosť vytvoríme len dve metódy, metóda <em>index</em> ktorá nám zobrazí všetky dostupné tagy a metóda <em>view</em>, ktorá nám zobrazí všetky články prislúchajúce k danému tagu. Kód bude vypadať následovne</p>
<pre><code>class TagsController extends AppController {

        var $name = 'Tags';
        var $helpers = array('Html', 'Form');

        function index() {
                $this-&gt;Tag-&gt;recursive = 0;
                $this-&gt;set('tags', $this-&gt;paginate());
        }

        function view($id = null) {
                if (!$id) {
                        $this-&gt;Session-&gt;setFlash(__('Invalid Tag.', true));
                        $this-&gt;redirect(array('action'=&gt;'index'));
                }
                $this-&gt;set('tag', $this-&gt;Tag-&gt;read(null, $id));
        }
}</code></pre>
<p>K vyššie uvedeným kódom bližšie vysvetlím význam niektorých použitých metód, ktoré majú pre správne pochopenie celého mechanizmu zásadný význam. Metódou <a href="http://api.cakephp.org/1.2/class_controller.html#8d64f371009811f1d5662a491ba5cf82">set()</a> posielame dáta do view. Metóda prijíma dva parametre, kde prvý označuje názov premennej vo view a druhý parameter sú samotné dáta uložené do premennej s názvom určenom v prvom parametri (bližšie si túto časť vysvetlíme neskôr, kedy budeme dáta zobrazovať). Metóda <a href="http://api.cakephp.org/1.2/class_controller.html#6f79c1eed018894aede112c294087345">paginate()</a> sa nám stará o stránkovanie veľkého množstva dát (túto vlastnosť si predstavíme v niektorej z ďalších častí nášho seriálu). Metóda <a href="http://api.cakephp.org/1.2/class_session_component.html#0f46011d40587807377decf37088ac12">Session-&gt;setFlash()</a> nám nastaví chybovú hlášku pre layout, ktorú môžeme jednoducho v našom layoute zobraziť na mieste, kde budeme chcieť. Metóda <a href="http://api.cakephp.org/1.2/class_controller.html#903188d3de83bd65c78bb676f61b3039">redirect()</a> sa postará o presmerovanie behu našej aplikácie buď pomocou zadanej url adresy alebo pomocou určenia controllera a akcie. Premenná <a href="http://api.cakephp.org/1.2/class_controller.html#c9073fdd6603617ab015c968f0add014">$this-&gt;data</a> reprezentuje dáta odoslané formulárom z view.</p>
<p>Určite vás napadlo, že sme v našich controlleroch nikde neuvádzali akcie pre pridanie článku, pridanie tagu, administrácie užívateľov atď. Je to náš zámer, pretože dané akcie patria do administračného rozhrania, ktorému sa budeme venovať v nasledujúcej časti seriálu.</p>
<h2>Zobrazujeme dáta</h2>
<p>Už sme si spomenuli metódu, ktorá nám posiela dáta do view pochádzajúce z našich modelov. Správne tušíte, že sa jedná o metódu <a href="http://api.cakephp.org/1.2/class_controller.html#8d64f371009811f1d5662a491ba5cf82">set()</a> a pochopenie jej práce je pre ďalšie časti kľúčové. Ako som spomenul, príjíma dva parametre, prvý parameter je názov premennej vo view a druhým parametrom sú samotné dáta, ktoré sa vložia do premennej s názvom určenom v prvom parametri. Aby sme neostali len pri teórii, poďme si ich význam ukázať na príklade.</p>
<p>Zoberme kód nášho controllera <em>ArticlesContro­ller</em> a jeho metódu view, ktorá reprezentuje akciu pre zobrazenie konkrétneho článku. Užívateľ zadá do prehliadača url <em><a href="http://www.example.com/articles/view/1">www.example.com/articles/view/1</a></em> čím určí, že chce zobraziť článok s id 1. Mechanizmus routingu správne vyhodnotí url a určí, že sa vykoná metóda <em>view</em> v controlleri <em>ArticlesContro­ller</em>. Táto metóda najprv otestuje, či sme zadali nejaké id článku, ak áno, pomocou modelu vyberie dáta z tabuľky articles (<em>$this-&gt;Article-&gt;read(null, $id)</em>) a následne ich vloží do view pod premennou article (<em>$this-&gt;set(‚article‘, $this-&gt;Article-&gt;read(null, $id))</em>). Potom už je naša práca veľmi jednoduchá a dáta možeme zobraziť.</p>
<p>Súbory s našimi šablónami sa ukladajú do adresára <em>app/views</em>. V našom prípade pre zobrazenie článku to bude adresár <em>app/views/arti­cles/view.ctp</em>. Náš súbor <em>view.ctp</em>, ktorý zobrazuje konkrétny článok, by mohol vypadať následovne</p>
<pre><code>&lt;div class="articles view"&gt;
&lt;h2&gt;&lt;?php  __('Article');?&gt;&lt;/h2&gt;
        &lt;dl&gt;&lt;?php $i = 0; $class = ' class="altrow"';?&gt;

                &lt;dt&lt;?php if ($i % 2 == 0) echo $class;?&gt;&gt;&lt;?php __('Id'); ?&gt;&lt;/dt&gt;
                &lt;dd&lt;?php if ($i++ % 2 == 0) echo $class;?&gt;&gt;
                        &lt;?php echo $article['Article']['id']; ?&gt;
                        &amp;nbsp;
                &lt;/dd&gt;

                &lt;dt&lt;?php if ($i % 2 == 0) echo $class;?&gt;&gt;&lt;?php __('Title'); ?&gt;&lt;/dt&gt;
                &lt;dd&lt;?php if ($i++ % 2 == 0) echo $class;?&gt;&gt;
                        &lt;?php echo $article['Article']['title']; ?&gt;
                        &amp;nbsp;
                &lt;/dd&gt;

                &lt;dt&lt;?php if ($i % 2 == 0) echo $class;?&gt;&gt;&lt;?php __('Text'); ?&gt;&lt;/dt&gt;
                &lt;dd&lt;?php if ($i++ % 2 == 0) echo $class;?&gt;&gt;
                        &lt;?php echo $article['Article']['text']; ?&gt;
                        &amp;nbsp;
                &lt;/dd&gt;

                &lt;dt&lt;?php if ($i % 2 == 0) echo $class;?&gt;&gt;&lt;?php __('User'); ?&gt;&lt;/dt&gt;
                &lt;dd&lt;?php if ($i++ % 2 == 0) echo $class;?&gt;&gt;
                        &lt;?php echo $html-&gt;link($article['User']['id'], array('controller'=&gt; 'users', 'action'=&gt;'view', $article['User']['id'])); ?&gt;

                        &amp;nbsp;
                &lt;/dd&gt;
                &lt;dt&lt;?php if ($i % 2 == 0) echo $class;?&gt;&gt;&lt;?php __('Created'); ?&gt;&lt;/dt&gt;
                &lt;dd&lt;?php if ($i++ % 2 == 0) echo $class;?&gt;&gt;
                        &lt;?php echo $article['Article']['created']; ?&gt;

                        &amp;nbsp;
                &lt;/dd&gt;
        &lt;/dl&gt;
&lt;/div&gt;</code></pre>
<p>Teraz nám už je jasné, akým spôsobom zobraziť dáta vo view. V controlleri sme si vložili do view dáta pod premennou <em>article</em> a vo view sme na základe tejto premennej dáta jednoducho zobrazovali (napr. <em>$article[‚Arti­cle‘][‚title‘]</em> zobrazí titulok článku). Ešte poznamenám, že nám nemusí byť jasné, aký význam má metóda <em>__(‚Created‘)</em>. Táto metóda súvisí s internaciona­lizáciou stránky a CakePHP na toto myslí už od počiatku vývoja aplikácie. Bližšie sa o internaciona­lizácii môžete dočítať v článku <a href="http://ims.rockretail.com/articles/2007/09/24/viacjazycny-web-v-cakephp">Viacjazyčný web v cakePHP.</a></p>
<h2>Formát zobrazovaných dát</h2>
<p>Už vieme ako vložiť dáta do view, poďme sa pozrieť nato, v akom formáte sa nám dáta z modelu do view dostávajú. Model všeobecne mapuje dáta do viacrozmerných polí. V podstate nám nastávajú dve možnosti pri vkladaní dát z modelu do view. Prvou možnosťou je, že nám model vráti jeden záznam a druhou možnosťou je, že nám model vráti viac záznamov. Obidva prípady si ukážeme priamo na príklade.</p>
<p>Pozrime sa na situáciu, kedy nám model vráti jeden záznam. Predstavme si, že chceme zobraziť jeden článok, formát dát bude nasledovný</p>
<pre><code>Array
(
    [Article] =&gt; Array
        (
            [id] =&gt; 46
            [seo_link] =&gt; 5-tvorime-cms-s-cakephp-controller-a-view
            [title] =&gt; 5. Tvoríme CMS s CakePHP - Controller a View
            [intro_text] =&gt; V predchádzajúcej časti seriálu sme si navrhli a vytvorili databázu...
        )
)</code></pre>
<p>Ako môžeme vidieť vyššie, model nám vratil dvojrozmerné pole, kde prvý index je názov modelu, z ktorého data pochádzajú a druhý index je názov stĺpca v databázovej tabuľke.</p>
<p>Odlišná situácia nastane, keď nám model vracia viac záznamov. Predstavme si, že chceme zobraziť zoznam článkov, formát dát bude nasledovný</p>
<pre><code>Array
(
    [0] =&gt; Array
        (
            [Article] =&gt; Array
                (
                    [id] =&gt; 46
                    [seo_link] =&gt; 5-tvorime-cms-s-cakephp-controller-a-view
                    [title] =&gt; 5. Tvoríme CMS s CakePHP - Controller a View
                    [intro_text] =&gt; V predchádzajúcej časti seriálu sme si navrhli a vytvorili databázu...
                 )
         )
    [1] =&gt; Array
        (
            [Article] =&gt; Array
                (
                    [id] =&gt; 41
                    [seo_link] =&gt; ako-poslat-email-s-prilohou
                    [title] =&gt; Ako poslať email s prílohou
                    [intro_text] =&gt; Nedávno som v jednom z mojich projektov riešil situáciu, kedy bolo potrebné k odosielanému emailu pripojiť aj prílohu...
                 )
         )
)</code></pre>
<p>Ako môžeme vidieť vyššie, model nám vrátil trojrozmerné pole, kde prvý index určuje index záznamu v poli v rozmädzí od [0;n-1], kde n-1 je počet vrátených záznamov. Druhý index je názov modelu, z ktorého dáta pochádzajú a posledný tretí index je názov stĺpca v databázovej tabuľke.</p>
<p>Treba ešte poznamenať, že model nám môže vrátiť aj zložitejšie štruktúry, avšak práca s nimi je obdobná. Keď si nebudeme istý formátom dát vo view, môžeme použiť metódu <em>var_dump()</em> resp. pri zapnutom debug móde metódu <a href="http://api.cakephp.org/basics_8php.html#dd2fb66372dc7e9429eeaf250a09f040">debug()</a> priamo z CakePHP.</p>
<p>Týmto je táto časť nášho seriálu u konca. Jej cieľom bolo pochopenie základných princípov archiktúry MVC a to konkrétne controller a view. Nedotkli sme sa niektorých tém, ktoré s danými časťami súvisia, akú sú napr. helpery, komponenty atď. Nemusíte sa obávať, určite sa k nim dostaneme v niektorej z ďalších častí.</p>
<p>Rád uvítam vaše námety a pripomienky k článku.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2008/06/11/5-tvorime-cms-s-cakephp-controller-a-view/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>MVC model view controller v CakePHP</title>
		<link>http://ims.rockretail.com/2008/04/01/mvc-model-view-controller-v-cakephp/</link>
		<comments>http://ims.rockretail.com/2008/04/01/mvc-model-view-controller-v-cakephp/#comments</comments>
		<pubDate>Tue, 30 Nov 1999 00:00:00 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Články]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[cookbook]]></category>
		<category><![CDATA[Model View Controller]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[V dnešnom článku si detailne priblížime pohľad na celkovú architektúru frameworku a tou je architektúra Model View Controller. Porozumenie MVC je pre vývoj v CakePHP zásadné a tento článok vás ponorí do tajov tohto návrhového vzoru z pohľadu daného frameworku.
Článok je voľne inšpirovaný v Cookbook::Un­derstanding Model-View-Controller. Týmto by autor chcel požiadať ostatných, ktorí by mali [...]]]></description>
			<content:encoded><![CDATA[<p>V dnešnom článku si detailne priblížime pohľad na celkovú architektúru frameworku a tou je architektúra Model View Controller. Porozumenie MVC je pre vývoj v CakePHP zásadné a tento článok vás ponorí do tajov tohto návrhového vzoru z pohľadu daného frameworku.<span id="more-36"></span></p>
<p>Článok je voľne inšpirovaný v <a href="http://book.cakephp.org/view/10/understanding-model-view-contr">Cookbook::Un­derstanding Model-View-Controller.</a> Týmto by autor chcel požiadať ostatných, ktorí by mali záujem na preklade Cookbook do slovenského jazyka, nech vyjadria svoj postoj v diskusii k článku.</p>
<h2>Úvod</h2>
<p>CakePHP je postavený na návrhovom vzore <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC.</a> Pri programovaní aplikácií postavených na tomto návrhovom vzore, MVC rozdeľuje danú aplikáciu na 3 základné vrstvy</p>
<ol>
<li>Model – reprezentuje dáta aplikácie</li>
<li>View – zobrazuje dáta modelu</li>
<li>Controller – prijíma požiadavky od klienta a na základe konkrétnych požiadaviek riadi beh aplikácie</li>
</ol>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/cakephpmvc.png" alt="" /></div>
<p>Obrázok znázorňuje request od klienta a jeho následné spracovanie v CakePHP. Pre ilustráciu si predstavme, že klient nazvaný „Ricardo“ klikol na odkaz „Buy A Custom Cake Now!“ na domovskej stránke našej web aplikácie.</p>
<ol>
<li>Ricardo klikol na odkaz smerujúci na adresu <a href="http://www.example.com/cakes/buy">www.example.com/cakes/buy</a> a jeho prehliadač vytvoril request na váš webový server.</li>
<li>Dispatcher kontruluje request URL (/cakes/buy) a smeruje daný request na správny controller.</li>
<li>Controller vykonáva určitú logiku aplikácie. Pre príklad, controller môže kontrolovať, či je Ricardo prihlásený.</li>
<li>Controller taktiež používa modely na získanie prístupu k aplikačným dátam. Modely najčastejšie reprezentujú databázové tabuľky, ale môžu byť taktiež reprezentované LDAP entitami, RSS kanálmi alebo súbormi v systéme. V našom príklade controller používa model na získanie Ricardových posledných nákupov z databázy.</li>
<li>Controller okrem iného predáva dáta do ďalšej časti MVC architektúry nazvanej View. View vezme dáta a pripraví ich pre zobrazenie v klientovi. Views sú v CakePHP najčastejšie vo formáte HTML, avšak môžu byť aj jednoducho vo formáte PDF, XML alebo v inom formáte.</li>
<li>Akonáhle view kompletne pripraví dáta pre zobrazenie, následne sú spracované dáta vrátené ako response do Ricardovho klienta.</li>
</ol>
<p>Takmer každý request do vašej aplikácie bude nasledovať obdobný postup, preto je dobré si daný postup poriadne zapamätať a samozrejme mu aj porozumieť.</p>
<h2>Výhody</h2>
<p>Prečo používať MVC? Pretože je to je ustálený návrhový vzor, ktorý pretvorí aplikáciu na udržateľný, modulárny a rýchlo sa vyvíjúci balík. Nové vlastnosti sú pridávané jednoducho a staré rysy dostávajú novú tvár. Modulárny a oddelený návrh taktiež umožňuje developerom a návrhárom pracovať súčasne, zahŕňa taktiež možnosť rychlého <a href="http://en.wikipedia.org/wiki/Software_prototyping">prototypovania.</a> Separácia taktiež umožňuje developerom robiť zmeny v jednej časti aplikácie bez ovplyvnenia zvyšných častí.</p>
<p>Ak ste nikdy predtým nevyvíjali aplikáciu touto cestou, určite to zaberie určitý čas zoznámiť sa s návrhovým vzorom MVC, ale som presvedčený, že ak tak raz urobíte, nikdy to nebude chcieť robiť inak.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2008/04/01/mvc-model-view-controller-v-cakephp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
