<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
	<title>Vokiel.com</title>
	
	<link>http://blog.vokiel.com</link>
	<description>Web Developer Blog</description>
	<lastBuildDate>Fri, 27 Aug 2010 10:27:26 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BlogVokielCom" /><feedburner:info uri="blogvokielcom" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Wtyczka Similarity współpracująca z qTranslate</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/neXOAcmO6TA/wtyczka-similarity-wspolpracujaca-z-qtranslate</link>
		<comments>http://blog.vokiel.com/wtyczka-similarity-wspolpracujaca-z-qtranslate#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:06:40 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[similarity]]></category>
		<category><![CDATA[wtyczki]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=598</guid>
		<description><![CDATA[Zmuszenie do działania wtyczki Similarity z wtyczką qTranslate. Naprawa sposobu wyświetlania podobnych wpisów na wielojęzycznym blogu.]]></description>
			<content:encoded><![CDATA[<p>Tym razem wpis będzie bardzo krótki. Osoby korzystające z wielu wtyczek napotykają czasem na problem z kompatybilnością. Niestety, wymagać od twórców aby uwzględniali inne wtyczki podczas pisania swoich, to jak wymagać od programisty aby instalował Windowsa. Zatem w przypadku pojawiania się problemów zmuszeni jesteśmy do utworzenia własnych rozwiązań. </p>
<p><span id="more-598"></span></p>
<div class="source_demo_container">
<a rel="nofollow" target="_blank" href="/dema/similarity/similarity.php" class="source" title="Źródła">Źródła</a>
</div>
<h2>Wtyczki sprawiające problemy</h2>
<p>Na moim blogu miałem kilka kwestii braku kompatybilności wtyczek. <a rel="nofollow" target="_blank" href="http://wordpress.org/extend/plugins/qtranslate-meta/#referrer=blog.vokiel.com">qTranslate META</a> nie współgra z <a rel="nofollow" target="_blank" href="http://wordpress.org/extend/plugins/all-in-one-seo-pack/#referrer=blog.vokiel.com">All in One SEO Pack</a>, a teraz przyszła kolej na wtyczkę <a rel="nofollow" target="_blank" href="http://wordpress.org/extend/plugins/similarity/#referrer=blog.vokiel.com">Similarity</a>, która ma problem z samym <a rel="nofollow" target="_blank" href="http://wordpress.org/extend/plugins/qtranslate/#referrer=blog.vokiel.com">qTranslate</a>. Nie jest łatwo tworzyć wielojęzycznego bloga;) Jednak, jak już się domyślacie poradzimy sobie z tym. </p>
<p>Głównym zadaniem tego wpisu jest zachowanie na później sposobu, w jaki rozwiązałem ten problem. W przypadku aktualizacji którejś z wtyczek nie będę musiał odszukiwać poprawionych przeze mnie plików i nadpisywać nowych &#8211; po prostu sięgnę do bloga <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Problem wtyczki Similarity</h2>
<p>Korzystając z wtyczki qTranslate tytuły wpisów zapisywane są w inny sposób. Dla każdego użytego w notce języka są dodawane specjalne znaczniki (oparte na komentarzach HTML), a całość zapisywana jest do jednego pola.</p>
<p style="border:1px solid silver;padding:0 4px;white-space:pre-wrap;font:1em/1.5 monospace;"><span>&lt;!&#8211;:pl&#8211;&gt;PHP w trybie CGI &#8211; autentyfikacja HTTP &#8211; system logowania&lt;!&#8211;:&#8211;&gt;&lt;!&#8211;:en&#8211;&gt;PHP in CGI version &#8211; HTTP Authentication &#8211; login system&lt;!&#8211;:&#8211;&gt;</span></p>
<p>Z powodu takiego zapisu, pobierając tytuł wpisu otrzymamy go we wszystkich językach. Niestety, użytkownik będący na stronie z językiem Polskim może nie mieć ochoty na oglądanie listy podobnych wpisów, na której, każdy wpis jest wypisany we wszystkich językach w jakich występuje. W przypadku tylko dwóch języków nie jest to jeszcze straszne, chociaż mylące. Co jeśli, ktoś tworzy większy serwis tłumaczony na dziesiątki języków?</p>
<h2>Rozwiązanie</h2>
<p>W przypadku tworzenia takich haków najbardziej niewdzięczną czynnością jest przerobienie czyjegoś kodu i wyłapanie w nim odpowiednich fragmentów. W przypadku takim jak ten, gdzie przyczyna niepoprawnego działania jednej z wtyczek jest znana, poszukiwanie rozwiązania jest łatwiejsze. W zasadzie wystarczy odnaleźć fragment kodu wtyczki Similarity odpowiadający za wyświetlanie linków do podobnych wpisów. Dodatkowo, można się pokusić o fragment z wtyczki qTranslate, który oczyszcza link z niepotrzebnych tłumaczeń. Dzięki takiemu połączeniu nie będzie potrzeby pisania własnego kodu, wyrażeń regularnych etc. Mając na uwadze, że konieczność wykorzystania haków do Similarity występuje tylko w przypadku korzystania z qTranslate możemy śmiało pokusić się o wtórne skorzystanie z jej kodu.</p>
<p>W tym przypadku mamy szczególne ułatwienie, gdyż wtyczka qTranslate uruchamiana jest przed wtyczką Similarity, zatem źródła tej pierwszej są już załadowane. Czyli utworzenie rozwiązania sprowadza się do odnalezienia i wykorzystania właściwej funkcji. Z poszukiwaniami było ciężko, na szczęście edytory pomagają śledzić kolejne wywołania funkcji. Dzięki temu już po kilkunastu przeskokach miałem odnalezioną odpowiednią funkcję z wtyczki qTranslate.</p>
<p>Szukana funkcja to: <code class="b">qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage($lang)</code>, nazywa się ciekawie <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Jedyne co nam pozostaje to wywołanie tej funkcji w odpowiednim miejscu wtyczki Similarity. Dokładnie to są to 2 miejsca, (oryginalnie linia 200 i 281). Jako, że kod może zostać wywoływany w dwóch miejscach lepiej będzie utworzyć oddzielną funkcję, którą w razie konieczności zmian można zastąpić czymkolwiek innym. Interesują nas dwie linie 200 i 281 pliku <code class="b">similarity/similarity.php</code>. Są to linie generujące linki do podobnych postów. W tym kodzie istotną zmienną jest <code class="b">$post-&gt;post_title</code>, która odpowiada za to co użytkownik widzi na ekranie.</p>
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$impression</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;{title}&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$post</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post_title</span><span style="color: #339933;">,</span><span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;{url}&quot;</span><span style="color: #339933;">,</span>get_permalink<span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;{strength}&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$list</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'strength'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;{link}&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;&lt;a href=<span style="color: #000099; font-weight: bold;">\&quot;</span>{url}<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;{title}&lt;/a&gt;&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$output_template</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>
<p>Odnajdujemy miejsca utworzenia zmiennej <code class="b">$post</code> (linie 143 oraz 215), dopisujemy za nimi:</p>
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// linia 143</span>
<span style="color: #000088;">$post</span> <span style="color: #339933;">=</span> get_post<span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// dopisujemy:</span>
<span style="color: #000088;">$post</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post_title</span> <span style="color: #339933;">=</span> qtranslate_post_title<span style="color: #009900;">&#40;</span><span style="color: #000088;">$post</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post_title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//(..)</span>
<span style="color: #666666; font-style: italic;">// linia 215</span>
<span style="color: #000088;">$post</span> <span style="color: #339933;">=</span> get_post<span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// dopisujemy:</span>
<span style="color: #000088;">$post</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post_title</span> <span style="color: #339933;">=</span> qtranslate_post_title<span style="color: #009900;">&#40;</span><span style="color: #000088;">$post</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post_title</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>
<p>Teraz zostało nam już tyko wywołać odpowiednią funkcję z wtyczki qTranslate. Robimy to następująco:</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * Hak poprawiający wyświetlanie podobnych linków
 * @author Vokiel | http://blog.vokiel.com/?p=598
 * @param string $title
 **/</span>
<span style="color: #000000; font-weight: bold;">function</span> qtranslate_post_title<span style="color: #009900;">&#40;</span><span style="color: #000088;">$title</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: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> wp_specialchars<span style="color: #009900;">&#40;</span>qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage<span style="color: #009900;">&#40;</span><span style="color: #000088;">$title</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$title</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>
<p>Prosty warunek sprawdzający czy wymagana funkcja została zdefiniowana (załadowana), jeśli tak, to poprawiamy link, jeśli nie, to zostaje zwrócony taki jaki był. Mam nadzieje, że się komuś jeszcze przyda</p>
<p>Voila!</p>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/pamieciozerny-wordpress-memory-exhausted-zbyt-maly-memory_limit" title="Pamięciożerny WordPress &#8211; memory exhausted, zbyt mały memory_limit (12 Wrzesień 2009)">Pamięciożerny WordPress &#8211; memory exhausted, zbyt mały memory_limit</a> (5)</li>
	<li><a href="http://blog.vokiel.com/optymalizacja-wordpress-cz-2" title="Optymalizacja WordPress cz 2 (26 Wrzesień 2009)">Optymalizacja WordPress cz 2</a> (1)</li>
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
	<li><a href="http://blog.vokiel.com/eclipse-helios-na-windows7-x6" title="Eclipse Helios na Windows 7 x64 (27 Czerwiec 2010)">Eclipse Helios na Windows 7 x64</a> (5)</li>
	<li><a href="http://blog.vokiel.com/css-minify-combine-zmniejszanie-laczenie-plikow-css-w-jeden" title="CSS minify – combine: zmniejszanie i łączenie plików css w jeden (16 Wrzesień 2009)">CSS minify – combine: zmniejszanie i łączenie plików css w jeden</a> (0)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/neXOAcmO6TA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/wtyczka-similarity-wspolpracujaca-z-qtranslate/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/wtyczka-similarity-wspolpracujaca-z-qtranslate</feedburner:origLink></item>
		<item>
		<title>PHP w trybie CGI – autentyfikacja HTTP – system logowania</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/zGvdv5DsycE/php-w-trybie-cgi-autentyfikacja-http-system-logowania</link>
		<comments>http://blog.vokiel.com/php-w-trybie-cgi-autentyfikacja-http-system-logowania#comments</comments>
		<pubDate>Fri, 06 Aug 2010 21:00:44 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[autentyfikacja]]></category>
		<category><![CDATA[cgi]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[logowanie]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=583</guid>
		<description><![CDATA[System logowania w PHP oparty na autentyfikacji HTTP. Pomimo, iż oficjalna wersja w manualu stwierdza, że takie logowanie nie jest możliwe jeśli PHP pracuje w trybie CGI, jednak okazuje się, że jest możliwość obejścia tego ograniczenia.]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.vokiel.com/wp-content/uploads/2010/08/auth-300x197.png" alt="Autentyfikacja HTTP " title="Autentyfikacja HTTP" width="300" height="197" class="alignright size-medium wp-image-595" /></p>
<p>Ostatnio, podczas przenosin dość starej aplikacji na nowy serwer natknąłem się na problem z powodu wykorzystania autentyfikacji <abbr title="HyperText Transfer Protocol">HTTP</abbr>. Problem okazał się błachy, jednak w momencie przenosin i pierwszych testów miałem problem z diagnozą przyczyn takiego stanu rzeczy.</p>
<p><span id="more-583"></span></p>
<h2>Opis sytuacji</h2>
<p>Na wstępie krótko opiszę sytuację, objawy jakie się pojawiły. W dalszej części pokażę sposób poradzenia sobie z problemem.</p>
<p>Na starym serwerze <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> działał sobie jako zwykły moduł apache. Jako, że aplikacja była pisana dawno temu, wówczas system logowania oparty na autentyfikacji HTTP wydawał się wystarczający. Tym bardziej, iż była to aplikacja intranetowa. Po przenosinach na nowy serwer okazało się, że okienko autentyfikacji nie przestawało wyskakiwać nawet po podaniu poprawnego loginu i hasła. Na pierwszy ogień poszło sprawdzenie poprawności przeniesionej bazy danych, użytkownika bazy, zawartości tabel. Okazało się, że wszystko jest ok, zatem na warsztat poszedł test systemu logowania.</p>
<h2>System logowania oparty o autentyfikację HTTP</h2>
<p>System logowania był bardzo prosty. Pobrane dane z <code class="b">$_SERVER[&#039;PHP_AUTH_USER&#039;]</code> oraz <code class="b">$_SERVER[&#039;PHP_AUTH_PW&#039;]</code> były porównywane z tymi w bazie danych. Jeśli autoryzacja nie przebiegała pomyślnie wyświetlany był odpowiedni komunikat i po trzech sekundach strona była odświeżana z ponownym wyświetleniem okienka autentyfikacji.</p>
<p>Skrócony na potrzeby przykładu plik index.php.</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PHP_AUTH_USER'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'WWW-Authenticate: Basic realm=&quot;Logowanie&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HTTP/1.0 401 Unauthorized'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">DEFINE</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'LOGINSALT'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'TESTOWYSALTLOGOWANIA'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'class/db/db.class.php'</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'class/login.class.php'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$login_string</span> <span style="color: #339933;">=</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PHP_AUTH_USER'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>LOGINSALT<span style="color: #339933;">.</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PHP_AUTH_PW'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$logowanie</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> login<span style="color: #009900;">&#40;</span><span style="color: #000088;">$login_string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$logowanie</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">login</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$logowanie</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isLogged</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: #666666; font-style: italic;">// ok</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">'notLogged.php'</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'WWW-Authenticate: Basic realm=&quot;Logowanie&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HTTP/1.0 401 Unauthorized'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>
<p>Jak widać jest to bardzo proste, wręcz banalne rozwiązanie. Z tą różnicą względem podstawowych systemów opartych na <code class="b">.htpasswds</code>, że dane użytkowników są przechowywane w bazie danych.</p>
<p>Sama klasa logowania też jest bardzo prosta. Jednak w tym wypadku, doskonale spełniała swoje założenia. Wersja odchudzona:</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * Klasa logowania
 *
 * @param string $login_string - Ciąg danych logowania md5(login+salt+md5(hasło))
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> login<span style="color: #009900;">&#123;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Ciąg logowania
	 *
	 * @var string
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_login_string</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Stan zalogowania
	 *
	 * @var bool $_logged
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_logged</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Id zalogowanego użytkownika
	 *
	 * @var int
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_id</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Konstruktor klasy logowania
	 *
	 * @param string $login_string
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$login_string</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_login_string <span style="color: #339933;">=</span> <span style="color: #000088;">$login_string</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Logowanie użytkownika
	 *
	 * @return bool
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> login<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> db_class<span style="color: #009900;">&#40;</span>DB_HOST<span style="color: #339933;">,</span>DB_LOGIN<span style="color: #339933;">,</span>DB_PASS<span style="color: #339933;">,</span>DB_NAME<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT `ID` FROM `LISTA_USR` WHERE md5(CONCAT(`LOGIN`,'&quot;</span><span style="color: #339933;">.</span>LOGINSALT<span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;',`PASS`))='&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_login_string<span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;' ;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sqlQuery</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sqlNumRows</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&gt;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRow</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_id <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ID'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_logged <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Sprawdzenie czy zalogowany
	 *
	 * @return bool $this-&gt;_logged
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> isLogged<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_logged<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Pobranie ID zalogowanego użytkownika
	 *
	 * @return int $this-&gt;_id;
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getUsrId<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_id<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>
<p>Rozwiązanie proste jak budowa cepa. Nie ma się tu nad czym rozwodzić. Niestety w trybie CGI się nie sprawdza, gdyż w zmiennej <code class="b">$_SERVER</code> nie ma zmiennych <code class="b">$_SERVER[&#039;PHP_AUTH_USER&#039;]</code> oraz <code class="b">$_SERVER[&#039;PHP_AUTH_PW&#039;]</code>.</p>
<h2>Rozwiązanie</h2>
</p>
<p>Rozwiązaniem na brak wymaganych zmiennych okazał się odpowiedni wpis w <code class="b">.htaccess</code>, który tworzył nową zmienną w tablicy <code class="b">$_SERVER</code>, do której przypisywał ciąg logowania .</p>
<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">RewriteRule .<span style="color: #000000; font-weight: bold;">*</span> - <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #007800;">E</span>=HTTP_AUTHORIZATION:<span style="color: #000000; font-weight: bold;">%</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>HTTP:Authorization<span style="color: #7a0874; font-weight: bold;">&#125;</span>,L<span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>
<p>Teraz wystarczyło tylko obsłużyć ten ciąg po stronie PHP. Dane zapisane do zmiennej <code class="b">$_SERVER[&#039;REDIRECT_HTTP_AUTHORIZATION&#039;]</code> są kodowane przy wykorzystaniu base64. W celu wydobycia loginu i hasła, trzeba pobrać fragment tego zmiennej, zdekodować i rozbić po znaku dwukropka.</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PHP_AUTH_USER'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PHP_AUTH_PW'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':'</span><span style="color: #339933;">,</span> <span style="color: #990000;">base64_decode</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_AUTHORIZATION'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>
<p>To by było na tyle. Strona się uruchomiła, login i hasło zostało przyjęte, użytkownik zalogowany. Ale, ale&#8230; Byłoby zbyt prosto. Po kliknięciu na dowolny odnośnik (było wykorzystane przepisywanie adresów) w oczy rzucał się błąd 404.</p>
<p>Okazało się, że nasza regułka włączająca autentyfikację HTTP była zbyt zachłanna i przyjmowała na siebie całą pracę, nie dopuszczając innych regułek do pracy.</p>
<p>W związku z tym trzeba było opracować inne rozwiązanie, takie, które dawało obsługę przyjaznych adresów oraz <code class="b">$_SERVER[&#039;PHP_AUTH_USER&#039;]</code> i <code class="b">$_SERVER[&#039;PHP_AUTH_PW&#039;]</code></p>
<h2>Finalne rozwiązanie</h2>
</p>
<p>Jak człowiek siądzie i pomyśli, to wymyśli. Pierwszy pomysł był dobry, ale zabrakło w nim podstawowej rzeczy, warunku, dla którego miał być aktywowany. Poza tym umieszczenie go na początku pliku <code class="b">.htaccess</code> też nie było mądre. Po przeniesieniu reguły na koniec pliku, oraz dodaniu odpowiedniego warunku wszystko zaczęło działać jak należy.</p>
<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">RewriteCond <span style="color: #000000; font-weight: bold;">%</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>HTTP:Authorization<span style="color: #7a0874; font-weight: bold;">&#125;</span> ^<span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
RewriteRule ^<span style="color: #7a0874; font-weight: bold;">&#40;</span>.<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> - <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #007800;">E</span>=HTTP_AUTHORIZATION:<span style="color: #000000; font-weight: bold;">%</span>1<span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>
<p>Dodatkowo należało przerobić skrypt wyciągający nazwę użytkownika i hasło ze zmiennej <code class="b">$_SERVER[&#039;REDIRECT_HTTP_AUTHORIZATION&#039;]</code>, gdyż poprzedni skrypt rozsypywał się, gdy użytkownik miał hasło zawierające znak dwukropka.</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REDIRECT_HTTP_AUTHORIZATION'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PHP_AUTH_USER'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$auth_params</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;:&quot;</span> <span style="color: #339933;">,</span> <span style="color: #990000;">base64_decode</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REDIRECT_HTTP_AUTHORIZATION'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PHP_AUTH_USER'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$auth_params</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$auth_params</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PHP_AUTH_PW'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #000088;">$auth_params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>
<h2>Podsumowanie</h2>
<p>Jak się okazało, obeszło się bez przepisywania systemu logowania na zwykły formularz. Poza tym nie zawsze należy wierzyć temu co jest napisane w manualu:</p>
<blockquote><p>Uwierzytelnianie HTTP jest obsługiwana przez PHP tylko wtedy, gdy PHP pracuje jako moduł Apache&#8217;a, nie jest dostępna w trybie CGI.</p></blockquote>
<p>Czyba czas najwyższy przepisać część działających aplikacji na &#8222;dobry&#8221;, działający w różnych konfiguracjach system logowania. Systemy oparte na autentyfikację HTTP są dobre dla wbudowanych rozwiązań (routery, zarządzalne switch&#8217;e, etc), zwykłe aplikacje powinny mieć normalny system uwierzytelniania i autoryzacji.</p></p>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/pamieciozerny-wordpress-memory-exhausted-zbyt-maly-memory_limit" title="Pamięciożerny WordPress &#8211; memory exhausted, zbyt mały memory_limit (12 Wrzesień 2009)">Pamięciożerny WordPress &#8211; memory exhausted, zbyt mały memory_limit</a> (5)</li>
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
	<li><a href="http://blog.vokiel.com/css-minify-combine-zmniejszanie-laczenie-plikow-css-w-jeden" title="CSS minify – combine: zmniejszanie i łączenie plików css w jeden (16 Wrzesień 2009)">CSS minify – combine: zmniejszanie i łączenie plików css w jeden</a> (0)</li>
	<li><a href="http://blog.vokiel.com/wtyczka-similarity-wspolpracujaca-z-qtranslate" title="Wtyczka Similarity współpracująca z qTranslate (27 Sierpień 2010)">Wtyczka Similarity współpracująca z qTranslate</a> (0)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" title="The Small Calendar &#8211; jQuery + PHP w praktyce (24 Luty 2010)">The Small Calendar &#8211; jQuery + PHP w praktyce</a> (5)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/zGvdv5DsycE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/php-w-trybie-cgi-autentyfikacja-http-system-logowania/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/php-w-trybie-cgi-autentyfikacja-http-system-logowania</feedburner:origLink></item>
		<item>
		<title>Eclipse Helios na Windows 7 x64</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/E8Iqq6sZUPw/eclipse-helios-na-windows7-x6</link>
		<comments>http://blog.vokiel.com/eclipse-helios-na-windows7-x6#comments</comments>
		<pubDate>Sun, 27 Jun 2010 19:36:06 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[XYZ]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[linux tools]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[wtyczki]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=550</guid>
		<description><![CDATA[Nowa wersja Eclipse 3.6 Helios - największe z dotychczasowych wydań. Eclipse udostępnia 12 różnych projektów w tym oczywiście dla programistów PHP – czyli Eclipse for PHP Developers. W tym wpisie dowiesz się co nowego w Eclipse Helios, oraz przede wszystkim jak zainstalować to IDE na Windows7 x64.]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.vokiel.com/wp-content/uploads/2010/06/eclipse_logo-300x1501.jpg" alt="Eclipse" title="Eclipse" width="300" height="165" class="alignright size-full wp-image-567" />
<p>23 czerwca 2010 r nastąpiło wydanie nowej wersji <a rel="nofollow" target="_blank" href="http://www.eclipse.org/#referrer=blog.vokiel.com" title="Eclipse">Eclipse</a> 3.6 <a rel="nofollow" target="_blank" href="http://www.eclipse.org/helios/#referrer=blog.vokiel.com" title="Eclipse Helios">Helios</a> . Owo wydanie jest największym z dotychczasowych wydań: 39 różnych zespołów projektowych, 33 miliony linii kodu, 490 commiterów. Eclipse udostępnia <a rel="nofollow" target="_blank" href="http://www.eclipse.org/downloads/#referrer=blog.vokiel.com" title="Pakiety Eclipse - strona pobierania">12 różnych projektów</a>, dla różnych typów programistów. W tym oczywiście dla programistów PHP &#8211; czyli <a rel="nofollow" target="_blank" href="http://www.eclipse.org/downloads/packages/eclipse-php-developers/heliosr#referrer=blog.vokiel.com" title="Eclipse for PHP Developers">Eclipse for PHP Developers</a> . Czemu o tym piszę? Przede wszystkim dlatego, że Eclipse PDT jest moim ulubionym IDE, jest tym, na którym pracuję zawodowo, do którego jestem bardzo przyzwyczajony (dotychczas Eclipse Galileo).</p>
<p><span id="more-550"></span></p>
<h2>Nowości w Eclipse Helios</h2>
<p>Helios wprowadza wiele nowości, część z nich, z punktu widzenia web developera nie ma większego znaczenia. Jednak warto mieć na uwadze zaangażowanie twórców, różnorodność tworzonych rozwiązań, ilość zaangażowanych developerów.</p>
<h3>1. Lepsze wsparcie dla Linuxa</h3>
<p>Ostatnie badania wskazały na rosnący udział systemu spod znaku pingwina w ogólnej liczbie developerów korzystających z tego IDE. Twórcy Eclipse wyszli im naprzeciw wprowadzając szereg usprawnień dedykowanych pod systemy z tej kategorii. Stworzony został <a rel="nofollow" target="_blank" href="http://www.eclipse.org/linuxtools/#referrer=blog.vokiel.com" title="Linux Tools Project">Linux Tools Project</a> , który ma na celu ułatwienie pracy przy programowaniu w C/C++. Zintegrowano m.in. GNU Autotools, Valgrind, OProfile, RPM, SystemTap, GCov, GProf, LTTng, etc.</p>
<h3>2. Eclipse Marketplace Client</h3>
<div id="attachment_562" class="wp-caption alignright" style="width: 233px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/06/eclipse_marketplace.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2010/06/eclipse_marketplace-223x300.jpg" alt="Eclipse Marketplace" title="Eclipse Marketplace" width="223" height="300" class="size-medium wp-image-562" /></a><p class="wp-caption-text">Eclipse Marketplace</p></div>
<p>Jest to klient zapewniający developerom dostęp do czegoś w rodzaju <em>&#8222;app-store&#8221;</em> z tą różnicą, że dotyczy wtyczek. Daje możliwość łatwego przeglądania i instalowania nowych plug-in&#8217;ów. Będzie dostępnych ponad 100 wtyczek w jednym katalogu, co ma znacznie ułatwić i usprawnić ich wybieranie i dodawanie do programu.</p>
<h3>3. Wsparcie dla Git&#8217;a</h3>
<p>Pojawiło się długo oczekiwane wsparcie dla Git&#8217;a (popularnego rozproszonego systemu kontroli wersji). Wprowadzone zostało w projektach EGit oraz JGit. Nowe wydanie EGit 0.8 zawiera nowy widok repozytoriów Git&#8217;a, wsparcie dla &#8222;fast forward merging&#8221; oraz tagowania. JGit 0.8 &#8211; które jest wykorzystywane w EGicie dla połączeń z repozytoriami Git pokazało duży skok wydajności aż do 50% podczas pracy z dużymi repozytoriami.</p>
<h3>4. Nowości w Web Tools Platform</h3>
<p>WTP wprowadza wsparcie dla tworzenia, uruchamiania i debugowania aplikacji napisanych pod najnowsze specyfikacje Java EE (Java EE 6) włączając Servlet 3.0, JPA 2.0, JSF 2.0, and EJB 3.1.</p>
<h3>5. Poprawione wsparcie dla <abbr title="JavaScript Development Tools">JSDT</abbr></h3>
<p><div id="attachment_561" class="wp-caption alignleft" style="width: 310px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/06/eclipse_linux.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2010/06/eclipse_linux-300x243.jpg" alt="Framework w JSDT" title="Framework w JSDT" width="300" height="243" class="size-medium wp-image-561" /></a><p class="wp-caption-text">Framework w JSDT</p></div>
<p>Ulepszone wsparcie dla JSDT dla programistów JavaScript. W tym framework debugera JavaScript, który umożliwia integrację debugerów JavaScript, takich jak Rhino i Firebug oraz korzystanie z nich bezpośrednio w IDE. Został utworzony nowy pakiet <a rel="nofollow" target="_blank" href="http://www.eclipse.org/downloads/packages/eclipse-ide-javascript-web-developers/heliosr#referrer=blog.vokiel.com" title="Eclipse IDE for JavaScript Web Developers">Eclipse IDE for JavaScript Web Developers</a> , który ma na celu ułatwienie programistom JavaScript odszukania, zainstalowania i korzystania z IDE na bazie Eclipse.</p>
<h3>6. Eclipse Xtext 1.0</h3>
<p>Popularny framework do tworzenia <abbr title="domain specific languages">DSL</abbr>, wprowadza 80 nowych funkcji, w tym lepszą wydajność i skalowalność do 30 razy lepszą niż w poprzednich wersjach. Nowa funkcja indeksowania w pamięci umożliwia rozwój bardziej zaawansowanych technologii DSL w Xtext. Framework dostarcza wszystkich potrzebnych w programowaniu funkcji – koloryzacji składni, walidacji kodu, formatowania czy autouzupełniania.</p>
<h3>7. Acceleo 3.0</h3>
<p>Nowe wydanie Acceleo implementuje model specyfikacji OMG (<abbr title="Model-to-text">MTL</abbr>) oraz zapewnia funkcje wymagane przez generator kodu IDE. </p>
<h3>8. Usprawnienia źródeł</h3>
<p>W tej części zawiera się wiele drobniejszych zmian, które jednak mogą znacznie wpływać na komfort pracy. Są to:</p>
<div id="attachment_572" class="wp-caption alignright" style="width: 310px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/06/open-resource-path-relative.png"><img src="http://blog.vokiel.com/wp-content/uploads/2010/06/open-resource-path-relative-300x178.png" alt="Open resource path relative" title="Open resource path relative" width="300" height="178" class="size-medium wp-image-572" /></a><p class="wp-caption-text">Open resource path relative</p></div>
<ol class="nice-list">
<li>Wirtualne foldery &#8211; foldery nie istniejące fizycznie w systemie plików. Tworzone są jedynie dla aktualnego obszaru roboczego.</li>
<li>Drap and drop &#8211; obsługa przeciągania plików z eksploratora systemowego. Poza tym istnieje możliwość otwierania plików z linii komend. Wydaje się, że to nic wielkiego, jednak w połączeniu ze specjalnie do tego przygotowanym <a rel="nofollow" target="_blank" href="http://aniefer.blogspot.com/2010/05/opening-files-in-eclipse-from-command.html#referrer=blog.vokiel.com" title="Opening files in Eclipse from the command line">API</a> ficzer staje się bardzo funkcjonalny.</li>
<li>Uniksowe prawa dostępu &#8211; dostępne są pełne uniksowe prawa dostępu do zasobów.</li>
<li>Remote System Explorer &#8211; framework, który pozwala pracować na różnorodnych zewnętrznych źródłach, tak, jakby były umieszczone w lokalnej lokalizacji. Daje możliwość pracy m.in. poprzez wykorzystanie zdalnych plików SSH, FTP; zdalnego dostępu do powłoki; zdalnej obsługi procesów przez agentów dstore; czy zdalnego debugowania przy pomocy CDT/gdb</li>
<li>Filtrowanie wyszukiwania &#8211; daje możliwość wyszukiwania w źródłach przy uwzględnieniu masek, znaków specjalnych etc. (patrz screen: Open resource path relative)</li>
</ol>
<h2>Start z Eclipse</h2>
<p>Rozpoczęcie pracy z Eclipse, dla osób nie posiadających doświadczenia z tym IDE:</p>
<h3>Pobranie</h3>
<p>Start z Eclipse najlepiej rozpocząć od <a rel="nofollow" target="_blank" href="http://www.eclipse.org/downloads/#referrer=blog.vokiel.com" title="Pakiety Eclipse - strona pobierania">strony pobierania</a>, z której można pobrać wybraną wersję (Eclipse for PHP Developers, Eclipse IDE for JavaScript Web Developers czy Eclipse for RCP and RAP Developers oraz wiele innych).</p>
<h3>Pluginy</h3>
<p>Kolejnym bardzo ważnym elementem są pluginy. Pluginy w Eclipse mogą znacznie rozszerzać funkcjonalność IDE. Właściwie każda dedykowana wersja czy to do PHP, czy C++ opiera się na pluginach. Nowością w tej wersji, jak już wspomniałem wcześniej, jest <a rel="nofollow" target="_blank" href="http://marketplace.eclipse.org/#referrer=blog.vokiel.com" title="Eclipse Marketplace">Eclipse Marketplace</a>, drugim, głównym, miejscem do wyszukiwania wtyczek jest strona <a rel="nofollow" target="_blank" href="http://www.eclipse-plugins.info/eclipse/index.jsp#referrer=blog.vokiel.com" title="Eclipse plugins">eclipse-plugins.info</a>.</p>
<h3>Dalsza nauka</h3>
<p>Poza tym wartymi uwagi są <a rel="nofollow" target="_blank" href="http://www.eclipse.org/resources?type=book#referrer=blog.vokiel.com" title="Książki o Eclipse">książki</a>, <a rel="nofollow" target="_blank" href="http://www.eclipse.org/resources?category=Getting%20Started#referrer=blog.vokiel.com" title="Tutoriale">tutoriale</a>, <a rel="nofollow" target="_blank" href="http://wiki.eclipse.org/The_Official_Eclipse_FAQs#referrer=blog.vokiel.com" title="Frequently Asked Questions">FAQ</a> oraz <a rel="nofollow" target="_blank" href="http://wiki.eclipse.org/Main_Page#referrer=blog.vokiel.com" title="Eclipse Wiki">wiki</a>. W razie problemów warto przejrzeć <a rel="nofollow" target="_blank" href="http://www.eclipse.org/forums/#referrer=blog.vokiel.com" title="Eclipse forum">forum</a>, na którym możemy spotkać się z innymi użytkownikami, ich rozwiązaniami. Na koniec, rozwiązanie dla najbardziej zawziętych i wytrwałych &#8211; <a rel="nofollow" target="_blank" href="http://help.eclipse.org/helios/index.jsp#referrer=blog.vokiel.com" title="Eclipse documentation - Current Release<br />
Eclipse Helios">dokumentacja</a> </p>
<h3>Rozwijanie</h3>
<p>Kolejnym etapem zaznajomienia się z tą platformą może być partycypacja w jej tworzeniu. Przede wszystkim każdy może zgłaszać odnalezione przez siebie <a rel="nofollow" target="_blank" href="http://bugs.eclipse.org/bugs/#referrer=blog.vokiel.com" title="Eclipse bugs">luki i błędy</a> oraz pomagać innym użytkownikom na forum.</p>
<h2>Instalacja na Windows 7</h2>
<p>Pierwotnie cały wpis miał dotyczyć tylko tego aspektu. Jednak w związku z tym, iż w większości wpisów na tym blogu opisuję poruszane tematy w miarę kompleksowo, trudno mi było poprzestać na tak krótkim wpisie.</p>
<p>Pierwsza próba uruchomienia nowego Eclipse, na niedawno postawionym Windows 7 zakończyła się niepowodzeniem. Okazało się, że Eclipse nie widzi zainstalowanego w systemie środowiska uruchomieniowego javy (<abbr title="Java Runtime Environment">JRE</abbr>). Jego przeinstalowanie, restart systemu na nic się nie zdało. Eclipse może pracować na różnych wersjach maszyn wirtualnych javy &#8211; oficjalnie rekomendowaną jest 1.5. Dla developerów kodujących w javie proponuje się wykorzystanie <abbr title="Java Development Kit">JDK</abbr> zamiast JRE.</p>
<p>Aby zainstalować nowe Eclipse Helios (nowa instalacja, nie aktualizacja) należy pobrać wybraną wersję ze strony eclipse. W moim przypadku (Win7 x64) pobrałem adekwatną, 64 bitową wersję Eclipse for PHP Developers. Następnie należy wypakować ją do wybranego katalogu &#8211; u mnie był to katalog <code class="b">eclipse</code> zlokalizowany w <code class="b">c:\Program Files\</code> (z racji wersji x64).</p>
<p>Na koniec pozostało poinformowanie IDE o istnieniu JRE poprzez dopisanie ścieżki w pliku konfiguracyjnym. Plik ten <code class="b">eclipse.ini</code> zlokalizowany w katalogu głównym programu:<br />
<code class="b">c:\Program Files\eclipse\eclipse.ini</code> powinien zawierać następujące linie:</p>
<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">-vm
c:/Program Files/Java/jre1.5.0_22/bin/javaw.exe</pre></div></div>
<p>Całość mojego startowego pliku konfiguracyjnego wygląda następująco:</p>
<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.0.v20100503
-product
org.eclipse.epp.package.php.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vm
c:/Program Files/Java/jre1.5.0_22/bin/javaw.exe
-vmargs
-Dosgi.requiredJavaVersion<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">1.5</span>
-Xms40m
-Xmx512m</pre></div></div>
<div style="text-align: center; width: 200px; float: right; border: 1px solid #ECECEC; padding: 10px;">
<script src="http://helion.pl/plugins/new/ksiazkasm.phi?id=eclweb&#038;nr=4648Y&#038;double=double&#038;size=125"></script>
</div>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
	<li><a href="http://blog.vokiel.com/pamieciozerny-wordpress-memory-exhausted-zbyt-maly-memory_limit" title="Pamięciożerny WordPress &#8211; memory exhausted, zbyt mały memory_limit (12 Wrzesień 2009)">Pamięciożerny WordPress &#8211; memory exhausted, zbyt mały memory_limit</a> (5)</li>
	<li><a href="http://blog.vokiel.com/wtyczka-similarity-wspolpracujaca-z-qtranslate" title="Wtyczka Similarity współpracująca z qTranslate (27 Sierpień 2010)">Wtyczka Similarity współpracująca z qTranslate</a> (0)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" title="The Small Calendar &#8211; jQuery + PHP w praktyce (24 Luty 2010)">The Small Calendar &#8211; jQuery + PHP w praktyce</a> (5)</li>
	<li><a href="http://blog.vokiel.com/optymalizacja-wordpress-cz-2" title="Optymalizacja WordPress cz 2 (26 Wrzesień 2009)">Optymalizacja WordPress cz 2</a> (1)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/E8Iqq6sZUPw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/eclipse-helios-na-windows7-x6/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/eclipse-helios-na-windows7-x6</feedburner:origLink></item>
		<item>
		<title>CONFidence 2010 – IT Security Event – relacja</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/VoV1wfhhddA/confidence-2010-it-security-event-relacja</link>
		<comments>http://blog.vokiel.com/confidence-2010-it-security-event-relacja#comments</comments>
		<pubDate>Mon, 31 May 2010 20:37:29 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[confidence]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[SQL Injection]]></category>
		<category><![CDATA[XSS]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=493</guid>
		<description><![CDATA[Relacja z konferencji CONFidence, która odbyła się 25-26.05 2010 w Krakowie. Czołówka światowej klasy specjalistów przez dwa dni w jednym miejscu. Profesjonalne warsztaty, panele dyskusyjne, konkursy]]></description>
			<content:encoded><![CDATA[<div id="attachment_496" class="wp-caption alignright" style="width: 264px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/05/logo.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2010/05/logo.jpg" alt="CONFidence 2010 - Kraków" title="CONFidence 2010 - Kraków" width="254" height="53" class="size-full wp-image-496" /></a><p class="wp-caption-text">źródło: 2010.confidence.org.pl</p></div>
<p>W dniach 25-26.05 2010 w Krakowie odbyła się konferencja CONFidence, w której miałem przyjemność uczestniczyć. Konferencja odbyła się już ósmy raz (od 2005r.). Skupia czołówkę światowej klasy specjalistów. W trakcie tej dwudniowego spotkania odbyło się wiele prezentacji opisujących nowe, nieujawniane dotychczas wyniki badań. CONFidence to nie tylko konferencja, to także profesjonalne warsztaty, panele dyskusyjne, konkursy, Fight Club, Hackers for Charity Roulette, CONFidence Speed Breaking oraz wiele innych.
</p>
<p>Tematy konferencji obejmowały wiele aspektów bezpieczeństwa, w tym także bezpieczeństwa aplikacji internetowych, o czym w dalszej części wpisu.</p>
<p><span id="more-493"></span></p>
<h2>Słowem wstępu</h2>
<div id="attachment_499" class="wp-caption alignleft" style="width: 310px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/05/klub_spolem_zuk1.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2010/05/klub_spolem_zuk1-300x225.jpg" alt="Klub Społem - Żuk" title="Klub Społem - Żuk" width="300" height="225" class="size-medium wp-image-499" /></a><p class="wp-caption-text">źródło: www.krakow.come2europe.eu</p></div>
<p style="padding-top: 12px;">Na wstępie chciałbym zauważyć, że przygotowanie konferencji było na bardzo wysokim poziomie. Obsługa, lokalizacja (Kino Kijów), zaplecze, a przede wszystkim prelegenci. </p>
<p>Zabytkowe kamienice Krakowa, mnogość pubów w piwniczkach (genialny Społem Pub), konkursy polegające na zdobywaniu kolejnych i kolejnych tworzyły ciekawą mieszanką. </p>
<p>Generalnie mam bardzo pozytywne wrażenia. Wróćmy do tematu &#8211; bezpieczeństwa.</p>
<h2 style="clear: both;display:block;float:none;overflow:auto;">&nbsp;</h2>
<h2>Agenda</h2>
<p>Konferencja skupiła ponad 30 specjalistów. Rozłożenie tej grupy zaledwie na 2 dni konferencji spowodowało konieczność utworzenia dwóch równoległych bloków. Niestety, trzeba było wybierać na które prezentacje się idzie, a które omija. Pełna agenda dostępna jest na stronie <a rel="nofollow" target="_blank" href="http://2010.confidence.org.pl/agenda#referrer=blog.vokiel.com">CONFidence &#8211; Agenda</a> </p>
<p><h3>Wybrane prezentacje, o których chcę wspomnieć</h3>
<ol class="nice-list">
<li>Anonimowość, prywatność i współpraca z TORem w rzeczywistym świecie &#8211; Jacob Appelbaum</li>
<li>Bezpieczeństwo jest &#8222;do bani&#8221; &#8211; Eddie Schwartz</li>
<li>Dobrze znane luki w ludzkim mózgu i zachowaniu – powszechne błędy administratorów &#8211; Wojciech Bojdol</li>
<li>Dan Kaminsky</li>
<li>Teraźniejszość i przyszłość wielowarstwowych ataków sieciowych i XSSQLI &#8211; Mario Heiderich</li>
</ol>
<p>Powyżej prezentują listę tylko tych wybranych, współgrających z tematyką bloga. Oczywiście ciekawych wystąpień było dużo więcej, jak chociażby prezentacja: &#8222;Nie możecie nas zatrzymać: najnowsze trendy w technikach exploit&#8221; &#8211; Alexey Sintsov. Czy Ataki na telefonię komórkową i sposoby zapobiegania im – jak bezpieczeństwo zmieni sytuację na rynku telefonii komórkowej &#8211; Tam Hanna</p>
<h2>Prezentacje</h2>
<h3>Anonimowość, prywatność i współpraca z TORem w rzeczywistym świecie &#8211; Jacob Appelbaum </h3>
<p>Temat tego wystąpienia nie jest ściśle związany z tematyką bloga, jednak warto o nim wspomnieć. <a rel="nofollow" target="_blank" href="https://www.torproject.org/#referrer=blog.vokiel.com" title="Projekt TOR">TOR</a> jest projektem i otwartą siecią, wykorzystywanym przeciwko cenzurze, dającym ludziom na całym świecie możliwość dostępu do treści nie filtrowanych przez rządy. Pomaga chronić użytkowników przed inwigilacją, która zagraża anonimowości, prywatności, prowadzeniu poufnych interesów i osobistej komunikacji. Niestety, często u nas kojarzony jest przez wielu ludzi jako siedlisko zła, pedofilii. Być może za sprawą wypowiedzi kilku nieznających tematu polityków.</p>
<p>Z punktu widzenia web developera, korzystanie przez odwiedzających z TOR&#8217;a powoduje trudności w zbieraniu statystyk odwiedzin. Większość statystyk opisujących źródła odwiedzin będą zakłamane. Jeśli na domiar tego, użytkownicy będą korzystać ze specjalnie przygotowanych przeglądarek, traking takich osób będzie niemożliwy, bądź gromadzone statystyki będą zakłamane.</p>
<h3>Bezpieczeństwo jest &#8222;do bani&#8221; &#8211; Eddie Schwartz </h3>
<p>Świetna prezentacja, raczej nie związana z projektowaniem aplikacji www. Skupia się na bezpieczeństwie systemów, sieci. Sposób przedstawienia tematu oraz sam autor (Eddie Schwartz jest głównym oficerem ds. bezpieczeństwa w NetWitness i ma 25 lat doświadczenia w dziedzinie bezpieczeństwa informacji i prywatności), zrobiły na mnie duże wrażenie.</p>
<h3>Dobrze znane luki w ludzkim mózgu i zachowaniu – powszechne błędy administratorów &#8211; Wojciech Bojdol </h3>
<p>Prezentacja dająca spojrzenie z trochę innej strony &#8211; psychologicznej. Temat dość ciekawy, rzeczy, o których większość się nawet nie zastanawia. Na prezentacji zostały przedstawione błędy wynikające z wad ludzkiej percepcji, lekceważenie niepomyślnych informacji, nie dopuszczanie informacji sprzecznych z naszym zdaniem, iluzje pamięciowe, iluzja nieomylności. Moim zdaniem warte uwagi kwestie, nie tylko z punktu widzenia bezpieczeństwa systemów, sieci. Programiści też czasem myślą, że są nieomylni, że skoro mają 5 lat doświadczenia to wiedzą najlepiej jak rozwiazać dane zagadnienie, wydają się nie widzieć oznak problemów, błędów. Ma to swoje odzwierciedlenie później w jakości powstałego kodu, czy to aplikacji stacjonarnej, czy webowej.</p>
<h3>Dan Kaminsky </h3>
<p><a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Dan_Kaminsky#referrer=blog.vokiel.com">Dan Kaminsky</a> jest znaną postacią w kwestiach bezpieczeństwa. Trzeba przyznać, że poza wiedzą jest bardzo ciekawą osobowością. Jego wystąpienie poruszało tematykę bezpiecznego tworzenia aplikacji internetowych. Wiele miejsca zostało poświęcone tematyce SQL-Injection, z tym, że z innego, niż powszechnie, punktu widzenia. Dan skupił się na takim przygotowaniu narzędzi, aby programiści z łatwością mogli z nich korzystać. Jak zauważył na wstępie, większość luk pojawia się ponieważ developerzy są leniwi. Przykładowo, pomimo, że istnieje w PDO bindowanie parametrów i tak wielu programistów woli podstawiać zmienne bezpośrednio do zapytania.</p>
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT * FROM `TABELA` WHERE `POLE` like <span style="color: #006699; font-weight: bold;">$pole</span> OR `POLE2` like <span style="color: #006699; font-weight: bold;">$pole2</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>
<p>Powyższy zapis jest wygodniejszy w stosowaniu, niż ten poniżej. W dodatku zawiera się w jednej linii, nie w trzech.</p>
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$stmt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_db<span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT * FROM `TABELA` WHERE `POLE` like :pole OR `POLE2` like :pole2&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindParam</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':pole'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pole</span><span style="color: #339933;">,</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">PARAM_STR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindParam</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':pole2'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pole2</span><span style="color: #339933;">,</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">PARAM_STR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>
<p>W związku z tym, proponuje stworzenie takich narzędzi, które spowodują, że programiści będą tworzyć aplikacje w najszybszy dla nich sposób, z tym, że będą one bezpieczne.</p>
<h2>Teraźniejszość i przyszłość wielowarstwowych ataków sieciowych i XSSQLI &#8211; Mario Heiderich</h2>
<p>Moim zdaniem najlepsza prezentacja (dla web developera) z całej konferencji. <a rel="nofollow" target="_blank" href="http://mario.heideri.ch/#referrer=blog.vokiel.com">Mario Heiderich</a> jest niezależnym konsultantem ds. bezpieczeństwa i trenerem, mieszka w Kolonii, a także pracuje dla szerokiej gamy firm niemieckich i międzynarodowych. W wolnym czasie Mario lubi spędzać dużo czas z oknem konsoli Firebug. Zakres poruszonych kwestii jest bardzo szeroki, wstęp do prezentacji wygąda następująco:</p>
<ol class="nice-list">
<li>Co się stało z bezpieczeństwem aplikacji www?</li>
<li>XSS, wstrzykiwanie SQL, Auth i path traversal</li>
<li>Mamy obecnie niesamowite rzeczy! NoScript, the IE8 and Chromium XSS filter and CSP</li>
<li>Użytkownicy muszą być bezpieczniejszi niż kiedykolwiek! </li>
<li>WWW się nie zmieniło? </li>
<li>Nie było żadego HTML5 i następnego pokolenia przeglądarek?</li>
</ol>
<p>Mario zaprezentował bardzo dużo różnorodnych luk, niestety zabezpieczenie się przed większością z nich możliwe jest tylko poprzez wyłączenie JavaScript. Oczywiście, w obecnej sytuacji, tak radykalny krok spowoduje pojawienie się utrudnień w korzystaniu z aplikacji webowych, niektóre z nich całkowicie unieruchomi. W związku z tym, pozostaje nam czekać na aktualizacje przeglądarek. W gestii ich producentów pozostaje napisanie takich silników, które uniemożliwią przeprowadzenie takich ataków</p>
<p>Przykładowo, osoby dysponujące przeglądarką z zainstalowanym firebugiem (lub inną konsolą js) polecam przetestowanie kilku poniższych kawałków kodu</p>
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">top<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#40;</span>Number.<span style="color: #660066;">MAX_VALUE</span><span style="color: #339933;">/</span><span style="color: #CC0000;">45268</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">36</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">15</span><span style="color: #339933;">,</span><span style="color: #CC0000;">19</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>Number.<span style="color: #660066;">MAX_VALUE</span><span style="color: #339933;">/</span><span style="color: #CC0000;">99808</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">36</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">71</span><span style="color: #339933;">,</span><span style="color: #CC0000;">76</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'(&quot;XSS&quot;)'</span><span style="color: #009900;">&#41;</span></pre></div></div>
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">ω<span style="color: #339933;">=</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#91;</span>Ṫ<span style="color: #339933;">,</span>Ŕ<span style="color: #339933;">,,</span>É<span style="color: #339933;">,,</span>Á<span style="color: #339933;">,</span>Ĺ<span style="color: #339933;">,</span>Ś<span style="color: #339933;">,,,</span>Ó<span style="color: #339933;">,</span>Ḃ<span style="color: #009900;">&#93;</span><span style="color: #339933;">=!</span><span style="color: #3366CC;">''</span><span style="color: #339933;">+</span><span style="color: #009900;">&#91;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>Ś<span style="color: #339933;">+</span>Ó<span style="color: #339933;">+</span>Ŕ<span style="color: #339933;">+</span>Ṫ<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>ω<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>Á<span style="color: #339933;">+</span>Ĺ<span style="color: #339933;">+</span>É<span style="color: #339933;">+</span>Ŕ<span style="color: #339933;">+</span>Ṫ<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span>Ó<span style="color: #339933;">+</span>ω<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>Ḃ<span style="color: #339933;">+</span>Ṫ<span style="color: #339933;">+</span>Ó<span style="color: #339933;">+</span>Á<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Á«)'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>
<p>Ten kod to szaleństwo! Sprawdźcie demo na stronie Mario&#8217;s: <a rel="nofollow" target="_blank" href="http://heideri.ch/jso/what???#referrer=blog.vokiel.com" title="Szaleństwo demo">http://heideri.ch/jso/what???</a> (działa tylko w IE)</p>
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #CC0000;">1</span><span style="color: #339933;">;--&lt;?</span>f<span style="color: #339933;">&gt;&lt;</span>l￦<span style="color: #339933;">:!!:</span>x\
<span style="color: #339933;">/</span>style<span style="color: #339933;">=</span>`b<span style="color: #339933;">&amp;</span>#x5c<span style="color: #339933;">;</span>65h\0061vIo\r<span style="color: #339933;">/</span>ĸ
<span style="color: #339933;">:</span>url<span style="color: #009900;">&#40;</span>#def<span style="color: #339933;">&amp;</span>#x61ult#time2<span style="color: #009900;">&#41;</span>\ö<span style="color: #339933;">/</span><span style="color: #3366CC;">';'</span>`￦<span style="color: #339933;">/</span>onb
egin<span style="color: #339933;">=</span>
<span style="color: #339933;">&amp;</span>#x5bμ<span style="color: #339933;">=</span>\u00<span style="color: #339933;">&amp;</span>#054<span style="color: #339933;">;</span>1le<span style="color: #339933;">&amp;</span>#114t<span style="color: #339933;">&amp;</span>#<span style="color: #CC0000;">40</span><span style="color: #339933;">&amp;</span>#x31<span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>#
x5d<span style="color: #339933;">&amp;</span>#x2f<span style="color: #339933;">/&amp;</span>#xyŧ\<span style="color: #339933;">&gt;</span></pre></div></div>
<p>Lub zaprezentowanego ataku XSSQLI (atak XSS poprzez wykorzystanie SQL Injection)</p>
<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> UpdateXML<span style="color: #66cc66;">&#40;</span>concat<span style="color: #66cc66;">&#40;</span> 0x3c<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'script'</span><span style="color: #66cc66;">,</span>0x3e<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'alert(1)'</span><span style="color: #66cc66;">,</span>0x3c<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'/script'</span><span style="color: #66cc66;">,</span>0x3e<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'/x'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>
<p>Obszerniejsza relacja z prezentacji Mario w kolejnym wpisie.</p>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
	<li><a href="http://blog.vokiel.com/thesmallcalendar" title="The Small Calendar (7 Marzec 2010)">The Small Calendar</a> (0)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-windows-gadget" title="The Small Calendar &#8211; Windows gadżet (7 Marzec 2010)">The Small Calendar &#8211; Windows gadżet</a> (3)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" title="The Small Calendar &#8211; jQuery + PHP w praktyce (24 Luty 2010)">The Small Calendar &#8211; jQuery + PHP w praktyce</a> (5)</li>
	<li><a href="http://blog.vokiel.com/sledzik-na-nasza-klasa-pl-metoda-na-usuniecie" title="Śledzik na nasza-klasa.pl &#8211; Metoda na usunięcie (22 Wrzesień 2009)">Śledzik na nasza-klasa.pl &#8211; Metoda na usunięcie</a> (2)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/VoV1wfhhddA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/confidence-2010-it-security-event-relacja/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/confidence-2010-it-security-event-relacja</feedburner:origLink></item>
		<item>
		<title>The Small Calendar – Windows gadżet</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/rMmto_h2BCw/the-small-calendar-windows-gadget</link>
		<comments>http://blog.vokiel.com/the-small-calendar-windows-gadget#comments</comments>
		<pubDate>Sun, 07 Mar 2010 20:30:19 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[en]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[pl]]></category>
		<category><![CDATA[The Small Calendar]]></category>
		<category><![CDATA[thesmallcalendar]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=391</guid>
		<description><![CDATA[The Small Calendar - nowa odsłona pod postacią systemowego gadżetu. Gadżet dostępny dla systemów Windows Vista oraz Windows 7. Całość napisana przy użyciu JavaScript, CSS, (x)HTML.]]></description>
			<content:encoded><![CDATA[<p>Tak jak zaplanowałem na końcu wpisu <a href="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" title="The Small Calendar – jQuery + PHP w praktyce">The Small Calendar – jQuery + PHP w praktyce</a>, postanowiłem stworzyć systemowy (windowsowy) gadżet z <strong>The Small Calendar</strong>. W tym wpisie postaram się przybliżyć tajniki tworzenia takowych gadżetów. Gadżety pojawiły się wraz z Vistą &#8211; jako element sidebar&#8217;a, w Windows 7 są już autonomicznymi programikami, które mogą być porozrzucane wszędzie na pulpicie.</p>
<p><span id="more-391"></span></p>
<div class="source_demo_container">
<a rel="nofollow" target="_blank" href="/dema/thesmallcalendar/TheSmallCalendar.gadget.zip" class="source" title="Źródła">Źródła</a><a rel="nofollow" target="_blank" href="/dema/thesmallcalendar/" class="demo" title="Demo">Demo</a>
</div>
<h2>Pierwsze kroki</h2>
<p>Platforma gadżetów Windows jest frameworkiem dla tworzenia i hostowania mini-aplikacji. Tworzenie aplikacji odbywa się niemalże tak samo, jak zwykłych stron internetowych. Do wykorzystania są technologie <abbr title="Extensible HyperText Markup Language">(x)HTML</abbr>, <abbr title="Cascading Style Sheets">CSS</abbr>, JavaScript, <abbr title="Microsoft's version of JAVAScript">JScript</abbr>, <abbr title="Microsoft's Visual Basic Scripting Edition">VBscript</abbr>. Oczywiście dołączanie gotowych bibliotek jest możliwe, w tym przykładzie pokażę jak łatwo można skorzystać z biblioteki jQuery.</p>
<h3>Katalog przechowywania</h3>
<p>Gadżety są przechowywane w konkretnym katalogu. Rozpoczynając tworzenie nowego gadżetu katalog najlepiej utworzyć smodzielnie (później, po zakończeniu prac utworzony gadżet będzie się sam instalował). Folder przechowywania gadżetów w Windows 7: <code class="b">%localappdata%\Microsoft\Windows Sidebar\Gadgets\</code>. Czyli dla użytkownika Vokiel będzie to np: <code class="b">C:\Users\Vokiel\AppData\Local\Microsoft\Windows Sidebar\Gadgets\</code>. W tym katalogu należy utworzyć folder dla danego gadżetu, nazwę kończąc na <code class="b">.gadget</code>. W naszym przypadku będzie to <code class="b">TheSmallCalendar.gadget</code>.</p>
<div id="attachment_397" class="wp-caption aligncenter" style="width: 640px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/03/TheSmallCalendar_gadget_localization-e1267911326116.png"><img src="http://blog.vokiel.com/wp-content/uploads/2010/03/TheSmallCalendar_gadget_localization-e1267911326116.png" alt="The Small Calendar Gadżet - Folder lokalizacji" title="The Small Calendar Gadżet - Folder lokalizacji" width="630" height="126" class="size-full wp-image-397" /></a><p class="wp-caption-text">The Small Calendar Gadżet - Folder lokalizacji</p></div>
<h3>Manifest</h3>
<p>Plik <code class="b">gadget.xml</code> opisuje zawartość paczki, czyli gadżetu. Zawiera podstawowe informacje na temat dodatku, które później widoczne są na ekranie gadżetów.</p>
<p>Tworzony przeze mnie kalendarz zawiera następujący opis:</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gadget<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>The Small Calendar<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;namespace<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>vokiel.widgets<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/namespace<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.0.2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;author</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Vokiel&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;info</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;logo</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;img/icon.png&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copyright<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #ddbb00;">&amp;#169;</span> Vokiel | vokiel.com<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/copyright<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>To jest mały kalendarz, który pozwala sprawdzić dzień tygodnia dla wybranej daty. Ten kalendarz jest inny niż wszystkie, posiada tylko jeden blok dni!<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;icons<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;icon</span> <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;48&quot;</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;48&quot;</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;img/TheSmallCalendar_48x48.png&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/icons<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;hosts<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;host</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;sidebar&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;base</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;HTML&quot;</span> <span style="color: #000066;">apiVersion</span>=<span style="color: #ff0000;">&quot;1.0.0&quot;</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;TheSmallCalendar.html&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;permissions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Full<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/permissions<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;platform</span> <span style="color: #000066;">minPlatformVersion</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;defaultImage</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;img/TheSmallCalendar_48x48.png&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/host<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/hosts<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gadget<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>
<p>Opisywanie szczegółów zawartości tego pliku nie jest konieczne, znaczniki XML są tak dobrane, iż same w sobie są dostatecznym opisem. Najważniejszą rzeczą w tym pliku jest wskazanie pliku głównego gadżetu, w tym przypadku jest to <code class="b">TheSmallCalendar.html</code>, ten plik zostanie otwarty przy starcie aplikacji.</p>
<p>Wynik opisu zawartego w powyższym listingu kodu przedstawia się następująco: </p>
<div id="attachment_396" class="wp-caption aligncenter" style="width: 640px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/03/TheSmallCalendar_gadgets_screen-e1267911344480.png"><img src="http://blog.vokiel.com/wp-content/uploads/2010/03/TheSmallCalendar_gadgets_screen-e1267911344480.png" alt="The Small Calendar Gadżet - Ekran gadżetów" title="The Small Calendar Gadżet - Ekran gadżetów" width="630" height="457" class="size-full wp-image-396" /></a><p class="wp-caption-text">The Small Calendar Gadżet - Ekran gadżetów</p></div>
<p>Dokładny opis, które pola odnoszą się do jakich elementów przedstawia screen pochodzący ze źródła &#8211; czyli Microsoftu </p>
<div class="wp-caption aligncenter" style="width: 630px"><a rel="nofollow" target="_blank" href="http://i.msdn.microsoft.com/Bb508509.GadgetPicker_with_callouts(en-us,VS.85).png"><img src="http://i.msdn.microsoft.com/Bb508509.GadgetPicker_with_callouts(en-us,VS.85).png" alt="The Small Calendar Gadżet - Elementy manifestu" title="The Small Calendar Gadżet - Elementy manifestu" width="620" height="446" class="size-full wp-image-396" /></a><p class="wp-caption-text">The Small Calendar Gadżet - Elementy manifestu</p></div>
<h3>Struktura plików</h3>
<p>Aby zachować porządek utwórzmy następującą strukturę plików:</p>
<div id="attachment_405" class="wp-caption aligncenter" style="width: 523px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/03/TheSmallCalendar_gadget_folders.png"><img src="http://blog.vokiel.com/wp-content/uploads/2010/03/TheSmallCalendar_gadget_folders.png" alt="The Small Calendar Gadżet - Struktura katalogów" title="The Small Calendar Gadżet - Struktura katalogów" width="513" height="230" class="size-full wp-image-405" /></a><p class="wp-caption-text">The Small Calendar Gadżet - Struktura katalogów</p></div>
<p>W katalogu <strong>css</strong> będziemy przechowywać zewnętrzne arkusze stylów (dla strony głównej gadżetu oraz dla strony z ustawieniami). Następnie w katalogu <strong>img</strong> elementy graficzne, a w folderze <strong>js</strong> &#8211; jak się nie trudno domyśleć: pliki z zawartością JavaScript &#8211; najważniejsze w naszej aplikacji. Katalogi pochodzące od nazw języków posłużą do przechowywania wersji językowych dla tłumaczeń.</p>
<h3>Wersje językowe</h3>
<p>Jak wspomniałem powyżej, możliwym jest utworzenie katalogów tłumaczeń na inne języki. Za sprawą genialnej obsługi tłumaczeń po stronie systemu, kwestia jest tu bardzo prosta. System poszukuje plików przeszukując katalogi według ustalonej kolejności. Zaczynając od pełnej nazwy lokalizacji, np.: en-us, pl_pl; następnie jeśli nie zostanie znaleziona, przechodzi do poszukiwań katalogu ze skróconą nazwą, np.: en, pl; jeśli to zawiedzie, przeszuka główny katalog gadżetu. Poszukiwana wersja językowa jest oczywiście tą, jaka została ustawiona w systemie. Zatem jeśli uruchamiamy komputer z polską wersją językową Windowsa, system uruchamiając gadżety będzie poszukiwał plików językowych w następującej kolejności: pl_PL -> pl -> katalog główny.</p>
<p>Ważnym zaznaczenia jest fakt, iż możliwe jest utworzenie różnych wersji językowych dla plików opisujących gadżet.</p>
<p>Wykorzystanie w praktyce tłumaczeń jest banalenie proste. Tworzymy zmienne w JavaScript, którym przypisujemy wartości tłumaczeń odpowiednio dla danego języka, następnie tłumaczenia te zapisujemy do odpowiednich katalogów. Dalej w kodzie jawnie z nich korzystamy, bez konieczności wywoływania odpowiedniego pliku z tłumaczeniem &#8211; tym zajmie się za nas system.</p>
<p>Plik <code class="b">pl\local.js</code></p>
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> lng <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
lng.<span style="color: #660066;">legend_year</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Ustawienia daty'</span><span style="color: #339933;">;</span>
lng.<span style="color: #660066;">label_year</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Rok'</span><span style="color: #339933;">;</span></pre></div></div>
<p>Plik <code class="b">en\local.js</code></p>
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> lng <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
lng.<span style="color: #660066;">legend_year</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Date settings'</span><span style="color: #339933;">;</span>
lng.<span style="color: #660066;">label_year</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Year'</span><span style="color: #339933;">;</span></pre></div></div>
<p>Użycie dalej w kodzie sprowadza się do wywołania zmiennych:</p>
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#legend_year'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span>lng.<span style="color: #660066;">legend_year</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>
<h2>System.Gadget</h2>
<p>Gadżety miałyby niewielką przydatność dyby nie możliwość zapisu ustawień. Możliwość dostosowania ich do użytkownika otwiera wiele możliwości, w połączeniu z ajaxem &#8211; niemal niezliczone. Dostępne są gadżety dające możliwość podglądu twittera, dodawania nowych wpisów, śledzenia stanu pogody w wybranym mieście itd. Wszystko to ze względu na możliwość zapisu preferencji użytkownika.</p>
<p>Zadanie to odbywa się przy wykorzystaniu dwóch (czterech) najważniejszych metod.<br />
Są to: <code class="b">System.Gadget.Settings.writeString(&quot;NazwaZmiennej&quot;, &quot;Wartosc&quot;);</code><br />
oraz <code class="b">System.Gadget.Settings.readString(&quot;NazwaZmiennej&quot;);</code> oraz ich odpowiedników próbujących odgadnąć typ danych, tj: <code class="b">.read()</code> i <code class="b">.write()</code>. Dzięki tym metodom mamy możliwość zapisu ustawień, które mogą zostać odczytane po restarcie komputera.</p>
</p>
<p>Oczywiście <code class="b">System.Gadget</code> to nie tylko ustawienia. Obiekt <code class="b">System.Gadget</code> jest o wiele bardziej złożony . Wykorzystamy z niego tylko podstawowe metody, będą to: </p>
<ol class="nice-list">
<li><strong>System.Gadget.settingsUI</strong> &#8211; włączenie funkcjonalności ustawień, wskazanie pliku ustawień</li>
<li><strong>System.Gadget.onShowSettings</strong> &#8211; wskazanie funkcji uruchamianej po kliknięciu opcji ustawień</li>
<li><strong>System.Gadget.onSettingsClosing</strong> &#8211; wskazanie funkcji uruchamianej przy zamykaniu opcji ustawień</li>
<li><strong>System.Gadget.onSettingsClosed</strong> &#8211; wskazanie funcji uruchamianej po zamknięciu opcji ustawień</li>
<li><strong>System.Gadget.version</strong> &#8211; pobranie numeru wersji gadżetu</li>
</ol>
<h3>Start z JavaScript</h3>
<p>Wykorzystując powyższe metody z obiektu System.Gadget stworzymy ogólny zarys gadżetu, system przepływu danych i akcji. Plik główny gadżetu <code class="b">js\TheSmallCalendar.js</code></p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * włączenie funkcjonalności ustawień, wskazanie pliku ustawień
 */</span>
System.<span style="color: #660066;">Gadget</span>.<span style="color: #660066;">settingsUI</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Settings.html&quot;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">/**
 * wskazanie funcji uruchamianej po zamknięciu opcji ustawień
 */</span>
System.<span style="color: #660066;">Gadget</span>.<span style="color: #660066;">onSettingsClosed</span> <span style="color: #339933;">=</span> SettingsClosed<span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">/**
 * wskazanie funkcji uruchamianej po kliknięciu opcji ustawień
 */</span>
System.<span style="color: #660066;">Gadget</span>.<span style="color: #660066;">onShowSettings</span> <span style="color: #339933;">=</span> SettingsShow<span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Następnie dlegacja funkcji w pliku <code class="b">js\settings.js</code></p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/**
 * wskazanie funkcji uruchamianej przy zamykaniu opcji ustawień
 */</span>
System.<span style="color: #660066;">Gadget</span>.<span style="color: #660066;">onSettingsClosing</span> <span style="color: #339933;">=</span> SettingsClosing<span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Mając zarys wydelegowanych funkcji przejdziemy do głównej części &#8211; tj. tworzenia gadżetu <strong>The Small Calendar</strong></p>
<h2>The Small Calendar</h2>
<p>The Small Calendar Gadget będzie zawierał dwa pliki html (główny + plik ustawień), dla każdej z tych stron zostanie utworzony oddzielny plik z ostylowaniem CSS oraz pliki js.</p>
<h3>Pliki HTML</h3>
<p>Pierwszy plik, główny gadżetu będzie bardzo prosty, praktycznie niemalże pusty, a to ze względu, iż treść zostanie wygenerowana dynamicznie przy pomocy javascript. Utwórzmy zatem prostą strukturę strony html, dołączając zewnętrzny arkusz styli CSS oraz pliki JavaScript. Jak widać na poniższym listingu mamy tylko jeden element głównego dokumentu: div z określonym id. Do niego to właśnie wpiszemy nasz kalendarz. Dołączonych plików js jest aż 4, są to: biblioteka jQuery, plik z domyślnymi ustawieniami, plik językowy (Windows sam przeszuka katalogi w poszukiwaniu tłumaczeń), ostatni plik to nasz główny rdzeń aplikacji.</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;MSThemeCompatible&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;yes&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;css/TheSmallCalendar.css&quot;</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span> <span style="color: #000066;">onload</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Init();&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;vokiel_small_calendar&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;js/jquery-1.4.2.min.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">language</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;javascript&quot;</span> <span style="color: #000066;">charset</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;utf-8&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;js/defaults.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">language</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;javascript&quot;</span> <span style="color: #000066;">charset</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;utf-8&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;local.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">language</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;javascript&quot;</span> <span style="color: #000066;">charset</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;utf-8&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;js/TheSmallCalendar.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">language</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;javascript&quot;</span> <span style="color: #000066;">charset</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;utf-8&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></td></tr></table></div>
<p>Style CSS są znane z <a href="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" title="The Small Calendar – jQuery + PHP w praktyce">poprzedniego wpisu</a>, zostały tylko nieznacznie dostosowane do gadżetu. Ważną informacją jest konieczność zdefiniowania wielkości dokumentu. W przeciwnym razie nasz gadżet nie będzie widoczny.</p>
<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">body<span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">284px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">295px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #cc00cc;">#F0F0F0</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>
<h3>Ustawienia</h3>
<p>Temat ustawień jest również bardzo prosty. Polega na utworzeniu strony z formularzem, w którym można zdefiniować wybrane opcje. Przy kliknięciu w ustawienia wywoływana jest funkcja dołączona do akcji onload dla body (w naszym przypadku jest to <code class="b">InitSettings()</code>). Funkcja ta odczytuje zapisane wartości zmiennych <code class="b">System.Gadget.Settings.readString()</code> (jeśli nie zostały ustawione pobiera domyślne), następnie wpisuje je do pól formularza. W tym gadżecie, w celu większej przejrzystości, funkcję zdefiniowałem bezpośrednio w kodzie html. Lepszym rozwiązaniem byłoby przypisanie jej do eventów.</p>
<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">document.<span style="color: #660066;">onreadystatechange</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;">if</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">readyState</span><span style="color: #339933;">==</span><span style="color: #3366CC;">&quot;complete&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// kod</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>
<p>Po zmianie ustawień i kliknięciu przycisku potwierdzającego wywoływana jest funkcja wydelegowana dla<br />
<code class="b">System.Gadget.onSettingsClosing</code>, w niej ustawiania odczytywane są z pól formularza, sprawdzane, następnie zapisywane w systemie <code class="b">System.Gadget.Settings.writeString()</code>.</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;MSThemeCompatible&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;yes&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;css/settings.css&quot;</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span> <span style="color: #000066;">onload</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;InitSettings();&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">legend</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;legend_year&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;year&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;label_year&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;year&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;year&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;4&quot;</span> <span style="color: #000066;">accept</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0123456789&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">fieldset</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fieldset_colors&quot;</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">legend</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;legend_color&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;color_31&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;label_color_31&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;</span>#<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;color_31&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;color_31&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;6&quot;</span> <span style="color: #000066;">accept</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0123456789ABCDEF&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;color_30&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;label_color_30&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;</span>#<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;color_30&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;color_30&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;6&quot;</span> <span style="color: #000066;">accept</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0123456789ABCDEF&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;color_2829&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;label_color_2829&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span>&gt;</span>#<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;color_2829&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;color_2829&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;6&quot;</span> <span style="color: #000066;">accept</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0123456789ABCDEF&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">small</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;author_url&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">small</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">small</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;ver&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">small</span>&gt;</span>
&nbsp;
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;js/jquery-1.4.2.min.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">language</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;javascript&quot;</span> <span style="color: #000066;">charset</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;utf-8&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;js/defaults.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">language</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;javascript&quot;</span> <span style="color: #000066;">charset</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;utf-8&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;local.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">language</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;js/settings.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">language</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></td></tr></table></div>
<p>Jak widać na listingu powyżej, strona z ustawieniami posiada 4 edytowalne pola. Są to: rok, kolory tła dla miesięcy z podziałem wg ilości dni w danym miesiącu (31,30,28 i/lub 29). Oczywiście roszerzenie ich o kolejne jest jak najbardziej zasadne. W planie mam dodanie koloru tekstu, gdyż obecnie po zmianie tła na jasny odcień całość staje się nieczytelna. Jednak na potrzeby przykładu, wprowadzenia do tematu wystarczy nam kilka podstawowych opcji.</p>
<p>Panel opcji wygląda następująco:</p>
<div id="attachment_427" class="wp-caption aligncenter" style="width: 352px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/03/TheSmallCalendar_gadget_options.png"><img src="http://blog.vokiel.com/wp-content/uploads/2010/03/TheSmallCalendar_gadget_options.png" alt="The Small Calendar Gadżet - Ustawienia" title="Gadżet - Ustawienias" width="342" height="368" class="size-full wp-image-427" /></a><p class="wp-caption-text">The Small Calendar Gadżet - Ustawienia</p></div>
<h3>Schemat działania</h3>
<p>Przechodzimy do meritum tworzenia gadżetu, czyli połączenia zdobytej wiedzy w jedną, działającą całość. Być może poprzednia część wpisu wydaje się oderwana od siebie, mam nadzieję, że po tej części i zakończeniu wszystko stanie się jasne.</p>
<p>Schemat działania gadżetu jest dość intuicyjny.</p>
<ol class="nice-list">
<li>Instalacja gadżetu, system korzystając z danych zawartych w pliku <code class="b">gadget.xml</code> wyświetla informację o dodatku.</li>
<li>W znaczniku <code class="b">base</code> znajdującego się w gałęzi <code class="b">hosts-&gt;host</code> znajduje się informacja, który plik ma być uznany za główny gadżetu.</li>
<li>Przy uruchomieniu gadżetu dołączane są pliki js, w których zawarta jest domyślna konfiguracja, zapisane tłumaczenia językowe, oraz funkcje generujące treść dodatku.</li>
<li>Wywołuje się funkcja <code class="b">Init();</code> zawarta w pliku <code class="b">js/TheSmallCalendar.js</code>, która odczytuje zapisane ustawienia (jeśli ich nie ma pobiera domyślne), generuje kalendarz, wpisuje go do gadżetu, koloruje kalendarz zgodnie z ustawieniami kolorów.</li>
<li>W przypadku kliknięcia ikonki opcji, system otwiera plik opcji zdefiniowany w js poprzez przypisanie<br />
<code class="b">System.Gadget.settingsUI = &quot;Settings.html&quot;;</code></li>
<li>Po załadowaniu strony wywoływana jest funkcja <code class="b">InitSettings()</code>, która uzupełnia etykiety o odpowiednie tłumaczenia <code class="b">LoadLang()</code> oraz wpisuje zapisane/domyślne ustawienia w pola formularza <code class="b">LoadSettings()</code></li>
<li>Po zatwierdzeniu ustawień uruchamiana jest funkcja <code class="b">SettingsClosing()</code>, która odczytuje zmienne wpisane w formularzu ustawień i zapisuje je do konfiguracji. Dzięki temu po restarcie sytemu ustawienia zostaną zachowane (w przypadku wyłączenia gadżetu i ponownego włączenia ustawienia są resetowane)</li>
<li>Po zamknięciu panelu ustawień, zapisaniu zmian, wywoływana jest funkcja <code class="b">SettingsClosed()</code>, z pliku js przypisanego do strony głównej gadżetu. Czyli sterowanie przekazywane jest z powrotem na stronę<br />
<code class="b">TheSmallCalendar.html</code>, wywoływana funkcja została wydelegowana przez<br />
<code class="b">System.Gadget.onSettingsClosed = SettingsClosed;</code></li>
<li>Uruchomiona funkcja <code class="b">SettingsClosed()</code> przeładowuje kalendarz, tak jakby został pierwszy raz uruchomiony. W przypadku innych gadżetów wystarczającym może być przeładowanie jednego fragmentu gadżetu, niestety w tym zwykle niezbędne jest utworzenie kalendarza od nowa (zmiana roku).</li>
</ol>
<h3>Tworzenie paczki &#8211; .gadget</h3>
<p>Ostatnim etapem jest utworzenie gotowej paczki, jednego pliku, instalatora gadżetu. W tym miejscu programistom z Microsoft należy się uznanie. Tworzenie takiej paczki sprowadza się do zwykłego spakowania katalogu zip&#8217;em i zmiany rozszerzenia na <code class="b">gadget</code>. Oczywiście jest też inna droga, można utworzyć paczki <abbr title="Cabinet">CAB</abbr> umożliwiające elektroniczne podpisanie archiwum .</p>
<h2>Zakończenie</h2>
</p>
<p>Stworzony gadżet, podobnie jak jego <a href="http://blog.vokiel.com/dema/thesmallcalendar/" title="The Small Calendar - Demo">wersja on-line</a>, zachował funkcjonalności wyboru roku, zmiany języka, reagowania na pojawienie się kursora myszy nad wybranymi częściami. </p>
<p>Funkcjonalności nie ubyło. Doszło kilka usprawnień. Korzystanie z gadżetu nie wymaga otwartej przeglądarki, jest poręczniejsze, szybsze. Wybór wersji językowej jest automatyczny, dzięki czemu odpada konieczność kilku dodatkowych kliknięć. Raz skonfigurowany gadżet może być stosowany przez długi czas.</p>
<h3>Strona projektu</h3>
<p>Zapraszam na specjalnie przygotowaną stronę projektu: <a href="http://blog.vokiel.com/thesmallcalendar/" title="The Small Calendar - Home">http://blog.vokiel.com/thesmallcalendar/</a></p>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/thesmallcalendar" title="The Small Calendar (7 Marzec 2010)">The Small Calendar</a> (0)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" title="The Small Calendar &#8211; jQuery + PHP w praktyce (24 Luty 2010)">The Small Calendar &#8211; jQuery + PHP w praktyce</a> (5)</li>
	<li><a href="http://blog.vokiel.com/earn-fame-and-fortune-in-the-nettuts-screenrscreencast-ompetition" title="(English) Earn Fame and Fortune in the Nettuts/Screenr Screencast Competition (3 Październik 2009)">(English) Earn Fame and Fortune in the Nettuts/Screenr Screencast Competition</a> (1)</li>
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
	<li><a href="http://blog.vokiel.com/sledzik-na-nasza-klasa-pl-metoda-na-usuniecie" title="Śledzik na nasza-klasa.pl &#8211; Metoda na usunięcie (22 Wrzesień 2009)">Śledzik na nasza-klasa.pl &#8211; Metoda na usunięcie</a> (2)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/rMmto_h2BCw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/the-small-calendar-windows-gadget/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/the-small-calendar-windows-gadget</feedburner:origLink></item>
		<item>
		<title>The Small Calendar – jQuery + PHP w praktyce</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/q-9dP9DoRH4/the-small-calendar-jquery-php-w-praktyce</link>
		<comments>http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce#comments</comments>
		<pubDate>Wed, 24 Feb 2010 15:02:39 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[en]]></category>
		<category><![CDATA[kalendarz]]></category>
		<category><![CDATA[pl]]></category>
		<category><![CDATA[thesmallcalendar]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=334</guid>
		<description><![CDATA[The Small Callendar - czyli mały kalendarz, który umożliwia sprawdzenie wybranej daty pod kątem dnia tygodnia. Różni się od standardowych tym, że ma tylko jeden blok z dniami miesiąca. Postanowiłem stworzyć taki kalendarzyk on-line przy wykorzystaniu PHP oraz odrobiny jQuery, plus oczywiście CSS.]]></description>
			<content:encoded><![CDATA[<p>Na <a rel="nofollow" target="_blank" href="http://www.grafishdesign.it/blog/the-small-calendar-eng#referrer=blog.vokiel.com">Grafish Design&#8217;s Blog</a> natknąłem się na <em>The Small Calendar</em>. Czyli mały kalendarz, który umożliwia sprawdzenie wybranej daty pod kątem dnia tygodnia. Przedstawiony tam kalendarz jest wersją do druku (dostępny do pobrania w ponad 30 językach). Kalendarz ten różni się od standardowych tym, że ma tylko jeden blok z dniami miesiąca. Postanowiłem stworzyć taki kalendarzyk on-line przy wykorzystaniu <abbr title="PHP: Hypertext Preprocessor">PHP</abbr> oraz odrobiny jQuery, plus oczywiście <abbr title="Cascading Style Sheets">CSS</abbr>.<br />
<span id="more-334"></span></p>
<div class="source_demo_container">
<a rel="nofollow" target="_blank" href="/dema/thesmallcalendar/thesmallcalendar.zip" class="source" title="Źródła">Źródła</a><a rel="nofollow" target="_blank" href="/dema/thesmallcalendar/" class="demo" title="Demo">Demo</a>
</div>
<h2>Cel</h2>
<p>Kalendarz w wersji oryginalnej wygląda następująco:</p>
<div id="attachment_336" class="wp-caption aligncenter" style="width: 435px"><a href="http://blog.vokiel.com/wp-content/uploads/2010/01/smallcalendareng.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2010/01/smallcalendareng.jpg" alt="The Small Calendar" title="smallcalendareng" width="425" height="650" class="size-full wp-image-336" style="margin: 0 auto;" /></a><p class="wp-caption-text">The Small Calendar - Grafish Design's Blog</p></div><br />
<em>źródło: Grafish Design&#8217;s Blog &#8211; The small calendar 2010 (en) .</em></p>
<h3>Planowana przeze mnie wersja będzie miała:</h3>
<ol class="nice-list">
<li>Wygląd przypominający oryginał</li>
<li>Wybór roku innego niż aktualny</li>
<li>Wielojęzyczność</li>
<li>Możliwość podświetlania kolumny dat</li>
<li>Możliwość podświetlania wierszy miesięcy</li>
<li>Możliwość podświetlania dni tygodnia dla wybranych dat</li>
<li>Możliwość przenoszenia bloku dat po kliknięciu na wiersz miesiąca</li>
</ol>
<h2>Generowanie kalendarza: PHP</h2>
<p>Do wygenerowania kalendarza posłużymy się prostą klasą, która wygeneruje nam kilka rzeczy. Po pierwsze stworzymy listę miesięcy, dla każdego z nich sprawdzimy liczbę dni, sprawdzimy dzień tygodnia dla pierwszego dnia miesiąca. Następnie stworzymy na tej podstawie tablicę, która będzie zawierała skróty nazw miesięcy (w wybranym języku), dla wybranego roku, do każdego z miesięcy przypiszemy ilość dni oraz odpowiednio posortowane skróty nazw dni tygodnia.</p>
<p>Klasa ta jest bardzo prosta, zatem możemy ją nazwać imitacją klasy, zbiorem funkcji opakowanych w klasę.</p>
<p><strong>Lista metod:</strong></p>
<ol class="nice-list">
<li><strong>public</strong> __construct &#8211; 2 parametry opcjonalne: rok, tablica z danymi języka | konstruktor</li>
<li><strong>public</strong> setLanguage &#8211; 1 parametr: tablica z tłumaczeniami | ustawienie języka</li>
<li><strong>public</strong> getdatesTable &#8211; 0 parametrów | tworzy tablicę dni</li>
<li><strong>public</strong> getCalendar &#8211; 0 parametrów | pobiera tablicę z kalendarzem</li>
<li><strong>private</strong> generateMonths &#8211; 0 parametrów | generuje miesiące</li>
<li><strong>private</strong> generateDayNames &#8211; 0 parametrów | tworzy dni tygodnia w odpowiedniej kolejności</li>
</ol>
<h3>Kod klasy</h3>
<p>Część po stronie serwera jest na tyle prosta, że nie wymaga większego opisu. Konstruktor może przyjmować 2 parametry: rok oraz tablicę z tłumaczeniem na inny język. Oba parametry są opcjonalne, domyślnym rokiem jest aktualny, język &#8211; polski. </p>
<p>
Metoda setLanguage ustawia język. Kolejna, getDatesTable generuje tablicę z dniami miesięcy (1-31), oznaczając odpowiednio ilości dni wg miesięcy. getCalendar wywołuje dwie inne: generateMonths &#8211; generuję tablicę miesięcy, wraz z ważnymi danymi, oraz generateDayNames &#8211; generującą skrótowe nazwy dni tygodnia.</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * VokielSmallCalendar class
 * @author Vokiel | http://blog.vokiel.com
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> VokielSmallCalendar <span style="color: #009900;">&#123;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Selected year
	 * @var int	$year
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$year</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Shortcuts names for months
	 * @var	array $monthsShort
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$monthsShort</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Shortcuts names for week days
	 * @var	array	$daysShort
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$daysShort</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Generated months table for the calendar
	 * @var array $months
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$months</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Construct,
	 * @param	int	$year
	 * @param	array	$lang
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$year</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #000088;">$lang</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: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">year</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$year</span><span style="color: #009900;">&#41;</span>? <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #000088;">$year</span> <span style="color: #339933;">:</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Y'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$lang</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'months'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'days'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$lang</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setLanguage</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$lang</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//end of __construct</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Setting the monts shortcuts names and days shorcuts names.
	 * Polish is default language.
	 * @param	array	$lang	Monts and days array starting from 1 = January and 1 = Monday
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setLanguage<span style="color: #009900;">&#40;</span><span style="color: #000088;">$lang</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: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">monthsShort</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'months'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>? <span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'months'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Sty'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Lut'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Mar'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">4</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Kwi'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Maj'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Cze'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Lip'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">8</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Sie'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">9</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Wrz'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Paź'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">11</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Lis'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">12</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Gru'</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;">daysShort</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'days'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>? <span style="color: #000088;">$lang</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'days'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Pon'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Wt'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Śr'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">4</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Czw'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Pt'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Sob'</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Nie'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//end of setLanguage method</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Generating the dates table (numbers from 1 to 31)
	 * @return	string	$datesTable	Generated HTML table
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getDatesTable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$datesTable</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;'</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">32</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$class</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&gt;=</span><span style="color: #cc66cc;">28</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: #000088;">$i</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">months</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'daysCount'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&gt;</span><span style="color: #cc66cc;">29</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$class</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'class=&quot;days_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$i</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;'</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000088;">$datesTable</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;td '</span><span style="color: #339933;">.</span><span style="color: #000088;">$class</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$i</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/td&gt;'</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">%</span><span style="color:#800080;">7</span><span style="color: #339933;">==</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$datesTable</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;/tr&gt;&lt;tr&gt;'</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000088;">$datesTable</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;'</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$datesTable</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//end of getdatesTable method</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Getting the calendar
	 * @return	array	$this-&gt;months Array with months shortcuts names and sorted week days shortcuts names
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getCalendar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">generateMonths</span><span style="color: #009900;">&#40;</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;">generateDayNames</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">months</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//end of getCalendar method</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Generating months table
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> generateMonths<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">13</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mktime</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #000088;">$i</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">year</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;">months</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'weekDay'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'N'</span><span style="color: #339933;">,</span><span style="color: #000088;">$time</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;">months</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'montShort'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">monthsShort</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">months</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'daysCount'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'t'</span><span style="color: #339933;">,</span><span style="color: #000088;">$time</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: #666666; font-style: italic;">//end of generateMonths method</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Generating week day names shortcuts
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> generateDayNames<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">months</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$month</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$dayStart</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$dayStart</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dayStart</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'weekDay'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$day</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$dayStart</span><span style="color: #339933;">+</span><span style="color: #000088;">$i</span><span style="color: #339933;">&gt;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span>? <span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">7</span><span style="color: #339933;">-</span><span style="color: #000088;">$dayStart</span><span style="color: #339933;">-</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$dayStart</span><span style="color: #339933;">+</span><span style="color: #000088;">$i</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;">months</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$month</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'weekdays'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">daysShort</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$day</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">months</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$month</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'weekDay'</span><span style="color: #009900;">&#93;</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: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//end of generateDayNames method</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">// end of VokielSmallCalendar class</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>
<h2>Obsługa kalendarza: JavaScript</h2>
<p>W tej części zajmiemy się oskrytpowaniem kalendarza w JavaScript (korzystając z jQuery) w celu nadania mu funkcjonalności, dynamiki i użytecznosci. Z naszych założeń wynika, że musimy utworzyć kilka funkcji, które będą reagować na przesuwanie kursora myszki ponad polami kalendarza.</p>
<h3>Kod JavaScript</h3>
<p>Pierwsza funkcja ma za zadanie podświetlać kolumny tabel w reakcji na najazd myszy na wiersze miesięcy. Następna jej część usuwa podświetlenie po zejściu kursora myszy z danego elementu. Taki hover-rollover.</p>
<p>Kolejny fragment listingu odpowiada za kliknięcie na danym miesiącu, co skutkuje małą animacją. Blok z listą dni zmienia pozycję, ustawiając się tuż pod wybranym miesiącem (klikniętym).</p>
<p>Funkcja sendYear ma za zadanie wskazać skryptowi PHP wybrany przez użytkownika rok. Kolejne akcje są już raczej kosmetyczne: akceptowanie tylko danych liczbowych w polu roku, automatyczne wysłanie formularza po naciśnięciu klawisza enter, wyczyszczenie pola po kliknięciu klawisza esc.</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</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: #006600; font-style: italic;">/**
	 * Actions after moving cursor over chosen month
	 * Hilights column in dates table and chosen month
	 */</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li:not(.daysTable) span'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">mouseenter</span><span style="color: #009900;">&#40;</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> $this <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> spanNr <span style="color: #339933;">=</span> $this.<span style="color: #660066;">parent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">index</span><span style="color: #009900;">&#40;</span>$this<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009966; font-style: italic;">/* nr dnia tygodnia (od zera) */</span>
&nbsp;
		$this.<span style="color: #660066;">parent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hover'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> tab <span style="color: #339933;">=</span> $this.<span style="color: #660066;">closest</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li.daysTable table tr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		tab.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</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: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'td:eq('</span><span style="color: #339933;">+</span>spanNr<span style="color: #339933;">+</span><span style="color: #3366CC;">')'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hover'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">mouseleave</span><span style="color: #009900;">&#40;</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> $this <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> spanNr <span style="color: #339933;">=</span> $this.<span style="color: #660066;">parent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">index</span><span style="color: #009900;">&#40;</span>$this<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009966; font-style: italic;">/* nr dnia tygodnia (od zera) */</span>
&nbsp;
		$this.<span style="color: #660066;">parent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hover'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> tab <span style="color: #339933;">=</span> $this.<span style="color: #660066;">closest</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li.daysTable table tr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		tab.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</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: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'td:eq('</span><span style="color: #339933;">+</span>spanNr<span style="color: #339933;">+</span><span style="color: #3366CC;">')'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hover'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">/**
	 * Clicking on chosen month
	 * Moves table with dates just after the clicked month
	 */</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li:not(.datesTable)'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		e.<span style="color: #660066;">preventDefault</span><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> $this <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> dt <span style="color: #339933;">=</span> $this.<span style="color: #660066;">parent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li.datesTable'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		dt.<span style="color: #660066;">slideUp</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1000</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>
			$this.<span style="color: #660066;">after</span><span style="color: #009900;">&#40;</span>dt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">delay</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">50</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">slideDown</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'normal'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">/**
	 * Action after moving cursor over chosen day in the table of days (1-31)
	 * Hilights days over all months
	 */</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li.datesTable table tr td'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">mouseenter</span><span style="color: #009900;">&#40;</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> $this <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> tdNr <span style="color: #339933;">=</span> $this.<span style="color: #660066;">parent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tr'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'td'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">index</span><span style="color: #009900;">&#40;</span>$this<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009966; font-style: italic;">/* nr dnia miesiaca (od zera) */</span>
		<span style="color: #003366; font-weight: bold;">var</span> sp <span style="color: #339933;">=</span> $this.<span style="color: #660066;">closest</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li:not(.datesTable)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		sp.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</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: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span:eq('</span><span style="color: #339933;">+</span>tdNr<span style="color: #339933;">+</span><span style="color: #3366CC;">')'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hover'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> tab <span style="color: #339933;">=</span> $this.<span style="color: #660066;">closest</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'table tbody'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		tab.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</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: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'td:eq('</span><span style="color: #339933;">+</span>tdNr<span style="color: #339933;">+</span><span style="color: #3366CC;">')'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hover'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">mouseleave</span><span style="color: #009900;">&#40;</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> $this <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> tdNr <span style="color: #339933;">=</span> $this.<span style="color: #660066;">parent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tr'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'td'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">index</span><span style="color: #009900;">&#40;</span>$this<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009966; font-style: italic;">/* nr dnia miesiaca (od zera) */</span>
		<span style="color: #003366; font-weight: bold;">var</span> sp <span style="color: #339933;">=</span> $this.<span style="color: #660066;">closest</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ul'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'li:not(.s)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		sp.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</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: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span:eq('</span><span style="color: #339933;">+</span>tdNr<span style="color: #339933;">+</span><span style="color: #3366CC;">')'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hover'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003366; font-weight: bold;">var</span> tab <span style="color: #339933;">=</span> $this.<span style="color: #660066;">closest</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'table tbody'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tr'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		tab.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</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: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'td:eq('</span><span style="color: #339933;">+</span>tdNr<span style="color: #339933;">+</span><span style="color: #3366CC;">')'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hover'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">/**
	 * Function for sending new typed year
	 */</span>
	<span style="color: #003366; font-weight: bold;">function</span> sendYear<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> y <span style="color: #339933;">=</span> parseInt<span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#year'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</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: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>y<span style="color: #339933;">&gt;</span><span style="color: #CC0000;">1901</span> <span style="color: #339933;">&amp;&amp;</span> y<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">2038</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			location.<span style="color: #660066;">href</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'?year='</span><span style="color: #339933;">+</span>y<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#year'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'error'</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: #006600; font-style: italic;">/**
	 * Accept button clicked - sending new date
	 */</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#accept'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		e.<span style="color: #660066;">preventDefault</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		sendYear<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">/**
	 * Accept only numbers
	 */</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#year'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">keyup</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\D/g</span><span style="color: #339933;">,</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">/**
	 * Checking key code on year field (esc, enter keys only)
	 */</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#year'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">keydown</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #339933;">==</span><span style="color: #CC0000;">13</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #009966; font-style: italic;">/* enter - send new year */</span>
			sendYear<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">keyCode</span><span style="color: #339933;">==</span><span style="color: #CC0000;">27</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #009966; font-style: italic;">/* esc - clear form */</span>
			$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">/**
	 * Remove 'error' clas after focusing year field
	 */</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#year'</span><span style="color: #009900;">&#41;</span>.<span style="color: #000066;">focus</span><span style="color: #009900;">&#40;</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: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClass</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'error'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #006600; font-style: italic;">/**
	 * Changing language
	 */</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#lang'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">change</span><span style="color: #009900;">&#40;</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> url <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> String<span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">location</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		url.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>url.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'year'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>url.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'lang'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				url <span style="color: #339933;">=</span> url.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/lang(.*)/gi</span><span style="color: #339933;">,</span><span style="color: #3366CC;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			document.<span style="color: #660066;">location</span> <span style="color: #339933;">=</span> url <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&amp;lang='</span> <span style="color: #339933;">+</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">':selected'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
			document.<span style="color: #660066;">location</span> <span style="color: #339933;">=</span>  <span style="color: #3366CC;">'?lang='</span> <span style="color: #339933;">+</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">find</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">':selected'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<h2>Ostylowanie CSS</h2>
<p>Style CSS nie wymagają szerokiego omówienia. Ważne jest tylko zwrócenie uwagi na kilka znaczników, które dają możliwość szczegółowego dopasowania wyglądu kalendarza do swoich potrzeb. Kolory wierszy dla miesięcy, w których liczba dni równa się 30, 31 oraz 28 lub 29 są oznaczone wybranymi klasami:<br />
<code class="b">.days_31, .days_30, .days_29 lub .days_28</code><code></code>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
</pre></td><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* reset css */</span>
<span style="color: #a1a100;">@CHARSET &quot;UTF-8&quot;;</span>
html<span style="color: #00AA00;">,</span> body<span style="color: #00AA00;">,</span> div<span style="color: #00AA00;">,</span> span<span style="color: #00AA00;">,</span> applet<span style="color: #00AA00;">,</span> object<span style="color: #00AA00;">,</span> iframe<span style="color: #00AA00;">,</span>
h1<span style="color: #00AA00;">,</span> h2<span style="color: #00AA00;">,</span> h3<span style="color: #00AA00;">,</span> h4<span style="color: #00AA00;">,</span> h5<span style="color: #00AA00;">,</span> h6<span style="color: #00AA00;">,</span> p<span style="color: #00AA00;">,</span> blockquote<span style="color: #00AA00;">,</span> pre<span style="color: #00AA00;">,</span>
a<span style="color: #00AA00;">,</span> abbr<span style="color: #00AA00;">,</span> acronym<span style="color: #00AA00;">,</span> address<span style="color: #00AA00;">,</span> big<span style="color: #00AA00;">,</span> cite<span style="color: #00AA00;">,</span> code<span style="color: #00AA00;">,</span>
del<span style="color: #00AA00;">,</span> dfn<span style="color: #00AA00;">,</span> em<span style="color: #00AA00;">,</span> <span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">,</span> img<span style="color: #00AA00;">,</span> ins<span style="color: #00AA00;">,</span> kbd<span style="color: #00AA00;">,</span> q<span style="color: #00AA00;">,</span> s<span style="color: #00AA00;">,</span> samp<span style="color: #00AA00;">,</span>
small<span style="color: #00AA00;">,</span> strike<span style="color: #00AA00;">,</span> strong<span style="color: #00AA00;">,</span> sub<span style="color: #00AA00;">,</span> sup<span style="color: #00AA00;">,</span> tt<span style="color: #00AA00;">,</span> var<span style="color: #00AA00;">,</span>
b<span style="color: #00AA00;">,</span> u<span style="color: #00AA00;">,</span> i<span style="color: #00AA00;">,</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">,</span>
dl<span style="color: #00AA00;">,</span> dt<span style="color: #00AA00;">,</span> dd<span style="color: #00AA00;">,</span> ol<span style="color: #00AA00;">,</span> ul<span style="color: #00AA00;">,</span> li<span style="color: #00AA00;">,</span>
fieldset<span style="color: #00AA00;">,</span> form<span style="color: #00AA00;">,</span> label<span style="color: #00AA00;">,</span> legend<span style="color: #00AA00;">,</span>
table<span style="color: #00AA00;">,</span> caption<span style="color: #00AA00;">,</span> tbody<span style="color: #00AA00;">,</span> tfoot<span style="color: #00AA00;">,</span> thead<span style="color: #00AA00;">,</span> tr<span style="color: #00AA00;">,</span> th<span style="color: #00AA00;">,</span> td <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">outline</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;"><span style="color: #cc66cc;">100</span>%</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">vertical-align</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">baseline</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">transparent</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> <span style="color: #ff0000;">&quot;Trebuchet MS&quot;</span><span style="color: #00AA00;">,</span> Tahoma<span style="color: #00AA00;">,</span> Verdana<span style="color: #00AA00;">,</span> Arial<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">14px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">overflow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">auto</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#vokiel_small_calendar</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #808080; font-style: italic;">/* width: 327px; */</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">427px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #993333;">auto</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">overflow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">auto</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #993333;">silver</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0px</span> <span style="color: #933;">2px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul<span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">list-style</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">overflow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">auto</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li<span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li strong<span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">59px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">clear</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">border-right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li span<span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">40px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">border-right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">cursor</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">pointer</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> <span style="color: #6666ff;">.days_31</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#46A12A</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> <span style="color: #6666ff;">.days_30</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#F29400</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> <span style="color: #6666ff;">.days_28</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#vokiel_small_calendar</span> <span style="color: #6666ff;">.days_29</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#EA609C</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> table <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">border-collapse</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">collapse</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> table<span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#vokiel_small_calendar</span> table tbody<span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#vokiel_small_calendar</span> table tr<span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">287px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> table tr td<span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">border-right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">cursor</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">default</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li<span style="color: #6666ff;">.hover</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li span<span style="color: #6666ff;">.hover</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li table tbody tr td<span style="color: #6666ff;">.hover</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#59ACEF</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li <span style="color: #6666ff;">.giveYear</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">75px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li <span style="color: #6666ff;">.giveYear</span> <span style="color: #cc00cc;">#accept</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">16px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">16px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">vertical-align</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">middle</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li <span style="color: #6666ff;">.giveYear</span> <span style="color: #cc00cc;">#year</span><span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">35px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #993333;">silver</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li <span style="color: #6666ff;">.giveYear</span> <span style="color: #cc00cc;">#year</span><span style="color: #6666ff;">.error</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #993333;">red</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li <span style="color: #6666ff;">.giveYear</span> p <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">12px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#vokiel_small_calendar</span> ul li <span style="color: #6666ff;">.giveYear</span> small <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>
<h2><strong>Voila</strong></h2>
<p>Całość została napisana przy użyciu PHP i JavaScript. Taki był pierwszy pomysł, który miał na celu zintegrować kalendarz z ważnymi wydarzeniami. Jednak nic nie stoi na przeszkodzie, aby przepisać część tworzoną w PHP na JS. Dzięki czemu otrzymalibyśmy kalendarz, który nie wymaga skryptu po stronie serwera.</p>
<p>W planie na bliżej nieokreśloną przyszłość mam utworzenie wersji bez udziału PHP, następnie upięcie tego w widżet opery, ewentualnie w gadżet do windy 7.</p>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/thesmallcalendar" title="The Small Calendar (7 Marzec 2010)">The Small Calendar</a> (0)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-windows-gadget" title="The Small Calendar &#8211; Windows gadżet (7 Marzec 2010)">The Small Calendar &#8211; Windows gadżet</a> (3)</li>
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
	<li><a href="http://blog.vokiel.com/earn-fame-and-fortune-in-the-nettuts-screenrscreencast-ompetition" title="(English) Earn Fame and Fortune in the Nettuts/Screenr Screencast Competition (3 Październik 2009)">(English) Earn Fame and Fortune in the Nettuts/Screenr Screencast Competition</a> (1)</li>
	<li><a href="http://blog.vokiel.com/php-date-polskie-nazwy-dni-i-miesiecy-funkcje-date-strftime" title="PHP Date &#8211; Polskie nazwy dni i miesięcy. Funkcje date strftime (23 Wrzesień 2009)">PHP Date &#8211; Polskie nazwy dni i miesięcy. Funkcje date strftime</a> (5)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/q-9dP9DoRH4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce</feedburner:origLink></item>
		<item>
		<title>Mikroformaty (microformats) – html znaczący więcej</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/hD7mtT1cNxk/mikroformaty-microformats-html-znaczacy-wiecej</link>
		<comments>http://blog.vokiel.com/mikroformaty-microformats-html-znaczacy-wiecej#comments</comments>
		<pubDate>Tue, 05 Jan 2010 22:54:04 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[hCalendar]]></category>
		<category><![CDATA[hCard]]></category>
		<category><![CDATA[mikroformaty]]></category>
		<category><![CDATA[rel-nofollow]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=267</guid>
		<description><![CDATA[W skrócie mikroformaty są umownym zestawem standardów (klas CSS i elementów języka xHTML) stosowanych w celu umożliwienia maszynom odczytania i zrozumienia większej ilości danych, które bez nich byłyby zrozumiałe tylko dla człowieka.]]></description>
			<content:encoded><![CDATA[<p>Prawdopodobnie wiele osób zetknęło się z <strong>mikroformatami</strong>, publikacji na ich temat jest dość dużo. Większość jednak porozrzucana, podzielona na mniejsze elementy. W tym wpisie chcę zebrać całość użytecznych informacji na ten temat w jednym miejscu. Najlepszym miejscem na to jest (jak dla mnie) ten blog <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>W skrócie mikroformaty są umownym zestawem standardów (klas CSS i elementów języka xHTML) stosowanych w celu umożliwienia maszynom odczytania i zrozumienia większej ilości danych, które bez nich byłyby zrozumiałe tylko dla człowieka.<br />
<span id="more-267"></span></p>
<h2>Charakterystyka mikroformatów</h2>
<p>Inicjatywa stworzenia mikroformatów miała miejsce w 2005 roku. W założeniu chciano przyśpieszyć adaptację tzw. idei sematycznej sieci. </p>
<p>Najważniejszą informacją odnośnie mikroformatów jest to, że nie są one odrębnym językiem. Nie są też odmianą, ani częścią jakiegoś języka. Są to umowne sposoby stosowania klas <abbr title="Cascading Style Sheet">CSS</abbr> oraz elementów xHTML w taki sposób, aby umieścić dodatkowe informacje w sposób łatwy do odczytania dla maszyn. Wzbogacają tzw. semantykę kodowania, dzięki czemu stają się łatwiejsze do przetworzenia. Umożliwiają przenoszenie treści zawartej na witrynie do innych aplikacji, dzięki czemu rozszerza się zakres wykorzystania informacji. </p>
<p>Mikroformaty tylko opisują dane, same w sobie nie są ich nośnikami. Jest to ogólnie przyjęta konwencja, która pozwala zagnieżdżać dodatkowe informacje w dokumentach HTML.</p>
<blockquote><p>Designed for humans first and machines second, microformats are a set of simple, open data formats built upon existing and widely adopted standards.</p></blockquote>
<p>Można je zastosować zarówno w <abbr title="Hypertext Markup Language">HTML</abbr>, <abbr title="Extensible Hypertext Markup Language">xHTML</abbr>, <abbr title="Extensible Markup Language">XML</abbr>, <abbr title="Really Simple Syndication">RSS</abbr>, ATOM. Występują w następujących atrybutach: </p>
<ol class="nice-list">
<li>atrybut <strong>class</strong></li>
<li>atrybut <strong>rel</strong></li>
<li>atrybut <strong>rev</strong></li>
</ol>
<h2>Budowa mikroformatów</h2>
<p>Jak już wspomniałem mikroformaty opierają się na klasach CSS lub na atrybutach xHTML. Najczęściej spotykanym zastosowaniem są wizytówki (<strong>hCard</strong>), terminarz (<strong>hCalendar</strong>). W przypadku pierwszego zastosowania, całość wizytówki zawieramy w elemencie z klasą CSS o nazwie <code class="b">vcard</code>. W niej zawartość elementów z odpowiednimi klasami jest interpretowana jako pola wizytówki. W przypadku kalendarza, całość umieszczamy w elemencie z przypisaną klasą <code class="b">vevent</code>.<br />
hCard jest bardziej rozbudowany (17 pozycji) od hCalendar (8 pozycji), zatem nim się zajmiemy w celu przedstawienia budowy mikroformatów. Przykładowa wizytówka może wyglądać następująco:</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;vcard&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fn&quot;</span>&gt;</span>Jan Dzban<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;additional-name&quot;</span>&gt;</span>Piotr<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;org&quot;</span>&gt;</span>Firma Jana Dzbana SP. Z O. O.<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;email&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mailto:jan.kowalski@firma_jana_dzbana.pl&quot;</span>&gt;</span>jan.kowalski@firma_jana_dzbana.pl<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;url&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://firma_jana_dzbana.pl&quot;</span>&gt;</span>strona WWW<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;adr&quot;</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;street-address&quot;</span>&gt;</span>Dzbanowa 666<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;locality&quot;</span>&gt;</span>Janów<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;region&quot;</span>&gt;</span>Mazowieckie<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;postal-code&quot;</span>&gt;</span>00-123<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;country-name&quot;</span>&gt;</span>Polska<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;tel&quot;</span>&gt;</span>0-700-123-456<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>
<p>Przyjrzymy się szczegółom. Klasa <code class="b">vcard</code> informuje, że mamy do czynienia z wizytówką (mikrofromatem hCard).<br />
Klasa <code class="b">fn</code> zawiera informację o osobie (Imię i nazwisko). Jeśli chcielibyśmy być bardziej dokładni możemy się posłużyć dwoma oddzielnymi elementami <code class="b">given-name</code> i <code class="b">family-name</code>, oznaczającymi odpowiednio imię i nazwisko. Dodatkowe (drugie) imię zawiera element z klasą <code class="b">additional-name</code>.<br />
Klasa <code class="b">org</code> symbolizuje organizację (firmę, przedsiebiorstwo).<br />
Kolejne klasy <code class="b">email</code> i <code class="b">url</code> &#8211; jak nazwa wskazuje, odpowiednio adres poczty elektronicznej, adres strony WWW.<br />
Kolejny blok o klasie <code class="b">adr</code> informuje o zawartości dotyczącej adresu. A w nim szczegółowe dane: nazwa ulicy, numer domu, miejscowość, region (województwo), kod pocztowy, kraj.<br />
Ostatni blok zawiera informację o numerze telefonu &#8211; klasa <code class="b">tel</code>.</p>
<p>Jak widać nazewnictwo klas jest bardzo intuicyjne, dzięki czemu podnosi nawet czytelność kodu HTML.</p>
<h2>Microformats w praktyce &#8211; rodzaje i zastosowanie</h2>
<p>Lista podstawowych mikroformatów jest już dość liczna, ciągle powstają nowe (17 w wersji roboczej). Poniższa lista przedstawia mikroformaty, które zostały uznane jako stabilne, otwarte formaty:</p>
<ol class="nice-list">
<li><strong>hCalendar</strong> &#8211; kalendarz, terminarz</li>
<li><strong>hCard</strong> &#8211; wizytówka</li>
<li><strong>rel-nofollow</strong> &#8211; link nie powinien wpływać na ranking strony docelowej w indeksach wyszukiwarek</li>
<li><strong>rel-license</strong> &#8211; link do strony z licencją pod którą opublikowano odwiedzaną stronę</li>
<li><strong>rel-tag</strong> &#8211; link do strony z danym tagiem (słowem kluczowym, tematem)</li>
<li><strong>VoteLinks</strong> &#8211; link z informacją o ocenie strony docelowej względem aktualnej</li>
<li><strong><abbr title="The XHTML Friends Network">XFN</abbr></strong> &#8211; relacje międzyludzkie</li>
<li><strong><abbr title="XHTML Meta Data Profiles">XMDP</abbr></strong> &#8211; do opisu metadanych (schematycznych opisów innych mikroformatów)</li>
<li><strong><abbr title="Extensible Open XHTML Outlines">XOXO</abbr></strong> &#8211; definiuje nowy typ dokumentu XHTML</li>
</ol>
<p>Możliwych zastosowań jest więcej niż mikroformatów. Wile z nich można łączyć, np przy pomocy hCalendar + hCard + Geo &#8211; możemy utworzyć informację o spotkaniu, podać wizytówkę organizatora, oznaczyć miejsce wykorzystując geolokalizację.<br />
Łącząc mikroformaty z innymi usługami takimi jak Technorati, która przekonwertuje nasz kod HTML na format uniwersalny, umożliwiający załadowanie udostępnionych informacji do kalendarza użytkownika, dodatkowo udostępni aplikację z urządzeniami przenośnymi. Link dodajemy w postaci:</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://technorati.com/contacts/http://strona.pl/hcard.html&quot;</span>&gt;</span>Dodaj wizytówkę<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://technorati.com/events/http://strona.pl/hcalendar.html&quot;</span>&gt;</span>Dodaj spotkanie<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div>
<p>Kolejnym przykładem może być użycie Kalendarza Google, który daje możliwość importu danych w formacie hCalendar. Pojedyncze kliknięcie w przycisk przenosi do kalendarza, wypełni formularz rejestracji nowego zdarzenia (z informacji zaczerpniętych z mikroformatu). Dzięki temu można stworzyć zaproszenia na spotkanie, umieścić je na własnej stronie, a odwiedzający będą mogli jednym kliknięciem dodać je do swoich kalendarzy.</p>
<h2>Ikony dla mikroformatów</h2>
<p>Aby jeszcze lepiej uwidocznić zastosowanie mikroformatów dobrą metodą jest przygotowanie zestawu ikon symbolizujących odpowiednie dane. Rozpoznawalne ikony, stosowane na wielu stronach staną się cenną informacją rozpoznawczą. Z racji tego, że idea mikroformatów jest jeszcze młoda, ikony wciąż podlegają zmianom i procesowi standaryzacji. Firma Bartelme Design udostępnia <a rel="nofollow" target="_blank" href="http://bartelme.at/journal/archive/microformats_icons#referrer=blog.vokiel.com">darmowy zestaw ikon</a> (źródła dla programów Photoshop i Ilustrator) wraz z programem do tworzenia ikon. Łącząc wybrane ikonki w jeden obraz, dodając odrobinę kodu CSS możemy łatwo stworzyć przenośny zestaw <a rel="nofollow" target="_blank" href="http://blog.vokiel.com/css-sprites-laczenie-wielu-obrazkow-w-jeden-redukcja-zadan-http" title="CSS Sprites">CSS Sprites</a> Microformats. Podstawowy zestaw ikon widać poniżej:</p>
<p><img src="http://bartelme.at/material/microformats/microformats_icons01.png" alt="microformats_icons" class="a_img" style="width:405px;height:156px;" /></p>
<h2>Przykłady</h2>
<p>Kilka przykładów najbardziej popularnych mikroformatów:</p>
<h3>hCalendar<small></small> </h3>
<p>Jest to mikroformat kalendarzy, wydarzeń, spotkań. Jego główne elementy to: podsumowanie, data rozpoczęcia (oba wymagane), nazwa, lokalizacja, data zakończenia, status, geolokalizacja itd.</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;vevent&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hcalendar-Zlot-programistów-PHP&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;url&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://planeta.php.pl&quot;</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">abbr</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dtstart&quot;</span> <span style="color: #000066;">title</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;2010-01-06T07:0000&quot;</span>&gt;</span>6 stycznia 2010 o godzinie 7:00<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">abbr</span>&gt;</span>,
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">abbr</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dtend&quot;</span> <span style="color: #000066;">title</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;2010-01-07T02:00&quot;</span>&gt;</span> godzina 2:00, 7 stycznia 2010<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">abbr</span>&gt;</span> :
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;summary&quot;</span>&gt;</span>Zlot programistów PHP<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span> at
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;location&quot;</span>&gt;</span>POLSKA<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>
<h3>XFN<small></small></h3>
<p>XFN oferuje 2 typy relacji linków: my sami, inni ludzie. Relacje z innymi są podzielone na 6 kategorii: friendship, physical, professional, geographical, family, romantic.</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;me&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://blog.vokiel.com/css-sprites-laczenie-wielu-obrazkow-w-jeden-redukcja-zadan-http&quot;</span>&gt;</span>Vokiel o CSS Sprites<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://anadoxin.org/blog/&quot;</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;met friend&quot;</span>&gt;</span>0xcafebabe per aspera ad astra<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div>
<h3>VoteLinks<small></small></h3>
<p>VoteLinks poprzez użycie atrybutu <code class="b">rev</code> określa stosunek danej strony do linkowanej (w odróżnieniu od atrybutu rel, który określa stosunek strony linkowanej do danej).<br />
Do wykorzystania mamy 3 opcje: <code class="b">vote-for</code>, <code class="b">vote-against</code>, <code class="b">vote-abstain</code> , czyli: za, przeciw, neutralny (wstrzymanie się od oceny).</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Sprawdź stronę: <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://nospor.pl&quot;</span> <span style="color: #000066;">rev</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;vote-for&quot;</span>&gt;</span>nospor.pl<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>!<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Natomiast <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.theworstwebsite.com/&quot;</span> <span style="color: #000066;">rev</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;vote-against&quot;</span>&gt;</span>ta strona<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span> jest beznadziejna<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span></pre></div></div>
<h3>Geo<small> </small></h3>
<p>Ciekawym mikroformatem, o którym nie wspomniałem wcześniej jest <strong>Geo</strong> (jest jeszcze w wersji roboczej). Jest bardzo prosty, posiada 2 właściwości: <code class="b">latitude</code> oraz <code class="b">longitude</code>. Jak sama nazwa wskazuje, służy do określania geolokalizacji.</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;geo&quot;</span>&gt;</span>GEO:
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;latitude&quot;</span>&gt;</span>37.386013<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span>,
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;longitude&quot;</span>&gt;</span>-122.082932<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>
<p>Przy zastosowaniu znacznika <code class="b">&lt;abbr&gt;</code> wartością będzie zawartość atrybutu <code class="b">tittle</code> zamiast zawartości całego znacznika (patrz przykład wyżej). Dzięki temu, możemy wyświetlić dane lokalizacyjne bardziej czytelne dla człowieka.</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;geo&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">abbr</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;latitude&quot;</span> <span style="color: #000066;">title</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;37.408183&quot;</span>&gt;</span>N 37° 24.491<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">abbr</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">abbr</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;longitude&quot;</span> <span style="color: #000066;">title</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;-122.13855&quot;</span>&gt;</span>W 122° 08.313<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">abbr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>
<h3>Rel-license<small></small></h3>
<p>Prosty mikrofromat, który informuje czytelnika, na jakiej licencji został udostępniony czytany przez niego tekst.</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://creativecommons.org/licenses/by/2.0/&quot;</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;license&quot;</span>&gt;</span>Strona udostępniona na zasadach licencji CC by 2.0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div>
<h3>Rel-tag<small></small>, rel-nofollow<small></small></h3>
<p>Te formaty stają się ważne dla osób zainteresowanych pozycjonowaniem stron. <strong>Rel-tag</strong> odnosi do strony o danym tagu (popularny element serwisów łeb-dwa-zero). <strong>Rel-nofollow</strong> &#8211; informuje, że dany link prowadzi do strony, z którą nie chcemy mieć wiele wspólnego. W szczególności nie chcemy aby wyszukiwarki indeksowały dany link przeglądając źródła naszej strony. Z punktu widzenia pozycjonowania, taki link jest bez wartości, nie wzmacnia pozycji danego serwisu (nie wpływa na Page Rank)</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://blog.vokiel.com/kategoria/php&quot;</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;tag&quot;</span>&gt;</span>PHP<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.google.com&quot;</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;nofollow&quot;</span>&gt;</span>Nie wzmacniaj pozycjonera<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div>
<h2>Mikroformaty i wyszukiwarki</h2>
<p>Dla wielu osób ważną informacją jest wpływ mikroformatów na wyszukiwarki i pozycje na listach wyników wyszukiwania. Dzięki mocnemu poparciu programistów mikroformaty są już czynnie stosowane przez duże firmy. Internetowi giganci jak Yahoo!, Google aktywnie uczestniczą w popularyzacji mikroformatów. Yahoo! udostępnia obiekty hCalendar i hCard w serwisie <a rel="nofollow" target="_blank" href="http://upcoming.org#referrer=blog.vokiel.com" title="Upcoming.org">upcoming.org</a>, obiekty hCard na Yahoo! Local, XFN oraz Geo na witrynie Flickr. Natomiast Google używa hCard w rezultatach wyszukiwania serwisu Mapy, dzięki czemu ułatwia zapamiętywanie adresów.</p>
<p>Wspomniane wyżej wyszukiwarki oferują już możliwość wyszukiwania treści utworzonej według standardów licencjonowania Creative Commons przy zastosowaniu mikroformatu <code class="b">rel-licence</code>. Ponieważ coraz więcej treści publikuje się z użyciem mikroformatów, wyszukiwarki będą niejako zmuszone dokonać zmian w algorytmach wyszukiwania. Ciekawym udogodnieniem jest wyszukiwarka mikroformatów udostępniona przez Technorati, która daje możliwość wyszukiwania wydarzeń, informacji kontaktowych, recenzji.</p>
<h2>Dodatkowe informacje</h2>
<p><a rel="nofollow" target="_blank" href="http://articles.sitepoint.com/article/microformats-meaning-markup#referrer=blog.vokiel.com" title="Microformats: More Meaning from Your Markup">Microformats: More Meaning from Your Markup</a><br />
<a rel="nofollow" target="_blank" href="http://microformatique.com/book/#referrer=blog.vokiel.com" title="Microformats - empowering your markup for Web 2.0">Microformats &#8211; empowering your markup for Web 2.0</a><br />
<a rel="nofollow" target="_blank" href="http://www.danwebb.net/2007/2/9/sumo-a-generic-microformats-parser-for-javascript#referrer=blog.vokiel.com" title="Sumo! A Generic Microformats Parser For JavaScript">Sumo! A Generic Microformats Parser For JavaScript</a><br />
<a rel="nofollow" target="_blank" href="http://carsonified.com/blog/category/dev/microformats-dev/#referrer=blog.vokiel.com" title="Microformats">Microformats</a><br />
<a rel="nofollow" target="_blank" href="http://microformats.org/wiki/cheat-sheet#referrer=blog.vokiel.com" title="cheat-sheets">Microformats &#8211; cheat-sheet</a><br />
<a rel="nofollow" target="_blank" href="http://www.addedbytes.com/cheat-sheets/microformats-cheat-sheet/#referrer=blog.vokiel.com">Microformats-cheat-sheet (pdf, png)</a><br />
<a rel="nofollow" target="_blank" href="http://suda.co.uk/projects/microformats/cheatsheet/microformats.cheatsheet.pdf#referrer=blog.vokiel.com">Microformats.cheatsheet.pdf</a></p>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/thesmallcalendar" title="The Small Calendar (7 Marzec 2010)">The Small Calendar</a> (0)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-windows-gadget" title="The Small Calendar &#8211; Windows gadżet (7 Marzec 2010)">The Small Calendar &#8211; Windows gadżet</a> (3)</li>
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
	<li><a href="http://blog.vokiel.com/css-minify-combine-zmniejszanie-laczenie-plikow-css-w-jeden" title="CSS minify – combine: zmniejszanie i łączenie plików css w jeden (16 Wrzesień 2009)">CSS minify – combine: zmniejszanie i łączenie plików css w jeden</a> (0)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" title="The Small Calendar &#8211; jQuery + PHP w praktyce (24 Luty 2010)">The Small Calendar &#8211; jQuery + PHP w praktyce</a> (5)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/hD7mtT1cNxk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/mikroformaty-microformats-html-znaczacy-wiecej/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<enclosure url="http://suda.co.uk/projects/microformats/cheatsheet/microformats.cheatsheet.pdf#referrer=blog.vokiel.com" length="72872" type="application/pdf" /><media:content url="http://suda.co.uk/projects/microformats/cheatsheet/microformats.cheatsheet.pdf#referrer=blog.vokiel.com" fileSize="72872" type="application/pdf" /><feedburner:origLink>http://blog.vokiel.com/mikroformaty-microformats-html-znaczacy-wiecej</feedburner:origLink></item>
		<item>
		<title>CSS Sprites – łączenie wielu obrazków w jeden redukcją żądań HTTP</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/eTSJ2wYMU8g/css-sprites-laczenie-wielu-obrazkow-w-jeden-redukcja-zadan-http</link>
		<comments>http://blog.vokiel.com/css-sprites-laczenie-wielu-obrazkow-w-jeden-redukcja-zadan-http#comments</comments>
		<pubDate>Tue, 24 Nov 2009 18:58:30 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[combine]]></category>
		<category><![CDATA[CSS Sprites]]></category>
		<category><![CDATA[minify]]></category>
		<category><![CDATA[optymalizacja]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=215</guid>
		<description><![CDATA[CSS Sprites jest techniką polegającą na łączeniu wielu obrazków wykorzystywanych na stronie w jeden. Ich wyświetlanie odbywa się poprzez ustawienie w CSS atrybutu background-position na odpowiednią wartość "przesuwającą" cały obraz, tak aby widoczny był ten odpowiedni fragment. Korzystając z CSS Sprites przeglądarka pobiera tylko jeden złączony obrazek, zamiast wielu małych.]]></description>
			<content:encoded><![CDATA[<p>Czym są &#8222;Chochliki (skrzaty) CSS&#8221; ? Do czego służą? Jak możemy je wykorzystać? Jakie korzyści płyną z ich zastosowania? Jakie są ograniczenia, trudności w stosowaniu?</p>
<p>CSS Sprites jest techniką łączenia wielu obrazków w jeden, których wyświetlanie następuje poprzez odpowiednie wypozycjonowanie obrazu tła. Wbrew temu co mogłaby wskazywać nazwa, nie są to małe obrazki, lecz jeden duży złożony wielu mniejszych.</p>
<p><span id="more-215"></span></p>
<div class="source_demo_container">
<a rel="nofollow" target="_blank" href="/dema/css_sprites/css_sprites.zip" class="source" title="Źródła">Źródła</a><a rel="nofollow" target="_blank" href="/dema/css_sprites/" class="demo" title="Demo">Demo</a>
</div>
<h2>Na czym polega CSS Sprites</h2>
<p>Jak zostało wspomniane w wypisie, technika ta polega na połączeniu wielu obrazków wykorzystywanych na stronie w jeden. Wyświetlanie tych obrazków polega na ustawieniu w CSS atrybutu <code class="b">background-position</code> na odpowiednią wartość &#8222;przesuwającą&#8221; cały obraz, tak aby w polu widzenia był ten właściwy. Przeglądarka pobiera cały obrazek i wyświetla jego fragmenty w odpowiednich miejscach, zamiast pobierać każdy mały obrazek oddzielnie.</p>
<p>Nie jest to nowa technika, właściwe można powiedzieć, że jest starsza niż sam CSS. Jej pochodzenie wywodzi się ze starych 8-bitowych gier komputerowych. Komputer wczytywał do pamięci jeden obraz, a wyświetlał tylko akurat potrzebny fragment. Było to o wiele szybsze rozwiązanie niż ciągłe pobieranie nowych obrazków.</p>
<p>Najczęściej wybieranym zastosowaniem CSS Sprites (często nieświadomie) jest efekt CSS Rollover polegający na podmianie obrazka tła po najechaniu kursorem.</p>
<h2>Niedogodności i trudności w stosowaniu</h2>
<p>Na początku wspomnę o kilku niedogodnościach związanych ze stosowaniem tego rozwiązania. Warto mieć je na uwadze, aby już od początkowych etapów tworzenia nie wpaść w pułapki, aby uniknąć konieczności przerabiania wszystkiego od początku.</p>
<p>Obraz całościowy CSS Sprites tworzony jest z wielu mniejszych obrazków, zwykle w programach graficznych (Adobe® Photoshop®, Gimp), zatem wszelkie zmiany w wyglądzie strony będą wymagały dokonania przeróbek w obrazku całościowym. Ma to istotne znaczenie w przypadku korzystania z usług zewnętrznych grafików.</p>
<p>W przypadku zastosowania elementu tła, które jest powielane po jednej ze współrzędnych element ten powinien być jedynym elementem w rzędzie/kolumnie (w zależności od osi powielania). Dobrze to widać w przypadku YouTube (na niżej załączonym obrazku).</p>
<p>Waga obrazka CSS Sprites może być czasem większa niż sumaryczna waga obrazków składowych (nie jest to regułą, bo przykładowo przy małych ikonkach zajmuje mniej).</p>
<p>Do momentu załadowania całego obrazka żadne elementy graficzne nie będą wyświetlane, jedynie formatowanie zawarte w css.</p>
<p>Nadmiarowość kodu HTML.<br />
<strong>@KrzyHu</strong> dzięki za przypomnienie</p>
<h2>Plusy techniki</h2>
<p>Niewątpliwym plusem tej techniki jest zmniejszenie liczby żądań HTTP.<br />
Podczas ładowania strony przeglądarka pobiera wszystkie zewnętrzne elementy (skrypty js, arkusze css, obrazki, etc). Każdy taki element jest oddzielnym żądaniem HTTP, których jednoczesna ilość jest ograniczona. Zatem czym więcej tych elementów, tym dłużej trwa ładowanie strony (nawet w przypadku szybkiego łącza). Skompletowanie całej strony, przy czystym cache, trwa o wiele dłużej niż by wskazywała na to jej waga.<br />
Wpływa na to ilość żądań, ale także czas potrzebny na nawiązanie połączenia, przetworzenie żądania przez serwer, jednym słowem cała komunikacja. Jeśli na stronie stosujemy 30 ikon, to ich złączenie w jeden spowoduje spadek ilości żądań aż o 29 sztuk!</p>
<p>Stosowanie techniki CSS Rollover z wykorzystaniem CSS Sprites powoduje, że nie pojawia się &#8222;miganie&#8221; podczas podmiany obrazka. Często w przypadku stosowania &#8222;standardowego&#8221; podejścia w momencie najechania kursorem na element znika on całkowicie aż do momentu pobrania obrazka dla stanu <code class="b">:hover</code></p>
<p><img class="a_img" style="width: 224px; height: 96px;" title="Brak css sprites" src="../wp-content/uploads/2009/11/no_css_sprites.jpg" alt="Brak css sprites" /></p>
<p>Ewentualna zmiana kolorystyki strony, ikon, nagłówków etc pociąga za sobą zmianę tylko jednego pliku graficznego. Popularna, jeszcze nie tak dawno, zmiana kolorystki strony na odcienie szarości (żałoby narodowe) w przypadku CSS Sprites jest wręcz banalna.</p>
<h2>Tworzenie własnego CSS Sprites</h2>
<p>Aby nie być gołosłownym proponuję stworzenie stylu komunikatów opartego właśnie o CSS Sprites. Wynik działania będzie (przypominał) następujący:</p>
<p><img style="width: 593px; height: 236px;" title="Style komunikatów oparte na css sprites" src="../wp-content/uploads/2009/11/komunikaty.jpg" class="a_img" alt="Style komunikatów oparte na css sprites" /></p>
<h3>Tworzenie obrazka CSS Sprites</h3>
<p>Abyśmy sami nie musieli tworzyć ikonek postaramy się odszukać gotowe zestawy. Wybrałem <a rel="nofollow" target="_blank" title="Function Icon Set" rel="nofollow" href="http://wefunction.com/2008/07/function-free-icon-set/#referrer=blog.vokiel.com">Function Icon Set</a>. Wymagają tylko dwóch przeróbek: dodania literki &#8222;i&#8221; do jednej z nich, oraz zmiany wielkości z 48×48px na 32x32px; Tworzymy obraz o wymiarach 128x32px, ustawiamy prowadnice co 32px, wklejamy zmniejszone ikonki, dopisujemy literkę <code class="b">i</code> przy tej niebieskiej.</p>
<p><img class="a_img" title="Css Sprites 32px" src="../wp-content/uploads/2009/11/css_sprites_32px.jpg" alt="Css Sprites 32px" /></p>
<h3>Tworzenie kodu HTML</h3>
<p>Struktura komunikatów będzie następująca:</p>
<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;success&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;sprite_ico&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span>
    Komunikat success
&nbsp;
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>
</p>
<p>Czemu taka konstrukcja? Otóż aby nie pokazać pozostałych ikonek musimy nadać elementowi stałą szerokość, a nie możemy zrobić tego dla samego div. Kolejne komunikaty różnią się jedynie klasą div&#8217;a.</p>
<h3>Tworzenie kodu CSS</h3>
<p>Najważniejsza część tworzenia CSS Sprites &#8211; odpowiednie formatowanie, które da możliwość wykorzystania jednego obrazka do wyświetlenia różnych ikon w zależności od klasy komunikatu.</p>
<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div<span style="color: #6666ff;">.info</span><span style="color: #00AA00;">,</span> div<span style="color: #6666ff;">.success</span><span style="color: #00AA00;">,</span> div<span style="color: #6666ff;">.warning</span><span style="color: #00AA00;">,</span> div<span style="color: #6666ff;">.error</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">14px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.info</span> <span style="color: #6666ff;">.sprite_ico</span><span style="color: #00AA00;">,</span> div<span style="color: #6666ff;">.success</span> <span style="color: #6666ff;">.sprite_ico</span><span style="color: #00AA00;">,</span> div<span style="color: #6666ff;">.warning</span> <span style="color: #6666ff;">.sprite_ico</span><span style="color: #00AA00;">,</span> div<span style="color: #6666ff;">.error</span> <span style="color: #6666ff;">.sprite_ico</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;img/css_sprite_32.png&quot;</span><span style="color: #00AA00;">&#41;</span> <span style="color: #993333;">no-repeat</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> inline-<span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">32px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">margin-right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">vertical-align</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">middle</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">32px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.info</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#00529B</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#BDE5F8</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.info</span> <span style="color: #6666ff;">.sprite_ico</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background-position</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0px</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.success</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#4F8A10</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#DFF2BF</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.success</span> <span style="color: #6666ff;">.sprite_ico</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background-position</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-32px</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.warning</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#9F6000</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#FEEFB3</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.warning</span> <span style="color: #6666ff;">.sprite_ico</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background-position</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-64px</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.error</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#D8000C</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#FFBABA</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.error</span> <span style="color: #6666ff;">.sprite_ico</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background-position</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-96px</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>
<p><strong>Krótkie omówienie</strong><br />
Pierwszy blok tworzy główne ramy klas komunikatów. Drugi tworzy wspólne style dla elementów span, które będą zawierały w sobie ikonki. Tu dołączamy obrazek tła, który utworzyliśmy w poprzednim kroku. Nie podajemy pozycji obrazka, gdyż będziemy je ustawiać dla każdej klasy oddzielnie. Tutaj definiujemy tylko brak powielania obrazu tła.<br />
Następnie w kolejnych parach tworzone są szczegóły dla danego komunikatu. Kolor czcionki, obramowania dla div, oraz pozycja tła obrazka dla ikonki(!).</p>
<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div<span style="color: #6666ff;">.success</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#4F8A10</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#DFF2BF</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
div<span style="color: #6666ff;">.success</span> .sprite_ico<span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background-position</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-32px</span> <span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>
<p>Najważniejszą opcją w tym kodzie, związaną z css sprites, jest <code class="b">background-position: -32px 0px;</code>, która określa pozycję obrazu tła względem górnego lewego narożnika. Jest to tak jakby margines dla danego obrazu tła.</p>
<p><img class="a_img" title="CSS Sprites - background-position" src="../wp-content/uploads/2009/11/css_sprites_32px_background_position.jpg" alt="CSS Sprites - background-position" /></p>
<p>Ujemny pierwszy parametr przesunie obraz w lewo (strzałka czerwona), ujemny drugi (strzałka zielona) &#8211; do góry. Wartości dodatnie przesuną obraz odpowiednio w prawo i w dół.</p>
<p>Pozycję tła w poszczególnych klasach przesuwamy co 32px, tyle ile zawiera szerokość ikonki. Często dobrym rozwiązaniem jest ustawienie ikon w większych odstępach, dzięki temu nawet niedokładne wypozycjonowanie w css nie będzie widoczne, poza tym uniknie się różnic w interpretacji w poszczególnych przeglądarkach. Dla naszego przykładu układ co 32px jest wystarczający.</p>
<p><strong>Voila!</strong></p>
<p>Wykorzystanie CSS Sprites w tak prostym przykładzie dało nam kilka korzyści:</p>
<ol class="nice-list">
<li>Jedno żądanie http zamiast czterech w celu pobrania ikon</li>
<li>Wszystkie ikonki w jednym miejscu &#8211; w przypadku przenosin nie zgubimy żadnej</li>
<li>Zmianę kolorystyki można dokonać edytując tylko jeden obrazek + css</li>
</ol>
<h2>Wykorzystanie CSS Sprites przez znane serwisy</h2>
<p>Co może jeszcze przemawiać za zastosowaniem tej techniki? Wystarczy spojrzeć na serwisy z ogromną ilością odwiedzin, wiele z nich już od dawna korzysta z CSS Sprites. Są to m.in:</p>
<h3>&nbsp;</h3>
<h3>YouTube.com</h3>
<p><a rel="nofollow" target="_blank" class="a_img" style="background: transparent url(http://s.ytimg.com/yt/img/master-vfl69326.gif) no-repeat 3px 3px; width: 630px; height: 530px;" title="YouTube Css Sprites" href="http://s.ytimg.com/yt/img/master-vfl69326.gif#referrer=blog.vokiel.com"></a></p>
<h3>&nbsp;</h3>
<h3>Onet.pl</h3>
<p><a rel="nofollow" target="_blank" class="a_img" style="background: transparent url(http://www.onet.pl/_d/378acd482f45104827b7ec24a9c6d371%2Cs_1_0.png) no-repeat 3px 3px; width: 630px; height: 812px;" title="Onet.pl Css Sprites" href="http://www.onet.pl/_d/378acd482f45104827b7ec24a9c6d371%2Cs_1_0.png#referrer=blog.vokiel.com"></a></p>
<h3>&nbsp;</h3>
<h3>Apple.com</h3>
<p><a rel="nofollow" target="_blank" class="a_img" style="background: transparent url(http://images.apple.com/global/nav/images/globalnavbg.png) no-repeat 3px 3px; width: 630px; height: 152px;" title="Apple.com Css Sprites" href="http://images.apple.com/global/nav/images/globalnavbg.png#referrer=blog.vokiel.com"></a></p>
<h2>Pobieranie</h2>
<p><a rel="nofollow" target="_blank" href="/dema/css_sprites/css_sprites.zip" class="download" title="css_sprites.zip">css_sprites.zip</a></p>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/css-minify-combine-zmniejszanie-laczenie-plikow-css-w-jeden" title="CSS minify – combine: zmniejszanie i łączenie plików css w jeden (16 Wrzesień 2009)">CSS minify – combine: zmniejszanie i łączenie plików css w jeden</a> (0)</li>
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
	<li><a href="http://blog.vokiel.com/thesmallcalendar" title="The Small Calendar (7 Marzec 2010)">The Small Calendar</a> (0)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-windows-gadget" title="The Small Calendar &#8211; Windows gadżet (7 Marzec 2010)">The Small Calendar &#8211; Windows gadżet</a> (3)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" title="The Small Calendar &#8211; jQuery + PHP w praktyce (24 Luty 2010)">The Small Calendar &#8211; jQuery + PHP w praktyce</a> (5)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/eTSJ2wYMU8g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/css-sprites-laczenie-wielu-obrazkow-w-jeden-redukcja-zadan-http/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/css-sprites-laczenie-wielu-obrazkow-w-jeden-redukcja-zadan-http</feedburner:origLink></item>
		<item>
		<title>PHP Autoloader – automatyczne dołączanie klas przez spl_autoload_register() zamiast __autoload()</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/-YRlFcDvsng/php-autoloader-automatyczne-dolaczanie-klas-przez-spl_autoload_register-zamiast-__autoload</link>
		<comments>http://blog.vokiel.com/php-autoloader-automatyczne-dolaczanie-klas-przez-spl_autoload_register-zamiast-__autoload#comments</comments>
		<pubDate>Tue, 20 Oct 2009 13:01:09 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[autoloader]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[spl_autoload_register]]></category>
		<category><![CDATA[__autoload]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=164</guid>
		<description><![CDATA[Pisząc nawet niewielkie aplikacje webowe często ilość klas rozrasta się do pokaźnej liczby. Rozwiązaniem problemu jest automatyczne dołączanie plików klas w momencie pierwszej próby użycia danej klasy. Powszechnie stosuje się dwa rozwiązania: __autoload() oraz spl_autoload_register()]]></description>
			<content:encoded><![CDATA[<p>Pisząc nawet niewielkie aplikacje webowe często ilość klas rozrasta się do pokaźnej liczby. Rozwiązaniem problemu jest automatyczne dołączanie plików klas w momencie próby utworzenia obiektu danej klasy. Powszechnie stosuje się dwa rozwiązania: <a rel="nofollow" target="_blank" href="http://www.php.net/manual/pl/language.oop5.autoload.php#referrer=blog.vokiel.com">__autoload()</a> oraz <a rel="nofollow" target="_blank" href="http://usphp.com/manual/en/function.spl-autoload-register.php#referrer=blog.vokiel.com">spl_autoload_register()</a><br />
<span id="more-164"></span><br />
Aby możliwe było wykorzystanie którejś z funkcji należy sprawdzić czy są dostępne.<br />
W przypadku funkcji <code class="b">__autoload()</code> sprawa wydaje się prosta &#8211; przede wszystkim wymagane jest PHP 5.0 (nie jest dostępna w przypadku korzystania z PHP jako CLI). W przypadku <code class="b">spl_autoload_register()</code> wymagane jest PHP w wesji >=5.1.2.</p>
<h2>Główne różnice</h2>
<table class="data-table">
<thead>
<tr>
<th></th>
<th><strong>__autoload()</strong></th>
<th><strong>spl_autoload_register()</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Wiele funkcji ładujących</td>
<td>NIE</td>
<td>TAK</td>
</tr>
<tr>
<td>Obsługa wyjątków</td>
<td>NIE</td>
<td>TAK</td>
</tr>
</tbody>
</table>
<h2>Możliwości rozwiązań</h2>
<p>Możliwości rozwiązań może być tyle ilu programistów. Wszystko zależy od tego, czego wymagamy od projektu. Możemy skorzystać z prostego dołączania klas w jednej lokalizacji, rozbudować o większą liczbę lokalizacji, dodać możliwość zastosowania różnych postfiksów, sprawdzania czy klasa/interfejs zostały już wywołane, dodać możliwość przeszukiwania katalogów w głąb, stworzyć mapę klas i interfejsów i odwoływać się do nich jak do zwykłej tablicy. Możliwości jest na prawdę wiele.</p>
<h3>Wersja super lite __autoload()</h3>
<p>Jeśli mamy do czynienia z małą stroną, możemy ujednolicić nazewnictwo klas, przechowywać je w jednej lokalizacji i użyć najprostszego dołączania:</p>
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">set_include_path</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$DOCUMENT_ROOT</span><span style="color: #339933;">.</span> <span style="color: #0000ff;">'classes'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// lub </span>
<span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'include_path'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$DOCUMENT_ROOT</span><span style="color: #339933;">.</span> <span style="color: #0000ff;">'classes'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> __autoload<span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;.class.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>
<p>Jednak powyższe rozwiązanie może zostać wykorzystane tylko w bardzo prostych projektach, nie daje żadnej elastyczności, możliwości konfiguracji, zmian, narzuca szereg ograniczeń.</p>
<h3>Wersja bardziej rozbudowana __autoload()</h3>
<p>W przypadku korzystania chociażby z interfejsów w nazewnictwie <code class="b">interfejsA.interface.php</code> poprzednia metoda już nie zadziała (zresztą nie zadziała w prawie żadnym wypadku poza podstawowym <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ). W pierwszej kolejności możemy rozszerzyć lokalizacje o dodatkowe katalogi:</p>
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">set_include_path</span><span style="color: #009900;">&#40;</span>
        <span style="color: #990000;">get_include_path</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #339933;">.</span>PATH_SEPARATOR<span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/classes/&quot;</span>
        <span style="color: #339933;">.</span>PATH_SEPARATOR<span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/interfaces/&quot;</span>
        <span style="color: #339933;">.</span>PATH_SEPARATOR<span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/modules/&quot;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>
<p>Dzięki temu pliki klas będą dołączane z wielu lokalizacji, nie tylko z jednej. Problem pojawia się w momencie próby użycia klasy, której nie ma. Rozszerzmy funkcję <code class="b">__autoload</code> o dodatkowe funkcjonalności:</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> __autoload<span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    try <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> interface_exists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000088;">$class</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">,</span> <span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$deeps</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$deeps</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$file</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$class</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000088;">$file</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'.class.php'</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span><span style="color: #990000;">is_readable</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> interface_exists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Class cannot be found ( '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$classname</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' )'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$e</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>
<p>Dodaliśmy kilka funkcjonalności:</p>
<ul>
<li>Sprawdzanie czy klasa bądź interfejs zostały już zdefiniowane</li>
<li>Następnie dodaliśmy możliwość zagnieżdżania klas w głąb katalogów. Wymaganiem tutaj postawionym jest nazewnictwo klas z użyciem dolnego podkreślenia jako separatora katalogu<br />
<code class="b">katalog_nazwaKlasy.class.php</code> lub <code class="b">katalog__podkatalog_nazwaKlasy.class.php</code></li>
<li>Sprawdzenie czy plik istnieje, czy jest możliwy do odczytu</li>
</ul>
<p>Jednak nadal nie możemy przechwycić wyjątku blokiem try-catch, zatem przy stosowaniu tej metody wymagana jest pewność iż wszystkie wywoływane klasy mają swoje odpowiedniki w plikach.</p>
<h3>Wersja lite spl_autoload_register()</h3>
<p>Sam proces dołączania będzie identyczny jak wersji lite dla __autoload() z tą różnicą, że wywołanie loadera będzie inne.</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> classLoader<span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$DOCUMENT_ROOT</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/class/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$classname</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.class.php'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">is_readable</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
        throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Class cannot be found ( '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$classname</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' )'</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: #990000;">spl_autoload_register</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'classLoader'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>Możliwość korzystania z funkcji w spl_autoload_functions nie jest jedyną, którą mamy do dyspozycji. Równie dobrze, możemy skorzystać z klas. Prosty przykład na pokazanie zasady funkcjonowania:</p>
<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> VLoader<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> autoload<span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// kod</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">spl_autoload_register</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'VLoader'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'autoload'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>
<h3>Wersja bardziej rozbudowana spl_autoload_register()</h3>
<p>Możemy utworzyć oddzielne funkcje (metody) dla rożnych rodzajów danych. Dzięki temu, możemy dać zewnętrznym aplikacjom czy programistom możliwość utworzenia własnej funkcji automatycznego ładowania plików klas. Jest to rozwiązanie lepsze od poprzednich, nie ogranicza programistów piszących dodatki do naszej aplikacji do ścisłego przestrzegania narzuconej przez nas struktury i nazewnictwa klas.</p>
<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$extensions</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'.php'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'.class.php'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'.interface.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ext</span> <span style="color: #339933;">=</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span><span style="color: #000088;">$extensions</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">spl_autoload_register</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">spl_autoload_extensions</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ext</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> classLoader<span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$extensions</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'.php'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'.class.php'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'.interface.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$class</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">,</span> <span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$deeps</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$DOCUMENT_ROOT</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$deeps</span><span style="color: #339933;">;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$file</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$class</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$extensions</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$ext</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$fileClass</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$file</span><span style="color: #339933;">.</span><span style="color: #000088;">$ext</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileClass</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">is_readable</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileClass</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$classname</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileClass</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">spl_autoload_register</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'classLoader'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* kod funckji interfaceLoader */</span>
<span style="color: #990000;">spl_autoload_register</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'interfaceLoader'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>
<p>W powyższym przykładzie wyzerowaliśmy wszystkie zarejestrowane autoloadery, następnie ustawiliśmy listę rozszerzeń możliwych do dopisania do plików. Dalej zmodyfikowaliśmy lekko poprzednią funkcję do ładowania klas. Jak widać na końcu wystarczy dopisać własną funkcję, która będzie przeszukiwać wskazany katalog i dołączyć ja poprzez <code class="b">spl_autoload_register()</code>. Dzięki temu, zewnętrzny programista może uzupełnić aplikację przez swoje klasy, które zostaną automatycznie dodane.</p>
<p>Nie jest to rozwiązanie bez wad. Wymaga napisania przez takiego programistę swojego loadera, w dodatku nastręcza trudności w jego dołączeniu. Rozwiązaniem byłoby nakazanie stworzenia funkcji loadera w oddzielnym pliku oraz umieszczenia go w określonej lokalizacji, w celu późniejszego dołączenia go do aplikacji. Co w rezultacie narzuca kolejne ograniczenia, czasem nie mniejsze niż te, których chcieliśmy uniknąć na początku.</p>
<h2>Problemy i wymagania</h2>
<p>Zbierając wszystkie trudności napotkane w procesie tworzenia autoloadera tworzy nam się lista problemów i wymagań, których spełnienie da nam szansę stworzenia takiego mechanizmu, który będziemy mogli z łatwością wykorzystywać w różnych projektach.</p>
<ol class="nice-list">
<li>Uniknięcie konieczności użycia require, require_once</li>
<li>Możliwość umieszczania klas w dowolnych lokalizacjach</li>
<li>Połączenie z zewnętrznymi bibliotekami</li>
<li>Szybkość działania</li>
<li>Łatwość użycia</li>
<li>Automatyzacja procesu</li>
<li>Dołączanie tylko wymaganych klas</li>
<li>Brak bądź niewielkie ograniczenia w nazewnictwie plików</li>
</ol>
<p>Spora ta lista <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Jak możemy z tego wybrnąć? Otóż wymienione w treści wpisu metody nie będą miały zastosowania do tak zaawansowanych wymagań. Przemyślmy sytuację:<br />
<strong>Ad. 1.</strong> Łatwizna, stosując system autoloadera automatycznie pozbywamy się tej konieczności. Jeżeli tylko spełnimy ograniczenia systemu.<br />
<strong>Ad. 2.</strong> Abyśmy mogli umieszczać klasy w wielu lokalizacjach możemy dodawać ścieżki do nich w autoloaderze, bądź utworzyć kolejne funkcje dla nowych lokalizacji. Ewentualnością może być przeskanowanie wszystkich możliwych lokalizacji w poszukiwaniu wybranego pliku.<br />
<strong>Ad. 3.</strong> W przypadku zewnętrznych bibliotek, zwykle wystarczy wywoływać główną klasę, która już później sama dołącza potrzebne jej dodatkowe klasy, interfejsy. Tak czy inaczej, jakoś musimy się dostać do tej głównej klasy. Pół biedy, jeśli główny plik klasy jest oddzielnie, a w katalogu pozostałe pliki, możemy wtedy taką paczkę wrzucić do katalogu klas i sprawa załatwiona. Gorzej natomiast z tymi, które są porozrzucane wszystkie w jednym folderze. Wtedy musimy przemyśleć opcję dodawania listy lokalizacji.<br />
<strong>Ad. 4.</strong> Szybkość działania jest bardzo ważnym elementem w każdym systemie, szczególnie aplikacji internetowej. W tym punkcie występuje tu w dwóch aspektach: szybkość aplikacji, szybkość pracy z danym rozwiązaniem. Drugie rozumienie nie jest takie ważne, gdyż występuje tylko w momencie pisania aplikacji, ewentualnie w procesie aktualizacji i poprawek. Natomiast szybkość działania aplikacji ma już ogromne znaczenie. Gdyby przy każdej odsłonie strony, narzut na autoloaderze wynosił 1 sec, pomnożone przez tysiące odsłon generowałoby drastyczne spadki wydajności. Zatem nacisk na szybkość działania, wydajność jest bardzo ważny. Ważniejszy niż łatwość kodowania, szybkość pisania kodu, przenośność.<br />
<strong>Ad. 5.</strong> Łatwość użycia, implementacji, przenośności kodu. Łatwość kodowania ma znaczenie dla użyteczności klasy od strony programisty. Dobrze jeśli ten, podczas kodowania nowych części aplikacji nie musiał dodatkowo pisać dodatkowych funkcji autolodera, bądź pilnować dodawania ścieżek do już istniejących. Najwygodniejszym rozwiązaniem jest informacja, że jest stosowany autoloader i nie trzeba zajmować się dodatkowym kodem, obsługą ładowania plików.<br />
<strong>Ad. 6.</strong> Automatyzacja w tym przypadku występuje w rozumieniu braku konieczności ręcznych zmian w kodzie, dodawania ścieżek do katalogów, dopisywania własnych funkcji dla autoloadera. Aby to osiągnąć musimy stworzyć system na tyle uniwersalny, aby był w stanie sam dostosować się do różnic w aplikacji.<br />
<strong>Ad. 7.</strong> Może wydawać się dziwne, jednak niektórzy proponują rozwiązanie, które przeskanuje wybrane lokalizacje i dołączy wszystkie pliki, tak aby ich późniejsze wykorzystanie ograniczyć tylko do utworzenia nowego obiektu.<br />
<strong>Ad. 8.</strong> Nazewnictwo plików powinno być czytelne i wskazujące, jeśli nie jednoznaczne. Chociażby ze względu na wygodę programowania, późniejszej kontroli plików i kodu. Zatem jakieś wymagania musimy założyć. Może to być dodanie postfiksu class.php, interface.php, nazwa klasy w nazwie pliku. Dobrze by było, gdyby można było łączyć klasy w jeden plik, aby klasy na stale związane ze sobą mogły być zapisane w jednym pliku.</p>
<h2>Rozwiązanie</h2>
<p>Jedynym sensownym rozwiązaniem, spełniającym powyższe, jest utworzenie mapy klas zawierających parę kluczy <code class="b">nazwa klasy =&gt; ścieżka</code><br />
Aby sprostać wymaganiom szybkości działania mapa taka powinna być tworzona tylko w przypadku zmian w układzie plików, bądź przenosin aplikacji do nowej lokalizacji, a w pozostałym czasie należy korzystać z już utworzonej mapy. Możemy ja cachować jako zserializowaną tablicę, zapisywać jako pliki ini, czy w inny, szybki i wygodny sposób. Dzięki temu najbardziej absorbująca praca jaką jest przeszukiwanie katalogów będzie wykonana bardzo rzadko, a w przypadku uruchomienia finalnej wersji aplikacji prawdopodobnie prawie nigdy.<br />
Kwestią do rozwiązania pozostaje tylko na jakiej zasadzie tworzona by była taka mapa.</p>
<ul>Pomysłów jest kilka:</p>
<li> Stałe nazewnictwo w formie nazwa_klasy.class.php, nazwa_interfejsu.interface.php skanowanie plików, wybieranie z nazwy członu przed .class.php lub interface.php, i zapisywanie tej nazwy do tablicy.<br />
Wymaga stałego nazewnictwa, po jednej klasie, interfejsie na plik.</li>
<li> Przeskanowanie plików, otworzenie każdego z nich, wyszukanie w nim ciągu inicjującego klasę lub interfejs i ten ciąg doda do tablicy.<br />
Ma to swoje wady: konieczność otworzenia plików, przeszukania ich zawartości. Takie działanie na pewno nie wpłynie pozytywnie na czas pracy skryptu. Jednak ma też kilka zalet. Uniezależnia od konkretnego nazewnictwa, lokalizacji plików, daje możliwość umieszczenia kilku klas w jednym pliku. Warto oczywiście trzymać się jakiejś sensownej, logicznej struktury.</li>
</ul>
<p>W drugiej części przedstawię próbę utworzenia takiego sytemu automatycznego logowania.</p>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/log-class-klasa-loggera-zdarzen-cz-3" title="Log class – klasa loggera zdarzeń cz 3 (28 Wrzesień 2009)">Log class – klasa loggera zdarzeń cz 3</a> (0)</li>
	<li><a href="http://blog.vokiel.com/log-class-klasa-loggera-zdarzen-cz-2" title="Log class – klasa loggera zdarzeń cz 2 (21 Wrzesień 2009)">Log class – klasa loggera zdarzeń cz 2</a> (1)</li>
	<li><a href="http://blog.vokiel.com/log-class-klasa-loggera-zdarzen" title="Log class &#8211; klasa loggera zdarzeń (7 Wrzesień 2009)">Log class &#8211; klasa loggera zdarzeń</a> (2)</li>
	<li><a href="http://blog.vokiel.com/pamieciozerny-wordpress-memory-exhausted-zbyt-maly-memory_limit" title="Pamięciożerny WordPress &#8211; memory exhausted, zbyt mały memory_limit (12 Wrzesień 2009)">Pamięciożerny WordPress &#8211; memory exhausted, zbyt mały memory_limit</a> (5)</li>
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/-YRlFcDvsng" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/php-autoloader-automatyczne-dolaczanie-klas-przez-spl_autoload_register-zamiast-__autoload/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/php-autoloader-automatyczne-dolaczanie-klas-przez-spl_autoload_register-zamiast-__autoload</feedburner:origLink></item>
		<item>
		<title>(English) Earn Fame and Fortune in the Nettuts/Screenr Screencast Competition</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/nDRIEheequ0/earn-fame-and-fortune-in-the-nettuts-screenrscreencast-ompetition</link>
		<comments>http://blog.vokiel.com/earn-fame-and-fortune-in-the-nettuts-screenrscreencast-ompetition#comments</comments>
		<pubDate>Sat, 03 Oct 2009 09:43:23 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[en]]></category>
		<guid isPermaLink="false">http://blog.vokiel.com/?p=169</guid>
		<description><![CDATA[(English) The screencast is about alternately colorizing table rows, adding other color on mouse over and on click events. Everything made by 4 lines of CSS and a bit more of jQuery JavaScript code.]]></description>
			<content:encoded><![CDATA[<p>Ten wpis jest dostępny wyłącznie w języku: <a href="http://blog.vokiel.com/feed?lang=en">English</a>.</p>
	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.vokiel.com/thesmallcalendar" title="The Small Calendar (7 Marzec 2010)">The Small Calendar</a> (0)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-windows-gadget" title="The Small Calendar &#8211; Windows gadżet (7 Marzec 2010)">The Small Calendar &#8211; Windows gadżet</a> (3)</li>
	<li><a href="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" title="The Small Calendar &#8211; jQuery + PHP w praktyce (24 Luty 2010)">The Small Calendar &#8211; jQuery + PHP w praktyce</a> (5)</li>
	<li><a href="http://blog.vokiel.com/info" title="Info (10 Wrzesień 2009)">Info</a> (0)</li>
	<li><a href="http://blog.vokiel.com/sledzik-na-nasza-klasa-pl-metoda-na-usuniecie" title="Śledzik na nasza-klasa.pl &#8211; Metoda na usunięcie (22 Wrzesień 2009)">Śledzik na nasza-klasa.pl &#8211; Metoda na usunięcie</a> (2)</li>
</ul>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/nDRIEheequ0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/earn-fame-and-fortune-in-the-nettuts-screenrscreencast-ompetition/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/earn-fame-and-fortune-in-the-nettuts-screenrscreencast-ompetition</feedburner:origLink></item>
	<media:rating>nonadult</media:rating></channel>
</rss><!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
