<?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>Martin Cohen &#187; Web</title>
	<atom:link href="http://coh.io/blog/category/web/feed" rel="self" type="application/rss+xml" />
	<link>http://coh.io/blog</link>
	<description>Intype, dizajn, vývoj a somári</description>
	<lastBuildDate>Sun, 23 May 2010 15:41:46 +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>Sága o inštalácii YUIDoc [Web]</title>
		<link>http://coh.io/blog/1190-saga-o-instalacii-yuidoc</link>
		<comments>http://coh.io/blog/1190-saga-o-instalacii-yuidoc#comments</comments>
		<pubDate>Fri, 21 May 2010 13:09:47 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1190</guid>
		<description><![CDATA[
<p>Ani som nechcel tento článok napísať, lebože iba keď si tým obhyzdným
peklom jeden prejde, pochopí že stav alarmujúci jest.</p>

<p>YUIDoc je semä hada britského, čiže potrebujete Python. Okrem toho jačí
po 4 daľších knižniciach. Bez command prompt cez nasledovné
neprejdete.</p>

<p>Python 2.6</p>

<p>Stiahnite si Python 2.6.5 Windows<br />
installer</p>

<p>Nainštalujte. Doporučujem nemeniť cieľovú cestu a horko prijať čo
má<br />
inštalátor prednastavené, inak sa môžete dostať do slušných<br />
sračiek.</p>

<p>Do PATH […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Ani som nechcel tento článok napísať, lebože iba keď si tým obhyzdným
peklom jeden prejde, pochopí že stav alarmujúci jest.</p>

<p><a href="http://developer.yahoo.com/yui/yuidoc/">YUIDoc</a> je semä hada
britského, čiže potrebujete <em>Python</em>. Okrem toho jačí po
4 daľších knižniciach. Bez <em>command prompt</em> cez nasledovné
neprejdete.</p>

<h2>Python 2.6</h2>

<ol>
	<li>Stiahnite si <a href="http://www.python.org/download/">Python 2.6.5 Windows
	installer</a></li>

	<li>Nainštalujte. Doporučujem nemeniť cieľovú cestu a horko prijať čo má
	inštalátor prednastavené, inak sa môžete dostať do slušných
	sračiek.</li>

	<li>Do <code>PATH</code> si pridajte <code>C:\Python26</code> a
	<code>C:\Python26\Scripts</code>.</li>
</ol>

<h2>setuptools</h2>

<p><code>setuptools</code> je balíček, ktorý zjednodušuje sťahovanie a
inštaláciu ostatných balíčkov pre Python.</p>

<ol>
	<li>Stiahnite si <a
	href="http://pypi.python.org/pypi/setuptools#files">setuptools-0.6c11.win32-py2.6.exe</a>.
	Bacha aby ste fakt stiahli verziu py2.6, inak budú problémy.</li>

	<li>Nainštalujte.</li>
</ol>

<h2>Ostatné závislosti pre YUIDoc</h2>

<ol>
	<li>Spustite <em>command prompt</em> a postupne nainštalujte každý
	z nasledujúcich balíčkov. Pokiaľ by vám systém protestoval, že použitý
	<code>easy_install</code> nevie nájsť, skúste nasledové spúšťať
	z adresára <code>C:\Python26\Scripts</code>.</li>

	<li><code>easy_install Pygments</code></li>

	<li><code>easy_install SimpleJSON</code></li>

	<li><code>easy_install Cheetah</code></li>
</ol>

<p>Mne v bode 4. <code>Cheetah</code> zlyhal na tom, že si nevedel nájsť
práve stiahnutý inštalátor pre <code>Markdown</code>:</p>

<pre>...
Downloading http://sourceforge.net/projects/python-markdown/files/markdown/2.0.3/Markdown-2.0.3.win32.exe/download
Processing download
error: Couldn't find a setup script in c:\docume~1\martin~1.bal\locals~1\temp\easy_install-ad29ft\download</pre>

<p>Pre istotu som teda <a
href="http://sourceforge.net/projects/python-markdown/files/">Markdown
stiahol</a> a nainštaloval samostatne. Sám netuším či to má význam.</p>

<h2>YUIDoc</h2>

<p><a href="http://yuilibrary.com/downloads/#yuidoc">Stiahnite si YUI Doc</a>.
Niekam ho rozbaľte (ideálne keď cesta nebude obsahovať medzery v názvoch
súborov). Ja mám napríklad adresár <code>D:\work\libraries</code> kde mám
rôzne podobné taľafatky. Z neho mám urobený samostatný disk takto:</p>

<pre>subst L: D:\work\libraries</pre>

<p>Baťák sa mi spúšťa po štarte, takže <code>L:</code> mám vždy
po ruke.</p>

<p><em>YUIDoc</em> má v sebe ukážkový spúšťačno-konfigurujúci
<code>L:\yuidoc\bin\example.bat</code> ktorý si je potrebné niekam
skopírovať a upraviť podľa potreby. A pretože <em>YUIDoc</em> vo verzii
<em>1.0.0b1</em> používa <em>deprecated</em> modul <em>Sets</em> som si urobil
ešte malú úpravu na poslednom riadku, ktorá zakáže veselé
<em>DeprecatedWarning</em> ňuf-ňuf správičky. Tu máte môj
<code>generate.bat</code>:</p>

<pre>
@ECHO OFF

REM ##########################################################################

REM The location of your yuidoc install
<strong>SET yuidoc_home="l:\yuidoc"</strong>

REM The location of the files to parse.  Parses subdirectories, but will fail if
REM there are duplicate file names in these directories.  You can specify multiple
REM source trees:
REM      SET parser_in="c:\home\www\yahoo.dev\src\js c:\home\www\Event.dev\src"
<strong>SET parser_in=""</strong>

REM The location to output the parser data.  This output is a file containing a
REM json string, and copies of the parsed files.
<strong>SET parser_out="..\..\temp\doc"</strong>

REM The directory to put the html file outputted by the generator
<strong>SET generator_out="..\..\dist\doc"</strong>

REM The location of the template files.  Any subdirectories here will be copied
REM verbatim to the destination directory.
<strong>SET template="%yuidoc_home%\template"</strong>

REM The project version that will be displayed in the documentation.
<strong>SET version="1.0.0"</strong>

REM The version of YUI the project uses.
<strong>SET yuiversion="2"</strong>

<strong>python -W ignore::DeprecationWarning %yuidoc_home%\bin\yuidoc.py %parser_in% -p %parser_out% -o %generator_out% -t %template% -v %version% -Y %yuiversion%</strong>
</pre>

<p>Popis jednotlivých parametrov je v dodávke celkom jasný. Pre úplnosť
uvediem ešte štruktúru môjho projektu:</p>

<ul>
	<li><code>dev\js</code> Obsahuje moje JS súbory a aj uvedený
	<code>generate.bat</code>, ktorý z toho adresára spúšťam (bacha, uvedené
	cesty sú relatívne k tomuto adresáru).</li>

	<li><code>dist\doc</code> Sem sa mi vyleje dokumentácia v HTML.</li>

	<li><code>temp\doc</code> Sem tratí <em>YUIDoc</em> dočasné súbory.</li>
</ul>

<p>Mľaskavo vychutnávajte.</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1190-saga-o-instalacii-yuidoc/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JavaScript zvnútra 1/4: Dedičnosť objektov [Web]</title>
		<link>http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov</link>
		<comments>http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov#comments</comments>
		<pubDate>Tue, 04 May 2010 14:00:18 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1048</guid>
		<description><![CDATA[
<p>Veľa zmätku nastalo okolo JavaScriptu. Jeho neobyčajné vlastnosti veľa
nás radšej ignoruje, akoby mali pariť uzlinami. Našli sme si miesto toho
zázračné formulky, ktoré nám pomáhajú priepasť prekonávať. Navyše,
množstvo zdrojov uvádza nekompletné, či dokonca nesprávne postupy.
Špecifikácia nie je veľkým pomocníkom a k tomu všetkému sú tu rozdiely
medzi implementáciami.</p>

<p>Všetci vieme:</p>

<p>JavaScript má prototypovú dedičnost.</p>

<p>Na dedenie je vlastnosť prototype.</p>

<p>Na inštancovanie objektu […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Veľa zmätku nastalo okolo JavaScriptu. Jeho neobyčajné vlastnosti veľa
nás radšej ignoruje, akoby mali pariť uzlinami. Našli sme si miesto toho
<em>zázračné formulky,</em> ktoré nám pomáhajú priepasť prekonávať.
Navyše, množstvo zdrojov uvádza nekompletné, či dokonca nesprávne postupy.
Špecifikácia nie je veľkým pomocníkom a k tomu všetkému sú tu rozdiely
medzi implementáciami.</p>

<p>Všetci vieme:</p>

<ul>
	<li>JavaScript má prototypovú dedičnost.</li>

	<li>Na dedenie je vlastnosť <code>prototype</code>.</li>

	<li>Na inštancovanie objektu používame funkcie, ktoré sa podobajú ako na
	triedy, tak na konštruktory.</li>
</ul>

<p>a strácame sa:</p>

<ul>
	<li>Čo je to prototypová dedičnost?</li>

	<li>Akú úlohu hrá vlastnosť <code>prototype</code> v dedičnosti?</li>

	<li>Ako funguje inštancovanie objektu z konštruktora?</li>
</ul>

<h2>Dedičnosť medzi objektami</h2>

<p>Prototypová dedičnost, byť termín nesprávny, vhodný sťa metafora jest.
(Používať budem i termíny ako napríklad „trieda“, ktoré nie sú tak
celkom správne v kontexte JavaScriptu).</p>

<p>Na spodku zázrakov JavaScriptu je dedičnosť medzi objektami (nemýliť
s triedami). Na to aby sme pochopili ako funguje dedenie tried, je dobré
vedieť ako môže jeden objekt dediť od druhého. Príklad:</p>

<pre class="js"><code><span class="js-keywords1">var</span><span
class="js-out"> fruit = { taste: </span><span
class="js-quote">&quot;sweet&quot;</span><span class="js-out"> };
</span><span
class="js-keywords1">var</span><span
class="js-out"> apple = { color: </span><span
class="js-quote">&quot;red&quot;</span><span class="js-out"> };

</span><span
class="js-comment">// Čil z&aacute;zrak snaň sa!
</span><span
class="js-out">
alert( apple.taste ); </span><span
class="js-comment">// =&gt; &quot;sweet&quot;</span></code></pre>

<p>Zázrak, ktorý sa musí stať je prepojenie objektov <code>apple</code> a
<code>fruit</code>. Čiže ak sa spýtam na <code>apple.taste</code>, JavaScript
musí vedieť, že ak <code>taste</code> nie je definovaná pre
<code>apple</code> tak sa musí pozrieť na <code>fruit</code>.</p>

<p>Existuje vlastnosť každého objektu v JavaScripte, o ktorej nám
súčasné implementácie viac-menej mlčia. Všetci sme už počuli
o vlastnosti <code>prototype</code>, málo je však počut o
<code>__proto__</code>. Je to preto, že <code>__proto__</code> je
v špecifikácii <a href="http://www.ecmascript.org/">ECMAScript
262</a> označená ako interná (skrytá) a nemali by sme teda na ňu ako
programátori šahať. (Špecifikácia hovorí o tejto vlastnosti ako o
<code>[[Prototype]]</code>).</p>

<p>I napriek tomu dve JavaScriptové implementácie (<a
href="http://www.mozilla.org/js/spidermonkey/">SpiderMonkey od Mozilly</a> a <a
href="http://code.google.com/p/v8/">V8 od Google</a>) ju sprístupňujú a
pomenúvajú <code>__proto__</code> (budem teda používať toto pomenovanie).
<strong>Rád by som tu zdôraznil, že ide o neštandardnú internú
vlastnosť, ale nám veľmi dobre poslúži na pochopenie toho čo sa
v JavaScripte de­je.</strong></p>

<p>Oný zázrak je teda v tom, že <code>apple.__proto__</code> nastavíme na
<code>fruit</code>:</p>

<pre class="js"><code><span class="js-keywords1">var</span><span
class="js-out"> fruit = { taste: </span><span
class="js-quote">&quot;sweet&quot;</span><span class="js-out"> };
</span><span
class="js-keywords1">var</span><span
class="js-out"> apple = { color: </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> };

apple.__proto__ = fruit;

alert( apple.taste ); </span><span
class="js-comment">// =&gt; &quot;sweet&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/zbqPV/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-1-1.png" alt=""
/></div>

<p>Objekt <code>apple</code> dedí od <code>fruit</code>, vďaka vlastnosti
<code>__proto__</code>. Ak sa spýtame na hodnotu vlastnosti <code>taste</code>,
JavaScript sa ju pokúsi nájsť na objekte <code>apple</code>. Ak ju objekt
<code>apple</code> nemá, mrkne sa do objektu <code>apple.__proto__</code>, ak
ani tam nič, tak <code>apple.__proto__.__proto__</code>atď. V našom prípade
sa zastaví na <code>apple.__proto__</code>, pretože ukazuje na objekt
<code>fruit</code> a ten vlastnosť <code>taste</code> má.</p>

<p>Ak chcem objektu <code>apple</code> zmeniť chuť na <code>"sour"</code>,
nič mi nebráni. Objekt <code>fruit</code> bude stále sladký:</p>

<pre class="js"><code><span class="js-out">apple.taste = </span><span
class="js-quote">&quot;sour&quot;</span><span
class="js-out">;
alert( apple.taste ); </span><span
class="js-comment">// =&gt; &quot;sour&quot;
</span><span
class="js-out">alert( fruit.taste ); </span><span
class="js-comment">// =&gt; &quot;sweet&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/WWx6H/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-1-2.png" alt=""
/></div>

<p>V tomto momente <code>apple</code> dostáva vlastný <code>taste</code> a
JavaScript už nemusí snoriť po <code>__proto__</code> aby ju našiel.</p>

<p>Je dôležité si uvedomiť, že s <code>__proto__</code> sa za normálnych
okolností nestretneme. Budeme dokonca nútení ho nepoužívať, pretože nie
je definovaný vo všetkých implementáciách. V tejto sérii slúži hlavne
na vysvetlenie vnútorných pochodov v JavaScripte.</p>

<p>Ďalšia časť:</p>

<ul>
	<li><strong>JavaScript zvnútra 1/4: Dedičnosť objektov</strong></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript zvnútra 2/4: Konštruktory [Web]</title>
		<link>http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory</link>
		<comments>http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory#comments</comments>
		<pubDate>Tue, 04 May 2010 13:00:42 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1062</guid>
		<description><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<p>JavaScript<br />
zvnútra 1/4: Dedičnosť objektov</p>

<p>JavaScript zvnútra 2/4: Konštruktory</p>

<p>JavaScript<br />
zvnútra 3/4: Prototyp konštruktora</p>

<p>JavaScript<br />
zvnútra 4/4: Dedičnosť medzi triedami</p>

<p>Predsa však, bežnejšia, dostupnejšia a bezpečnejšia forma dedičnosti
ako tá čisto objektová je pomocou konštruktorov. Kým sa dostanem
k samotnej dedičnosti, nutno jest pochopiť konštruktory.</p>

<p>Konštruktor je objekt triedy Function, teda funkcia:</p>

<p>function Fruit( color ) {<br />
this.color = color; }</p>

<p>var apple = […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><strong>JavaScript zvnútra 2/4: Konštruktory</strong></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<p>Predsa však, bežnejšia, dostupnejšia a bezpečnejšia forma dedičnosti
ako tá <a
href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">čisto
objektová</a> je pomocou konštruktorov. Kým sa dostanem k samotnej
dedičnosti, nutno jest pochopiť konštruktory.</p>

<p>Konštruktor je objekt triedy <em>Function</em>, teda funkcia:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
}

</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Fruit( </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> );

alert(apple.color); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/VdR7U/"> → Vyskúšajte</a></p>

<p>Tým sme vytvorili objekt <code>apple</code>, inštanciu <code>Fruit</code>,
ktorý má vlastnosť <code>color</code> nastavenú na <code>red</code>. Za
operátorom <code>new</code> sedí kus kódu, ktorý okrem iného zavolá
funkciu <code>Fruit</code> tak, že jej nastaví <code>this</code> na
<code>apple</code>. Asi takto:</p>

<pre class="js"><code><span
class="js-comment">// Vytvor&iacute; obyčajn&yacute; objekt
</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Object();
</span><span
class="js-comment">// Zavol&aacute; nad n&iacute;m met&oacute;du Fruit
</span><span
class="js-out">Fruit.call( apple, </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> );

alert( apple.color ); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/u5vqZ/"> → Vyskúšajte</a></p>

<p>Pomocou konštruktora teda pripravíme objekt tým, že mu nastavíme
základné vlastnosti. (Špecifikácia <a
href="http://www.ecmascript.org/">ECMAScript 262</a> tento proces popisuje
detailne v sekcii 13.2.2.)</p>

<h2>Metódy</h2>

<p>Pridajme metódu <code>yellColor</code>, ktorá zareve farbu. Prvé čo nás
napadne je:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
  </span><span
class="js-keywords1">this</span><span class="js-out">.yellColor = </span><span
class="js-keywords1">function</span><span class="js-out">() </span><span
class="js-comment">// Toto je fakt že zle
</span><span
class="js-out">  {
    alert( </span><span class="js-keywords1">this</span><span
class="js-out">.color );
  };
}

</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Fruit( </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> );

apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/Uzn4z/"> → Vyskúšajte</a></p>

<p>Kód nám síce funguje, nie že nie. Predstavme si ale, že chceme vytvoriť
celé vrece červeného ovocia. Povedzme takých 100ks:</p>

<pre class="js"><code><span class="js-keywords1">var</span><span
class="js-out"> bag = [];
</span><span class="js-keywords1">for</span><span
class="js-out">( </span><span class="js-keywords1">var</span><span
class="js-out"> i = </span><span class="js-num">0</span><span
class="js-out">; i &lt; </span><span class="js-num">100</span><span
class="js-out">; i++ )
{
  bag.push( </span><span
class="js-keywords1">new</span><span class="js-out"> Fruit( </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out"> ) );
}</span></code></pre>

<p>Pre každú jednu inštanciu vytvoríme jeho vlastnú metódu, čím si
úspešne zahrávame s časom a nárokmi na pamäť. Skúsme si rozpísať čo
sa vlastne deje:</p>

<pre class="js"><code><span class="js-keywords1">var</span><span
class="js-out"> bag = [];
</span><span class="js-keywords1">for</span><span
class="js-out">( </span><span class="js-keywords1">var</span><span
class="js-out"> i = </span><span class="js-num">0</span><span
class="js-out">; i &lt; </span><span class="js-num">100</span><span
class="js-out">; i++ )
{
  </span><span class="js-keywords1">var</span><span
class="js-out"> apple = </span><span class="js-keywords1">new</span><span
class="js-out"> Object();
  apple.color = </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out">;
  apple.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
  {
    alert( </span><span
class="js-keywords1">this</span><span
class="js-out">.color );
  }

  bag.push( apple );
}</span></code></pre>

<p>Vytvárať kvôli 100ks ovocia 100ks metód je celkom luxus, ktorý si
môžeme dovoliť iba málokedy. A nie je to len o rýchlosti a pamäti. Ak by
sme takýto kód nechali v našej knižnici a pre jeden z desiatich projektov
by sme potrebovali vypisovať farbu ovocia napríklad do konzoly
(<code>console.log</code>), neostáva nám iba vytvoriť novú vetvu kódu
s iným konštruktorom.</p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-2-1.png" alt=""
/></div>

<p>Riešením je definovať metódy na <a
href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora"><code>prototype</code>
konštruktora (v ďalšej časti)</a>.</p>

<p>Ďalšie časti:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><strong>JavaScript zvnútra 2/4: Konštruktory</strong></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript zvnútra 3/4: Prototyp konštruktora [Web]</title>
		<link>http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora</link>
		<comments>http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora#comments</comments>
		<pubDate>Tue, 04 May 2010 12:00:53 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1064</guid>
		<description><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<p>JavaScript<br />
zvnútra 1/4: Dedičnosť objektov</p>

<p>JavaScript<br />
zvnútra 2/4: Konštruktory</p>

<p>JavaScript zvnútra 3/4: Prototyp konštruktora</p>

<p>JavaScript<br />
zvnútra 4/4: Dedičnosť medzi triedami</p>

<p>Oveľa lepšie, ako pchať metódy priamo do konštruktora, je na to využiť
jeho vlastnosť prototype. Robí sa to takto:</p>

<p>function Fruit( color ) {<br />
this.color = color; }</p>

<p>Fruit.prototy­pe.yellColor = function() {<br />
alert( this.color ); };</p>

<p>var apple = new Fruit( „red“ ); apple.yellColor(); // […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><strong>JavaScript zvnútra 3/4: Prototyp konštruktora</strong></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<p>Oveľa lepšie, <a
href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">ako pchať
metódy priamo do konštruktora</a>, je na to využiť jeho vlastnosť
<code>prototype</code>. Robí sa to takto:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
}

Fruit.prototype.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
{
  alert( </span><span class="js-keywords1">this</span><span
class="js-out">.color );
};

</span><span class="js-keywords1">var</span><span
class="js-out"> apple = </span><span class="js-keywords1">new</span><span
class="js-out"> Fruit( </span><span class="js-quote">&quot;red&quot;</span><span
class="js-out"> );
apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/R9VqT/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-3-1.png" alt=""
/></div>

<p>Každá funkcia má vlastnosť <code>prototype</code>. Pri inštancovaní
operátorom <code>new</code> JavaScript nastaví novému objektu jeho <a
href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">spomínanú
vlastnosť <code>__proto__</code></a> na <code>prototype</code> konštruktora.
Čiže na pozadí volania <code>var apple = new Fruit( "red" );</code> sa udeje
niečo takéto:</p>

<pre class="js"><code><span
class="js-comment">// Vytvor&iacute; obycajn&yacute; objekt
</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Object();
</span><span
class="js-comment">// Nastav&iacute; __proto__ na prototyp kon&scaron;truktora
</span><span
class="js-out">apple.__proto__ = Fruit.prototype;
</span><span
class="js-comment">// Zavol&aacute; nad apple met&oacute;du Fruit
</span><span
class="js-out">Fruit.call(apple, </span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out">);

apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/gwEuj/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-3-2.png" alt=""
/></div>

<p>Metóda <code>yellColor()</code> nie je nastavená priamo inštancii, a preto
sa JavaScript pozrie na jeho <code>__proto__</code>, ktorý ukazuje na
<code>Fruit.prototype</code> a tam ju bezpečne nájde a vykoná.</p>

<p>V príklade z <a
href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">minulej
časti</a> sme ukazovali na problém 100ks ovocia. Ak to skúsime teraz,
uvidíme, že funkcia <code>yellColor()</code> je iba jedna, pre všetky
inštancie spoločná:</p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-3-3.png" alt=""
/></div>

<p>Ak by sme chceli prinútiť všetky inštancie vypisovať svoje farby do
konzoly, stačí zmeniť prototyp konštruktora, trebárs aj v inej knižnici,
či v projektovo-závislom kóde:</p>

<pre class="js"><code><span
class="js-out">Fruit.prototype.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
{
  console.log(</span><span
class="js-keywords1">this</span><span
class="js-out">.color);
}

apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot; ale tentokr&aacute;t už do konzoly</span></code></pre>

<p><a href="http://jsfiddle.net/CdeYz/"> → Vyskúšajte</a></p>

<p>V ďalšej časti o tom <a
href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">ako
funguje dedičnosť medzi triedami</a>.</p>

<p>Ďalšie časti:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><strong>JavaScript zvnútra 3/4: Prototyp konštruktora</strong></li>

	<li><a
	href="http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami">JavaScript
	zvnútra 4/4: Dedičnosť medzi triedami</a></li>
</ul>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript zvnútra 4/4: Dedičnosť medzi triedami [Web]</title>
		<link>http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami</link>
		<comments>http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami#comments</comments>
		<pubDate>Tue, 04 May 2010 11:00:05 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io/blog/?p=1065</guid>
		<description><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<p>JavaScript<br />
zvnútra 1/4: Dedičnosť objektov</p>

<p>JavaScript<br />
zvnútra 2/4: Konštruktory</p>

<p>JavaScript<br />
zvnútra 3/4: Prototyp konštruktora</p>

<p>JavaScript zvnútra 4/4: Dedičnosť medzi triedami</p>

<p>Ako vyrobiť triedu Apple, ktorá bude dediť od Fruit? Vieme ako bude
vyzerať Fruit a zhruba ako Apple:</p>

<p>function Fruit( color ) {<br />
this.color = color; }</p>

<p>Fruit.prototy­pe.yellColor = function() {<br />
alert( this.color ); }</p>

<p>function Apple( color ) {<br />
// Zavoláme konštruktor […]</p>
]]></description>
			<content:encoded><![CDATA[
<p>Tento článok je pokračovaním série o dedičnosti v JavaScripte:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><strong>JavaScript zvnútra 4/4: Dedičnosť medzi triedami</strong></li>
</ul>

<p>Ako vyrobiť triedu <code>Apple</code>, ktorá bude dediť od
<code>Fruit</code>? Vieme ako bude vyzerať <code>Fruit</code> a zhruba ako
<code>Apple</code>:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
}

Fruit.prototype.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
{
  alert( </span><span class="js-keywords1">this</span><span
class="js-out">.color );
}

</span><span
class="js-keywords1">function</span><span
class="js-out"> Apple( color )
{
  </span><span
class="js-comment">// Zavol&aacute;me kon&scaron;truktor Fruit, aby in&scaron;tancii nastavil farbu
</span><span
class="js-out">  Fruit.call( </span><span class="js-keywords1">this</span><span
class="js-out">, color );
}

</span><span class="js-keywords1">var</span><span
class="js-out"> apple = </span><span class="js-keywords1">new</span><span
class="js-out"> Apple(</span><span class="js-quote">&quot;red&quot;</span><span
class="js-out">);
apple.yellColor();
</span><span
class="js-comment">// Uncaught TypeError:
// Object #&lt;an Apple&gt; has no method 'yellColor'</span></code></pre>

<p>A teraz ako to spojiť? Chceme aby objekt vytvorený triedou
<code>Apple</code> videl na metódu <code>Fruit.prototype.yellColor()</code>.
Budeme navzájom prepájať <code>prototype</code> vlastnosti. Niekoho môže
napadnúť toto:</p>

<pre class="js"><code><span
class="js-out">Apple.prototype = Fruit.prototype;</span></code></pre>

<p>Lenže v tom prípade by sme prídávaním, či úpravou
<code>Apple.prototype</code> priamo prepisovali aj <code>Fruit.prototype</code>
a to nechceme. V prvej časti sme použili <code>__proto__</code>, to môžeme
aj teraz:</p>

<pre class="js"><code><span
class="js-comment">// Čokoľvek definovan&eacute; vo Fruit.prototype bude
// viditeľn&eacute; i v Apple.prototype
</span><span
class="js-out">Apple.prototype.__proto__ = Fruit.prototype;</span></code></pre>

<p><a href="http://jsfiddle.net/NZfUn/"> → Vyskúšajte</a></p>

<p><strong>Ale ako bolo písané v prvej časti tiež: <code>__proto__</code>
nie je štandardnou súčasťou implementácii.</strong> Vieme ho ale simulovať
tak, že medzi <code>Apple</code> a <code>Fruit</code> strčíme ešte jeden
pomocný konštruktor, jeho prototyp a inštanciu:</p>

<pre class="js"><code><span
class="js-comment">// Vytvor&iacute;me pomocn&yacute; primit&iacute;vny kon&scaron;truktor `Q`
</span><span
class="js-keywords1">function</span><span class="js-out"> Q() {};
</span><span
class="js-comment">// Jeho prototyp nastav&iacute;me na prototyp rodičovskej triedy `Fruit`
</span><span
class="js-out">Q.prototype = Fruit.prototype;
</span><span
class="js-comment">// A prototyp detskej triedy nastav&iacute;me na nov&uacute; in&scaron;tanciu triedy `Q`
</span><span
class="js-out">Apple.prototype = </span><span
class="js-keywords1">new</span><span class="js-out"> Q;
</span><span
class="js-comment">// Oprav&iacute;me referenciu na kon&scaron;truktor (inak by ukazovala na Q)
</span><span
class="js-out">Apple.prototype.constructor = Apple;</span></code></pre>

<p><a href="http://jsfiddle.net/ed6k4/"> → Vyskúšajte</a></p>

<div><img src="http://coh.io/blog/wp-content/uploads/JavaScript-4-1.png" alt=""
/></div>

<p>Diagram síce vyzerá <em>hnusoprskne,</em> ale v skutočnosti je tých
krokov podstatne menej. K <code>Fruit.prototype</code> sa totiž JavaScript
dostane už v druhom kroku: <code>(new Q).__proto__</code>, pretože <code>(new
Q).__proto__ == Q.prototype == Fruit.prototype</code>.</p>

<p>Keď rozpíšeme riadok <code>Apple.prototype = new Q;</code> podľa toho čo
už o operátore <code>new</code> vieme, zistíme, že JavaScript nám
vlastnosť <code>__proto__</code> nastaví tak ako by sme radi:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Q() {};
Q.prototype = Fruit.prototype;
Apple.prototype = </span><span
class="js-keywords1">new</span><span
class="js-out"> Object();
Apple.prototype.__proto__ = Q.prototype;</span></code></pre>

<p><a href="http://jsfiddle.net/XVvKS/"> → Vyskúšajte</a></p>

<p>Treba si dávať pozor iba na to, že tento kód nám prepíše celý
<code>Apple.prototype</code> a preto je dôležité ho volať predtým ako
začneme do neho nastavovať metódy. Celokus, kde <code>Apple</code> dedí od
<code>Fruit</code> bez použitia <code>__proto__</code> vypadá takto:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> Fruit( color )
{
  </span><span
class="js-keywords1">this</span><span
class="js-out">.color = color;
}

Fruit.prototype.yellColor = </span><span
class="js-keywords1">function</span><span
class="js-out">()
{
  alert( </span><span class="js-keywords1">this</span><span
class="js-out">.color );
}

</span><span
class="js-keywords1">function</span><span
class="js-out"> Apple( color )
{
  </span><span
class="js-comment">// Zavol&aacute;me kon&scaron;truktor Fruit, aby in&scaron;tancii nastavil farbu
</span><span
class="js-out">  Fruit.call(</span><span class="js-keywords1">this</span><span
class="js-out">, color);
}

</span><span
class="js-comment">// Vytvor&iacute;me pomocn&yacute; primit&iacute;vny kon&scaron;truktor `Q`
</span><span
class="js-keywords1">function</span><span class="js-out"> Q() {};
</span><span
class="js-comment">// Jeho prototyp nastav&iacute;me na prototyp rodičovskej triedy `Fruit`
</span><span
class="js-out">Q.prototype = Fruit.prototype;
</span><span
class="js-comment">// A prototyp detskej triedy nastav&iacute;me na nov&uacute; in&scaron;tanciu triedy `Q`
</span><span
class="js-out">Apple.prototype = </span><span
class="js-keywords1">new</span><span class="js-out"> Q;
</span><span
class="js-comment">// Oprav&iacute;me referenciu na kon&scaron;truktor (inak by ukazovala na Q)
</span><span
class="js-out">Apple.prototype.constructor = Apple;

Apple.prototype.fallOnNewtonsHead = </span><span
class="js-keywords1">function</span><span class="js-out">()
</span><span
class="js-comment">//...</span></code></pre>

<p>Pochopiteľne je možné si napísať jednoduchú funkciu, ktorá dedenie
urobí krajšie. Takto:</p>

<pre class="js"><code><span class="js-keywords1">function</span><span
class="js-out"> </span><span class="js-keywords1">extends</span><span
class="js-out">( Child, Parent )
{
  </span><span
class="js-keywords1">function</span><span
class="js-out"> Q() {};
  Q.prototype = Parent.prototype;
  Child.prototype = </span><span
class="js-keywords1">new</span><span
class="js-out"> Q;
  Child.prototype.constructor = Child;
}

</span><span
class="js-keywords1">extends</span><span
class="js-out">( Apple, Fruit );

</span><span
class="js-keywords1">var</span><span class="js-out"> apple = </span><span
class="js-keywords1">new</span><span class="js-out"> Apple(</span><span
class="js-quote">&quot;red&quot;</span><span
class="js-out">);
apple.yellColor(); </span><span
class="js-comment">// =&gt; &quot;red&quot;</span></code></pre>

<p><a href="http://jsfiddle.net/bPLqC/"> → Vyskúšajte</a></p>

<p>Príklad funguje i keď inštancia <code>apple</code> nemá zadefinovanú
metódu <code>yellColor()</code>. Tá je definovaná až na triede
<code>Fruit</code>. JavaScript si ju však veselo nájde postupným
prechádzaním <code>__proto__</code>:</p>

<pre class="js"><code><span
class="js-comment">// JS sa najprv pozrie na objekt apple
</span><span
class="js-out">apple
</span><span
class="js-comment">// Ak tam nie je, tak na jeho __proto__, ktor&eacute; ukazuje na Apple.prototype a to na q.prototype
</span><span
class="js-out">apple.__proto__            = Apple.prototype
</span><span
class="js-comment">// Ak tam nie je, tak na jeho __proto__, ktor&eacute; ukazuje na Q.prototype a to zase na Fruit.prototype
</span><span
class="js-out">apple.__proto__.__proto__  = Apple.prototype.__proto__ = Q.prototype = Fruit.prototype</span></code></pre>

<p>Celé to však nie je iba o tom, aby JavaScript vedel danú vlastnosť
nájsť. Ide aj o možnosť zistiť o inštanciu akej triedy ide. Na to
slúži operátor <code>instanceof</code>. Objekt <code>apple</code> teda bude
inštanciou ako <code>Apple</code>, tak <code>Fruit</code>:</p>

<pre class="js"><code><span
class="js-comment">// Je apple in&scaron;tanciou Apple?
</span><span
class="js-out">alert( apple </span><span
class="js-keywords1">instanceof</span><span
class="js-out"> Apple ); </span><span
class="js-comment">// =&gt; true
// Je apple in&scaron;tanciou Fruit?
</span><span
class="js-out">alert( apple </span><span
class="js-keywords1">instanceof</span><span
class="js-out"> Fruit ); </span><span
class="js-comment">// =&gt; true</span></code></pre>

<p><a href="http://jsfiddle.net/8A9gv/"> → Vyskúšajte</a></p>

<p>V súčasnosti už existuje množstvo článkov o tom, ako si zjednodušiť
dedenie, či používať kopu ďalších pekných a užítočných postupov
známych z iných jazykov. Úlohou tohto článku bolo odkryť čo sa deje pod
kapotou. Ostatné je už na vašej chuti.</p>

<p>Doporučujem sa mrknúť na nedávnu trojsériu od <a
href="http://zdrojak.root.cz/clanky/oop-v-javascriptu-i/">Daniela Steigerwalda
na Zdrojáku</a>.</p>

<p>Predchádzajúce časti:</p>

<ul>
	<li><a
	href="http://coh.io/blog/1048-javascript-zvnutra-14-dedicnost-objektov">JavaScript
	zvnútra 1/4: Dedičnosť objektov</a></li>

	<li><a
	href="http://coh.io/blog/1062-javascript-zvnutra-24-konstruktory">JavaScript
	zvnútra 2/4: Konštruktory</a></li>

	<li><a
	href="http://coh.io/blog/1064-javascript-zvnutra-34-prototyp-konstruktora">JavaScript
	zvnútra 3/4: Prototyp konštruktora</a></li>

	<li><strong>JavaScript zvnútra 4/4: Dedičnosť medzi triedami</strong></li>
</ul>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1065-javascript-zvnutra-44-dedicnost-medzi-triedami/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Intoru Forms: ElasticContainer [Web]</title>
		<link>http://coh.io/blog/1014-intoru-forms-elasticcontainer</link>
		<comments>http://coh.io/blog/1014-intoru-forms-elasticcontainer#comments</comments>
		<pubDate>Mon, 26 Apr 2010 15:54:58 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io//blog/?p=1014</guid>
		<description><![CDATA[
<p>Jednou z vecí na ktorú som sa tešil pri implementácii Intoru Forms je
práve ElasticContainer (asi dočasný názov). V Nette totiž nie je možné
urobiť kontajner s dynamickým počtom polí (ochrchlať sa to dá, ale je to
škaradé).</p>

<p>Prvým príkladom budiž prílohy. Ak chcem dať užívateľovi možnosť
pridať niekoľko príloh do formuláru, neviem vopred počet políčok, ten sa
nastaví až u klienta. ElasticContainer to rieši […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Jednou z vecí na ktorú som sa tešil pri implementácii <a
href="http://coh.io//blog/982-inaksie-formulare-v-nette">Intoru Forms</a> je
práve <em>ElasticContainer</em> (asi dočasný názov). V Nette totiž <a
href="http://forum.nettephp.com/cs/1825-dynamicky-pocet-poli">nie je možné</a>
urobiť kontajner s dynamickým počtom polí (ochrchlať sa to dá, ale je to
škaradé).</p>

<p>Prvým príkladom budiž prílohy. Ak chcem dať užívateľovi možnosť
pridať niekoľko príloh do formuláru, neviem vopred počet políčok, ten sa
nastaví až u klienta. <em>ElasticContainer</em> to rieši tak, že svoje
detské políčka nastaví až pri prijatí hodnôt. Každé políčko je klon
nejakého vopred definovaného poľa – tzv. <em>prototypu</em>.</p>

<p>Ak chcem prílohy, urobím:</p>

<pre class="php"><code><span class="php-var">$form</span>-&gt;add( <span
class="php-quote">'files'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> <span
class="php-keyword2">File</span> ) );</code></pre>

<p>Ak chcem tagy, urobím:</p>

<pre class="php"><code><span class="php-var">$form</span>-&gt;add( <span
class="php-quote">'tags'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> String ) );</code></pre>

<p>Ak chcem na prototype validácie, urobím validácie na prototype:</p>

<pre class="php"><code><span class="php-var">$form</span>-&gt;add( <span
class="php-quote">'emails'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> String ) )
  -&gt;getPrototype()
    -&gt;validates(<span
class="php-quote">'email'</span>);</code></pre>

<p>Validátorom <code>count</code> nad <em>ElasticContainer</em> môžem
obmedziť počet políčok:</p>

<pre class="php"><code><span class="php-var">$form</span>-&gt;add( <span
class="php-quote">'emails'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> String ) )
  -&gt;validates( <span
class="php-quote">'count'</span>, <span class="php-num">3</span>, <span
class="php-num">10</span> )
  -&gt;getPrototype()
    -&gt;validates(<span
class="php-quote">'email'</span>);</code></pre>

<p>Hodnoty získam a nastavím volaním <code>get/setValue</code>:</p>

<pre class="php"><code><span class="php-var">$c</span> = <span
class="php-var">$form</span>-&gt;add( <span
class="php-quote">'tags'</span>, <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">new</span> String ) );
<span
class="php-comment">//...
</span><span
class="php-var">$c</span>-&gt;setValue( <span
class="php-keyword2">array</span>(<span class="php-quote">'apple'</span>, <span
class="php-quote">''</span>, <span class="php-quote">'juice'</span>, <span
class="php-keyword1">NULL</span>, <span
class="php-quote">'banana'</span>) );
<span
class="php-comment">//...
</span><span
class="php-var">$c</span>-&gt;getValue(); <span
class="php-comment">// =&gt; array('apple', 'juice', 'banana')</span></code></pre>

<p>Šablona je potom jednoduchá:</p>

<pre class="php"><code>{<span class="php-keyword1">foreach</span> <span
class="php-var">$container</span> <span class="php-keyword1">as</span> <span
class="php-var">$field}</span>
  {form:text <span
class="php-var">$field}</span>
{/<span
class="php-keyword1">foreach</span>}</code></pre>

<p>Vypíše všetky nastavené políčka, minimálne a maximálne však toľko
koľko sa nastavilo cez <code>ElasticContainer::setMinimum/setMaximum</code>
alebo cez <code>$container-&gt;validates( 'count', $minimum, $maximum
)</code>.</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/1014-intoru-forms-elasticcontainer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Menej ukecané formuláre v Nette [Web]</title>
		<link>http://coh.io/blog/998-menej-ukecane-formulare-v-nette</link>
		<comments>http://coh.io/blog/998-menej-ukecane-formulare-v-nette#comments</comments>
		<pubDate>Sun, 25 Apr 2010 09:31:32 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io//blog/?p=998</guid>
		<description><![CDATA[
<p>Centi dnes dostal nápad na vylepšenie nášho FormHelper na vykreslovanie
Intoru formulárov v Nette. A myslím, že to bol dobrý nápad. Povážte:
doteraz sme boli nútení opakovane vymenovávať pre ktoré políčko ideme
vykreslovať popisok, chybky a samotný widget:</p>

<p>{form $form}<br />
{form:label $form[‚documen­t‘][‚title‘]}Ti­tulok{/form:la­bel}<br />
{form:error $form[‚documen­t‘][‚title‘]}<br />
{form:text $form[‚documen­t‘][‚title‘], ‚width‘ ⇒ ‚100%‘}
{/form}</p>

<p>Po novom sa veci značne zjednodušujú, vďaka párovému Latte helperu
{form:with …} […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p><a href="http://centi.sk/">Centi</a> dnes dostal nápad na vylepšenie
nášho <code>FormHelper</code> na vykreslovanie <a
href="http://coh.io//blog/982-inaksie-formulare-v-nette">Intoru formulárov
v Nette</a>. A myslím, že to bol dobrý nápad. Povážte: doteraz sme boli
nútení opakovane vymenovávať pre ktoré políčko ideme vykreslovať
popisok, chybky a samotný widget:</p>

<pre
class="html"><code>{form $form}
  {form:label $form['document']['title']}Titulok{/form:label}
  {form:error $form['document']['title']}
  {form:text $form['document']['title'], 'width' =&gt; '100%'}
{/form}</code></pre>

<p>Po novom sa veci značne zjednodušujú, vďaka párovému Latte helperu
<code>{form:with ...}</code> a pár ďalším novinkám:</p>

<pre
class="html"><code>{form $form}

  {form:label 'document/title' }
  {form:error 'document/title' }
  {form:text  'document/title', 'width' =&gt; '100%'}

  {* --- alebo --- *}

  {form:with 'document/title'}
    {form:label}
    {form:error}
    {form:text 'width' =&gt; '100%'}
  {/form:with}

  {* --- alebo --- *}

  {form:with 'document'}
    {form:label 'title'}
    {form:error 'title'}
    {form:text  'title', 'width' =&gt; '100%'}
  {/form:with}

  {* --- alebo --- *}

  {form:with 'document'}
    {form:with 'title'}
      {form:label}
      {form:error}
      {form:text 'width' =&gt; '100%'}
    {/form:with}
  {/form:with}

{/form}</code></pre>

<p>Všetky varianty sa dajú miešať jedna cez druhú a použiť to čo príde
lepšie. Tu je ukážka kúsku z editora užívateľa:</p>

<pre class="html"><code>{form:with 'email'}
  <span
class="html-tag">&lt;tr&gt;</span>
    <span class="html-tag">&lt;th</span><span
class="html-tagin"> class=</span><span
class="html-quote">&quot;w-min&quot;</span><span
class="html-tag">&gt;</span>{form:label}E-mail:{/form:label}<span
class="html-tag">&lt;/th&gt;</span>
    <span
class="html-tag">&lt;td&gt;</span>
      {form:error 'class' =&gt; 'mb-s w-text'}
      {form:text 'width' =&gt; '30em'}
    <span
class="html-tag">&lt;/td&gt;</span>
  <span
class="html-tag">&lt;/tr&gt;</span>
{/form:with}

<span
class="html-tag">&lt;tr&gt;</span>
  <span class="html-tag">&lt;th</span><span
class="html-tagin"> class=</span><span
class="html-quote">&quot;w-min va-t&quot;</span><span
class="html-tag">&gt;</span>{form:label 'password'}Password{/form:label}<span
class="html-tag">&lt;/th&gt;</span>
  <span
class="html-tag">&lt;td&gt;</span>
    <span
class="html-tag">&lt;div</span><span class="html-tagin"> class=</span><span
class="html-quote">&quot;mb-s&quot;</span><span
class="html-tag">&gt;</span>
      {form:error 'password'}
      {form:password 'password', 'width' =&gt; '15em', 'autocomplete' =&gt; 'off'}
    <span
class="html-tag">&lt;/div&gt;</span>
    <span
class="html-tag">&lt;div&gt;</span>
      {form:error 'password_confirmation'}
      {form:password 'password_confirmation', 'width' =&gt; '15em', 'autocomplete' =&gt; 'off'}
    <span
class="html-tag">&lt;/div&gt;</span>
  <span
class="html-tag">&lt;/td&gt;</span>
<span
class="html-tag">&lt;/tr&gt;</span></code></pre>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/998-menej-ukecane-formulare-v-nette/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inakšie Formuláre v Nette [Web]</title>
		<link>http://coh.io/blog/982-inaksie-formulare-v-nette</link>
		<comments>http://coh.io/blog/982-inaksie-formulare-v-nette#comments</comments>
		<pubDate>Fri, 23 Apr 2010 14:49:48 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://coh.io//blog/?p=982</guid>
		<description><![CDATA[
<p>Nájsť recept na správnu, rozširovateľnú a relatívne pohodlnú
implementáciu formulárového modulu dá fakt zabrať. Pre Nette ujo Grudl
síce vykročil, ale ja som to skúsil inak. Z fleku exámpl:</p>

<p>$document = new Container; $document[‚title‘] = new String;
$document[‚body‘] = new Text;</p>

<p>Formulár z tohto pohľadu je definícia hodnôt a ich validácii. Ako si
pozorní určite všimli, formulár nedefinuje názvy políčok, ani atribúty
ako class, id, […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Nájsť recept na správnu, rozširovateľnú a relatívne pohodlnú
implementáciu formulárového modulu dá fakt zabrať. Pre Nette ujo Grudl
síce vykročil, ale ja som to skúsil inak. Z fleku exámpl:</p>

<pre class="php"><code><span class="php-var">$document</span> = <span
class="php-keyword1">new</span> Container;
<span
class="php-var">$document</span>[<span class="php-quote">'title'</span>] = <span
class="php-keyword1">new</span> String;
<span
class="php-var">$document</span>[<span class="php-quote">'body'</span>] = <span
class="php-keyword1">new</span> Text;</code></pre>

<p>Formulár z tohto pohľadu je definícia hodnôt a ich validácii. Ako si
pozorní určite všimli, formulár nedefinuje názvy políčok, ani atribúty
ako <code>class</code>, <code>id</code>, <code>rows</code> či
<code>cols</code>. To všetko nechávam na šablonku. Čo nás zaujíma sú typy
hodnôt ktoré očakávame: polia, reťazce, dátumy, súbory, atp. Nad týmito
primitívnymi typmi následne fungujú validácie a filtre.</p>

<h2>Hodnoty</h2>

<p>Hodnoty sa čítajú z poľa hodnôt a je im jedno či je to POST,
databáza, súbor alebo obyčajné pole. Na každom políčku je k dispozícii
dvojička metód <code>getValue</code> a <code>setValue</code>, ktoré pracujú
s obyčajnými poľami.</p>

<h2>Integrácia s Nette</h2>

<p>Klasickú formulárovú funkčnosť a integráciu do Nette zabezpečuje
doplnková trieda <code>Form</code>. <code>Form</code> rieši komunikáciu
s prezentérom, získavanie a distribúciu HTTP dát do políčok, nastavovanie
<code>action</code>, či <code>method</code> atribútov. <code>Form</code>
v sebe zapúzdruje inštanciu triedy <code>Container</code>, čiže zvonku sa
javí prirodzene:</p>

<pre class="php"><code><span class="php-var">$form</span> = <span
class="php-keyword1">new</span> Form;
<span class="php-var">$form</span>[<span
class="php-quote">'document'</span>] = <span
class="php-keyword1">new</span> Container;
<span
class="php-var">$form</span>[<span class="php-quote">'document'</span>][<span
class="php-quote">'title'</span>] = <span
class="php-keyword1">new</span> String;
<span class="php-var">$form</span>[<span
class="php-quote">'document'</span>][<span
class="php-quote">'body'</span>] = <span
class="php-keyword1">new</span> Text;

<span
class="php-keyword1">if</span>( <span
class="php-var">$form</span>-&gt;isSubmitted() )
{
        <span
class="php-keyword1">if</span>( !<span
class="php-var">$form</span>-&gt;hasErrors() )
        {
                <span
class="php-comment">// Save data
</span>        }
}
<span
class="php-keyword1">else</span>
{
        <span
class="php-var">$form</span>[<span
class="php-quote">'document'</span>]-&gt;setValue( <span
class="php-keyword2">array</span>
        (
                <span
class="php-quote">'title'</span> =&gt; <span
class="php-quote">'Default title'</span>,
                <span
class="php-quote">'body'</span> =&gt; <span
class="php-quote">'Default body'</span>
        ));
}</code></pre>

<h2>Šablony</h2>

<p>Na zjednodušenie práce mám <code>FormHelper</code>, ktorý drobnosti so
šablonou rieši za mňa. V žiadnom prípade sa však nesnaží definovať
niečo navyše, výstupom sú holé políčka s nastavenými tými
najnutnejšími atribútmi:</p>

<pre
class="html"><code>{widget:label $form['document']['title']}Titulok{/widget:label}
{widget:message:error $form['document']['title']}
{widget:text $form['document']['title'], 'width' =&gt; '100%'}

{widget:label $form['document']['body']}Body{/widget:label}
{widget:message:error $form['document']['body']}
{widget:text:area $form['document']['body'], 'rows' =&gt; 5, 'cols' =&gt; 40}</code></pre>

<p>Až v šablone sa priraďuje políčku jeho vzhľad, spôsob rozloženia
prvkov. Je to síce pracnejšie ako s <code>ConventionalRenderer</code> z Nette
Forms, ale zato máte plnú voľnosť. <code>FormHelper</code> tiež zverejňuje
funkcie na generovanie <code>`name</code>, <code>id</code>, <code>style</code>,
ktoré sa dajú ľahko využiť pre písanie vlastných widgetov.</p>

<h2>Políčka</h2>

<p>Okrem obligátnych skalárnych, modul má aj komplikovanejšie políčka.
Jedným z nich je <code>ElasticContainer</code> a pomôže ak UI vyžaduje
pridávať vopred neurčený počet príloh, e-mailov, alebo tagov (každý
v samostatnom políčku).</p>

<pre class="php"><code><span class="php-var">$form</span>[<span
class="php-quote">'emails'</span>] = <span
class="php-keyword1">new</span> ElasticContainer( <span
class="php-keyword1">function</span>() {
        <span
class="php-var">$prototype</span> = <span
class="php-keyword1">new</span> String;
        <span
class="php-var">$prototype</span>-&gt;validates( <span
class="php-quote">'email'</span> );
        <span
class="php-keyword1">return</span> <span
class="php-var">$prototype</span>;
});</code></pre>

<p>Základná sada políčok by mala stačiť na všetko, ak však chcete, nič
vám nebráni si nadefinovať vlastnú triedu ktorá dedí od
<code>Field</code>.</p>

<h2>Validácie</h2>

<p>Validácie to vie samozrejme tiež:</p>

<pre class="php"><code><span class="php-var">$form</span>-&gt;validates( <span
class="php-quote">'children'</span>, <span
class="php-keyword2">array</span>
(
        <span
class="php-quote">'document/title'</span> =&gt; <span
class="php-keyword2">array</span>
        (
                <span
class="php-quote">'presence'</span> =&gt; <span
class="php-keyword1">true</span>,
                <span
class="php-quote">'length'</span> =&gt; <span
class="php-keyword2">array</span>( <span
class="php-quote">'minimum'</span> =&gt; <span
class="php-num">3</span> )
        ),

        <span
class="php-quote">'document/body'</span> =&gt; <span
class="php-keyword2">array</span>
        (
                <span
class="php-quote">'presence'</span> =&gt; <span
class="php-keyword1">true</span>
        )
));</code></pre>

<p>Validácie je možné viazať na rodičovské, ale aj na detské políčka.
Horný príklad je možné zapísať hneď niekoľkými spôsobmi:</p>

<pre class="php"><code><span
class="php-comment">// Naviazanim na 'document'; rodica 'title' a 'body' policok
</span>
<span
class="php-var">$form</span>[<span
class="php-quote">'document'</span>]-&gt;validates( <span
class="php-quote">'children'</span>, <span
class="php-keyword2">array</span>
(
        <span
class="php-quote">'title'</span> =&gt; <span
class="php-keyword2">array</span>
        (
                <span
class="php-quote">'presence'</span> =&gt; <span
class="php-keyword1">true</span>,
                <span
class="php-quote">'length'</span> =&gt; <span
class="php-keyword2">array</span>( <span
class="php-quote">'minimum'</span> =&gt; <span
class="php-num">3</span> )
        ),

        <span
class="php-quote">'body'</span> =&gt; <span
class="php-keyword2">array</span>
        (
                <span
class="php-quote">'presence'</span> =&gt; <span
class="php-keyword1">true</span>
        )
));

<span
class="php-comment">// --- alebo naviazanim na samotne policko s pouzitim pola
</span>
<span
class="php-var">$form</span>[<span class="php-quote">'document'</span>][<span
class="php-quote">'title'</span>]-&gt;validates( <span
class="php-keyword2">array</span>
(
        <span
class="php-quote">'presence'</span> =&gt; <span
class="php-keyword1">true</span>,
        <span
class="php-quote">'length'</span> =&gt; <span
class="php-keyword2">array</span>( <span
class="php-quote">'minimum'</span> =&gt; <span
class="php-num">3</span> )
));

<span class="php-var">$form</span>[<span
class="php-quote">'document'</span>][<span
class="php-quote">'body'</span>]-&gt;validates( <span
class="php-keyword2">array</span>
(
        <span
class="php-quote">'presence'</span> =&gt; <span
class="php-keyword1">true</span>
));

<span
class="php-comment">// --- alebo postupnym volanim metody validates
</span>
<span
class="php-var">$form</span>[<span class="php-quote">'document'</span>][<span
class="php-quote">'title'</span>]
        -&gt;validates( <span
class="php-quote">'presence'</span> )
        -&gt;validates( <span
class="php-quote">'length'</span>, <span
class="php-keyword2">array</span>( <span
class="php-quote">'minimum'</span> =&gt; <span
class="php-num">3</span> ) );

<span class="php-var">$form</span>[<span
class="php-quote">'document'</span>][<span
class="php-quote">'body'</span>]
        -&gt;validates( <span
class="php-quote">'presence'</span> );</code></pre>

<p>Modul so sebou nesie niekoľko základných validátorov (presence, length,
format, email, url, custom, children,…), a je samozrejme možné si
dodefinovať vlastné. Mapa string → validátor je definovaná v triede
<code>Validator\Registry</code>. Ak si chcete pridať vlastný, stačí
vytvoriť funkciu a zaregistrovať ju:</p>

<pre class="php"><code><span class="php-var">$form</span>[<span
class="php-quote">'password'</span>] = <span
class="php-keyword1">new</span> Container;
<span
class="php-var">$form</span>[<span class="php-quote">'password'</span>][<span
class="php-quote">'first'</span>] = <span
class="php-keyword1">new</span> String;
<span class="php-var">$form</span>[<span
class="php-quote">'password'</span>][<span
class="php-quote">'second'</span>] = <span
class="php-keyword1">new</span> String;

<span
class="php-keyword1">function</span> validatesPasswordConfirmation( <span
class="php-var">$field</span>, <span
class="php-var">$options</span> )
{
        <span
class="php-keyword1">if</span>( <span class="php-var">$field</span>[<span
class="php-quote">'first'</span>]-&gt;getValue() != <span
class="php-var">$field</span>[<span
class="php-quote">'second'</span>]-&gt;getValue() )
        {
                <span
class="php-var">$field</span>-&gt;addError( <span
class="php-quote">'Passwords do not match.'</span> );
                <span
class="php-keyword1">return</span> <span
class="php-keyword1">false</span>;
        }
        <span
class="php-keyword1">return</span> <span
class="php-keyword1">true</span>;
}

Validator\Registry::register( <span
class="php-quote">'password_confirmation'</span>, <span
class="php-quote">'validatesPasswordConfirmation'</span> );

<span
class="php-var">$form</span>[<span
class="php-quote">'password'</span>]-&gt;validates( <span
class="php-quote">'password_confirmation'</span> );</code></pre>

<p>Registrovať sa dá aj lambda funkcia:</p>

<pre class="php"><code>Validator\Registry::register( <span
class="php-quote">'password_confirmation'</span>, <span
class="php-keyword1">function</span>( <span class="php-var">$field</span>, <span
class="php-var">$options</span> )
{
        <span
class="php-keyword1">if</span>( <span class="php-var">$field</span>[<span
class="php-quote">'first'</span>]-&gt;getValue() != <span
class="php-var">$field</span>[<span
class="php-quote">'second'</span>]-&gt;getValue() )
        {
                <span
class="php-var">$field</span>-&gt;addError( <span
class="php-quote">'Passwords do not match.'</span> );
                <span
class="php-keyword1">return</span> <span
class="php-keyword1">false</span>;
        }
        <span
class="php-keyword1">return</span> <span
class="php-keyword1">true</span>;
});</code></pre>

<p>Ak potrebujete špeciálnu validáciu, možete použiť lambda funkciu
priamo:</p>

<pre class="php"><code><span class="php-var">$form</span>[<span
class="php-quote">'password'</span>] = <span
class="php-keyword1">new</span> Container;
<span
class="php-var">$form</span>[<span class="php-quote">'password'</span>][<span
class="php-quote">'first'</span>] = <span
class="php-keyword1">new</span> String;
<span class="php-var">$form</span>[<span
class="php-quote">'password'</span>][<span
class="php-quote">'second'</span>] = <span
class="php-keyword1">new</span> String;

<span
class="php-var">$form</span>[<span
class="php-quote">'password'</span>]-&gt;validates( <span
class="php-keyword1">function</span>( <span
class="php-var">$field</span> )
{
        <span
class="php-keyword1">if</span>( <span class="php-var">$field</span>[<span
class="php-quote">'first'</span>]-&gt;getValue() != <span
class="php-var">$field</span>[<span
class="php-quote">'second'</span>]-&gt;getValue() )
        {
                <span
class="php-var">$field</span>-&gt;addError( <span
class="php-quote">'Passwords do not match.'</span> );
                <span
class="php-keyword1">return</span> <span
class="php-keyword1">false</span>;
        }
        <span
class="php-keyword1">return</span> <span
class="php-keyword1">true</span>;
});</code></pre>

<p>Celý vtip je v tom, že si validačné pravidlá naviažete tam kde
potrebujete. V tomto prípade zapúzdrujem obe heslá do jedného kontajneru a
tým pádom si môžem zjednodušiť validáciu. Nerobí mi ale problém to
urobiť aj bez kontajnéru.</p>

<h2>Čo s tým?</h2>

<p>Modul nie je zatiaľ verejný, keďže ho nemám plne nasadený a ustálený.
Rád by som zistil, či sa aspoň niekomu zdá byť úžitočný. Mne to už
teraz ušetrilo kopu nervov.</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/982-inaksie-formulare-v-nette/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Google Reader: Pošlite ich všetkých do! [Web]</title>
		<link>http://coh.io/blog/436-google-reader-poslite-ich-vsetkych-do</link>
		<comments>http://coh.io/blog/436-google-reader-poslite-ich-vsetkych-do#comments</comments>
		<pubDate>Fri, 18 Sep 2009 11:34:05 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[google reader]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[send to]]></category>
		<category><![CDATA[tipy a triky]]></category>

		<guid isPermaLink="false">http://coh.io//blog/?p=436</guid>
		<description><![CDATA[
<p>Fičúrka Google Reader-u Send To je podobná ako oné … FeedFlares od
FeedBurneru; na rozdiel od nej však pridáva akcie pre vás a ku všetkému čo
čítate. Vyzerá to ako toto:</p>

<p>Ak to chcete, tak to máte v Settings → Send To, v úvode je celkom
fajnová ponuka (aj Twitter tam je), a úplne dolu, milí moji, tak úplne dolu
je odkaz Create a […]</p>

<!-- by Texy2! -->]]></description>
			<content:encoded><![CDATA[
<p>Fičúrka Google Reader-u <em>Send To</em> je podobná ako oné … <a
href="http://coh.io//blog/357-rss-nakrmte-si-rss-ko-socialnym-ziarenim">FeedFlares
od FeedBurneru</a>; na rozdiel od nej však pridáva akcie pre vás a ku
všetkému čo čítate. Vyzerá to ako toto:</p>

<div><img
src="http://coh.io/blog/wp-content/uploads/GoogleReader-SendTo-Result.png"
alt="" /></div>

<p>Ak to chcete, tak to máte v <em class="gray">Settings → Send To</em>,
v úvode je celkom fajnová ponuka (aj Twitter tam je), a úplne dolu, milí
moji, tak úplne dolu je odkaz <em class="gray">Create a custom link</em> a ten
oklikajte. No a pre pridanie napríklad <em>Evernote</em> vyplňte onen
formulárik nasledovne:</p>

<dl>
	<dt>Name</dt>

	<dd><code>Evernote</code></dd>

	<dt>URL</dt>

	<dd><code>http://s.evernote.com/grclip?url=${url}&amp;title=${title}</code></dd>

	<dt>Icon URL</dt>

	<dd><code>http://www.evernote.com/favicon.ico</code></dd>
</dl>

<p><a
href="http://lifehacker.com/5339214/supercharge-google-reader-with-send-to-links">Lifehacker.com
má podobných odkazov hojno</a>, tak si choďte!</p>

<!-- by Texy2! -->]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/436-google-reader-poslite-ich-vsetkych-do/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RSS: Nakŕmťe si RSS-ko sociálnym žiarením [Web]</title>
		<link>http://coh.io/blog/357-rss-nakrmte-si-rss-ko-socialnym-ziarenim</link>
		<comments>http://coh.io/blog/357-rss-nakrmte-si-rss-ko-socialnym-ziarenim#comments</comments>
		<pubDate>Thu, 17 Sep 2009 08:30:05 +0000</pubDate>
		<dc:creator>Martin Cohen</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[feedflares]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[tipy a triky]]></category>

		<guid isPermaLink="false">http://coh.io//blog/?p=357</guid>
		<description><![CDATA[
<p>FeedBurner skrz Google je môj lokaj už niekoľko blogov. Že mu ostanem
pánom i naďalej potvrdzuje jeho riešenie môjho problému: ako pridať
k článkom v RSS odkazy na komentáre a prípadné sociálne zariadenia typu
Twitter či menej obľúbený Facebook; Žrádlopálič tieto nazýva
Žrádložiary alebo aj FeedFlares.</p>

<p>Vo FeedBurner-i je táto možnosť ukrytá pod Optimize → FeedFlare. Tam
nájdete necelú dvadsiatku oficiálných fakieľ a keby sa vám málilo,
záľaha […]</p>
]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedburner.google.com/">FeedBurner</a> skrz Google je môj
lokaj už niekoľko blogov. Že mu ostanem pánom i naďalej potvrdzuje jeho
riešenie môjho problému: ako pridať k článkom v RSS odkazy na komentáre
a prípadné sociálne zariadenia typu <a href="http://twitter.com/">Twitter</a>
či menej obľúbený <a href="http://facebook.com/">Facebook</a>;
<em>Žrádlopálič</em> tieto nazýva <em>Žrádložiary</em> alebo aj
<strong>FeedFlares</strong>.</p>

<div><img src="http://coh.io/blog/wp-content/uploads/FeedFlares-Example.png"
alt="" /></div>

<p>Vo FeedBurner-i je táto možnosť ukrytá pod <em class="gray">Optimize →
FeedFlare</em>. Tam nájdete necelú dvadsiatku oficiálných fakieľ a keby sa
vám málilo, záľaha ich je v <a
href="http://feedburner.google.com/fb/a/help/flarecatalog">katalógu</a> či <a
href="http://www.google.fr/search?hl=en&amp;q=feedflares">inde</a>. A keby ani
to nezasýtilo, môžete si vytvoriť svoje vlastné, ako ja.</p>

<p><em>FeedFlare</em> je kratučký XML dokument. Na odoslanie článku na <a
href="http://twitter.com/">Twitter</a> s použítím služby <a
href="http://twitthis.com/">TwitThis.com</a> to máte takto:</p>

<pre class="xml"><code><span
class="html-tag">&lt;FeedFlareUnit&gt;</span>
        <span
class="html-tag">&lt;Catalog&gt;</span>
                <span
class="html-tag">&lt;Title&gt;</span>Poslať na Twitter<span
class="html-tag">&lt;/Title&gt;</span>
                <span
class="html-tag">&lt;Description&gt;</span>Poslať na Twitter cez TwitThis<span
class="html-tag">&lt;/Description&gt;</span>
        <span
class="html-tag">&lt;/Catalog&gt;</span>
        <span
class="html-tag">&lt;FeedFlare&gt;</span>
                <span
class="html-tag">&lt;Text&gt;</span>Poslať na Twitter<span
class="html-tag">&lt;/Text&gt;</span>
                <span
class="html-tag">&lt;Link</span><span class="html-tagin"> href=</span><span
class="html-quote">&quot;http://twitthis.com/twit?url=${link}&amp;amp;title=${title}</span><span
class="html-tagin">&quot;/&gt;</span>
        <span
class="html-tag">&lt;/FeedFlare&gt;</span>
<span
class="html-tag">&lt;/FeedFlareUnit&gt;</span></code></pre>

<p>XML dokument šupnite niekam na web. Tento môj je k dispozícii na</p>

<pre><code>http://tools.martincohen.info/feed_flares/sk-SK/twit_this.xml</code></pre>

<p>V nastaveniach na FeedBurner-i <em class="gray">(Optimize →
FeedFlare)</em> vložte URL do políčka pod zoznamom:</p>

<div><img src="http://coh.io/blog/wp-content/uploads/FeedFlares-Step1.png"
alt="" /></div>

<p>Pomágajte tlačítko <em class="gray">Add New Flare</em>:</p>

<div><img src="http://coh.io/blog/wp-content/uploads/FeedFlares-Step2.png"
alt="" /></div>

<p>Prvé zaškrtávatko je pre povolenie zobrazenia v RSS feede <em>(In
Feed),</em> to druhé je pre zobrazenie vo widgete <em>(On Site),</em> ktorý si
môžete nechať vygenerovať dolu na stránke. Zaškrťte príslušné
políčko <em>(In Feed):</em></p>

<div><img src="http://coh.io/blog/wp-content/uploads/FeedFlares-Step3.png"
alt="" /></div>

<p><strong>Nezabudnite</strong> nové nastavenie <strong>uložiť.</strong></p>

<p>Tým že ide o prostý <code>text/xml</code> môžete XML-ká generovať aj
na strane serveru a vytvoriť tzv. <em>dynamický FeedFlare.</em> Nemusíte sa
ani obmedzovať na odkazy a môžete generovať iba texty. To všetko je <a
href="http://code.google.com/apis/feedburner/feedflare_dev_guide.html">zdokumentované
na webe FeedBurneru</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://coh.io/blog/357-rss-nakrmte-si-rss-ko-socialnym-ziarenim/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
