<?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>Red-Pill Blog &#187; Třídy</title>
	<atom:link href="http://blog.red-pill.cz/category/programovani/php/tridy/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.red-pill.cz</link>
	<description>Blog o internetu, programování a jiných věcech…</description>
	<lastBuildDate>Thu, 29 Apr 2010 13:20:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Rozšiřování funkčnosti rodičovské třídy pomocí hooks</title>
		<link>http://blog.red-pill.cz/2009/01/18/rozsirovani-funkcnosti-rodicovske-tridy/</link>
		<comments>http://blog.red-pill.cz/2009/01/18/rozsirovani-funkcnosti-rodicovske-tridy/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 14:34:17 +0000</pubDate>
		<dc:creator>tomas.fejfar</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Nezařazené]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[Třídy]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.red-pill.cz/2009/01/18/rozsirovani-funkcnosti-rodicovske-tridy/</guid>
		<description><![CDATA[
<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>K napsání tohoto příspěvku mě inspirovala práce na jednom projektu
v Zend Frameworku, který je opravdu dobře napsaný z hlediska dědičnosti
atp. Někdo bude mít možná pocit, že tu znovuobjevuji kolo, ale někomu to
třeba pomůže. Pokud vás zajímá co jsou to <strong>hooks</strong>, tak
čtěte dále.</p>
<span id="more-103"></span>
<h2>Problém</h2>

<p>Rodičovský controller má v sobě většinu funkcionality. Takže třeba
pro update stačí načíst data, do proměnné controlleru dát form a zavolat
<em>parent::update()</em>. Všechno šlape jako hodinky do chvíle, než je
potřeba nějak rozšířit funkcionalitu nad možnosti parent controlleru.
Např. přidat nějakou složitou validaci dat, přidat nějaký ruhý form,
atp. V tu chvíli se na první pohled zdá, že jediná šance je zkopírovat
kód parent controlleru a udělat v něm potřebné úpravy. A docela dlouho
sem to takhle (prasecky) dělal.</p>

<h2>Řešení</h2>

<p>Do chvíle, než mě <a href="http://www.martinhujer.cz/">Martin Hujer</a>
upozornil na to, že se na tohle dají hezky použít <strong>hooks</strong>! :)
Ne že bych je neznal už dřív. V ZendFrameworku je používám dnes a denně
např. ve FrontController pluginech (dispatchLoop­Shutdown, preDispatch, …).
Ale vůbec mi nedošlo, že bych je mohl použít.</p>

<h2>Coto, toto?</h2>

<p>Cože to ty hooks jsou? Pro neznalé: Hooks jsou procedury, které nalepíte
někam doprostřed kódu a ve zděděné třídě do nich pak napíšete co
potřebujete, aniž byste museli měnit rodičovskou třídu. Pochopitelné? Moc
ne, že.</p>

<p>Příklad pomůže.</p>

<p><strong>Původní zdrojový kód</strong></p>

<pre class="php"><code><span
class="php-comment">// ParentController
</span><span
class="php-keyword1">function</span> updateAction()
{
  <span
class="php-comment">//nějaký kód co nastavuje třeba form, title, oescapování, atp.
</span>  <span
class="php-var">$this</span>-&gt;view-&gt;headTitle(<span
class="php-quote">'test'</span>);
  <span
class="php-comment">//semhle bych chtěl vložit nějaký svůj kód
</span>  <span
class="php-var">$this</span>-&gt;_model-&gt;update(<span
class="php-var">$this</span>-&gt;_data);
  <span
class="php-comment">//nějaký další kód
</span>}</code></pre>

<p><strong>Zdrojový kód s hooks</strong></p>

<pre class="php"><code><span
class="php-comment">// ParentController
</span><span
class="php-keyword1">function</span> updateAction()
{
  <span
class="php-comment">//nějaký kód co nastavuje třeba form, title, oescapování, atp.
</span>  <span
class="php-var">$this</span>-&gt;view-&gt;headTitle(<span
class="php-quote">'test'</span>);
  <span
class="php-var">$this</span>-&gt;_beforeUpdate();
  <span
class="php-var">$this</span>-&gt;_model-&gt;update(<span
class="php-var">$this</span>-&gt;_data);
  <span
class="php-var">$this</span>-&gt;_afterUpdate();
  <span
class="php-comment">//nějaký další kód
</span>}

<span
class="php-keyword1">protected</span> <span
class="php-keyword1">function</span> _beforeUpdate(){}
<span
class="php-keyword1">protected</span> <span
class="php-keyword1">function</span> _afterUpdate(){}

<span
class="php-comment">//IndexController extends ParentController
</span><span
class="php-keyword1">protected</span> <span
class="php-keyword1">function</span> _beforeUpdate(){
  <span
class="php-comment">//tady si můžu zavolat co potřebuji a provede se to
</span>  <span
class="php-comment">//před updatem DB
</span>  <span
class="php-comment">//např.:
</span>  <span
class="php-var">$this</span>-&gt;_data[<span
class="php-quote">'date'</span>] = <span
class="php-quote">'2009-01-01'</span>;
}</code></pre>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://blog.red-pill.cz/2009/01/18/rozsirovani-funkcnosti-rodicovske-tridy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Díl 1: Přihlašování uživatelů</title>
		<link>http://blog.red-pill.cz/2008/10/31/dil-1-prihlasovani-uzivatelu/</link>
		<comments>http://blog.red-pill.cz/2008/10/31/dil-1-prihlasovani-uzivatelu/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 15:35:05 +0000</pubDate>
		<dc:creator>tomas.fejfar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[Třídy]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.red-pill.cz/2008/10/31/dil-1-prihlasovani-uzivatelu/</guid>
		<description><![CDATA[
<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Již delší dobu jsem se chystal na nějaký větší projekt a dnes jsem se
k tomu konečně dostal a začal. A výsledkem je první díl seriálu
screencastů o Zend Frameworku – tentokrát na téma <strong>Jednoduché
přihlašování uživatelů</strong>.</p>
<object height="354" width="450">
<param name="movie"
value="http://www.stream.cz/object/170557-dil-1-prihlasovani-uzivatelu" />
<param name="allowfullscreen" value="true" />
<param name="wmode" value="transparent" />
<embed src="http://www.stream.cz/object/170557-dil-1-prihlasovani-uzivatelu"
type="application/x-shockwave-flash" wmode="transparent" allowfullscreen="true"
height="354" width="450" /></object>
<p>Kvalita záznamu je poněkud slabší a zvuk je malinko out-of-sync
(zvlášť ke konci), ale to se do příštího dílu změní. Případné
náměty na další témata pište do komentářů.</p>

<p>Potom, co jsem screencast dokončil a překomprimoval jsem si všimnul, že
sem zapoměl zmínit to hlídání init() metody. Takže to zmíním tady:</p>

<pre class="php"><code><span
class="php-keyword1">class</span> IndexController extend My_Controller_Restricted{
    <span
class="php-keyword1">public</span> <span
class="php-keyword1">function</span> init(){
        <span
class="php-var">$foo</span> = <span
class="php-quote">'bar'</span>;
        <span
class="php-comment">/* Tady chceme nějaký náš kód, jenže tím jsme přepsali
         * metodu init() v původním controlleru, takže je třeba jí
         * ještě zavolat.
         * Pokud by se měl init vykonat pouze po přihlášení, tak musí být
         * parent::init() na začátku !
         */</span>
        parent::init();
    }
}</code></pre>
Pro někoho se znalostmi OOP to není nic překvapujícího, ale pro OOP
začátečníky je tohle několik bezesných nocí. okud by si někdo chtěl
doplnit vzdělání, tak doporučuji:
<ul>
	<li>PHP: <a
	href="http://php.interval.cz/objektove-orientovane-programovani-oop-v-php/">http://php.interval.cz/…i-oop-v-php/</a></li>

	<li>Pascal: <a
	href="http://www.sweb.cz/david.padrta/pascal/7oop.html">http://www.sweb.cz/…al/7oop.html</a></li>

	<li>Teoreticky: <a
	href="http://www.smt.pilsedu.cz/~jojo/Vyt/OOP.htm">http://www.smt.pilsedu.cz/…/Vyt/OOP.htm</a></li>
</ul>

<p>Zdrojové kódy ke screencastu budou k dispozici během
příštího týdne.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.red-pill.cz/2008/10/31/dil-1-prihlasovani-uzivatelu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sitemap a sub-domény na Google Webmasters Tools</title>
		<link>http://blog.red-pill.cz/2008/08/13/sitemap-a-sub-domeny-na-google-webmasters-tools/</link>
		<comments>http://blog.red-pill.cz/2008/08/13/sitemap-a-sub-domeny-na-google-webmasters-tools/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 19:28:13 +0000</pubDate>
		<dc:creator>petr.kratina</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[Přístupnost]]></category>
		<category><![CDATA[Třídy]]></category>

		<guid isPermaLink="false">http://blog.red-pill.cz/2008/08/13/sitemap-a-sub-domeny-na-google-webmasters-tools/</guid>
		<description><![CDATA[
<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p style="text-align: justify;">Pokud vám není lhostejná viditelnost vašich
stránek a pojem SEO vám není úplně cizí, možná používáte nástroj <a
href="https://www.google.com/webmasters/tools/" target="_blank">Google
Webmasters Tools</a> (dále GWT). Je to skvělý nástroj, který vám umožní
alespoň částečně nahlédnout pod pokličku indexace webu Google crawlerem,
a umožní předat mu další informace o vašich stránkách. Jednou z ne
zrovna zanedbatelných možností jak pomoci indexovat své stránky je tzv. <a
href="http://www.sitemaps.org/protocol.php" target="_blank">sitemap soubor</a>,
který obsahuje všechna URL vašeho webu a užitečné informace jako čas
poslední změny, priority stránky a podobně, problém ale nastává ve
chvíli, kdy vaše stránky používají sub-domény jako logikou součást URL
pro vaši aplikaci, GWT totiž neumožní odkazovat ze sitemap souboru na jiné
domény a jen suše zahlásí:</p>

<div class="code">Adresa URL není povolena<br />
Tato adresa URL není v tomto umístění pro soubor Sitemap povolena.</div>
 <span id="more-86"></span>
<h2>Zamyšlení: K čemu vlastně používat sub-domény?</h2>

<p style="text-align: justify;">Použití sub-domén jako proměnných
součástí adresy je trochu sporné, někteří tvrdí, že je to zbytečné a
matoucí, například mě se ale toto dělení líbí – vezměme si jako
příklad katalog restaurací, proč by každá restaurace zařazená do
katalogu neměla mít pěkné URL složené z jejího názvu a naší domény,
vždyť na oné stránce jsou informace týkající se jen jí a restaurace jí
může snadno použít jako svou „homepage“…</p>

<h2>A jaké že je to slavné řešení?</h2>

<p style="text-align: justify;">Řešení je malinko složitější, spíše
tedy na technické provedení než na pochopení. Musíme totiž GWT
„vnutit“ ne sitemap soubor, ale sitemap index. To je vlastně seznam
souborů, které se mají načíst a zpracovat. Google ho přečte a všechy
soubory v něm obsažené přidá pod hlavní doménu. Sitemap index má
následující podobu:</p>

<div class="code">&lt;?xml version=„1.0“ encoding=„UTF-8“?&gt;<br />
&lt;sitemapindex
xmlns=„http:/­/www.sitemaps­.org/schemas/si­temap/0.9“&gt;<br />
    &lt;sitemap&gt;<br />
        &lt;loc&gt;­http://www.exam­ple.com/Sitemap­.xml&lt;/loc&gt;<br
/>
    &lt;/sitemap&gt;<br />
    &lt;sitemap&gt;<br />
        &lt;loc&gt;­http://blog.e­xample.com/Si­temap.xml&lt;/loc&gt;<br
/>
    &lt;/sitemap&gt;<br />
    &lt;sitemap&gt;<br />
        &lt;loc&gt;­http://articles­.example.com/Si­temap.xml&lt;/loc&gt;<br
/>
    &lt;/sitemap&gt;<br />
&lt;/sitemapindex&gt;<br />
</div>

<p style="text-align: justify;">To složitější je, dostat na každou
sub-doménu sitemap, který je platný jenom pro ni, já celou situaci řeším
generováním XML souborů do speciální složky a poté je pomocí PHP
zobrazím, vždy tedy jde o umístění <a
href="http://subdomena.domena.cz/Sitemap.xml">http://subdomena.domena.cz/Sitemap.xml</a>
ale aplikace podstrčí správný XML soubor pro danou sub-doménu. Pokud
nevíte jak na to, připravil jsem v PHP malý soubor (download na konci
článku), který toto vyřeší za vás. Vy jen generujete XML do složky
sitemaps (subdomena.xml), tento skript nasadíte přímo do rootu vaší
stránky a nasměrujete na něj pomocí mod_rewrite soubor sitemap.xml:</p>

<div class="code">RewriteEngine On<br />
<br />
RewriteCond %{REQUEST_FILENAME} /Sitemap.xml$<br />
RewriteRule .* Sitemap.php [L]</div>

<p>Případně budeme sitemap indexem odkazovat přímo na Sitemap.php.</p>

<h2>Závěr</h2>

<p style="text-align: justify;">Když tedy máme dostupný správný soubor
Sitemap.xml na každé sub-doméně a SitemapIndex.xml, obsahující jejich
umístění, stačí jej vložit do GWT a počkat až jej Google načte. První
se načte Index a poté postupně všechny jednotlivé Sitemapy, to bude trvat
nekolik desítek, minut, tak buďte trpěliví – výsledek stojí za to –
Google bude přesně vědět které poddomény jsou součástí
vašeho webu!</p>

<div style="text-align: center; margin-bottom: 10px;"><img
style="border: 1px #AAA solid;"
src="http://img87.imageshack.us/img87/8624/sitemapindexvh5.jpg"
alt="Google Web Tools Sitemap Index Status" /></div>

<p><strong>Download:</strong> <a
href="http://red-pill.cz/sitemap.zip">sitemap.zip</a> – třída sitemap,
ukázková XML a soubor .htaccess</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://blog.red-pill.cz/2008/08/13/sitemap-a-sub-domeny-na-google-webmasters-tools/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zend_View_Helper_Url &#8211; pár tipů</title>
		<link>http://blog.red-pill.cz/2008/05/25/zend_view_helper_url-par-tipu/</link>
		<comments>http://blog.red-pill.cz/2008/05/25/zend_view_helper_url-par-tipu/#comments</comments>
		<pubDate>Sun, 25 May 2008 19:20:35 +0000</pubDate>
		<dc:creator>tomas.fejfar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[Třídy]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.red-pill.cz/2008/05/25/zend_view_helper_url-par-tipu/</guid>
		<description><![CDATA[
<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>V aplikaci mám helper, který generuje menu ze stromu do UL. V něm jsem
chtěl nějak elegantně vyřešit routování na kategorie a i na root webu.
Řekl jsem si, že to udělám přes Zend_View_Hel­per_Url a routy, abych
nemusel přepisovat URL, kdyby se něco změnilo až budu vyvíjet dál.
S routami kategorií nebyl problém. Ale když sem si chtěl udělat „null“
routu na root webu, tak jsem pohořel, protože router očekává aspoň
nějaké parametry a routa "" mu nebyla dost dobrá.<span id="more-76"></span>
Nakonec to nebylo ani tak složité, ale třeba to někomu ušetří práci
(doufám, že zápis v mém interním formátu nebude moc zmatečný):</p>

<pre class="html"><code><span
class="html-tag">&lt;route&gt;</span>
        <span
class="html-tag">&lt;name&gt;</span>base<span
class="html-tag">&lt;/name&gt;</span>
        <span
class="html-tag">&lt;url&gt;</span>:root<span
class="html-tag">&lt;/url&gt;</span>
        <span
class="html-tag">&lt;params&gt;</span>
                <span
class="html-tag">&lt;module&gt;</span>shop<span
class="html-tag">&lt;/module&gt;</span>
                <span
class="html-tag">&lt;controller&gt;</span>index<span
class="html-tag">&lt;/controller&gt;</span>
                <span
class="html-tag">&lt;action&gt;</span>index<span
class="html-tag">&lt;/action&gt;</span>
        <span
class="html-tag">&lt;/params&gt;</span>
<span
class="html-tag">&lt;/route&gt;</span></code></pre>

<p>A potom prostě pošlete ten argument root prázdný :)</p>

<pre class="php"><code><span class="php-var">$url</span> = <span
class="php-keyword1">new</span> Zend_View_Helper_Url();
<span
class="php-var">$url</span>-&gt;url(<span
class="php-keyword2">array</span>(<span
class="php-quote">'root'</span>=&gt;<span class="php-quote">''</span>),<span
class="php-quote">'base'</span>);</code></pre>

<p>Další užitečnou věcí je, že pokud ve svém helperu potřebujete
používat aktuální view objekt, musíte nadefinovat interface, kterým ho
Helper Broker injectne do vašeho helperu. Popis jak na to najdete <a
href="http://framework.zend.com/manual/en/zend.view.helpers.html">v manuálu</a>
(úplně dole). Pak můžete používat v klidu registrované view helpery ve
svém helperu – tedy budete mít např. k ruce Zend_View_Hel­per_Partial
(můj oblíbený :) )</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://blog.red-pill.cz/2008/05/25/zend_view_helper_url-par-tipu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
