<?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; Začíname s CakePHP</title>
	<atom:link href="http://ims.rockretail.com/category/zaciname-s-cakephp/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>6. Tvoríme CMS s CakePHP &#8211; admin rozhranie</title>
		<link>http://ims.rockretail.com/2008/12/17/6-tvorime-cms-s-cakephp-admin-rozhranie/</link>
		<comments>http://ims.rockretail.com/2008/12/17/6-tvorime-cms-s-cakephp-admin-rozhranie/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 10:43:00 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Začíname s CakePHP]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[V predchádzajúcich častiach sme si vytvorili takmer funkčnú aplikáciu, avšak naša aplikácia stále nedisponuje admin rozhraním. V tejto časti seriálu si ukážeme možnosti tvorby admin rozhrania a taktiež si ukážeme jednoduchý spôsob prihlasovania užívateľov k takémuto rozhraniu.
Admin rozhraním disponuje v súčasnosti každá väčšia web aplikácia, a keďže v našom seriáli tvoríme CMS nebude tomu inak [...]]]></description>
			<content:encoded><![CDATA[<p>V predchádzajúcich častiach sme si vytvorili takmer funkčnú aplikáciu, avšak naša aplikácia stále nedisponuje admin rozhraním. V tejto časti seriálu si ukážeme možnosti tvorby admin rozhrania a taktiež si ukážeme jednoduchý spôsob prihlasovania užívateľov k takémuto rozhraniu.<span id="more-55"></span></p>
<p>Admin rozhraním disponuje v súčasnosti každá väčšia web aplikácia, a keďže v našom seriáli tvoríme CMS nebude tomu inak ani u nás.</p>
<p>V CakePHP máme v podstate dve možnosti, ktorými môžeme vytvoriť admin rozhranie pre našu aplikáciu. Jednou z možností je vytvoriť admin rozhranie ako samostatnú aplikáciu, druhou možnosťou je použiť predpripravené riešenie, ktoré ponúka CakePHP.</p>
<h2>Admin rozhranie ako samostatná aplikácia</h2>
<p>Najprv si poďme predstaviť riešenie, kde bude admin rozhranie fungovať ako samostatná aplikácia. V rámci nášho projektu si vytvoríme novú aplikáciu, ktorú nazveme <strong>admin</strong> (novú aplikáciu môžeme vytvoriť pomocou dostupných konzolových nástrojov v CakePHP alebo skopírovaním obsahu adresára <em>app</em> do adresára <em>admin</em>). Adresárová štruktúra projektu po vytvorení novej aplikácie <em>admin</em> by mohla vypadať následovne</p>
<pre><code>/web
|_ admin
   |_ webroot
   |_ controllers
   |_ views
   |_ models
   |_ ...
|_ app
   |_ webroot
   |_ controllers
   |_ views
   |_ models
   |_ ...
|_ cake</code></pre>
<p>Predstavme si, že adresár <em>web</em> je koreňový adresár našej web aplikácie a adresár <em>admin</em> je naša nová aplikácia v rámci nášho projektu s kompletnou stromovou štruktúrou CakePHP aplikácie. Keďže sa v našom adresári <em>admin</em> nachádza kompletná CakePHP aplikácia, ktorá nám môže slúžiť ako admin rozhranie, môžeme k nej pristupovať prostredníctvom adresy <em>http:</em>example.com/ad­min/* //</p>
<p>Ako už určite tušíte, takýto prístup má jednú veľkú nevýhodu a tou je samotný fakt, že sa jedná o samostatnú aplikáciu. Tým že máme vytvorenú samostatnú aplikáciu pre náš frontend a samostatnú aplikáciu pre admin rozhranie, nebudeme môcť medzi týmito aplikáciami zdieľať žiadne komponenty, helpery atď.</p>
<p>Tento spôsob tvorby admin rozhrania by som neodporúčal, pretože nedodržuje pravidlo DRY a veľa rovnakého kódu budete musieť písať a upravovať na dvoch miestach osobitne, tak ako vo frontende, tak i v admin aplikácii.</p>
<h2>Admin rozhranie s pomocou CakePHP</h2>
<p>Druhý spôsob, oveľa jednoduchší a inteligentnejší, je využiť riešenie, ktoré nám priamo ponúka CakePHP. Základom tohto riešenia je nastaviť admin routovanie v súbore <em>app/config/co­re.php</em> odkomentovaním ri­adku následovne</p>
<pre><code>Configure::write('Routing.admin', 'admin');</code></pre>
<p>Týmto sme dali CakePHP najavo, že za adresou <em>http:</em>example.com/ad­min// sa bude skrývať naše admin rozhranie. Od tejto chvíle bude CakePHP automaticky rozpoznávať akcie v controlleri a k nim príslušné view podľa predpony admin_.</p>
<p>Pozrime sa radšej na konkrétny príklad a poďme si teda doplniť našu aplikáciu o potrebné admin rozhranie. Pre názornosť si uveďme skrátený výpis zdrojového kódu <em>ArticlesContro­ller</em> v súbore <em>app/controller­s/articles_con­troller.php</em> (kompletné zdrojové kódy nájdete v prílohe k článku)</p>
<pre><code>&lt;?php
class ArticlesController extends AppController {

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

        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));
        }

        function admin_add() {
                if (!empty($this-&gt;data)) {
                        $this-&gt;Article-&gt;create();
                        if ($this-&gt;Article-&gt;save($this-&gt;data)) {
                                $this-&gt;Session-&gt;setFlash(__('The Article has been saved', true));
                                $this-&gt;redirect(array('action'=&gt;'index'));
                        } else {
                                $this-&gt;Session-&gt;setFlash(__('The Article could not be saved. Please, try again.', true));
                        }
                }
                $tags = $this-&gt;Article-&gt;Tag-&gt;find('list');
                $users = $this-&gt;Article-&gt;User-&gt;find('list');
                $this-&gt;set(compact('tags', 'users'));
        }

}
?&gt;</code></pre>
<p>V našom controlleri máme dve akcie, jedna z nich je pomenovaná <em>view</em> a druhá <em>admin_add</em>. Rozdiel medzi týmito akciami je v spôsobe prístupu k nim. Kým k akcii <em>view</em> pristupuje cez URL tak ako sme zvyknutý napr. <em>example.com/ar­ticles/view/10</em>, ku akcii <em>admin_add</em> pristupujeme cez URL <em>example.com/ad­min/articles/add</em></p>
<p>Nesmieme však zabudnúť na správne pomenovanie view súborov. Kedže každá akcia v controlleri je automaticky zviazaná s príslušným view súborom, vyššie spomenuté konvencie musíme dodržiavať aj pri view súboroch. Pozrime sa, ako by vyzerala adresárová štruktúra nášho príkladu</p>
<pre><code>/web
|_ app
   |_ controllers
      |_ articles_controller.php
   |_ views
      |_ articles
         |_ view.ctp
         |_ admin_add.ctp
   |_ models
   |_ ...</code></pre>
<p>Teraz nám je jasné, že ak vytvárame admin akciu v controlleri, musíme k nej vytvoriť aj admin view s rovnakým prefixom a to <em>admin_</em>. Síce už vieme úspešne vytvoriť admin rozhranie, avšak doposiaľ sme nijakým spôsobom nekontrolovali prístup k admin rozhraniu. A keďže určite nechceme admin rozhranie sprístupniť každému, poďme sa teda pozrieť, aké možnosti nám ponúka CakePHP.</p>
<h2>Autentifikácia</h2>
<p>O autentifikáciu sa v CakePHP stará komponenta „AuthComponent“:<a href="http://api.cakephp.org/class_auth_component.html">http://api.cakephp.org/…mponent.html</a> Táto komponenta disponuje množstvom užitočných metód a my sa na ne pozrieme priamo v našom ukážkovom príklade.</p>
<p>Našou úlohou bude, aby k našim admin akciám mal prístup len prihlásený užívateľ (keďže je náš systém veľmi jednoduchý, nebudeme riešiť žiadnu autorizáciu užívateľov a vystačíme si len s prihlasovaním užívateľov). Tzn. že pre vstup do admin rozhrania nám bude stačiť úspešné overenie mena a hesla.</p>
<h3>Nastavenie Auth komponenty</h3>
<p>Prvým krokom je nastavenie databázovej tabuľky. Tabuľku v databáze nazveme <em>users</em> (my už ju máme z predchádzajúcich častí vytvorenú) a jej štruktúra bude nasledovná</p>
<pre><code>CREATE TABLE users (
    id integer auto_increment,
    username char(50),
    password char(50),
    PRIMARY KEY (id)
);</code></pre>
<p>Ďalším krokom je načítanie tejto komponenty. Komponentu musíme načítať v niektorom z našich existujúcich controllerov, my ju budeme volať z <em>AppController</em> v súbore <em>app/app_contro­ller.php</em> aby bola komponenta dostupná pre všetky zdedené controllery</p>
<pre><code>class AppController extends Controller {
    var $components = array('Auth');
}</code></pre>
<p>Komponentu máme načítaný, následne môžeme začať s prihlasovaním užívateľov.</p>
<h3>Prihlasujeme užívateľa</h3>
<p>Najprv si musíme nastaviť potrebné premenné v komponente a tým zabezpečiť jej inicializáciu. Postupne určíme, na akú adresu nás aplikácia presmeruje po úspešnom prihlásení resp. po úspešnom odhlásení, taktiež je potrebné určiť, ktorá časť systému bude prístupná len prihlásenému užívateľovi. Tieto nastavenia nastavíme v <em>AppController</em> v súbore <em>app/app_contro­ller.php</em></p>
<pre><code>function beforeFilter() {
    $this-&gt;Auth-&gt;loginRedirect = array('controller' =&gt; 'articles', 'action' =&gt; 'index');
    $this-&gt;Auth-&gt;logoutRedirect = '/';
    $this-&gt;Auth-&gt;authorize = 'controller';
    $this-&gt;Auth-&gt;allow(array('index','view'));
}

function isAuthorized() {
    return true;
}</code></pre>
<p>Direktívou <em>$this-&gt;Auth-&gt;authorize = ‚controller‘</em> sme určili, že komponenta bude overovať prístup ku controlleru a jeho akciám. Tento spôsob je najjednoduchší, preto ho použijeme, avšak medzi možnosti patrí aj overovanie prístupu k modelu.</p>
<p>Direktívou <em>$this-&gt;Auth-&gt;allow(array(‚in­dex‘,‚view‘));</em> sme určili, že akcie <em>view</em> a <em>index</em> nebudú vyžadovať prihlásenie užívateľa, všetky ostatné akcie následne prihlásenie budú vyžadovať.</p>
<p>Ešte treba spomenúť metódu <em>isAuthorized()</em>, ktorá musí byť implementovaná, ak používame spôsob overovania <em>controller</em>. Do tejto metódy môžeme dať nejaké rozšírujúce podmienky súvisiace s overovaním užívateľa, napr. po úspešnom overení mena a hesla užívateľa môžeme skontrolovať, či užívateľ je administrátor a pod. V našom prípade žiadne doplňujúce podmienky nemáme, takže metóda vracia priamo hodnotu true a jedinou podmienkou pre prihlásenie je úspešné overenie mena a hesla.</p>
<p>Aby sa mohol užívateľ úspešne prihlásiť, musíme ešte vytvoriť formulár na prihlasovanie a príslušné akcie v controlleri <em>UsersController</em> v súbore <em>app/controller­s/users_contro­ller.php</em>.</p>
<p>V súbore <em>app/view/admin_lo­gin.ctp</em> vytvoríme formulár pre prihlásenie užívateľa</p>
<pre><code>&lt;?php
if  ($session-&gt;check('Message.auth')) $session-&gt;flash('auth');
echo $form-&gt;create('User', array('action' =&gt; 'login'));
echo $form-&gt;input('username');
echo $form-&gt;input('password');
echo $form-&gt;end('Login');
?&gt;</code></pre>
<p>V súbore <em>app/controller­s/users_contro­llers.php</em> doplníme potrebné akcie</p>
<pre><code>function admin_login() {
}

function logout() {
    $this-&gt;redirect($this-&gt;Auth-&gt;logout());
}</code></pre>
<p>Teraz máme všetko pripravené pre úspešné prihlasovanie a odhlasovanie užívateľov. Ak si teraz skúsime zadať adresu <em>example.com/ad­min/articles/add</em> systém nás automaticky presmeruje na prihlasovací formulár na adrese <em>example.com/ad­min/users/login</em> a nedovolí nám bez prihlásenia a úspešného overenia mena a hesla vstúpiť na túto adresu. Po zadaní adresy <em>example.com/u­sers/logout</em> budeme odhlásení a presmerovaní na adresu <em>example.com/ar­ticles</em> presne tak, ako sme si to určili v <em>AppController</em> v metóde <em>beforeFilter()</em> direktívou <em>$this-&gt;Auth-&gt;logoutRedirect = array(‚controller‘ ⇒ ‚articles‘,‚action‘ ⇒ ‚index‘)</em></p>
<p>V článku sme si predstavili dva možné spôsoby, ako vytvoriť admin rozhranie pre našu aplikáciu. Myslím si, že spôsob s pred pripraveným riešením CakePHP je oveľa praktickejší a poskytuje nám väčšiu flexibilitu. Taktiež sme si ukázali jednoduchý prihlasovací mechanizmus pomocou Auth komponenty.</p>
<p>Týmto je základná funkčnosť našej aplikácie kompletná a v budúcich častiach si ukážeme pokročilejšiu prácu v CakePHP, ako napríklad prácu s helpermi, ajaxom atď.</p>
<p>Na záver ešte poznamenám, že v prílohe sa nachádza kompletná ukážková aplikácia. Inštalačný skript pre databázu sa nachádza v súbore <em>app/config/sql/in­stall.sql</em> a prístup k databáze je potrebné nastaviť v súbore <em>app/config/da­tabase.php</em></p>
<p>Rád uvítam vaše námety a pripomienky v diskusii k článku.</p>
<p>Na stiahnutie: <a href="http://ims.rockretail.com/wp-content/uploads/2009/11/zaciname-s-cakephp-6.zip">zaciname-s-cakephp-6</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2008/12/17/6-tvorime-cms-s-cakephp-admin-rozhranie/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<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>4. Tvoríme CMS s CakePHP &#8211; Model</title>
		<link>http://ims.rockretail.com/2008/03/17/4-tvorime-cms-s-cakephp-model/</link>
		<comments>http://ims.rockretail.com/2008/03/17/4-tvorime-cms-s-cakephp-model/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 16:30:21 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Začíname s CakePHP]]></category>
		<category><![CDATA[active record]]></category>
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[V minulej časti seriálu sme si vysvetlili srdce frameworku Active Record. Od dnešnej časti sa pustíme do programovania nášho CMS a začneme návrhom databáze a vytvorením databázovej vrstvy našej aplikácie tzv. Modelu.
Konvencie CakePHP
Aby sme vedeli správne navrhnúť databázu, a CakePHP na jej základe správne chápal väzby medzi tabuľkami, je potrebné poznať konvencie pre návrh databáze. [...]]]></description>
			<content:encoded><![CDATA[<p>V minulej časti seriálu sme si vysvetlili srdce frameworku Active Record. Od dnešnej časti sa pustíme do programovania nášho CMS a začneme návrhom databáze a vytvorením databázovej vrstvy našej aplikácie tzv. Modelu.<span id="more-30"></span></p>
<h2>Konvencie CakePHP</h2>
<p>Aby sme vedeli správne navrhnúť databázu, a CakePHP na jej základe správne chápal väzby medzi tabuľkami, je potrebné poznať konvencie pre návrh databáze. Čo myslíme tým, aby CakePHP správne chápal väzby medzi tabuľkami? Znamená to, že ak budeme mať databázu správne navrhnutú, framework bude automaticky rozpoznávať cudzie kľúče, primárne kľúče a väzby medzi tabuľkami, a nebudeme ich musieť pre každú tabuľka explicitne zadávať.</p>
<p>Ešte je dobré poznamenať, že je veľmi rozumné zadávať názvy tabuliek, modelov atď. v anglickom jazyku. CakePHP automaticky chápe anglické jednotné a množné čísla, takže sa vyhneme zbytočným nastavovaniam (samozrejme je možné zadávať názvy aj v národných jazykoch, ale je to práca naviac a my preto budeme používať anglické konvencie).</p>
<p><strong>Názvy tabuliek</strong></p>
<p>Názvy tabuliek sa zapisujú pomenovaním v množnom čísle jednotiek, ktoré uchovávajú. Napríklad máme tabuľku, ktorá uchováva články, preto musí byť táto tabuľka pomenovaná v množnom čísle, v našom prípade <em>articles</em>.</p>
<p><strong>Primárny kľúč</strong></p>
<p>Primárny kľúč sa v tabuľkách označuje pomenovaním <em>id</em>. Taktiež platí, že môžeme používať aj iné pomenovanie pre primárny kľúč, ale opäť to musíme nastaviť.</p>
<p><strong>Cudzie kľúče</strong></p>
<p>Cudzie kľúče sa sa v tabuľkách označujú podľa tabuľky, kde sa pôvodne nachádzajú. Predstavme si, že každý článok má svojho autora. Čiže budeme mať dve tabuľky a to <em>articles</em> a <em>users</em>. V tabuľke <em>articles</em> sa bude potom pochopiteľne nachádzať cudzí kľúč z tabuľky <em>users</em> a to pomenovaním <em>user_id</em>. Čiže nám je hneď zrejmé, že cudzí kľúč sa tvorí podľa konvencie <em>jednotne_cislo_ta­bulky_cudzieho_klu­ca_id</em>.</p>
<p><strong>Názvy atribútov</strong></p>
<p>Ešte spomeniem, že je celkom vhodné, aby sa atribút <em>názov</em> pomenovával ako <em>name</em>. Oceníme to najmä pri generovaní select boxov vo väzbách 1:N, kde si budeme chcieť napríklad pri článku zvoliť kategóriu výberom z niekoľkých možností.</p>
<p><strong>Spojovacia tabuľka pri väzbe N:M</strong></p>
<p>Tabuľky ktoré sú vo väzbe N:M abecedne zoradíme a následne novú tabuľku pomenuje podľa konvencie <em>nazov_prvej_ta­bulky_nazov_dru­hej_tabulky</em>. Predstavme si, že náš článok má N nálepiek a jedna nálepka môže byť v M článkoch. Máme teda tabuľky pomenované <em>articles</em> a <em>tags</em> a následne vytvoríme spojovaciu tabuľku, ktorú pomenujeme <em>articles_tags</em>. Cudzie kľúče do spojovacej tabuľky vytvoríme podľa konvencií, ktoré sme si definovali vyššie.</p>
<h2>Navrhujeme databázu</h2>
<p>Na obrázku môžeme vidieť našu databázu pre náš nový redakčný systém, ktorú sme navrhli na základe vyššie definovaných konvencií</p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/4-cast-serial-db.png" alt="" /></div>
<h2>Modely tabuliek</h2>
<p>Databázu už máme správne navrhnutú a môžeme sa pustiť do tej najzaujímavejšej časti, a to je návrh databázovej vrstvy našej aplikácie tzv. <strong>Modelu</strong>, čo je jedna z troch častí návrhového vzoru <strong>Model View Controller</strong>. Ako sme si už spomínali v predchádzajúcom článku, modely sa umiestňujú do adresára <em>app/models</em>. V našom prípade vytvoríme 4 modely, i keď máme tabuliek spolu 5. Ako sme si už spomínali, model sa pre spojovaciu tabuľku nevytvára a kedže máme databázu správne navrhnutú, všetku potrebnú prácu v súvislosti so spojovacou tabuľkou vykoná Cake automaticky. Predtým, než začneme vytvárať samotné modely treba poznamenať, že model sa pomenováva ako jednotné číslo názvu tabuľky, čiže napr. pre našu tabuľku <em>articles</em> sa bude model nazývať <em>article</em> a bude umiestnený v súbore <em>app/models/ar­ticle.php</em></p>
<p><em>Model Article umiestený v súbore /app/models/ar­ticle.php</em></p>
<pre><code>&lt;?php
class Article extends AppModel {

        var $name = 'Article';
        var $useTable = 'articles';
        var $validate = array(
                'title' =&gt; VALID_NOT_EMPTY,
                'text' =&gt; VALID_NOT_EMPTY,
                'user_id' =&gt; array('numeric'),
                'created' =&gt; array('date')
        );

        var $belongsTo = array('User');
        var $hasAndBelongsToMany = array('Tag');
        var $hasMany = array('Comment');
}
?&gt;</code></pre>
<p><em>Model User umiestnený v súbore /app/models/u­ser.php</em></p>
<pre><code>&lt;?php
class User extends AppModel {

        var $name = 'User';
        var $useTable = 'users';
        var $validate = array(
                'username' =&gt; VALID_NOT_EMPTY,
                'password' =&gt; VALID_NOT_EMPTY
        );

        var $hasMany = array('Article');

}
?&gt;</code></pre>
<p><em>Model Comment umiestnený v súbore /app/models/com­ment.php</em></p>
<pre><code>&lt;?php
class Comment extends AppModel {

        var $name = 'Comment';
        var $useTable = 'comments';
        var $validate = array(
                'title' =&gt; VALID_NOT_EMPTY,
                'text' =&gt; VALID_NOT_EMPTY,
                'username' =&gt; VALID_NOT_EMPTY,
                'article_id' =&gt; array('numeric')
        );

        var $belongsTo = array('Article');

}
?&gt;</code></pre>
<p><em>Model Tag umiestnený v súbore /app/models/tag­.php</em></p>
<pre><code>&lt;?php
class Tag extends AppModel {

        var $name = 'Tag';
        var $useTable = 'tags';
        var $validate = array(
                'name' =&gt; VALID_NOT_EMPTY,
                'seo_link' =&gt; VALID_NOT_EMPTY
        );

        var $hasAndBelongsToMany = array('Article');

}
?&gt;</code></pre>
<p>Ako môžeme vidieť vyššie, v kóde sme už uviedli aj validačné kritéria, ktoré sme si priblížili už v predchádzajúcej časti seriálu. Využívať ich však budeme až v časti nasledujúcej, v ktorej sa budeme venovať vytváraniu zvyšných dvoch častí architektúry MVC a to Controller a View.</p>
<p>Aby sme si mohli otestovať, či sme našu databázu skutočne navrhli správne, môžeme využiť tzv. <strong>scaffolding</strong>. Cake nám pomocou <strong>scaffolding</strong> dokáže na základe vytvorených modelov automaticky skonštruovať ukážkovú aplikáciu, pomocou ktorej môžeme otestovať, či nám väzby v našej tabuľke fungujú správne. Potrebujeme však ku každému modelu vytvoriť <strong>Controller</strong>, v ktorom určíme, že Cake má používať na vytvorenie aplikácie scaffolding (ako som už spomínal vyššie, controlleru sa budeme venovať v nasledujúcej časti, preto nám teraz stačí bez hlbšieho vysvetlenie skopírovať jednotlivé kódy konkrétnych súborov s controllermi).</p>
<p><em>Controller Articles umiestnený v súbore /app/controller­s/articles_con­troller.php</em></p>
<pre><code>&lt;?php
class ArticlesController extends AppController {

        var $name = 'Articles';
        var $scaffold;
}
?&gt;</code></pre>
<p><em>Controller Users umiestnený v súbore /app/controller­s/users_contro­ller.php</em></p>
<pre><code>&lt;?php
class UsersController extends AppController {

        var $name = 'Users';
        var $scaffold;
}
?&gt;</code></pre>
<p><em>Controller Comments umiestnený v súbore /app/controller­s/comments_con­troller.php</em></p>
<pre><code>&lt;?php
class CommentsController extends AppController {

        var $name = 'Comments';
        var $scaffold;
}
?&gt;</code></pre>
<p><em>Controller Tags umiestnený v súbore /app/controller­s/tags_contro­ller.php</em></p>
<pre><code>&lt;?php
class TagsController extends AppController {

        var $name = 'Tags';
        var $scaffold;
}
?&gt;</code></pre>
<p>Skúste si zadať do url prehliadača napríklad adresy</p>
<p>www.tvoja-adresa/articles, www.tvoja-adresa/comments alebo www.tvoja-adresa/users.</p>
<p>Aké jednoduché však? Scaffolding je mocný nástroj tohto frameworku a dokáže nám značne uľahčiť prácu pri návrhu zložitejších vzťahov v databáze, preto určite stojí zato ho v rannom štádiu vývoja používať.</p>
<p>Rád uvítam vaše námety a pripomienky v diskusii k článku.</p>
<p>Na stiahnutie: <a href="http://ims.rockretail.com/wp-content/uploads/2008/03/zaciname-s-cakephp-4.zip">zaciname-s-cakephp-4</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2008/03/17/4-tvorime-cms-s-cakephp-model/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>3. Tvoríme CMS s CakePHP &#8211; Active Record</title>
		<link>http://ims.rockretail.com/2008/02/11/3-tvorime-cms-s-cakephp-active-record/</link>
		<comments>http://ims.rockretail.com/2008/02/11/3-tvorime-cms-s-cakephp-active-record/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 22:50:27 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Začíname s CakePHP]]></category>
		<category><![CDATA[active record]]></category>
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Treťou časťou pokračuje seriál o CakePHP. Táto časť patrí k najdôležitejším, pretože si v nej budeme podrobne vysvetľovať srdce celého frameworku a to je Active Record.
V minulej časti sme si povedali o základnej inštalácii celého frameworku a pre začiatok sme si vysvetlili, ako funguje základné rozloženie stránky. V dnešnej časti si predstavíme srdce celého CakePHP [...]]]></description>
			<content:encoded><![CDATA[<p>Treťou časťou pokračuje seriál o CakePHP. Táto časť patrí k najdôležitejším, pretože si v nej budeme podrobne vysvetľovať srdce celého frameworku a to je <strong>Active Record.</strong><span id="more-21"></span></p>
<p>V minulej časti sme si povedali o základnej inštalácii celého frameworku a pre začiatok sme si vysvetlili, ako funguje základné rozloženie stránky. V dnešnej časti si predstavíme srdce celého CakePHP a ukážeme si, ako správne dodržiavať konvencie Cake v súvislosti s návrhom databáze. Samotný návrh databázy príde na radu v nasledujúcej čas­ti.</p>
<h2>Active Record</h2>
<p>Active Record je srdce CakePHP a dokonale demonštruje princípy, na akých je Cake postavený.</p>
<p>Active Record je návrhový vzor, ktorý mapuje databázové tabuľky na triedy, riadky na objekty a stĺpce na ich atribúty (Toto však v Cake nie je úplne tak, rozdiel je v tom, že aktuálne sa riadky a stĺpce mapujú na dvojrozmerné polia. Mapovanie na objekty je naplánované na verziu 2.0). Z názvu triedy modelu teda jednoducho odvodíme názov tabuľky, napr. máme model Article, a k nemu patrí tabuľka articles (vždy množné číslo od názvu modelu). Zároveň active record umožňuje definovať vzťahy medzi tabuľkami (hasMany, belongsTo, hasManyAndBelon­gsTo…), okrem toho obsahuje výkonné nástroje pre prácu s dátami, ako je zápis, čítanie, validácia.</p>
<p>Čo teda Active Record prináša do našej práce? Najdôležitejšia a podstatná vec je, že nám značne uľahčuje prácu s databázou, kde v konečnom dôsledku nemusíme písať SQL. Koľko práce trávime písaním, ladením sql dotazov, následné mapovanie výsledkov atď. Active Record nám umožňuje pracovať na oveľa vyššej intelektuálnej úrovni. Poďme sa pozrieť na nasledujúci príklad:</p>
<p>Máme tabuľku Articles, v ktorej máme uložené jednotlivé články. Bežným spôsobom chceme vybrať konkrétny článok <em>SELECT * FROM articles WHERE id = 1</em></p>
<pre><code>+----+-------------+--------------------+--------+---------------------+
| id | title       | text               | user   | created             |
+----+-------------+--------------------+--------+---------------------+
|  1 | Titulok     | Text               | Linus  | 0000-00-00 00:00:00 |
+----+-------------+--------------------+--------+---------------------+</code></pre>
<p>V Cake si vytvoríme triedu <em>Article</em> (uložíme ju do súboru /app/models/ar­ticle.php), ktorá nám bude reprezentovať tabuľku <em>articles</em> (názov tabuľky je množné číslo názvu modelu)</p>
<pre><code>class Article extends AppModel{
  var $name = 'Article';
}</code></pre>
<p>A pomocou príkazu <em>$this-&gt;Article-&gt;find(1);</em> dostaneme požadovaný výsledok</p>
<pre><code>Article =&gt;
id: 1
title: Titulok
text: Text
user: Linus
created: 0000-00-00 00:00:00</code></pre>
<p>Pôsobivé však? Ako sme si uviedli v prvej časti, konvencia má prednosť pred konfiguráciou, preto Cake automaticky predpokladá, že keď máme model nazvaný <em>Article</em>, v našej databáze existuje tabuľka nazvaná <em>articles</em>. Ak by sme však chceli zmeniť názov tabuľky a nepoužívať tak automatické konvecie, môžeme tak urobiť následovne</p>
<pre><code>class Article extends AppModel{
  var $name = 'Article';
  var $useTable = 'clanky';
}</code></pre>
<p>Vyššie sme si povedali, že Active Record obsahuje efektívne metódy nielen pre čítanie dát, ale aj pre ich manipuláciu. Poďme teda zmeniť titulok nášho článku</p>
<pre><code>$article = $this-&gt;Article-&gt;find(1);
$article['Article']['title'] = 'nový titulok';
$this-&gt;Article-&gt;save($article);</code></pre>
<p>po uložení môžeme vidieť obsah tabuľky</p>
<pre><code>+----+-------------+--------------------+--------+---------------------+
| id | title       | text               | user   | created             |
+----+-------------+--------------------+--------+---------------------+
|  1 | nový titulok| Text               | Linus  | 0000-00-00 00:00:00 |
+----+-------------+--------------------+--------+---------------------+</code></pre>
<p>A máme hotovo. Jednoduchšie to už ani nemôže byť. Absolútny rozdiel od spôsobu, kde by sme museli písať sql ako <em>select…</em>, potom <em>update…</em> je značný. Možností využitia Active Record je mnoho</p>
<ul>
<li><em>$this-&gt;Article-&gt;findById(1)</em> ⇒ vráti článok s id 1</li>
<li><em>$this-&gt;Article-&gt;findAll(null,a­rray(‚title,‘tex­t&#8217;),‚Article.cre­ated desc‘)</em> ⇒ vráti články zotriedené podľa dátumu vytvorenia, a vyberú sa len stĺpce title a text</li>
<li><em>$this-&gt;User-&gt;findByName(‚Li­nus‘)</em> ⇒ vráti autora s menom Linus</li>
</ul>
<p>Bolo by asi zbytočné vypisovať tu ďalšie ukážky a demonštrovať tak silu Active Record. Pre jednotlivé metódy a ich parametre odporúčam pozrieť <a href="http://api.cakephp.org/1.2/class_model.html">oficiálnu dokumentáciu</a>. Okrem iného sme si povedali, že Active Record nám nedáva len nástroje pre manipuláciu s dátami, ale poskytuje nám taktiež možnosť validácie vstupných dát a určenie vzťahov medzi tabuľkami.</p>
<p><strong>Validácia vstupných dát</strong> je jednou zo základných podmienok bezpečnosti a správnej funkcie webovej aplikácie. Active Record preto obsahuje vstavanú a veľmi prepracovanú validáciu, ktorá nám uľahčí množstvo práce. Chceme určiť, aby titulok článku nebol pri uložení prázdny</p>
<pre><code>class Article extends AppModel{
   var $name = 'Article';
   var $validate = array(
           'title' =&gt; VALID_NOT_EMPTY,
           );
}</code></pre>
<p>Týmto sme určili, že pri uložení článku, musí byť vždy atribút <em>title</em> neprázdny. Preto, keď sa pokúsime uložiť článok následovne, dostaneme chybovú hlášku, ktorá nás upozorní, že titulok článku nemôže byť prázdny.</p>
<pre><code>$article = $this-&gt;Article-&gt;find(1);
$article['Article']['title'] = '';
$this-&gt;Article-&gt;save($save);

This field cannot be left blank</code></pre>
<p>Používať môžeme aj niekoľko validačných kritérie pre jeden atribút. Chceme napríklad určiť, aby náš titulok nebol prázdny a zároveň, aby mal minimálne 5 znakov a maximálne 100 znakov, nie je nič jednoduchšie</p>
<pre><code>class Article extends AppModel{
   var $name = 'Article';
   var $validate = array(
        'title' =&gt; array(
            'required' =&gt; VALID_NOT_EMPTY,
            'length' =&gt; array( 'rule' =&gt; 'validateLength', 'min' =&gt; 5, 'max' =&gt; 100 )
        ),
   );
}</code></pre>
<p>Sami vidíte, že jednoduchšie to už ani nemôže byť. A k tomu ešte platí, že Cake automaticky vypĺňa hodnotu prvku formulára, pri neúspešnom uložení generuje chybovú hlášku pre každý prvok formulára (podľa určenia validácie v modely) a umožňuje nám určiť taktiež aj iné validačné pravidlá ako VALID_NUMBER, VALID_YEAR, resp. ľubovoľný vlastný regulárny výraz. Z tohto nám musí byť jasné, koľko práce, kódu a starostí máme ušetrených.</p>
<p>Posledná vec, ktorú spomeniem pri Active Record sú <strong>vzťahy medzi tabuľkami</strong>. Active Record umožňuje mapovať vzťahy medzi tabuľkami ako napríklad 1:N, M:N atď. Vezmime si náš prechádzajúci príklad. Určite budeme chcieť mať autorov v osobitnej tabuľke. Vytvoríme si preto novú tabuľku s názvom <em>users</em>. Každý článok bude mať práve jedného autora a autor môže mať niekoľko článkov, čiže tu máme väzbu 1:N. Kód bude nasledovný</p>
<pre><code>class Article extends AppModel{
  var $name = 'Article';
  var $belongsTo = 'User';
}

class User extends AppModel{
  var $name = 'User';
  var $hasMany = 'Article';
}</code></pre>
<p>Poďme si vytvoriť nového autora a následne nový článok s daným autorom</p>
<pre><code>$user['user']['name'] = 'Linus';
$user['user']['email'] = 'linus@aaa.com';
$this-&gt;user-&gt;save($user);

+----+-------------+--------------------+
| id | name        | email              |
+----+-------------+--------------------+
|  1 | Linus       | linus@aaa.com      |
+----+-------------+--------------------+

$article['Article']['title'] = 'titulok';
$article['Article']['text'] = 'text';
$article['Article']['user_id] = 1;
$this-&gt;Article-&gt;save($article);

+----+-------------+--------------------+-----------+---------------------+
| id | title       | text               | user_id | created             |
+----+-------------+--------------------+-----------+---------------------+
|  1 | titulok     | text               | 1         | 0000-00-00 00:00:00 |
+----+-------------+--------------------+-----------+---------------------+</code></pre>
<p>To bolo jednoduché, keď sa teraz pozrieme na článok <em>$this-&gt;Article-&gt;find(1)</em>, vidíme detaily, že nám všetko funguje správne</p>
<pre><code>Article =&gt;
id: 1
title: Titulok
text: Text
user: Linus
created: 0000-00-00 00:00:00
user =&gt;

id: 1
name: Linus
email: linus@aaa.com</code></pre>
<p>Aké jednoduché však? Nemuseli sme písať žiadne dodatočné sql dotazy, stále nám stačí príkaz <em>$this-&gt;Article-&gt;find(1)</em>, jediné, čo je potrebné, je dodržiavať konvencie Cake a správne určiť vzťahy medzi tabuľkami (určiť správny vzťah medzi danými tabuľkami nám značne pomáha tzv. console, venovať sa jej budeme v niektorých z nasledujúcich častí) a v daných tabuľkách správne dodržiavať cudzie kľúče. Poďme sa preto pozrieť, ako vyzerajú dané tabuľky.</p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/hasmany.png" alt="cakephp hasmany active record" /></div>
<p>Z obrázku je jasné, že cudzí kľúč v tabuľke <em>articles</em> musí byť pomenovaný <em>user_id</em> čo sú dané konvencie Cake, aby framework mohol určiť, že sa jedná o cudzí kľúč z tabuľky <em>users</em>. Čiže vždy platí, že cudzí kľúč v tabuľke je zložený z jednotného číslo názvu tabuľky cudzieho kľúča a príslušného id, teda pre cudzí kľúč autora v tabuľke <em>articles</em> bude <em>user_id</em>.</p>
<p>Ako to bude s väzbou N:M? Opäť to bude veľmi jednoduché. Predstavme si situáciu, že článok môže mať niekoľko autorov a autor može mať niekoľko článkov. Tabuľky sú na sebe nezávislé a ich prepojenie bude zaisťovať špeciálna tabuľka, ktorú môžeme vidieť na obrázku</p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/hasandbelongstomany.png" alt="cakephp hasandbelongstomany active record" /></div>
<p>Opäť musíme dodržiavať konvencie Cake, aby všetko fungovalo správne. Názov tabuľky <em>articles_users</em> sa skladá z názvov tabuliek, ktoré sú vo vzťahu N:M, čiže <em>articles</em> a <em>users</em> a navyše tieto tabuľky musie byť zapísané v abecednom poradí a oddelené podtržítkom. Kód bude potom nasledovný</p>
<pre><code>class Article extends AppModel{
  var $name = 'Article';
  var $hasAndBelongsToMany = array(
          'user' =&gt; array('className' =&gt; 'user',
                        'joinTable' =&gt; 'articles_users',
                        'foreignKey' =&gt; 'article_id',
                        'associationForeignKey' =&gt; 'user_id',
                           )
       );
}

class user extends AppModel{
  var $name = 'user';
  var $hasAndBelongsToMany = array(
          'Article' =&gt; array('className' =&gt; 'Article',
                        'joinTable' =&gt; 'articles_users',
                        'foreignKey' =&gt; 'user_id',
                        'associationForeignKey' =&gt; 'article_id',
                           )
       );
}</code></pre>
<p>Ešte treba poznamenať, že model sa pre spojovaciu tabuľku <em>articles_users</em> nevytvára, vďaka dodržiavaniu konvencií Cake to nie je potrebné.</p>
<p>Týmto sme u konca. Dúfam, že sa mi podarilo zachytiť základné rysy a možnosti Active Record v CakePHP. Samotný návrh databáze a jej testovanie príde na radu v nasledujúcom článku.</p>
<p>Rád uvítam vaše námety a pripomienky v diskusii k článku.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2008/02/11/3-tvorime-cms-s-cakephp-active-record/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>2. Tvoríme CMS s CakePHP &#8211; začíname pracovať</title>
		<link>http://ims.rockretail.com/2008/01/04/2-tvorime-cms-s-cakephp-zaciname-pracovat/</link>
		<comments>http://ims.rockretail.com/2008/01/04/2-tvorime-cms-s-cakephp-zaciname-pracovat/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 21:34:29 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Začíname s CakePHP]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[cms]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Opäť pokračujeme v našom seriály a tentokrát začneme pracovať priamo s frameworkom.
V minulej časti sme si niečo málo povedali o základných vlastnostiach a prednostiach CakePHP. Počnúc touto časťou bude každý diel venovaný tvorbe redakčného systému a na konkrétnych ukážkach si predstavíme jednotlivé prednosti a vlastnosti tohto skvelého frameworku.
1. krok – získavame framework
Základný balík si môžete [...]]]></description>
			<content:encoded><![CDATA[<p>Opäť pokračujeme v našom seriály a tentokrát začneme pracovať priamo s frameworkom.<span id="more-18"></span></p>
<p>V minulej časti sme si niečo málo povedali o základných vlastnostiach a prednostiach CakePHP. Počnúc touto časťou bude každý diel venovaný tvorbe redakčného systému a na konkrétnych ukážkach si predstavíme jednotlivé prednosti a vlastnosti tohto skvelého frameworku.</p>
<h2>1. krok – získavame framework</h2>
<p>Základný balík si môžete stiahnuť priamo <a href="http://cakeforge.org/frs/download.php/595/cake_1.2.0.6311-beta.tar.bz2">zo stránok CakePHP – download sekcia</a>. V dobe písania tejto časti je aktuálna vývojová verzia 1.2.0.6311-beta. Po stiahnutí balíka rozbalíme príslušné súbory do adresára <strong>cakephp</strong> a umiestníme ho do zložky, kde bude prístupný webovému serveru (v mojom prípade je to zložka ~/www/cakephp a následne sa môžeme po spustení webového servera napr. Apache odkazovať na adresár prostredníctvom adresy <a href="http://localhost/cakephp">http://localhost/cakephp</a>). Týmto máme všetky potrebné súbory skopírované a framework pripravený k použitiu.</p>
<h2>2. krok – prvé kroky</h2>
<p>Medzi prvé kroky patrí nastavenie práv pre zápis pre adresár <strong>app/tmp/cache</strong> a zmena predvoleného hashovacieho stringu v súbore <strong>app/config/co­re.php</strong></p>
<pre><code>Configure::write('Security.salt', 'DYhG93b0asdf97473qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');</code></pre>
<p>Po zadaní adresy do webového prehliadača, v našom prípade <a href="http://localhost/cakephp">http://localhost/cakephp</a>, môžeme vidieť úvodnú obrazovku, ktorou nás CakePHP privíta a ktorá zároveň indikuje, že sa nám framework podarilo úspešne nainštalovať.</p>
<div><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/screenshot.png"><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/screenshot_thumb.png" alt="cakephp first screen" /></a></div>
<p>Ako môžeme vidieť na obrázku, Cake nám taktiež oznamuje, že nemáme nastavený prístup k databáze a to oznámením <strong>Your database configuration file is NOT present.</strong> Treba nám premenovať súbor <strong>app/config/da­tabase.php.de­fault</strong> na <strong>app/config/da­tabase.php</strong> a v ňom upraviť nasledovnú časť (jednotlivé položky sú dosť intuitívne a nemusím ich predstavovať)</p>
<pre><code>var $default = array(
        'driver' =&gt; 'mysql',
        'persistent' =&gt; false,
        'host' =&gt; 'localhost',
        'port' =&gt; '',
        'login' =&gt; 'user',
        'password' =&gt; 'password',
        'database' =&gt; 'database_name',
        'schema' =&gt; '',
        'prefix' =&gt; '',
        'encoding' =&gt; ''
);</code></pre>
<p>Ak doplníme správne hodnoty a Cake bude schopný pripojiť sa k databáze, oznámi nám to nasledovnou hláškou <strong>Your database configuration file is present. Cake is able to connect to the database.</strong> Pre pokročilé možnosti pripojenia k databáze si môžete prečítať článok <a href="http://ims.rockretail.com/articles/2008/03/26/pripojujeme-sa-k-databaze">Pripojujeme sa k databáze v CakePHP</a></p>
<h2>3. krok – upravujeme vzhľad</h2>
<p>Na obrázku vyššie môžeme vidieť defaultný vzhľad CakePHP po prvom spustení. My si chceme však vzhľad prispôsobiť podľa vlastných potrieb. Nato, aby sme chápali, ako sa vykresľuje celý vzhľad, pozrime si nasledujúci obrázok</p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/screenshot2.png" alt="cakephp layout" /></div>
<p>Modrou farbou je vykreslený tzv. <strong>layout stránky</strong>, ktorý sa vkladá do každej zobrazenej stránky a ak neurčíme inak, je pre všetky zobrazené stránky rovnaký (môžeme si to predstaviť, že na každej stránke so zobrazí napr. logo a práve dané logo bude umiestnené v jednom jedinom súbore, ktorý sa nazýva <strong>layout</strong>). Žltou farbou môžeme vidieť konkrétny <strong>view</strong>, pod ktorým si môžeme predstaviť napr. zoznam článkov, komentárov, noviniek atď.</p>
<p>Keď už vieme, ako celý zobrazovací mechanizmus pracuje, môžeme sa pustiť do prvých úprav. Najprv si zmeníme text úvodnej stránky v samotnom <strong>view</strong> a to vytvorením súboru <strong>app/views/pages/ho­me.ctp</strong> a vložením skúšobného textu do novovytvoreného súboru. Po úprave môžeme vidieť niečo obdobné</p>
<div><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/screenshot3.png"><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/screenshot3_thumb.png" alt="cakephp default layout" /></a></div>
<p>Defaultný layout necháme nezmenený a pre tento seriál budeme používať pôvodný priamo z CakePHP. Ak by sme sa ho však rozhodli zmeniť, vytvorili by sme súbor **app/views/la­youts/default­.ctp&#8221; do ktorého by sme umiestnili napr. nasledovný kód</p>
<pre><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;?p echo $html -&gt; charset("utf-8"); ?&gt;
&lt;title&gt;&lt;?php echo $title_for_layout?&gt;&lt;/title&gt;
&lt;? echo $html -&gt; css("stylesheet"); ?&gt;
&lt;? echo $javascript -&gt; link("scriptaculous/prototype.js"); ?&gt;

&lt;/head&gt;

&lt;body&gt;
&lt;div id="container"&gt;
&lt;div id="header"&gt;
    &lt;div id="menu"&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;?
        if ($session-&gt;check('Message.flash')):
                        $session-&gt;flash();
        endif;
?&gt;
&lt;div id="content"&gt;
        &lt;?php echo $content_for_layout ?&gt;
&lt;/div&gt;

&lt;div id="footer"&gt;
        &lt;a href="mailto:tibor.pino@gmail.com"&gt;Vyrobil Tibor Piňo&lt;/a&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>Jednotlivé časti layoutu si vysvetlíme neskôr, ale už aj teraz môžete vidieť, ako sa vkladajú css súbory, javascript súbory, ako sa zobrazuje view v layoute pomocou direktívy <strong>&lt;?php echo $content_for_layout ?&gt;</strong> atď.</p>
<p>A to by bolo pre túto časť zhruba všetko. V tejto časti sme sa už dostali k prvým úpravám vzhľadu, vysvetlili sme si ako funguje celý princíp zobrazovanie v Cake a taktiež ako si správne nakonfigurovať prístup k databáze. Týchto pár krokov nám stačí k ďalšej plnohodnotnej práci a v ďalšej časti si správne vytvoríme databázové tabuľky, vysvetlíme si vzťahy medzi jednotlivými tabuľkami a celý návrh otestujeme pomocou tzv. <strong>lešenia</strong> alebo <strong>scaffolding</strong></p>
<p>Rád uvítam vaše nápady a pripomienky v diskusii k článku.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2008/01/04/2-tvorime-cms-s-cakephp-zaciname-pracovat/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>1. Tvoríme CMS s CakePHP &#8211; úvod</title>
		<link>http://ims.rockretail.com/2007/12/12/1-tvorime-cms-s-cakephp-uvod/</link>
		<comments>http://ims.rockretail.com/2007/12/12/1-tvorime-cms-s-cakephp-uvod/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 22:09:29 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Začíname s CakePHP]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[cms]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Touto časťou sa začína seriál, v ktorom si na tvorbe konkrétnej webovej aplikácie ukážeme jednotlivé aspekty skvelého frameworku CakePHP.
Trochu histórie
Začiatky CakePHP siahajú do roku 2005, kedy Michal Tatarynowicz vytvoril minimalistický framework nazvaný Cake. Tento framework vydal neskôr pod licenciou MIT, čím položil základ pre dnešný CakePHP. Mnohí by si mohli myslieť, že napriek krátkej existencii [...]]]></description>
			<content:encoded><![CDATA[<p>Touto časťou sa začína seriál, v ktorom si na tvorbe konkrétnej webovej aplikácie ukážeme jednotlivé aspekty skvelého frameworku CakePHP.<span id="more-17"></span></p>
<h2>Trochu histórie</h2>
<p>Začiatky CakePHP siahajú do roku 2005, kedy Michal Tatarynowicz vytvoril minimalistický framework nazvaný Cake. Tento framework vydal neskôr pod licenciou MIT, čím položil základ pre dnešný CakePHP. Mnohí by si mohli myslieť, že napriek krátkej existencii sa nejedná o vyspelý projekt, ale opak je pravdou a aj tento seriál bude ukážkou toho, akým silným nástrojom pri vývoji webových aplikácie CakePHP je.</p>
<h2>Dáte si koláč?</h2>
<p>Ako som už vyššie spomínal, jedná sa o open source projekt, ktorý vyvíja Cake Software Foundation a oficiálnu stránku projektu môžete nájsť na adrese <a href="http://www.cakephp.org">www.cakephp.org</a></p>
<p>Jedná sa o framework postavený na skriptovacom jazyku PHP. Jednou z najväčších predností CakePHP je, že v jeho základnej kostre je inšpirovaný zrejme najlepším frameworkom súčasnosti a to Ruby on Rails. Frameworkov, ktorý sa taktiež inšpirovali RoR je mnoho, ale myslím si, že práve CakePHP je z nich najkomplexnejší.</p>
<p>Ak ste o danom frameworku ešte nepočuli, pozrite si najprv krátke video, v ktorom autor za pár minút naprogramuje kompletný blog: <a href="http://www.cakephp.org/screencasts/view/3">The Blog Tutorial</a>. Hotovo? Tak Poďme ďalej. Video je určite pôsobivé a jasne ukazuje, čo prináša CakePHP do sveta PHP. Môžeme vidieť, že aplikácia akoby sa rozvíjala „sama od seba“. Prečo je tomu tak? Pretože sa nesústreďujeme na nudné veci, ako je konfigurácia, mapovanie url a nekonečné písanie sql dotazov. Všetky tieto základné veci fungujú ako keby „samy od seba“, takže sa môžeme sústrediť skutočne na samotnú logiku aplikácie. A prečo to takto funguje?</p>
<p><strong>Konvencia má prednosť pred konfiguráciou</strong></p>
<p>Celý vývoj aplikácií pod CakePHP je tomuto heslu podriadený. Každá webová aplikácia je si v základných rysoch podobná, naše požiadavky a potreby na aplikáciu nie sú nijak unikátne. V každej aplikácii sa pripájate k databáze, vyberáte dáta z databázy, transformujete dáta, ukladáte dáta do databázy, zobrazujete dáta užívateľovi atď.</p>
<p>Začínať písať aplikáciu od príkazu <em>mysql_connect</em> a donekonečna písať stále tie isté sql dotazy je veľmi vyčerpávajúce a neefektívne. Preto v CakePHP platí základné pravidlo <strong>konvencia má prednosť pred konfiguráciou</strong>. Toto pravidlo znamená to, že v aplikácii nastavujeme len to, v čom sa líši od ostatných, to ostatné funguje „akoby samo“. Vytvoríme napríklad model Article, ten automaticky bude hľadať dáta v tabuľke articles (názov tabuľky v databáze je vždy množné číslo od modelu), zmeniť to samozrejme môžeme, musíme tak urobiť sami.</p>
<p><strong>DRY (Dont repeat yourself)</strong></p>
<p>CakePHP je navrhnutý pre maximálnu efektivitu práce a skutočne umožňuje pracovať tak, aby sme kód napísali jedenkrát, a už ho len používali. Neskôr uvidíme, ako môžeme tento princíp využívať v takmer každej časti našej aplikácie.</p>
<p><strong>Model View Controller</strong></p>
<p>CakePHP je MVC framework. Čo teda to magické MVC znamená. MVC je ustálený návrhový vzor, ktorý nám umožňuje transparentne rozdeliť aplikáciu do niekoľkých vrstiev. Model sa stará o manipuláciu s dátami (ukladanie, výber, aktualizáciu atď) a následne predáva dáta Controlleru. V CakePHP tvorí model <strong>Active Record</strong>, čo je najdôležitejšia časť celého frameworku a podrobne sa jej budeme venovať v 3. časti seriálu. Controller riadi beh celej aplikácie a podľa požiadaviek zo strany užívateľa rozhoduje o chode celej aplikácie. View je prezentačná vrstva, ktorá dané dáta zobrazuje, čiže sa jedná o grafický výstup celej aplikácie.</p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/mvc.png" alt="MVC model view controller architektúra" /></div>
<p>Keď sa pozrieme na základnú adresárovú štruktúru aplikácie založenej na CakePHP môžeme vidieť nasledovné. Tieto základné časti tvoria srdce CakePHP aplikácie</p>
<ul>
<li>…</li>
<li><strong>models</strong>
<ul>
<li>behaviors</li>
</ul>
</li>
<li><strong>views</strong>
<ul>
<li>helpers</li>
</ul>
</li>
<li><strong>controllers</strong>
<ul>
<li>components</li>
</ul>
<p>…</p>
</li>
</ul>
<p>Detailné informácie o implemntácii MVC v CakePHP môžete nájsť 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>
<p><strong>Active Record</strong></p>
<p>Ako som už vyššie spomínal, jedná sa o najdôležitejšiu časť celej aplikácie. V krátkosti si ukážeme jej možnosti. Predstavme si, že máme tabuľku s novinkami. Chceme vybrať konkrétnu novinku, zmeniť jej titulok a naspäť ju uložiť do databáze.</p>
<pre><code>$news = $this-&gt;News-&gt;findById(1);
$news['News']['title'] = 'nový titulok';
$this-&gt;News-&gt;save($news);</code></pre>
<p>Čo poviete? Jednoduché a elegantné. Žiadne zbytočné sql dotazy… Nechajme našu aplikáciu rásť „samú od seba“. Možnosti sú samozrejme široké a konkrétnu prácu si ukážeme neskôr.</p>
<h2>Načo sa môžeme tešiť <img src='http://ims.rockretail.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </h2>
<p>V tomto seriály si vytvoríme redakčný systém s možnosťou spravovať články, novinky, komentáre, užívateľov… Taktiež si ukážeme základy práce s ajaxom a ďalšie konkrétne prednosti tohto frameworku. Pri vytváraní konkrétnej aplikácie budeme používať verziu <strong>1.2.0.5875 pre-beta</strong>.</p>
<p>Táto časť bola trochu o teórii, v ktorej som skutočne iba v krátkosti zhrnul, čo vlastne CakePHP je. To čo môže priniesť do našej práce a efektívnosti, si ukážeme pri vytváraní konkrétnej webovej aplikácie.</p>
<p>Teším sa na vaše námety a pripomienky v diskusii.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2007/12/12/1-tvorime-cms-s-cakephp-uvod/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
