<?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; Tipy a triky</title>
	<atom:link href="http://ims.rockretail.com/category/tipy-a-triky/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>Viacjazyčný web v CakePHP &#8211; dynamický obsah</title>
		<link>http://ims.rockretail.com/2010/02/06/viacjazycny-web-v-cakephp-dynamicky-obsah/</link>
		<comments>http://ims.rockretail.com/2010/02/06/viacjazycny-web-v-cakephp-dynamicky-obsah/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 15:29:30 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>

		<guid isPermaLink="false">http://ims.rockretail.com/?p=215</guid>
		<description><![CDATA[V dnešnom článku si ukážeme ako jednoducho pomocou CakePHP vytvoriť viacjazyčný web, ktorý okrem prekladu statického obsahu, ako sú rôzne popisky a doplňujúce informácie, dokáže efektívne pracovať aj s prekladom obsahu uloženého v databáze.
Ako prekladať statický obsah v CakePHP sme si ukázali v článku Viacjazyčný web v CakePHP. I keď je už článok pomerne starý [...]]]></description>
			<content:encoded><![CDATA[<p>V dnešnom článku si ukážeme ako jednoducho pomocou CakePHP vytvoriť viacjazyčný web, ktorý okrem prekladu statického obsahu, ako sú rôzne popisky a doplňujúce informácie, dokáže efektívne pracovať aj s prekladom obsahu uloženého v databáze.<span id="more-215"></span></p>
<p>Ako prekladať statický obsah v CakePHP sme si ukázali v článku <a href="/2007/09/24/viacjazycny-web-v-cakephp/">Viacjazyčný web v CakePHP</a>. I keď je už článok pomerne starý a mnohé veci sa zjednodušili, podstata stále ostáva rovnaká a určite vám odporúčam pred ďalším čítaním najprv prečítať tento článok.</p>
<h2>Trieda TranslateBehavior</h2>
<p>Mozgom celej viacjazyčnej podpory v CakePHP je trieda <a href="http://api.cakephp.org/class/translate-behavior">TranslateBehavior</a>, ktorá sa stará u ukladanie, aktualizáciu a získavanie viacjazyčného obsahu z databázy. Poďme si v krátkosti predstaviť celý mechanizmus práce s viacjazyčným obsahom. Skutočná sila tohto riešenie spočíva v tom, že trieda TranslateBehaviour funguje ako <a href="http://book.cakephp.org/view/495/Core-Behaviors">behavior</a>, čiže magicky pridáva funkcionalitu do vašich existujúcich modelov. To okrem iného znamená, že vôbec nemusíte meniť vaše už existujúce databázové tabuľky.</p>
<p>Princíp fungovania je nasledovný. Predstavme si, že chceme prekladať články v našom systéme. Pridáme teda k nášmu modelu <em>Article </em>behavior <em>TranslateBehavior</em> a určíme ktoré atribúty z tabuľky článkov sa majú prekladať. <em>TranslateBehaviour</em> nám bude pri každom uložení článku do databázy ukladať jazykové mutácie atribútov, ktoré sme určili na preklad, do špeciálnej tabuľky. Čiže od tohto momentu budeme mať k našemu článku dostupné aj preložené jednotlivé časti.</p>
<p>Dosť bolo teórie, poďme sa pozrieť na implementáciu celého riešenia pomocou TranslateBehavior.</p>
<h2>Implementácia</h2>
<p>Predstavme si situáciu, že máme fungujúci systém článkov a chceme do tohto systému pridať podporu pre viacjazyčné články. Články máme uložené v tabuľke <em>articles</em> a o dáta z tejto tabuľky sa stará model <em>Articles</em>.</p>
<h3>1. krok &#8211; vytvorenie tabuľky i18n</h3>
<p>Ako sme si už spomenuli vyššie, TranslateBehavior funguje ako nadstavba k už fungujúcim modelom a preto prvým a nevyhnutným krokom je vytvorenie tabuľky <em>i18n</em> v našej databáze, do ktorej sa bude ukladať viacjazyčný obsah. Učiniť tak môžeme spustením skriptu v našej databáze, ktorý nájdeme v adresári <em>app/config/sql/i18n.sql. </em>Po spustení tohto skriptu sa v databáze vytvorí tabuľka, ktorá má nasledovnú štruktúru</p>
<pre><code>
id int(10) NOT NULL auto_increment,
locale varchar(6) NOT NULL,
model varchar(255) NOT NULL,
foreign_key int(10) NOT NULL,
field varchar(255) NOT NULL,
content mediumtext
</code></pre>
<p>Akú úlohu plnia jednotlivé atribúty v tejto tabuľke si vysvetlíme neskôr na konkrétnom príklade.</p>
<h3>2. krok &#8211; pridanie TranslateBehavior k modelu</h3>
<pre><code>&lt;?php
class Article extends AppModel {
	public $actsAs = array(
		'Translate'
	);
}
?&gt;</code></pre>
<p>TranslateBehaviour sa pridáva k modelu ako každá iná behavior funkcionalita a to direktívou <em>$actAs</em>. Po týchto dvoch krokoch máme <em>TranslateBehavior</em> nainštalovaný.</p>
<h3>3. krok &#8211; prekladáme dynamický obsah</h3>
<p>Zatiaľ sme síce určili, že by sme chceli prekladať naše články, ale nikde sme neurčili, ktoré časti nášho článku chceme prekladať. V našom prípade tak urobíme pre časti <em>title</em> a <em>text </em>a to následovne</p>
<pre><code>&lt;?php
class Article extends AppModel {
	public $actsAs = array(
		'Translate' =&gt; array(
			'title' =&gt; 'title', 'text' =&gt; 'text'
		)
	);
}
?&gt;</code></pre>
<p>Nastavenie modelu máme týmto hotové a môžeme sa pustiť do implementácie <em>view</em> časti. Naše súbory pre vkladanie článkov by vyzerali pred použitím <em>TranslateBehavior</em> následovne</p>
<pre><code>&lt;? echo $form-&gt;input('Article.title'); ?&gt;
&lt;? echo $form-&gt;input('Article.text',array('cols' =&gt;'10','rows'=&gt;'10','type'=&gt;'textarea')); ?&gt;</code></pre>
<p>Vyššie uvedený kód je štandardný pre vytvorenie input prvkov a preto ho nie je treba bližšie špecifikovať. Poďme sa pozrieť, ako bude vypadať rovnaký kód, ktorý nám umožní vkladať niekoľko jazykových verzií pre input <em>title</em> ako i pre input <em>text</em></p>
<pre><code>&lt;? echo $form-&gt;input('Article.title.slo'); ?&gt;
&lt;? echo $form-&gt;input('Article.title.eng'); ?&gt;

&lt;? echo $form-&gt;input('Article.text.slo',array('cols' =&gt; '10','rows'=&gt;'10','type'=&gt;'textarea')); ?&gt;
&lt;? echo $form-&gt;input('Article.text.eng', array('cols' =&gt; '10','rows'=&gt;'10','type'=&gt;'textarea')); ?&gt;</code></pre>
<p>Po napísaní článku a jeho viacjazyčných mutácií môžeme článok uložiť obvyklým spôsobom volaním metódy <em>$this-&gt;Article-&gt;sanve()</em> z controlleru <em>ArticlesController</em><em>.</em> To znamená, že v prípade controlleru nie je potrebné pri ukladaní článku vykonávať žiadne zmeny.</p>
<p>Poďme sa pozrieť, ako bude vypadať naša databáza po uložení takéhoto článku a čo sa v nej zmenilo. Predstavme si, že sme odoslali formulár s hodnotami <em>titulok sk, text sk</em> pre slovenskú mutáciu a<em> title en</em> <em>a text en</em> pre anglickú mutáciu. Naše tabuľku budú vypadať následovne</p>
<p><strong>tabuľka articles</strong></p>
<pre><code>+----+-------------+--------------------+--------+---------------------+
| id | title       | text               | user   | created             |
+----+-------------+--------------------+--------+---------------------+
|  1 | titulok sk  | text sk            | Linus  | 2010-02-06          |
+----+-------------+--------------------+--------+---------------------+</code></pre>
<p><strong>tabuľka i18n</strong></p>
<pre><code>+----+--------+-------+---------+-------------+------------+
| id | locale | field | model   | foreign_key | content    |
+----+--------+-------+---------+-------------+------------+
|  1 | slo    | title | Article |           1 | titulok sk |
|  2 | eng    | title | Article |           1 | title en   |
|  3 | slo    | text  | Article |           1 | text sk    |
|  4 | eng    | text  | Article |           1 | text en    |
+----+--------+-------+---------+-------------+------------+</code></pre>
<p>Ako môžeme vidieť <em>TranslateBehavior</em> funguje podľa očakávania a ako bolo povedané, k nášmu článku udržuje v špeciálnej tabuľke <em>i18n</em> jazykové mutácie. Čo znamenajú jednotlivé stĺpce tabuľky? Stĺpec <em>locale</em> ukladá označenie jazykovej mutácie daného riadku, hodnoty pochádzajú z triedy <a href="http://api.cakephp.org/class/l10n">l10n</a> z premennej <em>$__l10nMap</em> a rovnako sa používajú aj vo view pre jednotlivé input prvky<em>. </em>Stĺpec <em>field</em> označuje názov  atribútu z pôvodnej tabuľky články. Čiže v našom prípade sa jedná o <em>title</em> a <em>text</em>, ktoré pôvodne nájdeme v tabuľke a<em>rticles</em>. Stĺpec <em>foreign_key</em> predstavuje cudzí kľúč z tabuľky a<em>rticles::id</em>. Stĺpec <em>content</em> obsahuje samotnú jazykovú mutáciu. Myslím si, že viac nie je potrebné vysvetľovať celý mechanizmus a môžeme rovno prejsť na zobrazovanie jednotlivých jazykových mutácií.</p>
<h3>4. krok &#8211; zobrazujeme viacjazyčný obsah</h3>
<p>Prvým krokom pre zobrazenie viacjazyčného obsahu je nastavenie routovacích pravidiel tak, aby sme mohli v našej aplikácii prepínať medzi jednotlivými jazykovými verziami. Pri tomto sa budeme riadiť pravidlom, že zobrazenie jazykovej mutácie obsahu je úplne nezávislé na užívateľových nastaveniach &#8211; čiže aktuálny jazyk aplikácie budeme určovať podľa URL a nie podľa hodnôt uložených buď v cookies alebo v sessions.</p>
<h4>Routovanie</h4>
<p>Rozhodli sme, že jazyk aplikácie bude určovať URL. Formát URL bude nasledovný <em>http://www.tvoja-adresa.sk/jazyk/clanok/id</em></p>
<p>Routavacie pravidlo bude vyzerať následovne</p>
<pre><code>Router::connect('/:lang',array('controller'=&gt;'pages','action'=&gt;'display','home'),array('lang' =&gt; 'sk|en'));
Router::connect('/:lang/clanok/:id',array('controller'=&gt;'articles','action'=&gt;'view'),array('pass'=&gt;array('id'),'lang' =&gt; 'sk|en'));</code></pre>
<h4>Link helper</h4>
<p>Po nastavení routovacieho pravidla budeme potrebovať link helper, ktorý nám ku každému odkazu pridá aktuálny jazyk. Možno sa pýtate, prečo potrebujeme helper a nebude priamo používať metódu <em>$html-&gt;link()</em> následovne</p>
<pre><code>&lt;? $html-&gt;link(__('o nás',true),array('controller'=&gt;'articles','action'=&gt;'view','id'=&gt;'o-nas','lang'=&gt;$language)); ?&gt;</code></pre>
<p>Je to z dôvodu, aby sme nemuseli zakaždým posielať tejto metóde hodnotu aktuálneho jazyka a navyše sa v budúcnosti môže náš kód zmeniť a tým by sme museli ručne upravovať všetky odkazy. Náš helper si teda nazveme <em>LangHelper</em> a uložíme ho do súboru <em>app/view/helpers/lang_helper.php</em></p>
<pre><code>&lt;?
class LangHelper extends AppHelper {
    public $helpers = array('Html');

    public function link( $title, $url = NULL, $htmlAttributes = array ( ), $confirmMessage = false, $escapeTitle = true ) {
        if(@$this-&gt;params['lang']) {
            $url['lang'] = $this-&gt;params['lang'];
        } else {
            $url['lang'] = 'sk';
        }

        return $this-&gt;Html-&gt;link($title,$url,$htmlAttributes,$confirmMessage,$escapeTitle);
    }
}
?&gt;</code></pre>
<p>Následne môžeme vytovoriť odkaz na náš článok</p>
<pre><code>&lt;? echo $lang-&gt;link(__('o nás',true),array('controller'=&gt;'articles','action'=&gt;'view','id'=&gt;'1')); ?&gt;</code></pre>
<p>Vyššie uvedený odkaz nám vygeneruje URL v tvare <em>http://www.tvoja-adresa.sk/sk/clanok/1</em> za predpokladu, že aktuálny jazyk aplikácie je sk. Ako je možné, že sa vygenerovala adresa práve v tomto tvare? Je to z dôvodu, že CakePHP automaticky pozná podľa nastavených routovacích pravidiel, aký odkaz na akú URL chceme vytvoriť.</p>
<h4>Controller a prepínanie jazyka</h4>
<p>Po nastavení routovacích pravidiel sa môžeme pustiť do samotného nastavenia jazyka v našej aplikácii. Jazyk sa nastavuje direktívou <em>Configure::write(&#8216;Config.language&#8217;,$locale)</em> kde premenná <em>$locale </em>predstavuje hodnotu z triedy <em><a href="http://api.cakephp.org/class/l10n">l10n</a></em> a jej premennej <em>$__l10nCatalog</em>. Nastavenie budeme vykonávať v <em>AppController</em> v metóde <em>beforeFilter()</em></p>
<pre><code>&lt;?
class AppController extends Controller {
    public function beforeFilter() {
        $this-&gt;set_language();
    }

    private function set_language() {
        $code = @$this-&gt;params['lang'];
        if(@$code) {
            App::import('l10n');
            $l10n = new L10n();
            $language = $l10n-&gt;catalog($code);
            $locale = $language['locale'];
        } else {
            $locale = 'slo';
        }
        Configure::write('Config.language',$locale);
    }
}
?&gt;</code></pre>
<p>Následne môžeme v našej aplikácii prepínať jazyk pomocou URL <em>http://www.vasa-adresa.sk/sk</em> pre slovenský jazyk alebo <em>http://www.vasa-adresa.sk/en</em> pre anglický jazyk</p>
<h4>Zobrazujeme článok</h4>
<p>Článok môžeme načítať a následne zobraziť štandardným spôsobom, ako ho poznáme z bežného používania. V <em>ArticlesController</em> si načítame článok</p>
<pre><code>
public function view($seo_link = null) {
     $article = $this-&gt;Article-&gt;findBySeo_link($seo_link);
     $this-&gt;set(compact("article"));
}
</code></pre>
<p>A následne ho môžeme zobraziť vo view</p>
<pre><code>&lt;article class="article"&gt;
    &lt;h1&gt;&lt;? echo $article['Article']['title']; ?&gt;&lt;/h1&gt;
    &lt;div&gt;&lt;? echo $article['Article']['text']; ?&gt;&lt;/div&gt;
&lt;/article&gt;
</code></pre>
<p>Ako ste si určite všimli, nikde sme pri zobrazení neurčovali aká jazyková mutácia sa má zobrazovať. CakePHP to robí v tomto prípade automaticky a z databázy vyťahuje jazykovú mutáciu podľa direktívy <em>Configure::write(&#8216;Config.language&#8217;,$locale)</em> a premenná <em>$article</em> má tvar ako v prípade, keď sme <em>TranslateBehavior</em> nepoužívali, avšak s tým rozdielom, že vždy obsahuje jazykovú mutáciu podľa aktuálne nastaveného jazyka.</p>
<h2>Načo si dať pozor</h2>
<p>Narazil som na menšiu komplikáciu pri editácii článku. Keď sa pokúšate vybrať všetky jazykové mutácie prostredníctvom jedného SQL dotazu, CakePHP nám vráti dáta v nasledovnom formáte</p>
<pre><code>Array
(
    [Article] =&gt; Array
        (
            [id] =&gt; 1
            [title] =&gt; titulok sk
            [text] =&gt; text sk
            [locale] =&gt; slo
        )

    [title] =&gt; Array
        (
            [0] =&gt; Array
                (
                    [id] =&gt; 44
                    [locale] =&gt; eng
                    [model] =&gt; Article
                    [foreign_key] =&gt; 12
                    [field] =&gt; title
                    [content] =&gt; title en
                )
            [1] =&gt; Array
                (
                    [id] =&gt; 43
                    [locale] =&gt; slo
                    [model] =&gt; Article
                    [foreign_key] =&gt; 12
                    [field] =&gt; title
                    [content] =&gt; titulok sk
                )
        )
    [text] =&gt; Array
        (
            [0] =&gt; Array
                (
                    [id] =&gt; 47
                    [locale] =&gt; eng
                    [model] =&gt; Article
                    [foreign_key] =&gt; 12
                    [field] =&gt; text
                    [content] =&gt; text en
                )
            [1] =&gt; Array
                (
                    [id] =&gt; 48
                    [locale] =&gt; slo
                    [model] =&gt; Article
                    [foreign_key] =&gt; 12
                    [field] =&gt; text
                    [content] =&gt; text sk
                )

        )
)</code></pre>
<p>To znamená, že jazykové mutácie sa nachádzajú v premenných <em>$article['title']</em> a <em>$</em><em>article['text']</em>, preto ich treba ešte preformátovať do formátu <em>$article['Article']['title']['jazyk']</em>. Môžeme to urobiť následovne</p>
<pre><code>$this-&gt;data = $this-&gt;Article-&gt;findById($id);
$title = array();
$text = array();

foreach ($this-&gt;data['title'] as $item) {
     $title[$item['locale']] = $item['content'];
}
foreach ($this-&gt;data['text'] as $item) {
     $text[$item['locale']] = $item['content'];
}
$this-&gt;data['Article']['title'] = $title;
$this-&gt;data['Article']['text'] = $text;</code></pre>
<p>Našiel som nejaké návody, žeby sa pri editácii mala nastaviť premenná <em>locale</em> ako pole,  ktoré bude obsahovať zoznam všetkých jazykov a to následovne <em>Configure::write(&#8216;Config.language&#8217;,array(&#8217;slo&#8217;,'eng&#8217;))</em> avšak mne tento spôsob nefungoval. Neviem, možno je to len moja neznalosť, možno bol problém niekde inde.</p>
<p>Týmto je náš článok u konca. Myslím si, že CakePHP ponúka elegantný spôsob ako sa vyrovnať s viacjazyčným obsahom a ako v mnohých prípadoch, nám dokáže ušetriť množstvo času a práce. Rád uvítam vaše nápady a pripomienky v diskusii k článku.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2010/02/06/viacjazycny-web-v-cakephp-dynamicky-obsah/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CakePHP 1.3 beta</title>
		<link>http://ims.rockretail.com/2010/01/21/cakephp-1-3-beta/</link>
		<comments>http://ims.rockretail.com/2010/01/21/cakephp-1-3-beta/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 22:00:25 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>

		<guid isPermaLink="false">http://ims.rockretail.com/?p=196</guid>
		<description><![CDATA[CakePHP pomaly kráča k ostrému vydaniu verzie 1.3.Vo verzii 1.3 beta bola uzavretých takmer 43 tiketov a vytvorených viac než 600 commitov, čo svedčí o intenzívnej práci na tejto verzii. Táto verzia prináša množstvo noviniek a vylepšení sa dočkala väčšina základných pilierov CakePHP.
Podrobné zhrnutie nových vlastností nájdete na adrese http://cakephp.lighthouseapp.com/projects/42648/13-new-features
Migračnú príručku nájdete na adrese http://cakephp.lighthouseapp.com/projects/42648/13-migration-guide
]]></description>
			<content:encoded><![CDATA[<p>CakePHP pomaly kráča k ostrému vydaniu verzie 1.3.<span id="more-196"></span>Vo <a href="http://bakery.cakephp.org/articles/view/cakephp-1-3-0-beta-has-landed">verzii 1.3 beta</a> bola uzavretých takmer 43 tiketov a vytvorených viac než 600 commitov, čo svedčí o intenzívnej práci na tejto verzii. Táto verzia prináša množstvo noviniek a vylepšení sa dočkala väčšina základných pilierov CakePHP.</p>
<p>Podrobné zhrnutie nových vlastností nájdete na adrese <a href="http://cakephp.lighthouseapp.com/projects/42648/13-new-features">http://cakephp.lighthouseapp.com/projects/42648/13-new-features</a></p>
<p>Migračnú príručku nájdete na adrese <a href="http://cakephp.lighthouseapp.com/projects/42648/13-migration-guide">http://cakephp.lighthouseapp.com/projects/42648/13-migration-guide</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2010/01/21/cakephp-1-3-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debug Kit &#8211; pokročilé debugovanie v CakePHP</title>
		<link>http://ims.rockretail.com/2009/11/19/debug-kit-pokrocile-debugovanie-v-cakephp/</link>
		<comments>http://ims.rockretail.com/2009/11/19/debug-kit-pokrocile-debugovanie-v-cakephp/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 13:26:09 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[Debug Kit]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[FirePHP]]></category>

		<guid isPermaLink="false">http://ims.rockretail.com/?p=167</guid>
		<description><![CDATA[Debugovacie nástroje a samotné debugovanie sú dôležitou súčasťou každého vývoja. V dnešnom článku si predstavíme pokročilý debugovací nástroj Debug Kit.
Poďme si najprv priblížiť jednotlivé vlastnosti Debug Kit a následne sa pozrieme na jeho inštaláciu a integráciu s CakePHP aplikáciou.
Debug Kit
Debug Kit predstavuje pokročilý debugovací nástroj, ktorý ponúka množstvo informácií o našej aplikácii a jej stave. [...]]]></description>
			<content:encoded><![CDATA[<p>Debugovacie nástroje a samotné debugovanie sú dôležitou súčasťou každého vývoja. V dnešnom článku si predstavíme pokročilý debugovací nástroj Debug Kit.<span id="more-167"></span></p>
<p>Poďme si najprv priblížiť jednotlivé vlastnosti Debug Kit a následne sa pozrieme na jeho inštaláciu a integráciu s CakePHP aplikáciou.</p>
<h2>Debug Kit</h2>
<p><a href="http://thechaw.com/debug_kit" target="_blank">Debug Kit</a> predstavuje pokročilý debugovací nástroj, ktorý ponúka množstvo informácií o našej aplikácii a jej stave. Debug Kit dokáže zobraziť podrobné informácie o session, sql, request, timer, premenných atď. Poďme sa teda bližšie pozrieť na jednotlivé vlastnosti tohto nástroja.</p>
<h2>Panely</h2>
<p>Debug Kit zobrazuje vyššie spomínané debug informácie v paneloch. Na nasledujúcom obrázku môžeme vidieť integráciu Debug Kit do stránky a taktiež základné panely, ktoré ponúka Debug Kit v základnej inštalácii.</p>
<p><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-1.png"></a><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-2.png"><img class="alignnone size-full wp-image-169" title="debug-kit-2" src="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-2.png" alt="debug-kit-2" width="680" height="88" /></a></p>
<p>Medzi základné panely patria: History, Session, Request, Sql Log, Timer, Log, Variables. Poďme si teda bližšie priblížiť jednotlivé možnosti panelov.</p>
<h3>Panel History</h3>
<p>Panel History zobrazuje informácie o posledných requestoch zobrazením url danej stránky.</p>
<p><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-1.png"><img class="alignnone size-full wp-image-168" title="debug-kit-1" src="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-1.png" alt="debug-kit-1" width="680" height="157" /></a></p>
<h3>Panel Session</h3>
<p>Panel Session zobrazuje podrobné informácie o uložených Session našou aplikáciou.</p>
<p><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-3.png"><img class="alignnone size-full wp-image-170" title="debug-kit-3" src="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-3.png" alt="debug-kit-3" width="680" height="120" /></a></p>
<h3>Panel Request</h3>
<p>Panel Request zobrazuje informácie o aktuálnom requeste. Medzi informácie patria GET, POST požiadavky, Cake url parametre (v aplikácii dostupné v poli <em>$this-&gt;params</em>), Cookie informácie a podrobné informácie o použitých routovacích pravidlách.</p>
<p><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-4.png"><img class="alignnone size-full wp-image-171" title="debug-kit-4" src="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-4.png" alt="debug-kit-4" width="680" height="371" /></a></p>
<h3>Panel SQL Log</h3>
<p>Panel SQL Log zobrazuje informácie o spustených sql dotazoch v našej databáze. V podstate sa ničím nelíši od bežného sql výpisu z CakePHP.</p>
<p><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-5.png"><img class="alignnone size-full wp-image-172" title="debug-kit-5" src="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-5.png" alt="debug-kit-5" width="680" height="371" /></a></p>
<h3>Panel Timer</h3>
<p>Panel Timer zobrazuje podrobné informácie o čase načítavania jednotlivých častí našej aplikácie pre daný request a taktiež množstvo využitej pamäte. Časové informácie sa zobrazujú pre stránku ako celok, ale rovnako aj pre jednotlivé súčasti, ktoré boli generované v danom requeste.</p>
<p><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-6.png"><img class="alignnone size-full wp-image-173" title="debug-kit-6" src="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-6.png" alt="debug-kit-6" width="680" height="370" /></a></p>
<p>Debug Kit nám poskytuje možnosť merať čas pre ľubovoľnú časť kódu. Ako môžeme vidieť na obrázku vyššie, vo výpise sa nachádza položka s názvom <em>Listing of articles</em>. Táto položka meria čas spracovania výpisu článkov v metóde <em>index</em> v controlleri <em>ArticlesController</em>. Kód pre danú položku vyzerá následovne</p>
<pre><code>function index() {
     DebugKitDebugger::startTimer($name = 'articles', $message = 'Listing of articles');
     $this-&gt;Article-&gt;recursive = 1;
     $this-&gt;paginate = array('limit'=&gt;Configure::read('Homepage.articles'),'order' =&gt; 'Article.created desc','conditions'=&gt;array('show_on_index'=&gt;1,'visible'=&gt;1,'publish_up&lt;=now()'));         $this-&gt;set('articles', $this-&gt;paginate());
     DebugKitDebugger::stopTimer($name = 'articles');
}
</code></pre>
<h3>Panel Log</h3>
<p>Panel Log nám zobrazuje informácie zo <a href="http://book.cakephp.org/view/157/Logging" target="_blank">základných debugovacích nástrojov</a> priamo z CakePHP. Jedná sa o výpisy z logovacích súborov.</p>
<p><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-7.png"><img class="alignnone size-full wp-image-174" title="debug-kit-7" src="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-7.png" alt="debug-kit-7" width="680" height="152" /></a></p>
<h3>Panel Variables</h3>
<p>Panel Variables zobrazuje podrobné informácie o premenných a ich hodnotách v našej aplikácii, ktoré boli inicializované v controlleri.</p>
<p><a href="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-8.png"><img class="alignnone size-full wp-image-175" title="debug-kit-8" src="http://ims.rockretail.com/wp-content/uploads/2009/11/debug-kit-8.png" alt="debug-kit-8" width="680" height="370" /></a></p>
<h3>Vlastné panely</h3>
<p>Debug Kit taktiež ponúka možnosť vytvoriť si vlastné panely alebo zobraziť len určité panely z tých, ktoré sú prednastavené. Táto časť je veľmi jednoduchá a jej štúdium prenechám čitateľom. Bližšie informácie môžete násjť na stránkach <a href="http://thechaw.com/debug_kit/wiki/docs/toolbar-panels" target="_blank">Debug Kit &#8211; Toolbar Panels</a></p>
<h2>Inštalácia</h2>
<p>Inštalácie Debug Kit je veľmi jednoduchá. Stačí si stiahnuť zdrojové kódy priamo z <a href="http://thechaw.com/debug_kit/versions" target="_blank">download stránok projektu</a>. Aktuálna verzia v dobe písania článku je Debug Kit 1.1. Po stiahnutí Debug Kit stačí obsah balíčku nakopírovať do adresára <em>app/plugins/debug_kit</em> a vložiť nasledovný kód do požadovaného controllera, v našom prípade sa jedná o <em>ArticlesController</em> v súbore <em>app/controllers/articles_controller.php</em></p>
<pre><code>class ArticlesController extends AppController {
     var $components = array('DebugKit.Toolbar');
}</code></pre>
<h2>Integrácia s FirePHP</h2>
<p>Veľmi zaujímavou vlastnosťou Debug Kit je možnosť <a href="http://thechaw.com/debug_kit/wiki/docs/FireCake" target="_blank">integrácie</a> tohto nástroja s debugovacím nástrojom <a href="http://firephp.org/" target="_blank">FirePHP</a>. FirePHP umožňuje debugovať PHP aplikáciu pomocou známeho nástroja <a href="/2009/11/01/5-rozsireni-do-firefoxu-ktore-musi-kazdy-vyvojar-mat/">FireBug</a>.</p>
<p>Týmto je náš článok u konca. Myslím si, že Debug Kit je jedným s najlepších debugovacích nástrojov pre CakePHP a určite stojí za vyskúšanie. Rád uvítam vaše nápady a pripomienky k debugovaniu v CakePHP.</p>
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2009/11/19/debug-kit-pokrocile-debugovanie-v-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 rozšírení do Firefoxu, ktoré musí každý vývojár mať</title>
		<link>http://ims.rockretail.com/2009/11/01/5-rozsireni-do-firefoxu-ktore-musi-kazdy-vyvojar-mat/</link>
		<comments>http://ims.rockretail.com/2009/11/01/5-rozsireni-do-firefoxu-ktore-musi-kazdy-vyvojar-mat/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 21:40:13 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>
		<category><![CDATA[colorzilla]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[ie net renderer]]></category>
		<category><![CDATA[user agent switcher]]></category>
		<category><![CDATA[web developer]]></category>
		<category><![CDATA[yslow]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Firefox je výborný internetový prehliadač a je ešte lepší v podpore webového vývoja. V tomto článku si predstavíme 5 rozšírení, ktoré vám zjednodušia vývoj webových stránok.
Web Developer
Patrí k jedným z najznámejších vývojárskych rozšírení pre Firefox. Do Firefoxu sa integruje ako položka v menu alebo toolbar. Hlavným zámerom tohto rozšírenia je poskytnúť vývojárovi kompletné informácie o [...]]]></description>
			<content:encoded><![CDATA[<p>Firefox je výborný internetový prehliadač a je ešte lepší v podpore webového vývoja. V tomto článku si predstavíme 5 rozšírení, ktoré vám zjednodušia vývoj webových stránok.<span id="more-73"></span></p>
<h2>Web Developer</h2>
<p>Patrí k jedným z najznámejších vývojárskych rozšírení pre Firefox. Do Firefoxu sa integruje ako položka v menu alebo toolbar. Hlavným zámerom tohto rozšírenia je poskytnúť vývojárovi kompletné informácie o všetkých elementoch a možnosť manipulácie so stránkou. Medzi základné funkcie patrí zobrazenie podrobných informácie o html elementoch kliknutím na element (informácie ako šírka, výška, id alebo class, veľkosť písma, jeho predchodcovia atď.), práca s grafikou stránky (css, zobrazenie css podľa výstupného média, obrázky atď.), práca s formulármi, s cookies, automatická validácia stránky, zmena rozlíšenia Firefoxu a množstvo ďalších.</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/downloads/latest/1843/addon-1843-latest.xpi?src=addondetail">pridaj do Firefoxu</a><br />
<a href="https://addons.mozilla.org/en-US/firefox/addon/60">stránka rozšírenia</a></p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/web-developer.png" alt="" /> <img src="http://ims.rockretail.com/wp-content/uploads/2009/11/web-developer-1.png" alt="" /></div>
<h2>Firebug</h2>
<p>Hlavnými cieľom Firebug je debugovanie, editovanie a monitorovanie CSS, HTML a JavaScriptu priamo na vašich stránkach bez nutnosti úpravy zdrojového kódu. Do Firefoxu sa integruje ako samostatný panel. Medzi pokročilé vlastnosti patrí sledovanie komunikácie stránky so serverom alebo čas načítavanie jednotlivých elementov stránky.</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/downloads/latest/1843/addon-1843-latest.xpi?src=addondetail">pridaj do Firefox</a> <a href="https://addons.mozilla.org/en-US/firefox/addon/1843">stránka rozšírenia</a></p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/firebug.gif" alt="" /></div>
<h2>User Agent Switcher</h2>
<p>Ako už z názvu vyplýva, jedná sa o jednoduchého prepínača User Agent, čiže umožňuje Firefoxu, aby sa pre webové stránky identifikoval ako iný prehliadač. Jednoducho tak môžeme otestovať špecifické správanie web stránky pre jednotlivé druhy prehliadačov. Do Firefoxu sa integruje ako položka v menu alebo toolbar. Medzi prednastavené prehliadače patria Internet Explorer 6, 7, 8, Safari iPhone 3.0, avšak môžete si doplniť ľubovoľný druh, ktorý potrebujete.</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/downloads/latest/59/addon-59-latest.xpi?src=addondetail">pridaj do Firefoxu</a><br />
<a href="https://addons.mozilla.org/en-US/firefox/addon/59">stránka rozšírenia</a></p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/user-agent-switcher.png" alt="" /></div>
<h2>YSlow</h2>
<p>Hlavným cieľom YSlow je analyzovať web stránky a navrhnúť spôsob, ako zrýchliť web stránku na základe Yahoo pravidiel pre výkonné web stránky. YSlow sa integruje ako rozšírenie Firebug, takže k svojej činnosti potrebuje nainštalované rozšírenie Firebug.</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/downloads/latest/5369/addon-5369-latest.xpi?src=addondetail">pridaj do Firefoxu</a><br />
<a href="https://addons.mozilla.org/en-US/firefox/addon/5369">stránka rozšírenia</a></p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/yslow.jpg" alt="" /></div>
<h2>ColorZilla</h2>
<p>Hlavným cieľom ColorZilla je získať hodnotu farby z ktoréhokoľvek bodu na webovej stránke. Jednoducho môžete teda získať RGB hodnotu alebo hodnotu pre CSS z jednotlivých farieb na stránke. ColorZilla sa integruje do Firefoxu ako toolbar.</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/downloads/latest/271/addon-271-latest.xpi?src=addondetail">pridaj do Firefoxu</a><br />
<a href="https://addons.mozilla.org/en-US/firefox/addon/271">stránka rozšírenia</a></p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/colorzilla.png" alt="" /></div>
<h2>IE NetRenderer</h2>
<p>Hlavným cieľom je vyrenderovať stránku a vytvoriť z nej screenshot podľa toho, ako by vypadala v prehliadači Internet Explorer. Podporované sú takmer všetky verzie Internet Explorer od verzia 5.5 až po verziu 8. Do Firefoxu sa integruje ako tlačítko alebo položka v menu. K vytvárania screenshotov využíva známu službu <a href="http://ipinfo.info/netrenderer/index.php">IE NetRenderer</a></p>
<p><a href="https://addons.mozilla.org/en-US/firefox/downloads/latest/6455/addon-6455-latest.xpi?src=addondetail">pridaj do Firefoxu</a><br />
<a href="https://addons.mozilla.org/en-US/firefox/addon/6455">stránka rozšírenia</a></p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/ienetrenderer.png" alt="" /></div>
<p>Ak aj vy používate nejaké zaujímavé rozšírenia, podeľte sa s nimi v diskusii k článku.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2009/11/01/5-rozsireni-do-firefoxu-ktore-musi-kazdy-vyvojar-mat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Správne fungovanie CakePHP na webhostingu od firmy Websupport.sk</title>
		<link>http://ims.rockretail.com/2009/10/29/sprvane-fungovanie-cakephp-na-webhostingu-od-firmy-websupport-sk/</link>
		<comments>http://ims.rockretail.com/2009/10/29/sprvane-fungovanie-cakephp-na-webhostingu-od-firmy-websupport-sk/#comments</comments>
		<pubDate>Tue, 30 Nov 1999 00:00:00 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pre svoje projekty používam výborný webhosting od firmy Websupport. Avšak pre správne fungovanie CakePHP na serveroch od tejto firmy, je potrebná malá zmena v konfigurácii CakePHP. A kedže som dostal niekoľko otázok ohľadne tohto problému, rozhodol som sa napísať krátky článok.
Ako som už spomínal, defaultne CakePHP na webhosting Websupport nefunguje správne a hlási nasledovnú chybu
The [...]]]></description>
			<content:encoded><![CDATA[<p>Pre svoje projekty používam výborný webhosting od firmy <a href="http://www.websupport.sk">Websupport</a>. Avšak pre správne fungovanie CakePHP na serveroch od tejto firmy, je potrebná malá zmena v konfigurácii CakePHP. A kedže som dostal niekoľko otázok ohľadne tohto problému, rozhodol som sa napísať krátky článok.<span id="more-72"></span></p>
<p>Ako som už spomínal, defaultne CakePHP na webhosting Websupport nefunguje správne a hlási nasledovnú chybu</p>
<pre><code>The action webroot is not defined in controller AppController</code></pre>
<p>Hneď môžeme vidieť, že niečo nie je v poriadku a pri správnom fungovaní nemusí <em>AppController</em> obsahovať žiadnu metódu <em>webroot</em>. Túto chybu odstránime jednoduchým spôsobom a to nastavením správnej Routes direktívy. Do súboru <em>app/config/rou­tes.php</em> pridáme nasledovný riadok</p>
<pre><code>Router::connec­t(‚/app/webro­ot‘, array(‚controller‘  ⇒ ‚pages‘, ‚action‘  ⇒ ‚display‘,‚ho­me‘));</code></pre>
<p>Samozrejme si môžete zvoliť vlastné hodnoty pre <em>controller</em> a <em>action</em>.</p>
<p>Ak ste sa stretli s podobným problémom a vyriešili ho iným spôsobom, rád uvítam, ak sa s nimi podelíte v diskusii k článku.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2009/10/29/sprvane-fungovanie-cakephp-na-webhostingu-od-firmy-websupport-sk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zobrazenie error správ pre intput textarea</title>
		<link>http://ims.rockretail.com/2009/08/02/zobrazenie-error-sprav-pre-intput-textarea/</link>
		<comments>http://ims.rockretail.com/2009/08/02/zobrazenie-error-sprav-pre-intput-textarea/#comments</comments>
		<pubDate>Tue, 30 Nov 1999 00:00:00 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[validácia]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[V dnešnom článku si ukážeme malý trik, ako zobraziť validačné error správy pri inpute textarea.
CakePHP defaultne nezobrazuje validačné správy pri inpute typu textarea. Pozrime sa na nasledovný príklad
echo $form-&#62;textarea(‚text‘);
Tento kód nám správne vygeneruje input textarea, avšak problém nastáva vo chvíli, kedy textarea neprejde validáciou a spolu s textareou by sa mala zobraziť aj validačná správa, [...]]]></description>
			<content:encoded><![CDATA[<p>V dnešnom článku si ukážeme malý trik, ako zobraziť validačné error správy pri inpute textarea.<span id="more-69"></span></p>
<p>CakePHP defaultne nezobrazuje validačné správy pri inpute typu textarea. Pozrime sa na nasledovný príklad</p>
<pre><code>echo $form-&gt;textarea(‚text‘);</code></pre>
<p>Tento kód nám správne vygeneruje input textarea, avšak problém nastáva vo chvíli, kedy textarea neprejde validáciou a spolu s textareou by sa mala zobraziť aj validačná správa, ktorá nás bude informovať o tom, čo nie je v poriadku. Takto by vypadal HTML kód pre textarea v prípade validačnej chyby, ak by sme textareu vykresľovali metódou <em>$form-&gt;textarea(‚text‘);</em></p>
<pre><code>&lt;textarea name=„data[Ar­ticle][text]“ cols=„10“ rows=„10“ id=„ArticleIn­troText“ class=„form-error“ &gt;&lt;/textarea&gt;</code></pre>
<p>Ako môžeme vidieť, CakePHP nám v tomto prípade žiadnu error správu nevygeneroval, avšak aspoň pridal atribút <em>class=„form-error“</em>. Toto správanie je nežiadúce a my samozrejme budeme chcieť error správu zobraziť. Trik spočíva v tom, že musíme zavolať metódu <a href="http://api.cakephp.org/class/form-helper#method-FormHelperinput">input()</a> a parametrom určiť, aby vygenerovala input textarea</p>
<pre><code>echo $form-&gt;input(‚text‘,a­rray(‚type‘=&gt;‚tex­tarea‘));</code></pre>
<p>V tomto prípade všetko funguje správne a v prípade, že textarea neprejde validáciou, CakePHP správne vygeneruje HTML kód aj s error správou</p>
<pre><code>&lt;textarea name=„data[Ar­ticle][text]“ cols=„10“ rows=„10“ id=„ArticleIn­troText“ class=„form-error“ &gt;&lt;/textarea&gt;&lt;div class=„error-message“&gt;This field cannot be left blank&lt;/div&gt;</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2009/08/02/zobrazenie-error-sprav-pre-intput-textarea/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ako si prispôsobiť 404 error stránku v CakePHP</title>
		<link>http://ims.rockretail.com/2009/07/03/ako-si-prisposobit-404-error-stranku-v-cakephp/</link>
		<comments>http://ims.rockretail.com/2009/07/03/ako-si-prisposobit-404-error-stranku-v-cakephp/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 16:30:38 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>
		<category><![CDATA[404 error page]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Nedávno som narazil na výborný článok od Chris Coyier – 404 Best Practices, v ktorom popisuje možnosti, ako upraviť 404 error stránku. V tomto článku sa bližšie pozrieme nato, ako toho docieliť prostredníctvom CakePHP.
Ako ste sa mohli dočítať v spomínanom článku od Chris Coyier – 404 Best Practices, 404 error stránka by mala byť veľmi [...]]]></description>
			<content:encoded><![CDATA[<p>Nedávno som narazil na výborný článok od <a href="http://css-tricks.com/404-best-practices">Chris Coyier – 404 Best Practices</a>, v ktorom popisuje možnosti, ako upraviť 404 error stránku. V tomto článku sa bližšie pozrieme nato, ako toho docieliť prostredníctvom CakePHP.<span id="more-68"></span></p>
<p>Ako ste sa mohli dočítať v spomínanom článku od Chris Coyier – 404 Best Practices, 404 error stránka by mala byť veľmi dôležitou súčasťou každej profesionálnej aplikácie. Návštevníkom sa môže táto error stránka zobraziť veľmi jednoducho, a vôbec to nemusí byť jeho zásluhou (napr. chybný odkaz smerujúci na našu stránku alebo sme mohli presunúť stránku, ktorú sa pokúša návštevník zobraziť, na inú URL atď.) a preto by nám malo záležať na tom, aby sme návštevníka nestratili a poskytli mu určité informácie tak, aby našiel čo hľadá. Tu prichádza na rad prispôsobenie takejto stránky.</p>
<h2>Layout pre 404 error stránku</h2>
<p>Ako sme si už v CakePHP zvykli, štandardným chovaním pre zobrazenie akejkoľvek informácie je najprv vytvoriť layout a potom samotný obsah layoutu. Inak tomu nie je ani pri 404 error stránke. Layout umiestníme do súboru <em>app/views/lay­outs/error404­.ctp</em> a jeho obsah by mohol vypadať následovne</p>
<pre><code>&lt;? echo $html-&gt;docType('xhtml-trans'); ?&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
    &lt;head&gt;
        &lt;? echo $html-&gt;charset("utf-8"); ?&gt;
        &lt;title&gt;Tibor Pino - 404 not found&lt;/title&gt;
        &lt;meta name="author" content="Tibor Piňo" /&gt;

        &lt;style type="text/css"&gt;
            body { text-align: center; font-size: 1.3em;}
        &lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;? echo $content_for_layout; ?&gt;

    &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>Po vytvorení layoutu je ďalším krokom vytvorenie obsahu stránky.</p>
<h2>404 error stránka</h2>
<p>V našom prípade budeme chcieť návštevníkovi oznámiť, že stránka, ktorú sa pokúša zobraziť neexistuje, ale zároveň mu poskytneme odkaz na úvodnú stránku, kde by mohol potrebné informácie nájsť. Súbor so stránkou umiestníme do súboru <em>app/views/error­s/404error.ctp</em> a jeho obsah bude vypadať následovne</p>
<pre><code>&lt;?php $this-&gt;layout = 'error404'; ?&gt;
&lt;? echo $html-&gt;image('404-error-page.jpg',array('alt'=&gt;'Page not found')); ?&gt;
&lt;h1&gt;Stránka nenájdená!&lt;/h1&gt;
&lt;p&gt;Stránka, ktorú sa pokúšate zobraziť neexistuje,
&lt;br/&gt;ale &lt;? echo $html-&gt;link('úvodná stránka Tibor Piňo',array('controller'=&gt;'pages','action'=&gt;'display')); ?&gt;

&lt;br/&gt;by vám mohla pomôcť.&lt;/p&gt;</code></pre>
<p>Tu si musíme trochu vysvetliť, ako CakePHP pracuje s chybovými odpoveďami zo servera. CakePHP automaticky spracováva chybové odpovede, ktoré prijíme od servera. Pri detekovaní chybovej odpovede 404 CakePHP automaticky zobrazí súbor <em>app/views/error­s/404error.ctp</em>, ak takýto súbor existuje. V našom prípade tento súbor existuje a CakePHP ho správne zobrazí, takže nemusíme nič explicitne nastavovať. V tomto súbore je ešte jedna zvláštnosť a to to je určenie samotného layoutu <em>$this-&gt;layout = ‚error404‘;</em>. Toto určenie layoutu je nevyhnutné, pretože v opačnom prípade by CakePHP zobrazoval vlastný preddefinovaný layout, čo je v našom prípade nežiadúce.</p>
<p>Týmto máme všetko hotové a našu prispôsobenú 404 error stránku môžete vidieť priamo v praxi na stránke môjho portfólia <a href="http://blueweb.rockretail.com/aaa">blueweb.rockre­tail.com</a></p>
<p>Podobný postup môžete využiť aj pri <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes">ďalších chybových odpovediach zo strany servera</a> napr. pre odpoveď 500 Internal Server Error by sme náš kód umiestnili do súborov <em>app/views/error­s/500error.ctp</em> a <em>app/views/lay­outs/500error­.ctp</em></p>
<p>Na záver ešte doplním, že sa mi nepodarilo zaistiť podporu tém pri týchto chybový stránkach. Vo svojich projektoch často využívam témy, ktoré sú napríklad umiestnené v <em>app/views/the­mes/default</em> a i napriek správnemu fungovaniu tém v mojich projektoch, som musel umiestniť súbory s chybovými hláškami priamo do adresárov umiestnených v <em>app/views</em> namiesto očakávaných v <em>app/views/the­mes/default</em></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/2009/07/03/ako-si-prisposobit-404-error-stranku-v-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mobify.me &#8211; mobilná verzia webovej stránky za pár sekúnd</title>
		<link>http://ims.rockretail.com/2009/05/30/mobify-me-mobilna-verzia-webovej-stranky-za-par-sekund/</link>
		<comments>http://ims.rockretail.com/2009/05/30/mobify-me-mobilna-verzia-webovej-stranky-za-par-sekund/#comments</comments>
		<pubDate>Tue, 30 Nov 1999 00:00:00 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>
		<category><![CDATA[mobify.me]]></category>
		<category><![CDATA[mobil]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[

Prehliadanie internetu prostredníctvom mobilu je čoraz populárnejšie a s príchodom stále rýchlejšieho mobilného pripojenia a zariadení sa bude určite jeho popularita zväčšovať. Z tohto dôvodu prichádzajú na radu mobilné verzie webových stránok. Mobilná verzia je veľmi špecifická, pretože sa musí väčšinou vysporiadať s mobilnými prehliadačmi (vo väčšine prípadov značne obmedzená funkcionalita oproti desktopovým prehliadačom) a [...]]]></description>
			<content:encoded><![CDATA[<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/mobify-me.png" alt="" /></div>
<p><span id="more-65"></span>
<p>Prehliadanie internetu prostredníctvom mobilu je čoraz populárnejšie a s príchodom stále rýchlejšieho mobilného pripojenia a zariadení sa bude určite jeho popularita zväčšovať. Z tohto dôvodu prichádzajú na radu mobilné verzie webových stránok. Mobilná verzia je veľmi špecifická, pretože sa musí väčšinou vysporiadať s mobilnými prehliadačmi (vo väčšine prípadov značne obmedzená funkcionalita oproti desktopovým prehliadačom) a taktiež značne s rozdielnymi veľkosťami displejov. Tento článok však nemá za cieľ pokryť problematiku mobilného webu, ale bude zameraný na jeho samotnú tvorbu.</p>
<h2>Mobify.me</h2>
<p>Služba <a href="http://www.mobify.me">Mobify.me</a> predstavuje unikátnu službu, pomocou ktorej môžete veľmi rýchlo a jednoducho vytvoriť mobilnú verziu webovej stránky. K tomuto účelu poskytuje jednoduché webové rozhranie s množstvom užitočných funkcií, niektoré z nich si bližšie predstavíme. Celý postup, ako Mobify.me pracuje, môžeme zhrnúť do troch jednoduchých krokov</p>
<ul>
<li>Vyberieme najdôležitejšie elementy stránky, ktoré budú súčasťou mobilnej verzie</li>
<li>Upravíme si požadované elementy s použitím css alebo pridáme nové podľa vlastnej potreby</li>
<li>Spustíme webovú stránku na adrese m.yourwebsite.com a celý proces dokončíme presmerovaním na mobify.me, kde sa naša mobilná verzia nachádza</li>
</ul>
<p>Osobne som vždy chcel vytvoriť mobilnú verziu svojho blogu, avšak nikdy som si nebol istý, či ju vytvoriť len pomocou css, alebo pre mobilnú verziu použiť inú tému, resp. iný layout. Na tom už momentálne nezáleží, pretože Mobify.me robí všetku prácu za mňa <a href="http://m.ims.rockretail.com">http://m.ims.rockretail.com</a>.</p>
<h3>Máte kontrolu nad obsahom mobilnej verzie</h3>
<p>Mobify.me vám umožňuje vybrať jednotlivé elementy stránky a je len na vás, ktorá časť vašej webovej stránky bude súčasťou mobilnej verzie</p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/mobify-me-1.png" alt="" /></div>
<h3>Vlastný štýl pomocou CSS</h3>
<p>Grafiku stránky stále ovládate pomocou CSS. Mobify.me poskytuje plnohodnotný CSS editor, kde zmeny vidíte v reálnom čase. Môžete si samostatne upravovať elementy ako sú header a footer, resp. pridávať elementy, ktoré sa na pôvodnej stránke nevyskytujú. K dispozícii sú taktiež reálne náhľady na niekoľkých mobilných zariadeniach, v tomto prípade sa jedná o Iphone, Nokia, Razr a BlackBerry. Nemusíte sa však obávať, že mobilná verzia vašej stránky je určená len pre tieto značky mobilov, ako Mobify.me uvádza, stránky by mali fungovať na väčšine dostupných mobilných zariadení.</p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/mobify-me-2.png" alt="" /></div>
<h3>Podpora šablón</h3>
<p>Vo vašej stránke môžete rozlíšiť rôzne druhy šablón. Mobify.me rozlišuje šablóny na základe URL. Napríklad ako môžeme vidieť na tomto blogu, všetky články začínajú s URL <em>articles</em>, čo teda predstavuje samostatnú šablónu v ktorej som si mohol určiť, že sa napríklad nemajú zobrazovať komentáre alebo hodnotenie článkov. Ďalšiu šablónu predstavuje index stránka s URL /, kde som naopak určil zobrazenie zoznamu článkov a stránkovanie.</p>
<h3>Nestrácate kontakt s plnou verziou stránky</h3>
<p>Pri mobilných verziách stránok sa môžete mnohokrát stretnúť so situáciou, kde vás stránka automaticky presmeruje na mobilnú verziu (v prípade identifikovania, že používate mobilný prehliadač) a vy nemáte žiadnu možnosť navštíviť plnohodnotnú verziu. S Mobify.me o túto možnosť neprichádzate, pretože sa na každej vašej mobilnej stránke nachádza priamy odkaz na jej plnohodnotnú verziu.</p>
<h3>Nasadenie</h3>
<p>K dispozícii je niekoľko možností, ako spustiť mobilnú verziu. Podporované je automatické presmerovanie na mobilnú verziu v prípade detekcie mobilného prehliadača, k dispozícii máte subdoménu na adrese <a href="http://yourwebsite.mobify.me">http://yourwebsite.mobify.me</a> (pričom časť url <em>yourwebsite</em> si môžete zvoliť sami bez ohľadu na vašu skutočnú adresu) alebo môžete zvoliť vlastnú subdoménu, ktorú pomocou DNS CNAME záznamu presmerujete na mobify.me.</p>
<h3>Rozšírené nastavenia</h3>
<p>Okrem vyššie spomínaných vlastností, k dispozícii máte taktiež možnosť určiť vlastnú ikonu mobilnej verzie, Google Analytycs ID, AdMob Analytics ID, Google Maps Key alebo možnosť nastaviť stav vašej mobilnej verzie pomocou statusov.</p>
<h3>Je to všetko zdarma?</h3>
<p>Mobify.me je k dispozícii v troch verziách. Pričom prvá z nich je úplne zdarma a poskytuje všetky spomínané vlastnosti. Jediným obmedzením tejto verzie je, že na každej vašej stránke sa nachádza priamy odkaz na Mobify.me. Ďalšie dve verzie Plus a Pro sú platené a poskytujú nástroje pre SEO, bezpečnosť, monitorovanie a podporu.</p>
<p>Myslím si, že Mobify.me poskytuje výborný nástroj, ktorý uľahčuje tvorbu mobilného webu a vzhľadom na čoraz viac vzrastajúcu popularitu mobilného internetu sa rozhodne oplatí investovať svoj čas do tvorby takejto verzie.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2009/05/30/mobify-me-mobilna-verzia-webovej-stranky-za-par-sekund/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mobilná verzia IMSBLOGu</title>
		<link>http://ims.rockretail.com/2009/05/28/mobilna-verzia-imsblogu/</link>
		<comments>http://ims.rockretail.com/2009/05/28/mobilna-verzia-imsblogu/#comments</comments>
		<pubDate>Tue, 30 Nov 1999 00:00:00 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Od dnešného dňa je dostupná aj mobilná verzia tohto blogu, ktorú nájdete na adrese http://m.ims.rockretail.com


Mobilná verzia by mala fungovať na väčšine mobilných zariadení, nie len telefónoch typu pda alebo smartphone. V mobilnej verzii môžete nájsť kompletný obsah článkov vrátane kategórií, komentáre by mali byť dostupné v blízkej budúcnosti. K vytvoreniu mobilnej verzie som využil službu [...]]]></description>
			<content:encoded><![CDATA[<p>Od dnešného dňa je dostupná aj mobilná verzia tohto blogu, ktorú nájdete na adrese <a href="http://m.ims.rockretail.com">http://m.ims.rockretail.com</a></p>
<div><img src="http://ims.rockretail.com/wp-content/uploads/2009/11/mobile-version-blog.jpg" alt="" /></div>
<p><span id="more-64"></span>
<p>Mobilná verzia by mala fungovať na väčšine mobilných zariadení, nie len telefónoch typu pda alebo smartphone. V mobilnej verzii môžete nájsť kompletný obsah článkov vrátane kategórií, komentáre by mali byť dostupné v blízkej budúcnosti. K vytvoreniu mobilnej verzie som využil službu <a href="http://www.mobify.me">Mobife.me</a>, ktorá umožňuje vytvoriť mobilnú verziu v priebehu pár minút. Túto službu plánujem predstaviť prostredníctvom článku v najbližších dňoch (doplnené: <a href="http://ims.rockretail.com/articles/2009/05/30/mobify-me-mobilna-verzia-webovej-stranky-za-par-sekund">Mobify.me – mobilná verzia webovej stránky za pár sekúnd</a>).</p>
<p>Rád uvítam vaše pripomienky a skúsenosti s mobilnou verziou blogu.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2009/05/28/mobilna-verzia-imsblogu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamické nahrávanie modelu</title>
		<link>http://ims.rockretail.com/2009/05/23/dynamicke-nahravanie-modelu/</link>
		<comments>http://ims.rockretail.com/2009/05/23/dynamicke-nahravanie-modelu/#comments</comments>
		<pubDate>Sat, 23 May 2009 21:48:54 +0000</pubDate>
		<dc:creator>Tibor Piňo</dc:creator>
				<category><![CDATA[Tipy a triky]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[CakePHP disponuje prepracovaným mechanizmom, ktorý spája modely podľa definovaných väzieb a na základe týchto väzieb automaticky vytvára objekty modelov. Avšak môže nastať situácia, kedy potrebuje nahrať model dynamicky až za behu aplikácie. CakePHP nám ponúka niekoľko možností.
V praxi môže nastať situácia, kedy potrebujeme dynamicky nahrať model z controlleru alebo z modelu tzn. až za behu [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHP disponuje prepracovaným mechanizmom, ktorý spája modely podľa definovaných väzieb a na základe týchto väzieb automaticky vytvára objekty modelov. Avšak môže nastať situácia, kedy potrebuje nahrať model dynamicky až za behu aplikácie. CakePHP nám ponúka niekoľko možností.<span id="more-61"></span></p>
<p>V praxi môže nastať situácia, kedy potrebujeme dynamicky nahrať model z controlleru alebo z modelu tzn. až za behu samotnej aplikácie. Najprv si predstavíme spôsob dynamického nahrávania modelu z controlleru.</p>
<h2>Dynamické nahrávanie modelu z controlleru</h2>
<p>Len si pripomeňme, že za normálnych okolností môžeme model v controlleri nahrať pomocou premennej <em>$uses</em></p>
<pre><code>class ArticlesController extends AppController {
        var $name = 'Articles';
        var $uses = array('Comment');
}</code></pre>
<p>Takto sa pri každom použití controlleru Articles sa nahrá a vytvorí objekt modelu <em>Comment</em> (samozrejme ak máme definované väzby v modeloch, napr. väzbu <em>Article hasMany Comment</em>, nemusíme explicitne uvádzať, že sa má daný model <em>Comment</em> nahrávať). Takéto správanie nemusí byť vždy žiadúce a nahratie modelu a vytvorenie jeho objektu budeme chcieť urobiť dynamicky, napr. iba pri vykonávaní akcie <em>add</em>. K tomuto účelu využijeme triedu <a href="http://api.cakephp.org/class/app">App</a> a jej metódu <em>import</em></p>
<pre><code>class ArticlesController extends AppController {
        var $name = 'Articles';

        function add() {
            //dynamicke nahratie modelu a vytvorenie objektu
            App::import('Model','Comment');
            $comment = new Comment;
            //volanie metody test z modelu Comment
            $comment-&gt;test();
        }
}</code></pre>
<h2>Dynamické nahrávanie modelu z iného modelu</h2>
<p>Vyššie spomenutý postup je platný aj pre dynamické nahrávanie modelu z iného modelu. Takto by vyzeralo dynamické nahratie a vytvorenie objektu modelu <em>Comment</em> z modelu <em>Article</em></p>
<pre><code>class Article extends AppModel {

        var $name = 'Article';
        var $useTable = 'articles';

        function addArticle() {
            //dynamicke nahratie modelu a vytvorenie objektu
            App::import('Model','Comment');
            $comment = new Comment;
            //volanie metody test z modelu Comment
            $comment-&gt;test();
        }
}</code></pre>
<p>V tomto prípade máme ešte jednu možnosť, ktorá sa však od predchádzajúcej líši najmä situáciou, v ktorej by mala byť použitá. Tou možnosťou je použitie metódy <a href="http://api.cakephp.org/class/model#method-ModelbindModel">bindModel()</a>. Musím však pripomenúť, že táto metóda je primárne určená na vytváranie dynamických väzieb medzi samotnými modelmi, i napriek tomu patrí medzi možnosti dynamického nahrávanie modelu. V našom prípade sme dynamicky vytvorili väzbu <em>Article hasMany Comment</em> a automaticky získali objekt na model <em>Comment</em></p>
<pre><code>class Article extends AppModel {

    var $name = 'Article';
    var $useTable = 'articles';

    function addArticle() {
        //dynamicke vytovrenie vazby a automaticke vytvorenie objektu modelu Comment
        $this-&gt;bindModel(
            array('hasMany' =&gt; array(
                'Comment' =&gt; array(
                    'className' =&gt; 'Comment'
                    )
                )
            )
        );
        //volanie metody test z modelu Comment
        $this-&gt;Comment-&gt;test();
    }
}</code></pre>
<p>Dynamické nahratie modelu sa uskutoční iba v prípade volania metódy <em>addArticle</em>, čo je chovanie, ktorého sme chceli dosiahnuť.</p>
<p>Dúfam, že tento krátky článok bude v budúcnosti nápomocný. Rád uvítam vaše poznatky, nápady a pripomienky v diskusii k článku.</p>
]]></content:encoded>
			<wfw:commentRss>http://ims.rockretail.com/2009/05/23/dynamicke-nahravanie-modelu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
