<?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>Code42</title>
	<atom:link href="http://code42.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://code42.pl</link>
	<description>Just another WordPress ninjablog</description>
	<lastBuildDate>Fri, 09 Jul 2010 07:32:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Symfony+Propel: domyślne sortowanie</title>
		<link>http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 07:29:32 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[domyślne sortowanie w propelu]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=551</guid>
		<description><![CDATA[W przypadku gdy mamy wiele różnych metod pobierających kolekcje obiektów z bazy danych i chcemy, żeby były posortowane w podobny sposób — można dodać sortowanie w metodzie doSelect. public static function doSelect &#40;Criteria $criteria, PropelPDO $con = null&#41; &#123; if &#40;!$criteria-&#62;getOrderByColumns&#40;&#41;&#41; &#123; $criteria-&#62;addAscendingOrderByColumn &#40;self::YEAR&#41;; $criteria-&#62;addAscendingOrderByColumn &#40;self::MONTH&#41;; $criteria-&#62;addAscendingOrderByColumn &#40;self::DAY&#41;; &#125; return parent::doSelect &#40;$criteria, $con&#41;; &#125; Warunek [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='Permanent Link: Sortowanie obiektów po dacie utworzenia'>Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Permanent Link: Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Permanent Link: Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-medium wp-image-552" title="tree-order" src="http://code42.pl/wp-content/uploads/tree-order-300x206.jpg" alt="" width="300" height="206" /></p>
<p>W przypadku gdy mamy wiele różnych metod pobierających kolekcje obiektów z bazy danych i chcemy, żeby były posortowane w podobny sposób — można dodać sortowanie w metodzie <code>doSelect</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> doSelect <span style="color: #009900;">&#40;</span>Criteria <span style="color: #000088;">$criteria</span><span style="color: #339933;">,</span> PropelPDO <span style="color: #000088;">$con</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getOrderByColumns</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
     <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addAscendingOrderByColumn</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">YEAR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addAscendingOrderByColumn</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">MONTH</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addAscendingOrderByColumn</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">DAY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">,</span> <span style="color: #000088;">$con</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Warunek <code>if</code> umożliwia nam zdefiniowanie dowolnego innego sortowania <em>wcześniej</em>. W przypadku, gdy jakaś metoda (np. <code>getAll</code>) nie definiowała sortowania za pomocą obiektu <code>Criteria</code> — zostanie użyte domyślne (tutaj: po dacie).</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='Permanent Link: Sortowanie obiektów po dacie utworzenia'>Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Permanent Link: Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Permanent Link: Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formularze Symfony: select ograniczony przez wartość innego pola</title>
		<link>http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/#comments</comments>
		<pubDate>Wed, 12 May 2010 19:38:52 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=538</guid>
		<description><![CDATA[Opis na przykładzie Propela. Problem Jak ograniczyć liczbę opcji w sfWidgetFormChoice na podstawie wartości z innego pola formularza. Mowa o ograniczeniu stałym, zdefiniowanym w klasie formularza. Rozwiązanie Będąc w klasie formularza mamy dostęp do wartości odpowiadającego obiektu, tylko gdy dany formularz zostanie zainicjalizowany poprzez podanie obiektu do konstruktora (czyli przykładowo $this-&#62;form = new SampleForm ($sample_object)). [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Permanent Link: Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Permanent Link: Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Permanent Link: Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-546" title="html-select" src="http://code42.pl/wp-content/uploads/html-select.png" alt="" width="367" height="223" /></p>
<p><em>Opis na przykładzie Propela.</em></p>
<p><strong>Problem</strong><br />
Jak ograniczyć liczbę opcji w <code>sfWidgetFormChoice</code> na podstawie wartości z innego pola formularza. Mowa o ograniczeniu stałym, zdefiniowanym w klasie formularza.</p>
<p><strong>Rozwiązanie</strong><br />
Będąc w klasie formularza mamy dostęp do wartości odpowiadającego obiektu, tylko gdy dany formularz zostanie zainicjalizowany poprzez <strong>podanie obiektu do konstruktora</strong> (czyli przykładowo <code>$this-&gt;form = new SampleForm ($sample_object)</code>). Wtedy możemy pobrać jakąś informację z obiektu i na jej podstawie stworzyć <code>Criteria</code> ograniczające:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span> <span style="color: #009900;">&#40;</span>APeer<span style="color: #339933;">::</span><span style="color: #004000;">XYZ</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getObject</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAsd</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widgetSchema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'asd'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sfWidgetFormPropelChoice <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'model'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'B'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'criteria'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Permanent Link: Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Permanent Link: Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Permanent Link: Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: prawie jak parametry nazwane</title>
		<link>http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 09:23:37 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ciekawostki]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=512</guid>
		<description><![CDATA[W PHP nie ma czegoś takiego jak parametry nazwane z działania, ale jest taka rzecz z …wyglądu. O co chodzi? Mając funkcję: function foo &#40;$a = 1, $b = 22&#41; &#123; echo $a.' ~ '.$b; &#125; Normalnie ją wywołujemy na takie sposoby: foo&#40;&#41; // → '1 ~ 22' foo &#40;6&#41; // → '6 ~ 22' [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='Permanent Link: Sortowanie obiektów po dacie utworzenia'>Sortowanie obiektów po dacie utworzenia</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://code42.pl/wp-content/uploads/php_function_argument2.jpg"><img class="aligncenter size-full wp-image-531" title="php_function_argument" src="http://code42.pl/wp-content/uploads/php_function_argument2.jpg" alt="" width="500" height="217" /></a></p>
<p>W PHP nie ma czegoś takiego jak parametry nazwane z działania, ale jest taka rzecz z …wyglądu. O co chodzi? Mając funkcję:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> foo <span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">22</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$a</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' ~ '</span><span style="color: #339933;">.</span><span style="color: #000088;">$b</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Normalnie ją wywołujemy na takie sposoby:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '1 ~ 22'</span>
foo <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '6 ~ 22'</span>
foo <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '3 ~ 4'</span></pre></div></div>

<p>Jednak możemy sobie funkcję wywołać dodając etykiety parametrom:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">foo <span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">33</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '2 ~ 33'</span></pre></div></div>

<p>Możemy to zrobić również „niepoprawnie”:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">foo <span style="color: #009900;">&#40;</span><span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → '7 ~ 3'</span></pre></div></div>

<p>Jak widać PHP <strong>nie bierze</strong> pod uwagę tych nazw parametrów, jedynie kolejność. Nazwy mogą być dowolne, użyte zostaną i tak te z deklaracji funkcji. Powstaje więc pytanie — po co tego w ogóle używać? Otóż — dla <strong>przejrzystości kodu</strong>, co powinien dobrze zobrazować poniższy przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">render_last_posts <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'desc'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// → że jakie te posty mają być?</span>
&nbsp;
render_last_posts <span style="color: #009900;">&#40;</span><span style="color: #000088;">$limit</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sort</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'desc'</span><span style="color: #339933;">,</span>
    <span style="color: #000088;">$only_published</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #000088;">$by_user</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// aaa, takie!</span></pre></div></div>

<p>UWAGA. Takie przypisania ustawiają wartości zmiennych w danym zakresie, co czasami może doprowadzić do błędów (nadpisanie wcześniej zdefiniowanej zmiennej) lub być sytuacją pożądaną (przypisanie wartości do późniejszego wykorzystania).</p>
<p><span style="color: #999999;">Grafika na licencji:</span></p>
<p><span style="color: #999999;"> </span></p>
<div><a rel="cc:attributionURL" href="http://www.flickr.com/photos/hinkelstone/"><span style="color: #999999;">http://www.flickr.com/photos/hinkelstone/</span></a><span style="color: #999999;"> / </span><a rel="license" href="http://creativecommons.org/licenses/by/2.0/"><span style="color: #999999;">CC BY 2.0</span></a></div>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='Permanent Link: Sortowanie obiektów po dacie utworzenia'>Sortowanie obiektów po dacie utworzenia</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie</title>
		<link>http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 09:03:17 +0000</pubDate>
		<dc:creator>reinmar</dc:creator>
				<category><![CDATA[Różne]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=509</guid>
		<description><![CDATA[Opublikowane na licencji CC przez Trufflepig. W poprzednim artykule o obiektach w JavaScriptcie poruszyłem kwestię ich tworzenia, dostępu do właściwości, kontekstu wywoływania metod oraz wspomniałem o kilku cechach. Czyste literały obiektów same w sobie są już w tym języku bardzo przydatne &#8212; przekonał się pewnie o tym każdy kto korzystał z jakiejś biblioteki typu MooTools [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/' rel='bookmark' title='Permanent Link: Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem'>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Permanent Link: Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p class="top_img" style="text-align:right"><img src="http://pacman.mulabs.org/ts/oojs-2.jpg" alt="Gąsienica"  style="display:block; margin-left:auto" />Opublikowane na licencji CC przez <a href="http://www.flickr.com/photos/trufflepig/">Trufflepig</a>.</p>
<p>W poprzednim artykule o <a href="http://blog.koszulinski.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/">obiektach w JavaScriptcie</a> poruszyłem kwestię ich tworzenia, dostępu do właściwości, kontekstu wywoływania metod oraz wspomniałem o kilku cechach. Czyste literały obiektów same w sobie są już w tym języku bardzo przydatne &mdash; przekonał się pewnie o tym każdy kto korzystał z jakiejś biblioteki typu <a href="http://mootools.net/">MooTools</a> czy <a href="http://prototypejs.org">Prototype</a>. Pozwalają na przykład w dość wygodny sposób na podanie dowolnej liczby nazwanych argumentów funkcji:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Request</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'/your/url'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
	parameters<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> id<span style="color: #339933;">:</span> <span style="color: #CC0000;">12</span><span style="color: #339933;">,</span> action<span style="color: #339933;">:</span> <span style="color: #3366CC;">'sth'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>

	onSuccess<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>transport<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>transport.<span style="color: #660066;">responseText</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>

	evalJS<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre>
<p>Pisałem ostatnio o tym, że w JavaScriptcie nie ma klas. Skąd więc w przykładzie słówko kluczowe <code>new</code>, które w typowym języku służy do tworzenia instancji obiektu na bazie jakiejś klasy? Otóż okazuje się, że w JavaScriptcie wprowadzono twór zwany <em>konstruktorami obiektów</em>.</p>
<h3>Konstruktor obiektu</h3>
<p>Zwyczajnie zaczyna się od definiowania klasy jakiegoś kotka, samochodu, czy figury geometrycznej. Nudy. Chciałem wymyślić coś bardziej konstruktywnego i spośród wszystkich dostępnych na moim biurku obiektów wybrałem butelkę po miodzie pitnym (pustą niestety). Myślę, że konstruktory dla napoju alkoholowego i butelki będą wystarczająco oryginalne :). Do dzieła:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Alkohol <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>nazwa<span style="color: #339933;">,</span> ilosc_procentow<span style="color: #339933;">,</span> kolor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>

	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nazwa</span> <span style="color: #339933;">=</span> nazwa<span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ilosc_procentow</span> <span style="color: #339933;">=</span> ilosc_procentow<span style="color: #339933;">;</span>

	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">kolor</span> <span style="color: #339933;">=</span> kolor<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> ButelkaAlkoholu <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>alkohol<span style="color: #339933;">,</span> pojemnosc<span style="color: #339933;">,</span> rok_produkcji<span style="color: #339933;">,</span> kraj_produkcji<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>

	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">alkohol</span> <span style="color: #339933;">=</span> alkohol<span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">pojemnosc</span> <span style="color: #339933;">=</span> pojemnosc<span style="color: #339933;">;</span>

	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">rok_produkcji</span> <span style="color: #339933;">=</span> rok_produkcji<span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">kraj_produkcji</span> <span style="color: #339933;">=</span> kraj_produkcji<span style="color: #339933;">;</span>

<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre>
<p>Oj tak. JavaScript to dziwoląg. Miały być konstruktory obiektów, a tu znowu pojawiły się funkcje. Z drugiej strony pojawiło się też słowo kluczowe <code>this</code>, więc cały przykład przypomina dwa wycięte z definicji klas napisanych w normalnym języku konstruktory. Na szczęście obiekty tworzymy już normalnie:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> miod <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Alkohol<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Miód pitny'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">13</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'#850'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>

<span style="color: #003366; font-weight: bold;">var</span> butelka_miodu <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> ButelkaAlkoholu<span style="color: #009900;">&#40;</span>miod<span style="color: #339933;">,</span> <span style="color: #CC0000;">750</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2009</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Polska'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>

&nbsp;
console.<span style="color: #660066;">dir</span><span style="color: #009900;">&#40;</span>miod<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; screenshot poniżej</span>
console.<span style="color: #660066;">dir</span><span style="color: #009900;">&#40;</span>butelka_miodu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; screenshot poniżej</span>

&nbsp;
butelka_miodu.<span style="color: #660066;">alkohol</span>.<span style="color: #660066;">nazwa</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;Miód pitny&quot;</span></pre>
<p><img src="http://pacman.mulabs.org/ts/oojs_ss1.png" alt="Obiekty miód i butelka miodu" height="127"/></p>
<p>Utworzyliśmy w ten sposób dwa obiekty, których struktura została wylistowana przy pomocy <a href="http://getfirebug.com/">Firebuga</a> i którą przedstawiłem na screenie.</p>
<p>W poprzedniej części artykułu pisałem o tym, że obiekt może mieć swoje metody (inaczej funkcje przypisane jako właściwości obiektu). Musi więc być sposób aby w konstruktorze obiektu zdefiniować takie metody. Dodajmy więc kilka linii do konstruktora <code>ButelkaAlkohol</code>:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> ButelkaAlkoholu <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>alkohol<span style="color: #339933;">,</span> pojemnosc<span style="color: #339933;">,</span> rok_produkcji<span style="color: #339933;">,</span> kraj_produkcji<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>

	<span style="color: #006600; font-style: italic;">//...</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">pelna</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">oproznij</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>

		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">pelna</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> butelka_miodu <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> ButelkaAlkoholu<span style="color: #009900;">&#40;</span>miod<span style="color: #339933;">,</span> <span style="color: #CC0000;">750</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2009</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'Polska'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>

butelka_miodu.<span style="color: #660066;">pelna</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; true</span>
butelka_miodu.<span style="color: #660066;">oproznij</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
butelka_miodu.<span style="color: #660066;">pelna</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; false</span></pre>
<p>Jak widać, aby utworzyć coś co możemy nazwać metodą, musimy przypisać funkcję do właściwości przyszłego obiektu. Uczulam znowu na działanie słowa <code>this</code>, o czym pisałem już poprzednim razem.</p>
<h3>Alternatywna metoda tworzenia konstruktorów obiektów</h3>
<p>Naszym celem jest utworzenie obiektu o zadanych przez nas wartościach właściwości. Pamiętając, że najprostszym sposobem na utworzenie obiektu jest skorzystanie z literału możemy dojść do następującej konstrukcji: stwórzmy funkcję zwracającją obiekt zapisany za pomocą literału:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Alkohol2 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>nazwa<span style="color: #339933;">,</span> ilosc_procentow<span style="color: #339933;">,</span> kolor<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>

	<span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		nazwa<span style="color: #339933;">:</span> nazwa<span style="color: #339933;">,</span>
		ilosc_procentow<span style="color: #339933;">:</span> ilosc_procentow<span style="color: #339933;">,</span>

		kolor<span style="color: #339933;">:</span> kolor<span style="color: #339933;">,</span>
		pelna<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
		oproznij<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">pelna</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>

	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">return</span> obj<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> piwo <span style="color: #339933;">=</span> Alkohol2<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'piwo Tyskie'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">5.6</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'#FE3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>

piwo<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object nazwa=piwo Tyskie ilosc_procentow=5.6 kolor=#FE3</span></pre>
<p>Tak więc skorzystaliśmy z funkcji w jej czysto funkcyjnym wymiarze. To jednak nie koniec. Dawno już nie było mowy o żadnym JavaScriptowym dziwactwie. Pora na następne. Otóż ten zapis również zadziała:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> piwo2 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Alkohol2<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'piwo Tyskie'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">5.6</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'#FE3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>

piwo2<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object nazwa=piwo Tyskie ilosc_procentow=5.6 kolor=#FE3</span></pre>
<p>Zonk.</p>
<h4>Anegdota o użyciu <code>new</code> z funkcją</h4>
<p>Kiedy dowiedziałem się o powyższym od razu zacząłem się zastanawiać jak w zasadzie JavaScript traktuje <code>new</code> w kontekście funkcji. Pierwsze co ciśnie się na palce, to modyfikacja przykładu z konstruktorem <code>Alkohol2</code> tak by zwracał &#8222;nieobiekt&#8221;:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Cons <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>

	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Cons<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>

obj<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object</span></pre>
<p>Nic ciekawego &mdash; jakiś pusty obiekt otrzymaliśmy. Dodajmy więc właściwość (pierwszy sposób tworzenia konstruktorów):</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Cons <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>

	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">a</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'a'</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>

<span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Cons<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
obj<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object a=a</span></pre>
<p>Ciekawe, choć do wytłumaczenia &mdash; <code>return 5</code> jest pomijane. Połączmy teraz dwa sposoby tworzenia konstruktorów:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Cons <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>

	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">a</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'a'</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span> b<span style="color: #339933;">:</span> <span style="color: #3366CC;">'b'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>

<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Cons<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
obj<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object b=b</span></pre>
<p>Uups. JavaScript pomija właściwości zadeklarowane przy użyciu słowa <code>this</code>. W ten sposób dochodzimy do algorytmu, którym kieruje się ten język (a przynajmniej Firefox &mdash; może komuś się chce zajrzeć do specyfikacji? :):</p>
<ol>
<li>Jeśli zwracana przez funkcję wartość jest obiektem, to wyrażenie <code>new Cons()</code> zwraca ten obiekt.</li>
<li>W przeciwnym wypadku wyrażenie to zwraca obiekt z właściwościami ustalonymi przy pomocy słowa <code>this</code>.</li>
</ol>
<p>Porównując obydwa sposoby pisania konstruktorów można dojść do wniosku, że lepsza jest ta druga, (ze zwracaniem gotowego obiektu), ponieważ działa na obydwa sposoby: <code>new Cons()</code> i <code>Cons()</code>. Osobiście uważam jednak, że ta metoda jest gorsza &mdash; dlaczego? O tym później w tej i w następnej części artykułu.</p>
<h3>Elementy programowania obiektowego</h3>
<p>Umiemy już tworzyć konstruktory obiektów, które można porównać do klas w zwyczajnym języku. Obiekty tworzone za ich pomocą posiadały do tej pory jednak tylko publiczne właściwości i metody. JavaScript nie udostępnia mechanizmu modyfikatorów dostępu, można jednak skorzystać z jego cech aby oprogramować w prosty sposób podobne konstrukcje.</p>
<h4>Właściwości prywatne</h4>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Cons <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> <span style="color: #003366; font-weight: bold;">private</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'jestem prywatna'</span><span style="color: #339933;">;</span>

    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">getPrivate</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">private</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>

<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Cons<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
obj.<span style="color: #660066;">getPrivate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;jestem prywatna&quot;</span>

obj.<span style="color: #003366; font-weight: bold;">private</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; undefined</span></pre>
<p>Dlaczego to działa? Wszystko opiera się o kolejny dziwoląg, czyli JavaScriptowego scope&#8217;a, a także o closures (BTW. fajne tematy na kolejne artykuły). W skrócie &mdash; funkcja zadeklarowana w innej funkcji ma dostęp do zmiennych dostępnych w swoim &#8222;rodzicu&#8221;. Do tego mechanizm domknięć powoduje, że funkcja <code>getPrivate</code> &#8222;zapamiętuje&#8221; środowisko, w którym została zadeklarowana.</p>
<h4>Właściwości statyczne</h4>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Cons <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nonstatic</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'nie jestem statyczna'</span><span style="color: #339933;">;</span>

<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
Cons.<span style="color: #660066;">static</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'jestem statyczna'</span><span style="color: #339933;">;</span>
&nbsp;
Cons.<span style="color: #660066;">static</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;jestem statyczna&quot;</span>

Cons.<span style="color: #660066;">nonstatic</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; undefined</span></pre>
<p>Chyba nic nie trzeba wyjaśniać. Konstruktor <code>Cons</code> jak każda funkcja jest obiektem, więc można dodawać mu właściwości, co robimy w czwartej linii.</p>
<p>Dla jasności dodam, że w identyczny sposób tworzymy prywatne i statyczne metody obiektów i klas.</p>
<h4>Dostęp z obiektu do konstruktora</h4>
<p>Każdy obiekt posiada właściwość <code>constructor</code>, która daje dostęp do konstruktora (porównywalne do Javowego <code>Object.getClass()</code>):</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Cons <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>

    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sth</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'sth'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Cons<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>

obj.<span style="color: #660066;">constructor</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; function()</span>
obj.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;function () { this.sth = &quot;sth&quot;; }&quot;</span></pre>
<p>A teraz niespodzianka. Dlaczego drugi sposób tworzenia konstruktorów (przez literał obiektu) uważam za gorszy? O to jeden z powodów:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Cons2 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span> sth<span style="color: #339933;">:</span> <span style="color: #3366CC;">'sth'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>

<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> obj2 <span style="color: #339933;">=</span> Cons2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> obj3 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Cons2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>

&nbsp;
obj2.<span style="color: #660066;">constructor</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object()</span>
obj3.<span style="color: #660066;">constructor</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object()</span>

obj2.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;function Object() { [native code] }&quot;</span>
obj3.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;function Object() { [native code] }&quot;</span></pre>
<p>Zdefiniowaliśmy konstruktor, który teoretycznie działa jak ten z poprzedniego przykładu (zwraca obiekt o tej samej właściwości). Okazuje się jednak, że kiedy spróbujemy dostać się do konstruktora tego obiektu, to nie jest nim funkcja <code>Cons2</code>, a zwykła, natywna <code>Object</code>. Dla porównania:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;function Object() { [native code] }&quot;</span></pre>
<h3>Co dalej?</h3>
<p>Umiemy już posługiwać się obiektami. Umiemy też tworzyć ich konstruktory. Pora więc na dziedziczenie. O tym za czas jakiś w następnej części :)</p>
<p>Artykuł został opublikowany także na moim <a href="http://blog.koszulinski.pl/2010/02/28/obiektowy-javascript-cz-2-klasa-sama-w-sobie/">blogu prywatnym</a>.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/' rel='bookmark' title='Permanent Link: Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem'>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Permanent Link: Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Podstawy: osadzanie kodu PHP w pliku</title>
		<link>http://code42.pl/2010/02/12/podstawy-osadzanie-kodu-php-w-pliku/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2010/02/12/podstawy-osadzanie-kodu-php-w-pliku/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 19:51:51 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[kurs php]]></category>
		<category><![CDATA[php.ini]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=459</guid>
		<description><![CDATA[Żeby nie zanudzać tym, co już zostało wiele razy napisane, napiszę szybko, że istnieją 4 sposoby osadzania kodu PHP w pliku, z czego 2 najpopularniejsze wyglądają tak: &#60;?php $tutaj_kod // sposób standardowy ?&#62; &#60;? $tutaj_kod // sposób skrócony ?&#62; O pozostałych dwóch (tag &#60;script language='php'&#62;… i znany z ASP &#60;% … %&#62;) najlepiej od razu [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/06/30/zapamietywanie-hasla-dla-postgresql-w-pliku/' rel='bookmark' title='Permanent Link: Zapamiętywanie hasła dla PostgreSQL w pliku'>Zapamiętywanie hasła dla PostgreSQL w pliku</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Permanent Link: Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Żeby nie zanudzać tym, co już zostało wiele razy napisane, napiszę szybko, że istnieją 4 sposoby osadzania kodu PHP w pliku, z czego 2 najpopularniejsze wyglądają tak:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$tutaj_kod</span> <span style="color: #666666; font-style: italic;">// sposób standardowy ?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #000088;">$tutaj_kod</span> <span style="color: #666666; font-style: italic;">// sposób skrócony ?&gt;</span></pre></div></div>

<p>O pozostałych dwóch (tag <code>&lt;script language='php'&gt;…</code> i znany z ASP <code>&lt;% … %&gt;</code>) najlepiej od razu zapomnieć, chociażby z tego powodu, że nikt ich nie używa, a pierwszy z nich dodatkowo jest długi, brzydki i nie da się go mieszać z HTML-em.</p>
<h3>Więc który sposób jest lepszy?</h3>
<p>Jeśli tworzysz oprogramowanie, które ma być możliwie kompatybilne z wszelkimi serwerami i ich konfiguracjami (np. gdy tworzysz framework lub jakąś bibliotekę) właściwie musisz stosować zapis standardowy. Oszczędzi to zapewne wiele frustracji użytkownikom, bo jest to sposób, który zawsze działa. Jeśli jednak opisywany przypadek Cię nie dotyczy to warto stosować zapis skrócony (my go właśnie stosujemy bezproblemowo od dłuższego czasu). Wymaga on co prawda włączenia dyrektywy <code>short_open_tag = On</code> w pliku <code>php.ini</code>, jednak tworzony kod zyskuje sporo na czytelności. Do trybu PHP wskakujemy wtedy umieszczając tylko 2 znaki zamiast 5, natomiast zapis <code>&lt;?php echo  'Cześć' ?&gt;</code> można skrócić się aż o 7 znaków do <code>&lt;?= 'Cześć' ?&gt;</code>. A skoro można coś zapisać krócej, to czemu tego nie zrobić?</p>
<p><a href="http://code42.pl/wp-content/uploads/x.png"><img src="http://code42.pl/wp-content/uploads/x.png" alt="" title="Porównanie zapisu standardowego i skrótowego na przykładzie" width="570" height="387" class="aligncenter size-full wp-image-489" /></a></p>
<h3>Co warto wiedzieć o wychodzeniu z „trybu PHP”</h3>
<p>PHP wymaga kończenia  instrukcji średnikiem. Jak jednak widać w poprzednim akapicie, tego średnika nie ma. Jest to dopuszczalne, ponieważ wyjście z „trybu PHP” (?&gt;)  samo wstawia brakujący średnik. Warto to wykorzystać i nie zaciemniać kodu niepotrzebnymi znakami, szczególnie w przypadku gdy „wchodzimy” i „wychodzimy” do PHP w tej samej linii.</p>
<p>Inną sprawą jest fakt, że pliki zawierające w całości kod PHP, nie muszą i właściwie nie powinny mieć zakończenia „trybu PHP” (wtedy jednak nie wolno pominąć średnika w ostatniej instrukcji). Chroni nas to przed specyficzną sytuacją, gdy omyłkowo pozostawione puste linie w plikach ładowanych za pomocą funkcji <code>include</code> lub <code>require</code> spowodują rozpoczęcie wysyłania odpowiedzi (PHP od razu wysyła treść, która nie jest buforowana, ani nie jest kodem PHP), czego typowym następstwem jest komunikat:</p>
<pre> […] headers already sent by […]</pre>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/06/30/zapamietywanie-hasla-dla-postgresql-w-pliku/' rel='bookmark' title='Permanent Link: Zapamiętywanie hasła dla PostgreSQL w pliku'>Zapamiętywanie hasła dla PostgreSQL w pliku</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Permanent Link: Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/02/12/podstawy-osadzanie-kodu-php-w-pliku/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Obiektowy Javascript cz.1. &#8211; obiekt Twoim przyjacielem</title>
		<link>http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 13:21:06 +0000</pubDate>
		<dc:creator>reinmar</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[obiektowość]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=456</guid>
		<description><![CDATA[Opublikowane na licencji CC przez Trufflepig. Do tego czteroczęściowego (jak zapowiem, to może napiszę :) artykułu natchnęło mnie szkolenie z zaawansowanego JavaScriptu które, w miniony weekend, zorganizował we Wrocławiu Damian Ferrante Wielgosik. Już na początku chciałbym mu podziękować za wiedzę, którą się podzielił, ponieważ przed szkoleniem byłbym wstanie napisać tylko część tego artykułu. JavaScript to [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/' rel='bookmark' title='Permanent Link: Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie'>Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie</a></li>
<li><a href='http://code42.pl/2009/01/09/optymalizacje-sfpropelpagergetresults/' rel='bookmark' title='Permanent Link: Optymalizacje: sfPropelPager::getResults()'>Optymalizacje: sfPropelPager::getResults()</a></li>
<li><a href='http://code42.pl/2009/03/18/konsola-firebuga-echowanie-javascriptu/' rel='bookmark' title='Permanent Link: Konsola Firebuga &#8211; &#8222;echowanie&#8221; Javascriptu'>Konsola Firebuga &#8211; &#8222;echowanie&#8221; Javascriptu</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p class="top_img" style="text-align:right"><img src="http://pacman.mulabs.org/ts/oojs-1.jpg" alt="Gąsienica" style="display:block; margin-left:auto" />Opublikowane na licencji CC przez <a href="http://www.flickr.com/photos/trufflepig/">Trufflepig</a>.</p>
<p>Do tego czteroczęściowego (jak zapowiem, to może napiszę :) artykułu natchnęło mnie szkolenie z zaawansowanego JavaScriptu które, w miniony weekend, zorganizował we Wrocławiu <a href="http://ferrante.pl/">Damian Ferrante Wielgosik</a>. Już na początku chciałbym mu podziękować za wiedzę, którą się podzielił, ponieważ przed szkoleniem byłbym wstanie napisać tylko część tego artykułu.</p>
<h3>JavaScript to dziwoląg</h3>
<p>Tego nie da się ukryć. JavaScript należy do wąskiej grupy języków z rodziny <a href="http://en.wikipedia.org/wiki/ECMAScript">ECMAScriptu</a> (JS, <a href="http://en.wikipedia.org/wiki/ActionScript">ActionScript</a>, <a href="http://en.wikipedia.org/wiki/E4X">E4X</a>), którą cechuje to, że ich obiektowość oparta jest na <a href="http://en.wikipedia.org/wiki/Prototype-based_programming">prototypach</a>. Oznacza to, że w JavaScriptcie nie istnieje pojęcie klasy. Nie oznacza to jednak tego, że w JavaScriptcie nie da się programować obiektowo z wykorzystaniem np. konkretyzacji, dziedziczenia, czy właściwości prywatnych. Da się. Co więcej &mdash; da się uzyskać dużo więcej funkcjonalności klasycznego języka obiektowego, choć, o czym na sam koniec, niekoniecznie jest po co.</p>
<h3>Obiekt</h3>
<p>W języku z obiektowością klasową wypada zacząć od definicji klasy. Tak przynajmniej zaczynali autorzy książek, które czytałem. W przypadku JavaScriptu mielibyśmy jednak pewien problem, bo klas tutaj nie ma. Trzeba więc zacząć od utworzenia obiektu. Oto najprostszy:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">typeof</span> obj<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;object&quot;</span></pre>
<p>Tak, to w JavaScriptcie jest najprostszy obiekt. Zadeklarowany w przykładzie jest pusty i dziedziczy po obiekcie <code>Object</code>. Możemy sprawdzić to za pomocą poniższego kodu (jak działa i co to znaczy, o tym później):</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
obj.__count__<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 0, działa tylko w Firefoksie</span>

obj.__proto__.<span style="color: #660066;">constructor</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object()</span></pre>
<p>Obiekt możemy również utworzyć za pomocą konstruktora <code>Object()</code>. Nie jest to jednak sposób polecany, ponieważ&#8230; zmienną <code>Object</code> można nadpisać. Lepiej pozostać przy literałach obiektów, które są bezpieczniejsze i ładniejsze.</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Object<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; Object</span>

Object <span style="color: #339933;">=</span> <span style="color: #CC0000;">5</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> obj2 <span style="color: #339933;">=</span> Object<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt;  TypeError: Object is not a constructor</span></pre>
<h3>Właściwości obiektu</h3>
<p>Nic nam jednak z pustego obiektu. Pora dodać do niego dane i metody. Możemy skorzystać ze składni literału obiektu:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	text<span style="color: #339933;">:</span> <span style="color: #3366CC;">'Jestem obiektem'</span><span style="color: #339933;">,</span>

	saySth<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>

<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre>
<p>Bądź stworzyć pusty obiekt i dodać mu właściwości:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
obj.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Jestem obiektem'</span><span style="color: #339933;">;</span>

obj.<span style="color: #660066;">saySth</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre>
<p>W obu przypadkach efekt będzie ten sam. Kiedy wywołamy <code>obj.saySth();</code> dostaniemy alerta z tekstem <q>Jestem obiektem</q>.</p>
<p>Jeszcze słowo wtrącenia o literałach. Trzeba uważać na przecinek po ostatniej właściwości. Firefox i chyba wszystkie normalne przeglądarki trzymają się specyfikacji <a href="http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf">ECMAScript 5  pkt 11.1.5</a> (bądź to specyfikacja trzyma się tych przeglądarek ;), a kochany IE6, który zawsze musi być inny (&#8222;inny nie znaczy gorszy&#8221; w tym wypadku nie działa ;) trzyma się specyfikacji <a href="http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf">ECMAScript 3 pkt 11.1.5</a>. Tak więc przecinek po ostatniej właściwości zostanie zaakceptowany przez przeglądarki z rodziny normalnych, zaś IE6 wywali cichaczem błąd. Nie wiem co prawda jak sprawa wygląda w IE7 i IE8, ale radzę po prostu tego przecinka nie stawiać. Koniec dygresji.</p>
<p>W Javie, czy PHP metoda obiektu jest czymś zupełnie innym niż jego właściwość. W JavaScriptcie metoda jest po prostu funkcją przypisaną do właściwości obiektu. Widać to najlepiej w trzeciej linii ostatniego przykładu: <code>obj.saySth = function () {};</code>. Wynika to z tego, że w JavaScriptcie funkcja też jest obiektem. Dzięki temu możemy ją przypisywać do zmiennych, zwracać w innych funkcjach, czy&#8230; wywoływać na niej metody. Ta właściwość JavaScriptu jest naprawdę potężna i myślę, że język ten sporo teraz zyskał w oczach osób lubiących Rubiego, Pythona, czy jakiś język funkcyjny :).</p>
<h4>Uwaga na <code>this</code></h4>
<pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">typeof</span> obj.<span style="color: #660066;">saySth</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;function&quot;</span>
<span style="color: #003366; font-weight: bold;">var</span> sayNothing <span style="color: #339933;">=</span> obj.<span style="color: #660066;">saySth</span><span style="color: #339933;">;</span>

<span style="color: #000066; font-weight: bold;">typeof</span> sayNothing<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;function&quot;</span>
sayNothing<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; alert undefined</span></pre>
<p>Z pierwszych trzech linii widać, że możemy sobie dowolnie operować funkcją. Czwarta może być zaskoczeniem. Dlaczego <code>this.text === undefined</code>? Zauważcie, że funkcja <code>sayNothing</code> nie została wywołana w kontekście obiektu <code>obj</code>, tylko w kontekście&#8230; no właśnie &mdash; czego? Żeby to sprawdzić dodajmy dwie linie kodu do poprzednich przykładów:</p>
<pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">text</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Jestem globalnym scopem'</span><span style="color: #339933;">;</span>
sayNothing<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; alert &quot;Jestem globalnym scopem&quot;</span></pre>
<p>Teraz widać, że funkcja <code>sayNothing();</code> wywołana jest w globalnym kontekście. Możemy ją także wywołać w odpowiednim kontekście używając metody <code>call()</code> działającej na funkcji (tak jak pisałem wcześniej &mdash; funkcja też jest obiektem, więc ma też swoje metody):</p>
<pre class="javascript" style="font-family:monospace;">sayNothing.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; alert &quot;Jestem obiektem&quot;</span></pre>
<p>Więcej na ten temat u Ferrante w <a href="http://ferrante.pl/2010/02/02/this-w-javascript/">&#8222;this&#8221; w JavaScript</a>.</p>
<h4>Jeszcze trochę o obiektach</h4>
<p>Do właściwości obiektu możemy się również dostać za pomocą operatora <code>[]</code>, czyli w taki sposób jak do elementów tablicy. Jest to przydatne kiedy chcemy uzyskać właściwość, której nazwa trzymana jest w zmiennej:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> a<span style="color: #339933;">:</span> <span style="color: #3366CC;">'A'</span><span style="color: #339933;">,</span> b<span style="color: #339933;">:</span> <span style="color: #3366CC;">'B'</span><span style="color: #339933;">,</span> m<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'M'</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>

&nbsp;
obj<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'a'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;A&quot;</span>
<span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066;">name</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'b'</span><span style="color: #339933;">;</span>

obj<span style="color: #009900;">&#91;</span>b<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;B&quot;</span>
obj<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'m'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;M&quot;</span></pre>
<p>Po właściwościach obiektu można też iterować za pomocą konstrukcji <code>for (i in obj)</code>. Trzeba jednak uważać, bo, w zależności od tego jakim obiektem dysponujemy, możemy dostać niespodziewane (przynajmniej na razie) rezultaty. Póki co jednak wystarczy nam:</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> a<span style="color: #339933;">:</span> <span style="color: #3366CC;">'A'</span><span style="color: #339933;">,</span> b<span style="color: #339933;">:</span> <span style="color: #3366CC;">'B'</span><span style="color: #339933;">,</span> c<span style="color: #339933;">:</span> <span style="color: #3366CC;">'C'</span><span style="color: #339933;">,</span> d<span style="color: #339933;">:</span> <span style="color: #3366CC;">'D'</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>

<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #000066; font-weight: bold;">in</span> obj<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'obj['</span> <span style="color: #339933;">+</span> i <span style="color: #339933;">+</span> <span style="color: #3366CC;">'] = '</span> <span style="color: #339933;">+</span> obj<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>

<span style="color: #009900;">&#125;</span></pre>
<p>Obiekty można też zagłębiać. Jest to własność oczywista, ale wypada dla jasności o niej wspomnieć.</p>
<pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
	obj<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
		obj<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>

			hidden<span style="color: #339933;">:</span> <span style="color: #3366CC;">'Zonk'</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
obj.<span style="color: #660066;">obj</span>.<span style="color: #660066;">obj</span>.<span style="color: #660066;">hidden</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; &quot;Zonk&quot;</span></pre>
<h3>Co dalej?</h3>
<p>Samym obiektem programista żyć nie może. Klas jednak w JavaScripcie nie uświadczymy, trzeba więc wymyślić coś innego. Z pomocą przyjdą nam konstruktory obiektów, ale zrobią to dopiero w następnej części :).</p>
<p>Poza tym w trzeciej części mam zamiar napisać o prototypach, czyli JavaScriptowym dziedziczeniu. W czwartej chciałbym zebrać wszystko do kupy, pokazać może jakieś wzorce i napisać kilka uwag o programowaniu w JavaScriptcie. W zasadzie to uwagi mam już napisane, bo zacząłem od końca :D</p>
<p>Artykuł został także opublikowany na moim <a href="http://blog.koszulinski.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/">prywatnym blogu</a>.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/' rel='bookmark' title='Permanent Link: Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie'>Obiektowy JavaScript cz.2. &#8211; klasa sama w sobie</a></li>
<li><a href='http://code42.pl/2009/01/09/optymalizacje-sfpropelpagergetresults/' rel='bookmark' title='Permanent Link: Optymalizacje: sfPropelPager::getResults()'>Optymalizacje: sfPropelPager::getResults()</a></li>
<li><a href='http://code42.pl/2009/03/18/konsola-firebuga-echowanie-javascriptu/' rel='bookmark' title='Permanent Link: Konsola Firebuga &#8211; &#8222;echowanie&#8221; Javascriptu'>Konsola Firebuga &#8211; &#8222;echowanie&#8221; Javascriptu</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dlaczego frameworki CSS ssą?</title>
		<link>http://code42.pl/2010/01/29/dlaczego-frameworki-css-ssa/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2010/01/29/dlaczego-frameworki-css-ssa/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 13:07:16 +0000</pubDate>
		<dc:creator>reinmar</dc:creator>
				<category><![CDATA[HTML + CSS]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=453</guid>
		<description><![CDATA[Sesja się już dla mnie skończyła, można więc coś napisać. Dzisiaj będzie jednak krótko, bo i temat prosty. Cóż to takiego framework CSS? No właśnie. Każdy wie co to są frameworki programistyczne, ale CSSowy? Według wiki: A CSS framework, also known as a web design framework is a pre-prepared library that is meant to allow [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/11/23/zen-coding-snippety-do-kosza/' rel='bookmark' title='Permanent Link: Zen Coding &#8211; snippety do kosza'>Zen Coding &#8211; snippety do kosza</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Sesja się już dla mnie skończyła, można więc coś napisać. Dzisiaj będzie jednak krótko, bo i temat prosty.</p>
<h4>Cóż to takiego framework CSS?</h4>
<p>No właśnie. Każdy wie co to są frameworki programistyczne, ale CSSowy? Według <a href="http://en.wikipedia.org/wiki/CSS_framework">wiki</a>:</p>
<blockquote><p>A CSS framework, also known as a web design framework is a pre-prepared library that is meant to allow for easier, more standards-compliant styling of a webpage using the Cascading Style Sheets language. Just like programming and scripting language libraries, CSS frameworks (usually packaged as external .css sheets inserted into the header) package a number of ready-made options for designing and outlaying a webpage.</p>
</blockquote>
<p>Czyli, tak jak w językach programowania, framework jest biblioteką (w tym wypadku grupą reguł CSS) która ułatwia implementowanie jakichś standardowych, często powtarzających się funkcjonalności (w tym wypadku pewnych schematów w layoutcie).</p>
<p>Co, według mnie, frameworkiem CSS nie jest? Pisałem w listopadzie o <a href="http://blog.koszulinski.pl/2009/11/26/write-less-do-more-czyli-pimp-my-css/">parserze/kompilatorze/procesorze CSS &#8211; LESS</a>, który rozszerza składnię CSS o kilka świetnych rzeczy. Między innymi &#8211; zmienne, zagnieżdżone reguły, obliczenia, wielokrotne wykorzystywanie reguł. Jakby nie było &#8211; nie podchodzi to pod definicję z <a href="http://en.wikipedia.org/wiki/CSS_framework">Wikipedii</a>, ale niestety znajduje się w linkach do przykładowych frameworków. Dla ustalenia uwagi &#8211; <a href="http://lesscss.org/">LESS</a> nie jest frameworkiem.</p>
<h4>Czemuż ssie?</h4>
<p>Pod mą lupę wziąłem pierwsze linki zwrócone przez Google. Przyjrzałem się chwilkę frameworkom: <a href="http://www.blueprintcss.org/">Blueprint</a>, <a href="http://elasticss.com/">Elastic CSS</a>, <a href="http://developer.yahoo.com/yui/grids/">YUI 2 Grids</a>. Prawdopodobnie są lepsze rozwiązania od tych i z chęcią się im przyjrzę jeśli linki pojawią się w komciach :).</p>
<h5>Słówko o nieudanym porodzie</h5>
<p>Wypada jeszcze wtrącić, dla niezorientowanych, co to za poroniony pomysł ten <a href="http://960.gs/">Grid system</a>. Otóż wpadł ktoś na pomysł, że wygodnie będzie wszystkim (grafikom, programistom) jak ustalimy sobie, że strona składa się z X kolumn po Ypx szerokości każda, między którymi są marginesy po Zpx. Przyznam, że obaj z grafikiem byliśmy zachwyceni, aż do&#8230; pierwszego projektu. Życzę np. sporo zabawy z cieniami wychodzącymi poza granice kolumn, w przypadku kiedy nie możemy użyć <code>box-shadow</code>. Szlag trafia wszystkie piękne, okrągłe wartości.</p>
<h5>Koniec wtrącenia</h5>
<p>Najpierw kawałek kodu z <a href="http://developer.yahoo.com/yui/examples/grids/grids-gg.html">YUI 2 Grids</a>:</p>
<pre class="html" style="font-family:monospace;">&lt;div id=&quot;yui-main&quot;&gt;
   &lt;div class=&quot;yui-b&quot;&gt;
      &lt;div class=&quot;yui-g&quot;&gt;

         &lt;div class=&quot;yui-g first&quot;&gt;
            &lt;div class=&quot;yui-u first&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;yui-u&quot;&gt;&lt;/div&gt;
         &lt;/div&gt;

         &lt;div class=&quot;yui-g&quot;&gt;
            &lt;div class=&quot;yui-u first&quot;&gt;&lt;/div&gt;
            &lt;div class=&quot;yui-u&quot;&gt;&lt;/div&gt;
         &lt;/div&gt;

      &lt;/div&gt;
   &lt;/div&gt;
&lt;/div&gt;</pre>
<p>Tyle się kiedyś mówiło o semantyce kodu i oddzieleniu wyglądu od treści. Ponad pięć lat temu, kiedy zaczynałem naukę HTMLa i CSSa, trwała walka o to aby programiści zaczęli pisać porządny kod. Wydawało mi się, że teraz już nie powinno być z tym problemów, a tu zonk. Patrzę na ten przykład i co widzę?</p>
<ul>
<li>Prezentacja zbita razem z HTMLem &#8211; żeby zmienić układ strony zmieniamy HTMLa, a nie CSS,</li>
<li>Kompletnie bezznaczeniowe nazwy klas i identyfikatorów &#8211;  jedno wielkie semantyczne szambo. Wybrałem akurat framework od YUI, bo jest w tym najgorszy (choć Blueprint mu nie ustępuje). Elastic CSS wygląda trochę lepiej,</li>
<li>Divitis. W przypadku YUI można chyba akurat dowolnie zmieniać użyte tagi, bo framework resetuje marginesy i paddingi dla wszystkich elementów (co też, tak na marginesie, uważam za kiepską praktykę). Kiedy jednak używając Blueprinta postanowimy zawrzeć którąś kolumnę w listę, to wszystko szlag trafia, bo uwaga&#8230; niektóre selektory zawierają nazwę tagu :O</li>
<li>Narzucona struktura i kolejność elementów w kodzie HTML. Ja akurat poświęcam sporo uwagi temu aby każdy element nawigacyjny był w sensownym miejscu, aby nie używać niepotrzebnych tagów, a wykorzystując framework nie mam tej elastyczności,</li>
<li>I wreszcie &#8211; przecież to wszystko co oferuje framework można w czasie, który jest bez znaczenia w stosunku do całego projektu, napisać ręcznie. To jest kilka reguł, które doświadczona osoba pisze na raz i to od razu z ewentualnym hackiem dla IE6. Tak, wiem, że nie wszyscy mają taką wiedzę, ale wykorzystując framework nigdy jej nie pogłębią.</li>
</ul>
<p>Tak więc w żadnym wypadku nie widzę sensu w używaniu frameworków do budowy układu strony. Żeby jednak nie było, że w ogóle nie umiem wykorzystywać zewnętrznego kodu &#8211; uważam, że przydatne są frameworki poprawiające typografię, bądź też pod niektórymi względami formularze. Muszą jednak bazować na selektorach używających tagów, a nie klas, czy nie daj Boże identyfikatorów.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/11/23/zen-coding-snippety-do-kosza/' rel='bookmark' title='Permanent Link: Zen Coding &#8211; snippety do kosza'>Zen Coding &#8211; snippety do kosza</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/01/29/dlaczego-frameworki-css-ssa/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Vim: dopełnianie dowolnego tekstu (np. słów kluczowych PHP)</title>
		<link>http://code42.pl/2010/01/13/vim-dopelnianie-dowolnego-tekstu-np-slow-kluczowych-php/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2010/01/13/vim-dopelnianie-dowolnego-tekstu-np-slow-kluczowych-php/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 15:35:04 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Vim]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=439</guid>
		<description><![CDATA[Vim posiada dwa bardzo przydatne skróty klawiszowe: ctrl-n oraz ctrl-p. Obydwa służą do dopełniania słów, pierwszy zaczyna szukać za kursorem, drugi przed nim. Domyślnie Vim korzysta ze słów z bieżącego pliku oraz z wszystkich otwartych buforów. Można jednak tę funkcjonalność rozszerzyć dodając własny słownik. Sam słownik, to zwykły plik tekstowy, w którym słowa są oddzielone białymi znakami. Posiada [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/26/vim-znajdowanie-plikow-w-podkatalogach/' rel='bookmark' title='Permanent Link: Vim: Znajdowanie plików w podkatalogach'>Vim: Znajdowanie plików w podkatalogach</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Vim posiada dwa bardzo przydatne skróty klawiszowe: <kbd>ctrl-n</kbd> oraz <kbd>ctrl-p</kbd>. Obydwa służą do dopełniania słów, pierwszy zaczyna szukać za kursorem, drugi przed nim. Domyślnie Vim korzysta ze słów z bieżącego pliku oraz z wszystkich otwartych buforów.</p>
<p><a href="http://code42.pl/wp-content/uploads/vim-dopelnianie.png"><img src="http://code42.pl/wp-content/uploads/vim-dopelnianie.png" alt="" title="vim-dopelnianie" width="389" height="164" class="aligncenter size-full wp-image-449" /></a></p>
<p>Można jednak tę funkcjonalność rozszerzyć dodając własny słownik. Sam słownik, to zwykły plik tekstowy, w którym słowa są oddzielone białymi znakami. Posiada on jednak dość dziwne ograniczenie — czyta tylko 511 znaków w jednej linii, dlatego nie wolno przesadzać z ich długością.</p>
<p>Słownik może być np. takiej postaci:</p>
<pre>dzięciowodoronaftalen
dziewięciodoronaftalen
antypolonazsiderywizacjaimigtenwadsioptaweertyytna
fluorochlorowęglanowodoroazotanocydy
konstantynopolitańczykowianeczka
cześć
</pre>
<p>Aby skorzystać ze słownika należy dodać 2 linijki (właściwie może być jedna) do <code>~/.vimrc</code>:</p>
<pre>
set dictionary+=~/sciezka/do/slownika
set complete+=k
</pre>
<p>Pierwsza komenda ładuje słownik, druga sprawia, że możemy go przeszukiwać za pomocą wcześniej wspomnianych skrótów (domyślnie trzeba byłoby wciskać <kbd>ctrl-x-k</kbd>). Słowników może być wiele.</p>
<p>Słownik możemy sobie utworzyć na bazie plików Vima ze składnią do języków programowania (pod debianopodobnymi w katalogu <code>/usr/share/vim/vim72/syntax/</code>). Należy tutaj jednak pamiętać o ograniczeniu długości linii. Dlatego dla samego PHP udostępniamy <a href='http://code42.pl/wp-content/uploads/php-keywords.txt'>gotowy słownik słów kluczowych</a>. </p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/26/vim-znajdowanie-plikow-w-podkatalogach/' rel='bookmark' title='Permanent Link: Vim: Znajdowanie plików w podkatalogach'>Vim: Znajdowanie plików w podkatalogach</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/01/13/vim-dopelnianie-dowolnego-tekstu-np-slow-kluczowych-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zen Coding &#8211; snippety do kosza</title>
		<link>http://code42.pl/2009/11/23/zen-coding-snippety-do-kosza/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2009/11/23/zen-coding-snippety-do-kosza/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 08:15:57 +0000</pubDate>
		<dc:creator>reinmar</dc:creator>
				<category><![CDATA[HTML + CSS]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[snippets]]></category>
		<category><![CDATA[zen]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=430</guid>
		<description><![CDATA[Snippety do htmla? Nieeee. Zobaczcie Zen Coding. W skrócie działa to tak. Wpisuję w edytorze CSSową składnią: div#content&#62;h1+p Wciskam jakąś kombinację klawiszy i dostaję: &#60;div id=&#34;content&#34;&#62; &#60;h1&#62;&#60;/h1&#62; &#60;p&#62;&#60;/p&#62; &#60;/div&#62; Sprytne, nie? :) Ale to jeszcze mało. Spróbujcie tego: div#top&#62;h1&#62;a[title=Do strony głównej]{Moja strona}&#60;ul#menu&#62;li.pos$*3&#62;a &#60;div id=&#34;top&#34;&#62; &#60;h1&#62; &#60;a href=&#34;&#34; title=&#34;Do strony głównej&#34;&#62;Moja strona&#60;/a&#62; &#60;/h1&#62; &#60;ul id=&#34;menu&#34;&#62; &#60;li [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/01/29/dlaczego-frameworki-css-ssa/' rel='bookmark' title='Permanent Link: Dlaczego frameworki CSS ssą?'>Dlaczego frameworki CSS ssą?</a></li>
<li><a href='http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/' rel='bookmark' title='Permanent Link: Refaktoryzacja CSS — jednak coś można'>Refaktoryzacja CSS — jednak coś można</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Snippety do htmla? Nieeee. Zobaczcie <a href="http://www.smashingmagazine.com/2009/11/21/zen-coding-a-new-way-to-write-html-code/">Zen Coding</a>. W skrócie działa to tak. Wpisuję w edytorze CSSową składnią:</p>
<pre>div#content&gt;h1+p</pre>
<p>Wciskam jakąś kombinację klawiszy i dostaję:</p>
<pre>&lt;div id=&quot;content&quot;&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;</pre>
<p>Sprytne, nie? :) Ale to jeszcze mało. Spróbujcie tego:</p>
<pre>div#top&gt;h1&gt;a[title=Do strony głównej]{Moja strona}&lt;ul#menu&gt;li.pos$*3&gt;a</pre>
<pre>&lt;div id=&quot;top&quot;&gt;
    &lt;h1&gt;
        &lt;a href=&quot;&quot; title=&quot;Do strony głównej&quot;&gt;Moja strona&lt;/a&gt;
    &lt;/h1&gt;

    &lt;ul id=&quot;menu&quot;&gt;
        &lt;li class=&quot;pos1&quot;&gt;
            &lt;a href=&quot;&quot;&gt;&lt;/a&gt;
        &lt;/li&gt;
        &lt;li class=&quot;pos2&quot;&gt;

            &lt;a href=&quot;&quot;&gt;&lt;/a&gt;
        &lt;/li&gt;
        &lt;li class=&quot;pos3&quot;&gt;
            &lt;a href=&quot;&quot;&gt;&lt;/a&gt;
        &lt;/li&gt;

    &lt;/ul&gt;
&lt;/div&gt;</pre>
<p>Chyba nie muszę mówić jak bardzo taka pomoc przyspiesza pracę. Napisanie z palca kodu z drugiego przykładu zajęłoby mi przypuszczalnie więcej niż 2 minuty. Gdybym użył snippetów (do których przy HTMLu nie mogę się przyzwyczaić) może skróciłbym ten czas dwukrotnie. Zaś używając wynalazku Zen Coding całość naklepałem w 20s (i to nie mając wprawy). Tak więc gorąco polecam.</p>
<p>Gdyby ktoś szukał wtyczki do VIMa, to powstał <a href="http://github.com/rstacruz/sparkup" title="VIM zen coding plugin">plugin</a>, którego twórca zainspirował się Zen Codingiem.</p>
<p>Wpis ten opublikowałem też na <a href="http://reinmar.jogger.pl" title="Zapiski na koszulce - html, css, usability i nowe technologie">swoim prywatnym blogu</a>.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/01/29/dlaczego-frameworki-css-ssa/' rel='bookmark' title='Permanent Link: Dlaczego frameworki CSS ssą?'>Dlaczego frameworki CSS ssą?</a></li>
<li><a href='http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/' rel='bookmark' title='Permanent Link: Refaktoryzacja CSS — jednak coś można'>Refaktoryzacja CSS — jednak coś można</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/11/23/zen-coding-snippety-do-kosza/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Logowanie do pliku wszystkich zapytań w PostgreSQL</title>
		<link>http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/?&amp;owa_from=feed&amp;owa_sid=</link>
		<comments>http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 11:20:03 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=418</guid>
		<description><![CDATA[Aby zapisywać w logach wszystkie zapytania jakie się wykonują w naszej bazie danych wystarczy zmienić tylko kilka opcji konfiguracyjnych i zrestartować serwer Postgresa. Tak więc w pliku postgresql.conf (znajdującym się katalogu, w którym trzymane są bazy, zwykle tam gdzie wskzuje zmienna PGDATA, a w „debianopodobnych” w /etc/postgresql/8.x/main/) w sekcji Error Reporting and Logging ustawiamy: log_destination = 'stderr' [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/06/30/zapamietywanie-hasla-dla-postgresql-w-pliku/' rel='bookmark' title='Permanent Link: Zapamiętywanie hasła dla PostgreSQL w pliku'>Zapamiętywanie hasła dla PostgreSQL w pliku</a></li>
<li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Permanent Link: Migracja MySQL → PostgreSQL (aplikacji w Symfony 1.1)'>Migracja MySQL → PostgreSQL (aplikacji w Symfony 1.1)</a></li>
<li><a href='http://code42.pl/2009/01/14/czas-zycia-krotki-w-postgresie/' rel='bookmark' title='Permanent Link: PostgreSQL: Czas życia krotki'>PostgreSQL: Czas życia krotki</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Aby zapisywać w logach wszystkie zapytania jakie się wykonują w naszej bazie danych wystarczy zmienić tylko kilka opcji konfiguracyjnych i zrestartować serwer Postgresa.  Tak więc w pliku <code>postgresql.conf</code> (znajdującym się katalogu, w którym trzymane są bazy, zwykle tam gdzie wskzuje zmienna PGDATA, a w „debianopodobnych” w <code>/etc/postgresql/8.x/main/</code>) w sekcji Error Reporting and Logging ustawiamy:</p>
<pre>
<code>
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'
</code>
</pre>
<p>Gdzie:</p>
<ul>
<li><code>log_destination</code> — tak jest ustawiony domyślnie, więc tylko sprawdzamy czy się nic nie zmieniło.</li>
<li><code>logging_collector</code> — włączamy, aby logi trafiające do <code>stderr</code> mogły być zapisane do pliku.</li>
<li><code>log_directory</code> — dowolna nazwa katalogu dla logów, znajdującego się katalogu gdzie trzymamy bazę. Jeśli nie ma takiego należy go utworzyć i upewnić się, że postgres ma uprawnienia do zapisu.</li>
<li><code>log_filename</code> — nazwa pliku z logami, tutaj ze zdefiniowanym dniem.</li>
<li><code>log_statement</code> — grupa zapytań jakie chcemy zapisywać do pliku. Tutaj wybrane wszystkie. Inne opcje: none (wyłączenie zapisu), ddl (zapytania CREATE, ALTER, DROP), mod (tutaj zapewne chodzi o zapytania UPDATE, ale tego nie testowaliśmy).</li>
</ul>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/06/30/zapamietywanie-hasla-dla-postgresql-w-pliku/' rel='bookmark' title='Permanent Link: Zapamiętywanie hasła dla PostgreSQL w pliku'>Zapamiętywanie hasła dla PostgreSQL w pliku</a></li>
<li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Permanent Link: Migracja MySQL → PostgreSQL (aplikacji w Symfony 1.1)'>Migracja MySQL → PostgreSQL (aplikacji w Symfony 1.1)</a></li>
<li><a href='http://code42.pl/2009/01/14/czas-zycia-krotki-w-postgresie/' rel='bookmark' title='Permanent Link: PostgreSQL: Czas życia krotki'>PostgreSQL: Czas życia krotki</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
