<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blogujcie a ...</title>
	<atom:link href="http://dobre.proaukcje.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://dobre.proaukcje.pl</link>
	<description>To i owo dla domu i zagrody</description>
	<lastBuildDate>Tue, 10 Aug 2010 11:51:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Tagi HTML, których początkujący nie używają (a powinni!)</title>
		<link>http://dobre.proaukcje.pl/tagi-html-ktorych-poczatkujacy-nie-uzywaja-a-powinni/</link>
		<comments>http://dobre.proaukcje.pl/tagi-html-ktorych-poczatkujacy-nie-uzywaja-a-powinni/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 11:50:23 +0000</pubDate>
		<dc:creator>halibucik</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://dobre.proaukcje.pl/?p=303</guid>
		<description><![CDATA[Wróćmy na chwilę  do podstaw HTML. Wieżę, że każdy kto to czyta, wie czym jest HTML. Dużo mówi się o HTML 5 i dobrze byłoby przypomnieć sobie [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://dobre.proaukcje.pl/wp-content/plugins/simple-post-thumbnails/timthumb.php?src=/wp-content/thumbnails/303.png&amp;w=200&amp;h=150&amp;zc=1&amp;ft=jpg' alt='post thumbnail' /></p>
<p>Wróćmy na chwilę  do podstaw HTML. Wieżę, że każdy kto to czyta, wie czym jest HTML. Dużo mówi się o HTML 5 i dobrze byłoby przypomnieć sobie tagi, których niektórzy nigdy, niektórzy rzadko, a niektórzy często używają. Wszystkie wymienione są obsługiwane zarówno przez HTML 4.01 jak i HTML 5. Do dzieła więc!</p>
<p><span id="more-303"></span></p>
<h2>1. &lt;!&#8211; -&gt;</h2>
<p>Jeśli mieliście w ręku kiedykolwiek jakąkolwiek książkę o programowaniu, przeczytacie tam sto tysięcy razy jak ważne jest dokumentowanie i opisywanie własnego kodu. Nie są to czcze słowa! Z całą pewnością pozwala to na szybkie zorientowanie się co dzieje się w tym a nie innym miejscu.</p>
<p>Komentowanie HTML może wydawać się nieco na wyrost, jednakże i tu można znaleźć dobre zastosowanie &#8211; wydzielane bloków, części kodu, które są w jakiś sposób powiązane. Oznaczanie początku  i końca sekcji istotnie ułatwia późniejszą pracę. Śpieszę z przykładem:</p>
<pre class="brush: html; ">

&lt;!-- Nav Start --&gt;
&lt;ul&gt;
	&lt;li&gt;menu opcja1&lt;/li&gt;
	&lt;li&gt;menu opcja2&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- Nav End --&gt;

&lt;!-- Content Start --&gt;
&lt;p&gt;Zawartość blablabla...&lt;/p&gt;
</pre>
<h2>2. Style tabeli: &lt;thead&gt;, &lt;tbody&gt; oraz &lt;tfoot&gt;</h2>
<p>W zamierzchłych czasach (całkiem zresztą niedawno) tworzenie layoutu strony polegało na zagnieżdżaniu milionów tabel w sobie. Na szczęście ten trend minął i teraz tag &lt;table&gt; służy do prezentowania danych tabelarycznych, do czego bądź co bądź jest stworzony. Nie każdy wie, że tabele mają możność być ostylowane &#8211; dotyczy to kolumn, wierszy, nagłówków, stopki i zawartości.</p>
<p>Zobaczmy jak możemy to wykorzystać:<br />
<!--   --></p>
<table id="poczatkujacy_tabela">
<thead>
<tr>
<td>Przedmiot</td>
<td>Ilość</td>
</tr>
</thead>
<tfoot>
<tr>
<td>Suma</td>
<td>19</td>
</tr>
</tfoot>
<tbody>
<tr>
<td>Flaczki</td>
<td>13</td>
</tr>
<tr>
<td>Ziemniaczki</td>
<td>6</td>
</tr>
</tbody>
</table>
<p>Na uwagę zasługuje fakt, że element &lt;tfoot&gt; powinien znajdować się powyżej elementu &lt;tbody&gt;</p>
<p>Oto użyty w powyższym przykładzie kod:</p>
<pre class="brush: html; ">

&lt;table&gt;
&lt;thead&gt;
  &lt;tr&gt;
	&lt;td&gt;Przedmiot&lt;/td&gt;
	&lt;td&gt;Ilość&lt;/td&gt;
  &lt;/tr&gt;
&lt;/thead&gt;
&lt;tfoot&gt;
  &lt;tr&gt;
	&lt;td&gt;Suma&lt;/td&gt;
	&lt;td&gt;19&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tfoot&gt;
&lt;tbody&gt;
  &lt;tr&gt;
	&lt;td&gt;Flaczki&lt;/td&gt;
	&lt;td&gt;13&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
	&lt;td&gt;Ziemniaczki&lt;/td&gt;
	&lt;td&gt;6&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</pre>
<h2>3. &lt;optgroup&gt;</h2>
<p>Menu rozwijalne jest doskonałym sposobem na przedstawianie danych &#8216;do wyboru&#8217; użytkownikowi.<br />
Przedstawienie danych za pomocą &lt;optgroup&gt; sprawia, że są one czytelnie pogrupowane nawet, jeśli opcji jest mnóstwo.</p>
<select>
	<optgroup label="Drużyny piłkarskie"></p>
<option value="Orły z wioski">Orły z wioski</option>
<option value="Ptaszyny nadmorskie">Ptaszyny nadmorskie</option>
<p>	</optgroup><br />
	<optgroup label="Drużyny koszykarskie"></p>
<option value="Orły z miasta">Orły z miasta</option>
<option value="Ptaszyny rzeczne">Ptaszyny rzeczne</option>
<p>	</optgroup><br />
</select>
<pre class="brush: html; ">

&lt;select&gt;
	&lt;optgroup label=&quot;Drużyny piłkarskie&quot;&gt;
		&lt;option value=&quot;Orły z wioski&quot;&gt;Orły z wioski&lt;/option&gt;
		&lt;option value=&quot;Ptaszyny nadmorskie&quot;&gt;Ptaszyny nadmorskie&lt;/option&gt;
	&lt;/optgroup&gt;
	&lt;optgroup label=&quot;Drużyny koszykarskie&quot;&gt;
		&lt;option value=&quot;Orły z miasta&quot;&gt;Orły z miasta&lt;/option&gt;
		&lt;option value=&quot;Ptaszyny rzeczne&quot;&gt;Ptaszyny rzeczne&lt;/option&gt;
	&lt;/optgroup&gt;
&lt;/select&gt;
</pre>
<h2>4. Nagłówki &#8211; &lt;h1&gt;,&lt;h2&gt;,&lt;h3&gt;,&lt;h4&gt;,&lt;h5&gt;, oraz &lt;h6&gt;</h2>
<p>Wszyscy używamy nagłówków, ale szczerze mówiąc w niewielu miejscach można spotkać &lt;h3&gt; a tym bardziej niższe. Apelujemy: używajmy nagłówków zamiast niesemantycznych np. tagów &lt;div&gt; dla nagłówków!</p>
<h2>5. &lt;fieldset&gt; and &lt;legend&gt;</h2>
<p>Miło jest wypełniać formularz, który jest dobrze opisany, podzielony na logiczne sekcje. Aż chce się taki wysłać :)<br />
Za pomocą &lt;fieldset&gt; wyrysujesz prostokąt wokół sekcji, a &lt;legend&gt; doda podpis do danej sekcji. Zobacz jakie to proste!</p>
<form>
<fieldset>
<legend>Informacje główne: </legend>
<p>		<label>Imie:<br />
<input type="text" size="30" /></label><br />
		<label>Email:<br />
<input type="text" size="30" /></label><br />
		<label>Data urodzenia:<br />
<input type="text" size="10" /></label><br />
	</fieldset>
</form>
<pre class="brush: html; ">

&lt;form&gt;
	&lt;fieldset&gt;
		&lt;legend&gt;Informacje główne: &lt;/legend&gt;
		&lt;label&gt;Imie: &lt;input type=&quot;text&quot; size=&quot;30&quot; /&gt;&lt;/label&gt;
		&lt;label&gt;Email: &lt;input type=&quot;text&quot; size=&quot;30&quot; /&gt;&lt;/label&gt;
		&lt;label&gt;Data urodzenia: &lt;input type=&quot;text&quot; size=&quot;10&quot; /&gt;&lt;/label&gt;
	&lt;/fieldset&gt;
&lt;/form&gt;
</pre>
<h2>6. &lt;label&gt;</h2>
<p>Jest to niezwykle funkcjonalny tag &#8211; nie wpływa na wygląd, natomiast ułatwia wypełnianie formularzy &#8211; kliknięcie na etykietę (np. tekst) powoduje wybranie pola typu <strong>input</strong> &#8211;  radio, text czy checkbox.</p>
<form>
	<label>Imie:</p>
<input type="text" size="30" /></label><br />
		<label>Mężczyzna:</p>
<input type="radio" name="sex" /></label><br />
	<label>Kobieta:</p>
<input type="radio" name="sex" /></label><br />
</form>
<pre class="brush: html; ">

&lt;form&gt;
	&lt;label&gt;Imie:&lt;br /&gt;
		&lt;input type=&quot;text&quot; size=&quot;30&quot; /&gt;&lt;/label&gt;&lt;br /&gt;
		&lt;label&gt;Mężczyzna:&lt;br /&gt;
		&lt;input type=&quot;radio&quot; name=&quot;sex&quot; /&gt;&lt;/label&gt;&lt;br /&gt;
	&lt;label&gt;Kobieta:&lt;br /&gt;
		&lt;input type=&quot;radio&quot; name=&quot;sex&quot; /&gt;&lt;/label&gt;&lt;br /&gt;
&lt;/form&gt;
</pre>
<h2>7. &lt;blockquote&gt;</h2>
<p>Jeśli pragniesz wyróżnić fragment tekstu w specjalny sposób, użyj tagu &lt;blockquote&gt;.<br />
Domyślnie zostanie dodana przestrzeń przed i po wyróżnionej zawartości oraz margines lewy i prawy.</p>
<p>Jest to doskonały sposób, na wstawienie bloku cytatu. Jeśli pobierasz zawartość z innej strony, blackquote nadaje się do tego znakomicie!</p>
<blockquote>
<p>
Tak właśnie wstawiamy cytaty!
</p>
</blockquote>
<h2>8. &lt;cite&gt;</h2>
<p>Jest to odwołanie do innego źródła. Najczęściej używany w &lt;blockquote&gt;</p>
<blockquote>
<p>&#34;Kłapouchy zbliżył się do Puchatka i rzekł głośnym szeptem: &#8211; Czy nie mógłbyś poprosić twego przyjaciela, żeby gimnastykował się gdzie indziej ? Za chwile będę jadł śniadanie i nie chce, żeby mi ktokolwiek skakał po nim. To taki drobiazg, po prostu mój kaprys, ale każdy z nas ma swoje małe przyzwyczajenia. &#34; <cite>- poema.art.pl</cite></p>
</blockquote>
<pre class="brush: html; ">

&lt;blockquote&gt;
	Kłapouchy zbliżył się do Puchatka&lt;cite&gt;...&lt;/cite&gt;
&lt;/blockquote&gt;
</pre>
<h2>9. &lt;dl&gt;</h2>
<p>Korzystanie z list to doskonały sposób organizowania informacji. Każdy zna &lt;ul&gt;, ale jak często są używane &lt;ol&gt; i &lt;dl&gt;? Być może odniesienie do &#8222;listy definicji&#8221; myli niektórych, że mogą być używane tylko przy pojęciach i definicjach &#8211; jednak nie jest to przypadek.</p>
<p>Jakie istnieją typy list?</p>
<h3>
<ul>
<li>Nieuporządkowana ul &#8211; wypunktowana</li>
<li>Uporządkowana ol &#8211; numerowana</li>
<li>Definicje dl &#8211; terminy i definicje</li>
<pre class="brush: html; ">

&lt;dl&gt;
	&lt;dt&gt;Opis1&lt;/dt&gt;
		&lt;dd&gt;definicja1&lt;/dd&gt;
	&lt;dt&gt;Opis2&lt;/dt&gt;
		&lt;dd&gt;definicja2&lt;/dd&gt;
</pre>
<p>W tym artykule to wszystko, miały być jeszcze znaki ASCII, ale być może to będzie następny artykuł :)</p>
]]></content:encoded>
			<wfw:commentRss>http://dobre.proaukcje.pl/tagi-html-ktorych-poczatkujacy-nie-uzywaja-a-powinni/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chytre: Multi ramka za pomocą CSS</title>
		<link>http://dobre.proaukcje.pl/chytre-multi-ramka-za-pomoca-css/</link>
		<comments>http://dobre.proaukcje.pl/chytre-multi-ramka-za-pomoca-css/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 18:43:48 +0000</pubDate>
		<dc:creator>halibucik</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[Tipsy]]></category>
		<category><![CDATA[after]]></category>
		<category><![CDATA[before]]></category>
		<category><![CDATA[border]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[pseudoklasa]]></category>
		<category><![CDATA[ramka]]></category>
		<category><![CDATA[speudoklasy]]></category>

		<guid isPermaLink="false">http://dobre.proaukcje.pl/?p=256</guid>
		<description><![CDATA[Czy wiesz, że za pomocą stylów CSS można dodać do elementu wiele ramek? Jeśli do tej pory używałeś grafik, najwyższy czas z tym skończyć :) Użycie pseudoklasy [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://dobre.proaukcje.pl/wp-content/plugins/simple-post-thumbnails/timthumb.php?src=/wp-content/thumbnails/256.png&amp;w=200&amp;h=150&amp;zc=1&amp;ft=jpg' alt='post thumbnail' /></p>
<p>Czy wiesz, że za pomocą stylów CSS można dodać do elementu wiele ramek? Jeśli do tej pory używałeś grafik, najwyższy czas z tym skończyć :)<br />
Użycie pseudoklasy :after oraz :before może dodać więcej głębi do strony w kilka minut!<br />
<span id="more-256"></span>
<pre class="brush: html; ">

&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;utf-8&quot;&gt;
&lt;title&gt;Multi ramka&lt;/title&gt;
&lt;style&gt;
body { background: #d2d1d0; }

#box {
background: #f4f4f4;
border: 1px solid #bbbbbb;
width: 200px;
height: 200px;
margin: 60px auto;
position: relative;
}

#box:before {
border: 1px solid white;
content: &#039;&#039;;
width: 198px;
height: 198px;
position: absolute;
}

#box:after {
content: &#039;&#039;;
position: absolute;
width: 196px;
height: 196px;
border: 1px solid #bbbbbb;
left: 1px; top: 1px;
}
&lt;/style&gt;

&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;box&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://dobre.proaukcje.pl/chytre-multi-ramka-za-pomoca-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chytre: GMail – jeden adres by wszystkimi rządzić…</title>
		<link>http://dobre.proaukcje.pl/chytre-gmail-jeden-adres-by-wszystkimi-rzadzic/</link>
		<comments>http://dobre.proaukcje.pl/chytre-gmail-jeden-adres-by-wszystkimi-rzadzic/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 19:16:00 +0000</pubDate>
		<dc:creator>halibucik</dc:creator>
				<category><![CDATA[Tipsy]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://dobre.proaukcje.pl/?p=228</guid>
		<description><![CDATA[Poczta od Google jest znana i lubiana za dużą pojemność (obecnie już nie powala na kolana), prawie doskonały filtr antyspamowy, wątki (tu można polemizować) i sto tysięcy [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://dobre.proaukcje.pl/wp-content/plugins/simple-post-thumbnails/timthumb.php?src=/wp-content/thumbnails/228.png&amp;w=200&amp;h=150&amp;zc=1&amp;ft=jpg' alt='post thumbnail' /></p>
<p>Poczta od Google jest znana i lubiana za dużą pojemność (obecnie już nie powala na kolana), prawie doskonały filtr antyspamowy, wątki (tu można polemizować) i sto tysięcy dodatków bardziej lub mniej potrzebnych i funkcjonalnych.</p>
<p>Nie każdy zdaje sobie sprawę, że do jednego adresu prowadzi&#8230;<span id="more-228"></span><br />
nieskończona ilość adresów, które za pomocą kilku sprytnych kroków mogą wprowadzić małą rewolucję w korzystaniu z tej zacnej poczty.</p>
<p><strong>.</strong></p>
<p>Ta kropka sprawia, że domyślny adres konto@gmail.com jest tym samym adresem co kon.to@gmail.com. Nie zdziwi nikogo, że to również ten sam co kont.o@gmail.com, ale też konto.@gmail.com, ko..nto@gmail.com. Dochodzimy do wniosku, że kropka rozdzielająca adres email jest przez GMail ignorowana. Sztuczka nie działa w przypadku podpięcia zewnętrznego adresu email pod skrzynkę Google&#8217;a.</p>
<p><strong>+</strong></p>
<p>Ten plus postawiony tuż przed małpą (za pełną nazwą użytkownika &#8211; tu nie jest tak jak z kropką!) rozszerza ilość unikalnych, ale prowadzących na tą samą skrzynkę adresów. I tak mamy  konto+prywatny@gmail.com,  konto+nieprywatny@gmail.com, konto+jakikolwiekinny@gmail.com, które nadal są jednym i tym samym adresem!</p>
<p><strong>Kooperacja ./+</strong></p>
<p>Eureka! Metodę kropki i plusa możemy połączyć! A to heca:) k.ont.o+dobresobie@gmail.com to cały czas ten konto@gmail.com adres pocztowy.</p>
<p><strong>Ciekawostka</strong></p>
<p>Niejedna osoba posiada konto imie.nazwisko@gmail.com. Czy to oznacza, że ktoś inny zakładając imienazwisko@gmail.com będzie metodą kropki mógł się podawać za kogoś innego?<br />
Odpowiedź przychodzi natychmiastowo &#8211; NIE, bowiem zakładając konto z kropką rezerwujesz wszystkie adresy z kropką. Uff, no to jesteśmy bezpieczni.<br />
Drugą ciekawostką jest to, że adresu z + nie da się zarejestrować.</p>
<p><strong>Sens tych wynurzeń?</strong></p>
<p>Jakie zastosowania można znaleźć dla tych błyskotliwych sztuczek?<br />
Można znaleźć kilka. Ponieważ przesyłka na adres k.ont.o+dobresobie@gmail.com ma zapisanego adresata właśnie takiego k.ont.o+dobresobie@gmail.com, mamy możliwość filtrowania tychże przesyłek &#8211; tu z pomocą przychodzą nam rozbudowane filtry GMaila.</p>
<p>Jak to zrobić? Wyobraźmy sobie modne teraz konto na Facebook&#8217;u. Domyślnie otrzymujemy około jednego stosu wiadomości dziennie. Może to irytować, dlatego posłużymy się sprytną radą wujka dobra rada:)<br />
Podajemy adres konto+facebook@gmail.com przy rejestracji/edycji profilu. W GMailu tworzymy etykietę Facebook oraz w Ustawieniach w zakładce Filtry tworzymy nowy, wpisując w pole Do spreparowany adres email oraz przypisujemy etykietę, gdy coś na ten adres przyjdzie. Ha! teraz wszystkie ciekawe wiadomości mamy w jednym miejscu!</p>
<p>A już wkrótce następne powalające na kolana sztuczki dla Google Mail!</p>
]]></content:encoded>
			<wfw:commentRss>http://dobre.proaukcje.pl/chytre-gmail-jeden-adres-by-wszystkimi-rzadzic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak dodać formularz płatności PayPal na stronę www?</title>
		<link>http://dobre.proaukcje.pl/jak-dodac-formularz-platnosci-paypal-na-strone/</link>
		<comments>http://dobre.proaukcje.pl/jak-dodac-formularz-platnosci-paypal-na-strone/#comments</comments>
		<pubDate>Sun, 23 May 2010 10:06:09 +0000</pubDate>
		<dc:creator>halibucik</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[formularz]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[internetowe]]></category>
		<category><![CDATA[PayPal]]></category>
		<category><![CDATA[płatności]]></category>

		<guid isPermaLink="false">http://dobre.proaukcje.pl/?p=196</guid>
		<description><![CDATA[<div class='hpt_container' style='width:100%;display:block;clear:both;height:224px;'><div class='hpt_element' style='float:LEFT;border: #fff solid 1px;background:#FFFFFF;padding:1px;margin-right:10px;'><a href='http://dobre.proaukcje.pl/jak-dodac-formularz-platnosci-paypal-na-strone/'><img height='200px' width='200px' id='hpt_4' class='hpt_class' style=';border: #fff solid 1px' title='Jak dodać formularz płatności PayPal na stronę www?' alt='Jak doda formularz patnoci PayPal na stron pay  Jak dodać formularz płatności PayPal na stronę www?' src='http://dobre.proaukcje.pl/wp-content/uploads/hungred-post-thumbnail//images/live/Jak-doda-formularz-patnoci-PayPal-na-stron-pay.jpg'/></a></div>Choć może to wydawać się skomplikowane, utworzenie formularza dla płatności PayPal nie jest wcale bardziej skomplikowane od stworzenia zwykłego formularza na stronę www. Przy nieco większym zaangażowaniu [...]</div>]]></description>
			<content:encoded><![CDATA[<p>Choć może to wydawać się skomplikowane, utworzenie formularza dla płatności PayPal nie jest wcale bardziej skomplikowane od stworzenia zwykłego formularza na stronę www. Przy nieco większym zaangażowaniu można dodać coś w stylu &#8222;Kup teraz&#8221; gdzie można zdefiniować za co i ile użytkownik płaci.<br />
<span id="more-196"></span></p>
<h2>Jak to działa?</h2>
<p>W najprostszym przypadku w formularzu jest tylko widoczny przycisk &#8222;Kup teraz&#8221;, a wszystkie inne pola z wartością zapłaty i tytułem są ukryte i na sztywno zdefiniowane. My chcemy czegoś bardziej zaawansawnego :)</p>
<p>Nasz przykład &#8211; chcemy dać użytkownikom możliwość wpłacenia dobrowolnie dowolnej kwoty za jego zdaniem ciekawy artykuł/tutorial &#8211; użytkownik wpisuje kwotę i wybiera tytuł artykułu. Można to łatwo zrobić przez zmianę ukrytych pól hidden na pola typu text i/lub select. Więc zaczynajmy.</p>
<h2>Krok #1</h2>
<p>Pierwszą rzeczą jest stworzenie strony, na którą zostanie przeniesiony użytkownik po zapłaceniu, gdzie przyjmie gratulacje z powodu udanej zapłaty. </p>
<h2>Krok #2</h2>
<p>Następnie zaloguj się na swoje konto PayPal i kliknij kartę Merchant Services &#8211; Usługi dla handlowców. Na dole z prawej zobaczysz łącze Przyciski Kup teraz &#8211; utworzymy własny guzik.</p>
<p>Wypełnij formularz wpisując w pozycji ID liczbę 1 oraz podobnie abstrakcyjne dane dla nazwy przedmiotu i ceny. Dane te ustawimy później. Upewnij się, że połączenie NIE JEST szyfrowane &#8211; wybierz &#8216;Użyj mojego podstawowego adresu e-mail <TwójEmail>. Pozostałe pola (waga itp.) mogą być puste. Na następnej stronie jest kod &#8211; jest on domyślnie zaszyfrowany, ale przyciskiem ponad polem można go odkodować &#8211; zróbmy to!</p>
<h2>Krok #3</h2>
<pre lang="xml">
<form target="paypal" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="business" value="halibucik@wp.pl">
<input type="hidden" name="lc" value="PL">
<input type="hidden" name="item_name" value="1">
<input type="hidden" name="item_number" value="1">
<input type="hidden" name="amount" value="1.00">
<input type="hidden" name="currency_code" value="PLN">
<input type="hidden" name="button_subtype" value="products">
<input type="hidden" name="add" value="1">
<input type="hidden" name="bn" value="PP-ShopCartBF:btn_cart_LG.gif:NonHosted">
<input type="image" src="https://www.paypal.com/pl_PL/PL/i/btn/btn_cart_LG.gif" border="0" name="submit" alt="PayPal — Płać wygodnie i bezpiecznie">
<img alt="" border="0" src="https://www.paypal.com/pl_PL/i/scr/pixel.gif" width="1" height="1">
</form>
</pre>
<p>Oto kod, który otrzymałem od PayPal. Zauważ, że zachowując odpowiednie nazwy pól, możemy zmienić ich typ z <strong>hidden</strong> na <strong>text</strong>!</p>
<p>Oznacza to, że na przykład zamiast określania wartości kwoty na sztywne 9 PLN, możemy pozwolić użytkownikowi na wpisanie kwoty, które chcą zapłacić. Podobnie tytuł wpłaty item_name może być wprowadzony przez użytkownika.</p>
<p>Oto pola, które chcemy/możemy zmienić:</p>
<ul>
<li><strong>Item number</strong> &#8211; Jest to wartość, którą można zobaczyć na stronie PayPal po kliknięciu przycisku i rozwinięciu &#8216;strzałki&#8217; &#8211; zobacz przykładowy formularz poniżej</li>
<li><strong>Business</strong> &#8211; Jest to konto, na które zostanie przekazana wpłata. Upewnij się, że to Twój adres e-mail!</li>
<li><strong>Currency code</strong> &#8211; Waluta, w której wpłacane są pieniądze. Możesz zbudować listę rozwijalną, jeżeli spodziewasz się wpłat z całego świata</li>
<li><strong>Item name</strong> &#8211; tytuł wpłaty. Może być to lista rozwijalna lub pole typu text.</li>
<li><strong>Amount</strong> &#8211; kwota. Musimy uważać, aby znalazła się ty tylko liczba, w innym przypadku PayPal zwróci błąd i nici z transakcji&#8230; Można użyć zaawansowanej walidacji JS (osobny artykuł) w naszym przykładzie dodamy za polem walutę PLN, co ma sugerować aby wpisać tylko liczbę.</li>
</ul>
<h2>Krok #4</h2>
<p>Można zauważyć, że w kodzie nie ma tu adresu URL strony zwrotnej.  Wystarczy dodać linię do formularza (zwrotny adres URL)</p>
<pre lang="xml">
<input type="hidden" name="return" value="http://dobre.proaukcje.pl/wplata-przyjeta/">
</pre>
<p>Jak widzisz, przycisk ma domyślny paypalowski nudny oklepany wygląd. Nie chcemy nudnego &#8211; chcemy jeszcze nudniejszy klasyczny przycisk &#8211; dokonamy tego zmieniając input type=&#8221;image&#8221; na input type=&#8221;submit&#8221;.</p>
<pre lang="xml">
<input type="submit" value="Zapłać przez PayPal!">
</pre>
<h2>Krok #5</h2>
<p>Najwyższa pora aby zbudować formularz:</p>
<div style="margin:20px; padding:50px; padding-top:30px; background-color:#f5f5f5; border:1px dashed #c5c5c5;">
<p><big><b>Wesprzyj portal Dobre Wieści</b></big><br />
Wypełnij formularz wybierając Twój ulubiony tutorial:</p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="halibucik@wp.pl">
<input type="hidden" name="item_name" value="Donation">
<p>    <strong>Który tutorial chcesz docenić?</strong></p>
<select name="item_number">
<option value="PayPal formularz">PayPal formularz</option>
<option value="Zend Framework - logowanie">Zend Framework &#8211; logowanie</option>
<option value="Zupełnie inny">Zupełnie inny</option>
</select>
<p>    <strong>Jak wiele chcesz wpłacić?</strong></p>
<input type="text" name="amount">PLN</p>
<input type="hidden" name="no_shipping" value="0">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="currency_code" value="PLN">
<input type="hidden" name="lc" value="PL">
<input type="hidden" name="bn" value="PP-ShopCartBF:btn_cart_LG.gif:NonHosted">
<input type="hidden" name="return" value="http://dobre.proaukcje.pl/wplata-przyjeta/">
<input type="submit" value="Zapłać przez PayPal!">
</form>
</div>
<p>Możesz kliknąć teraz button i zobaczyć jak to w rzeczywistości wygląda. Nie obawiaj się, nie musisz nic wpłacać :)</p>
<p>Oto kompletny kod dla naszego przykładu:</p>
<pre lang="xml">

<big><b>Wesprzyj portal Dobre Wieści</b></big>
Wypełnij formularz wybierając Twój ulubiony tutorial:
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="halibucik@wp.pl">
<input type="hidden" name="item_name" value="Donation">

    <strong>Który tutorial chcesz docenić?</strong>
<select name="item_number">
<option value="PayPal formularz">PayPal formularz</option>
<option value="Zend Framework - logowanie">Zend Framework - logowanie</option>
<option value="Zupełnie inny">Zupełnie inny</option>
</select>

    <strong>Jak wiele chcesz wpłacić?</strong>
<input type="text" name="amount">PLN
<input type="hidden" name="no_shipping" value="0">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="currency_code" value="PLN">
<input type="hidden" name="lc" value="PL">
<input type="hidden" name="bn" value="PP-ShopCartBF:btn_cart_LG.gif:NonHosted">
<input type="hidden" name="return" value="http://dobre.proaukcje.pl/wplata-przyjeta/">
<input type="submit" value="Zapłać przez PayPal!">
</form>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://dobre.proaukcje.pl/jak-dodac-formularz-platnosci-paypal-na-strone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Chart Tools – jak tworzyć ciekawe wykresy</title>
		<link>http://dobre.proaukcje.pl/google-chart-tools-jak-tworzyc-ciekawe-wykresy/</link>
		<comments>http://dobre.proaukcje.pl/google-chart-tools-jak-tworzyc-ciekawe-wykresy/#comments</comments>
		<pubDate>Sat, 22 May 2010 15:28:34 +0000</pubDate>
		<dc:creator>halibucik</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Chart]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[interaktywne]]></category>
		<category><![CDATA[wykresy]]></category>

		<guid isPermaLink="false">http://dobre.proaukcje.pl/?p=152</guid>
		<description><![CDATA[<div class='hpt_container' style='width:100%;display:block;clear:both;height:224px;'><div class='hpt_element' style='float:LEFT;border: #fff solid 1px;background:#FFFFFF;padding:1px;margin-right:10px;'><a href='http://dobre.proaukcje.pl/google-chart-tools-jak-tworzyc-ciekawe-wykresy/'><img height='200px' width='200px' id='hpt_5' class='hpt_class' style=';border: #fff solid 1px' title='Google Chart Tools – jak tworzyć ciekawe wykresy' alt='Google Chart Tools jak tworzy ciekawe wykresy charttools logo  Google Chart Tools – jak tworzyć ciekawe wykresy' src='http://dobre.proaukcje.pl/wp-content/uploads/hungred-post-thumbnail//images/live/Google-Chart-Tools--jak-tworzy-ciekawe-wykresy-charttools_logo.gif'/></a></div>W tym tutorialu zapoznamy się z ciekawym sposobem na generowanie efektywnych wykresów słupkowych, kołowych, liniowych w locie za pomocą Google Chart Tools. Wykresy mogą być statyczne i [...]</div>]]></description>
			<content:encoded><![CDATA[<p>W tym tutorialu zapoznamy się z ciekawym sposobem na generowanie efektywnych wykresów słupkowych, kołowych, liniowych w locie za pomocą Google Chart Tools.<br />
Wykresy mogą być statyczne i interaktywne i zapoznamy się z tworzeniem obu w tym tutorialu.<br />
<span id="more-152"></span></p>
<h2>Statyczne kontra Interaktywne</h2>
<p>Mamy do dyspozycji dwa rodzaje wykresów:</p>
<ul>
<li>Statyczne <strong>Image Charts</strong>- używamy adresu URL do pobrania obrazka z wykresem</li>
<li>Interaktywne <strong>Interactive Charts</strong> &#8211; używamy JavaScript nadając im dynamizmu</li>
</ul>
<p>Image Charts są łatwe w użyciu, jednak interaktywne są znacznie bardziej elastyczne, ponieważ są &#8216;wrażliwe&#8217; na zdarzenia, które możemy wykorzystać do interakcji z innymi elementami na stronie.</p>
<h2>Jedna z pięciu najłatwiejszych rzeczy na świecie</h2>
<p>W istocie dodanie własnego statycznego wykresu na własną stronę sprowadza się do dodania adresu URL.<br />
Jeśli wpiszesz w swojej przeglądarce następujący link:</p>
<pre lang="xml">

http://chart.apis.google.com/chart?cht=p3&#038;chs=450x200&#038;chd=t:2,4,3&#038;chl=Tak|Nie|Nie%20wiem&#038;chtt=

Czy%20wiesz,%20ze%2050%%20Polakow%20to%20polowa%20spoleczenstwa?&#038;chco=ff0000
</pre>
<p>Zobaczysz taki oto wykres:<br />
<img src="http://dobre.proaukcje.pl/wp-content/uploads/2010/05/chart.jpg" alt="przykłądowy wykres kołowy" title="Wykres google chart tools" class="alignnone size-medium wp-image-157" /><br />
Możesz teraz dodać ten link jako adres obrazka w kodzie strony:</p>
<pre lang="xml">
<img src="http://chart.apis.google.com/chart?cht=p3&#038;chs=450x200&#038;chd=t:2,4,3&#038;chl=Tak|Nie|Nie%20wiem&#038;chtt=Czy%20wiesz,%20ze%2050%%20Polakow%20to%20polowa%20spoleczenstwa?&#038;chco=ff0000" />
</pre>
<p>Czyż nie jest to bajecznie prostą igraszką?</p>
<p>A teraz kilka słów o budowie adresu URL</p>
<h3>Parametry wymagane</h3>
<p><em class="green">http://chart.apis.google.com/chart?</em> &#8211; główny adres dla wywoływanych wykresów<br />
<em  class="green">cht=p3&#038;</em> &#8211; typ wykresu &#8211; tu kołowy 3D<br />
<em  class="green">chs=450&#215;200&#038;</em> &#8211; rozmiar wykresu w pikselach dłogość x wysokość<br />
<em  class="green">chd=t:2,4,3&#038;</em> &#8211; wartości procentowe dla odpowiednich danych</p>
<h3>Parametry opcjonalne</h3>
<p><em  class="green">chl=Tak|Nie|Nie%20wiem&#038;</em> &#8211; etykiety dla odpowiednich danych<br />
<em  class="green">chtt=Czy%20wiesz,%20ze%2050%%20Polakow%20to%20polowa%20spoleczenstwa?&#038;</em> &#8211; tytuł wykresu<br />
<em  class="green">chco=ff0000</em> &#8211; schemat kolorystyczny</p>
<p>I to tyle jeśli chodzi o statyczne wykresy. Manipulując powyższymi parametrami można osiągnąć niesamowite efekty! Do dyspozycji otrzymujemy sporo różnych rodzajów wykresów, które możemy dowolnie kolorować używając schematów od Google lub własnych, a dodając opcjonalne parametry, masz w ręku silne narzędzie!.<br />
Ale zajmijmy się teraz czymś jeszcze bardziej interesującym :)</p>
<h2>Wykresy interaktywne</h2>
<p>Aby używać interaktywnych wykresów zmienimy nieco podejście. W tym przypadku nie tworzymy adresu URL, tylko korzystamy z skryptu JavaScript. Nie jest to tak proste jak wcześniejsze zadanie, ale trudne też nie.</p>
<p>Wykresy mają różne poziomy interaktywności. Zazwyczaj wykres będzie reagować w określony sposób,  na wywołaną akcję. Kliknięciem pokazane podpowiedzi lub animacje to jeden z przykładów, ale naprawdę potężnym narzędziem jest to, że mogą one wywoływać zdarzenia, dla których można zarejestrować wywołania zwrotne. Do takich zdarzeń może być wybranie słupka lub kawałka wykresu kołowego po najechaniu myszką itp.</p>
<h2>Formatowanie danych</h2>
<p>Aby zobaczyć wykres wszystkie dane muszą wywodzić się z obiektu <code>DataTable</code>.<br />
W zasadzie jest to tabela zbudowana z wierszy i kolumn, gdzie każda kolumna ma zdefiniowane typy danych (ID i etykiety).<br />
Aby odnieść się do konkretnej komórki tabeli należy użyć pary wiersz-kolumna. Wiersz jest zawsze liczbą (numerowanie od zera), kolumna może być liczbą lub identyfikatorem.</p>
<p>Załóżmy, że chcemy wyświetlić wyniki naszej firmy osiągnięte w 2010 roku &#8211; na wykresie słupkowym:</p>
<table>
<thead>
<tr>
<th>Kwartał 2010r.</th>
<th>Zarobki</th>
<tr>
<tr>
<td>Kwartał I</td>
<td>308</td>
</tr>
<tr>
<td>Kwartał II</td>
<td>257</td>
</tr>
<tr>
<td>Kwartał III</td>
<td>375</td>
</tr>
<tr>
<td>Kwartał IV</td>
<td>123</td>
</tr>
</table>
<p>Mamy dwie kolumny: pierwsza typu &#8216;string&#8217; &#8211; etykieta każdego słupka, druga typu &#8216;number&#8217; jest wartością słupka. Mamy cztery rzędy co oznacza, że będą cztery słupki. Eureka!</p>
<p>W jaki sposób umieścić teraz dane w obiekcie DataTable? Oto odpowiedni kod &#8211; każda linia jest wyjaśniona później:</p>
<pre lang="javascript">

//utwórz obiekt DataTable
var dataTable = new google.visualization.DataTable();

//zdefiniuj kolumny
dataTable.addColumn('string','Kwartał 2010');
dataTable.addColumn('number', 'Zarobki');

//zdefiniuj wiersze
dataTable.addRows([['K1',308], ['K2',257],['K3',375],['K4', 123]]);
</pre>
<p>Jest to jeden ze sposobów tworzenia obiektu DataTable. Pamiętaj, że różne wykresy wymagają różnych danych i różnego ich formatu, więc przed utworzeniem takowego, zapoznaj się ze specyfikacją danego wykresu z Google Chart Tools.</p>
<h2>Wizualizacja danych na wykresie słupkowym</h2>
<p>W tym pierwszym przykładzie użyjemy wykresu kolumnowego do przedstawienia naszych danych. W galerii Google Visualization, możemy wybrać dowolny typ wykresu, aby zobaczyć dokumentację i przykłady.</p>
<pre lang="javascript">
   <script type="text/javascript" src="http://www.google.com/jsapi"></script>
</pre>
<p>Teraz możemy załadować Visualization API za pomocą konstrukcji google.load () funkcja (AJAX API):</p>
<pre lang="javascript">
    google.load('visualization', '1', {'packages': ['columnchart']});
</pre>
<p>Drugi parametr &#8217;1&#8242; odnosi się do wersji API do załadowania &#8211; 1 to aktualna wersja. &#8216;Packages&#8217; to tablica z wszystkimi wizualizacjami, z których będziemy korzystać. W tym przypadku, będzie to tylko wykres kolumnowy.</p>
<p>W tym momencie mamy wszystkie potrzebne biblioteki, aby stworzyć obiekt DataTable i wyświetlać nasze wykresy, jednak musimy mieć pewność, że wizualizacja jest w pełni załadowana, w przeciwnym razie dostaniemy kod błędu i nasze wykresy nie będą wyświetlane.</p>
<p>Aby to zrobić rejestrujemy funkcję zwrotną &#8211; będzie wywołana gdy wszystkie dane są załadowane.</p>
<pre lang="javascript">
//ustaw wywoływaną funkcję zwrotną
google.setOnLoadCallback (createChart);
</pre>
<p>Tak wygląda funkcja createChart() oraz cała struktura strony:</p>
<pre lang="javascript">
<!-- wczytaj Google AJAX API -->
        <script type="text/javascript" src="http://www.google.com/jsapi"></script>
        <script type="text/javascript">
            //wczytaj Google Visualization API oraz wykres
            google.load('visualization', '1', {'packages':['columnchart','piechart']});

            //ustaw wywoływaną funkcję zwrotną
            google.setOnLoadCallback (createChart);

            //wywoływana funkcja zwrotną
            function createChart() {

		//utwórz obiekt DataTable #ex1
                var dataTable = new google.visualization.DataTable();

		//zdefiniuj kolumny #ex1
                dataTable.addColumn('string','Kwartały 2010');
                dataTable.addColumn('number', 'Zarobki');

               //zdefiniuj wiersze #ex1
                dataTable.addRows([['K1',308], ['K2',257],['K3',375],['K4', 123]]);

                //instancja obiektu #ex1
                var chart = new google.visualization.ColumnChart (document.getElementById('Chart'));

                //definicja opcji wykresu
                var options = {width: 400, height: 240, is3D: true, title: 'Zarobki Firmy'};

                //rysuj wykresy
                chart.draw(dataTable, options);
</script>
<!-- ... -->
<div id="Chart"></div>
</pre>
<p>Obiekt chart, tworzony jest w ten sposób</p>
<pre lang="javascript">
var chart = new google.visualization.ColumnChart (document.getElementById('Chart'));
</pre>
<p>Argumentem funkcji jest referencja do elementu drzewa DOM, gdzie wyświetlony zostanie wykres tu &#8211; div z identyfikatorem Chart.<br />
Następnie definiujemy opcje wykresu &#8211; wymiary i nagłówek:</p>
<pre lang="javascript">
 var options = {width: 400, height: 240, is3D: true, title: 'Zarobki Firmy'};
</pre>
<p>W efekcie otrzymujemy taki wykres:<br />
<img src="http://dobre.proaukcje.pl/wp-content/uploads/2010/05/chart21-300x196.jpg" alt="" title="wykres słupkowy Google Chart" class="alignnone size-medium wp-image-191" /><br />
<em>Uwaga:  Wszystkie zdjęcia są tu statyczne, aby poradnik był dostępny niezależnie od przeglądarki i ustawień JavaScript. Zobacz załączone demo wersji interaktywnej.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://dobre.proaukcje.pl/google-chart-tools-jak-tworzyc-ciekawe-wykresy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chytre: Google Fonts API &#8211; miłość od pierwszego wejrzenia</title>
		<link>http://dobre.proaukcje.pl/bystre-google-fonts-api-milosc-od-pierwszego-wejrzenia/</link>
		<comments>http://dobre.proaukcje.pl/bystre-google-fonts-api-milosc-od-pierwszego-wejrzenia/#comments</comments>
		<pubDate>Thu, 20 May 2010 18:08:19 +0000</pubDate>
		<dc:creator>halibucik</dc:creator>
				<category><![CDATA[HTML & CSS]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://dobre.proaukcje.pl/?p=75</guid>
		<description><![CDATA[<div class='hpt_container' style='width:100%;display:block;clear:both;height:224px;'><div class='hpt_element' style='float:LEFT;border: #fff solid 1px;background:#FFFFFF;padding:1px;margin-right:10px;'><a href='http://dobre.proaukcje.pl/bystre-google-fonts-api-milosc-od-pierwszego-wejrzenia/'><img height='200px' width='200px' id='hpt_6' class='hpt_class' style=';border: #fff solid 1px' title='Chytre: Google Fonts API &#8211; miłość od pierwszego wejrzenia' alt='Chytre Google Fonts API mio od pierwszego wejrzenia font api 128  Chytre: Google Fonts API &#8211; miłość od pierwszego wejrzenia' src='http://dobre.proaukcje.pl/wp-content/uploads/hungred-post-thumbnail//images/live/Chytre-Google-Fonts-API--mio-od-pierwszego-wejrzenia-font_api-128.gif'/></a></div>Google powitało nas dzisiaj dwiema wiadomościami. Pierwsza z nich to usługa Google Font API. Linkując do określonej czcionki przechowywanej na serwerze Google (oszczędzamy transfer!), mamy dostęp do [...]</div>]]></description>
			<content:encoded><![CDATA[<p>Google powitało nas dzisiaj dwiema wiadomościami.<br />
Pierwsza z nich to usługa Google Font API. Linkując do określonej czcionki przechowywanej na serwerze Google (oszczędzamy transfer!), mamy dostęp do szerokiej gamy niestandardowych czcionek. Zintegrowanie naszego serwisu z nową usługą to &#8211; mówiąc krótko &#8211; betka!<br />
<span id="more-75"></span><br />
Ponieważ wszystko odbywa się za przysłowiowymi kulisami, Google Font API można bez przeszkód wykorzystywać NAWET w Internet Explorer 6.<br />
Możliwości najnowszego dziecka Google są już teraz imponujące, aż strach pomyśleć co czeka nas w przyszłości :)</p>
<h1>Najtrudniejszy pierwszy krok <img class="alignnone" title="nuta" src="http://www.zwodnik.pl/ikony/nuta.jpg" alt="nuta" width="24" height="24" /></h1>
<p>Aby skorzystać z Google Font API wystarczy dodać link do wybranej czcionki w meta, oraz w stylu css dodać font-family z nazwą tej czcionki. Przykład:</p>
<pre lang="xml">
&lt;html&gt;
 &lt;head&gt;
  &lt;meta&gt;
&lt;link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz'
 rel='stylesheet' type='text/css'&gt;
&lt;style type=&quot;text/css&quot;&gt;
 #tekst { font-family: 'Yanone Kaffeesatz', serif; font-size: 100px; }
&lt;/style&gt;
=Yanone+Kaffeesatz
 &lt;/head&gt;

 &lt;body&gt;
  &lt;span id=&quot;tekst&quot;&gt;Wybawco!&lt;/span&gt;
 &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Tak może wyglądać nasze cudeńko :)</p>
<p><img class="alignnone size-full wp-image-85" title="wybawco" src="http://dobre.proaukcje.pl/wp-content/uploads/2010/05/wybawco.jpg" alt="" width="280" height="113" /></p>
]]></content:encoded>
			<wfw:commentRss>http://dobre.proaukcje.pl/bystre-google-fonts-api-milosc-od-pierwszego-wejrzenia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Logowanie w Zend Framework</title>
		<link>http://dobre.proaukcje.pl/logowanie-w-zend-framework/</link>
		<comments>http://dobre.proaukcje.pl/logowanie-w-zend-framework/#comments</comments>
		<pubDate>Sun, 16 May 2010 15:33:00 +0000</pubDate>
		<dc:creator>halibucik</dc:creator>
				<category><![CDATA[Programowanie php]]></category>
		<category><![CDATA[Kontroler uwierzytelniania]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[ZF]]></category>

		<guid isPermaLink="false">http://dobre.proaukcje.pl/?p=17</guid>
		<description><![CDATA[Wielu zadaje sobie pytanie, jak w zend frameworku poradzić sobie z uwierzytelnianiem użytkowników. Największe wyzwanie to połączenie w jedno składników takich jak: Adapter uwierzytelniania Logowanie Kontroler dla [...]]]></description>
			<content:encoded><![CDATA[<p>Wielu zadaje sobie pytanie, jak w zend frameworku poradzić sobie z uwierzytelnianiem użytkowników.<br />
Największe wyzwanie to połączenie w jedno składników takich jak:</p>
<ul>
<li> Adapter uwierzytelniania</li>
<li> Logowanie</li>
<li> Kontroler dla akcji logowanie / wylogowanie</li>
<li> Sprawdzanie, czy użytkownik jest zalogowany<span id="more-17"></span></li>
</ul>
<p>Sztuką jest poprawne zaprojektowanie odpowiednich działań w strukturze MVC za pomocą Zend_Auth.</p>
<h2>Adapter uwierzytelniania</h2>
<p>Nasza aplikacja z założenia wymaga podania loginu i hasła, dane są sprawdzane i porównywane. W odpowiedzi otrzymujemy obiekt uwierzetelniania.</p>
<h2>Formularz logowania</h2>
<p>Formularz logowania jest w istocie bardzo prosty. W zend frameworku można ustalić wiele reguł walidacji danych, my ustawimy następujące:</p>
<ul>
<li>username zawiera tylko litery alfabetu oraz jego długość jest między 3-20 znaków</li>
<li>password musi składać się ze znaków alfanumerycznych i ma długość 6-20 znaków.</li>
</ul>
<p>Formularz może wyglądać następująco:</p>
<pre lang="php">class LoginForm extends Zend_Form
{
    public function init()
    {
        $username = $this->addElement('text', 'username', array(
            'filters'    =>; array('StringTrim', 'StringToLower'),
            'validators' => array(
                'Alpha',
                array('StringLength', false, array(3, 20)),
            ),
            'required'   => true,
            'label'      => 'Twoj login:',
        ));

        $password = $this->addElement('password', 'password', array(
            'filters'    => array('StringTrim'),
            'validators' => array(
                'Alnum',
                array('StringLength', false, array(6, 20)),
            ),
            'required'   => true,
            'label'      => 'Hasło:',
        ));

        $login = $this->addElement('submit', 'login', array(
            'required' => false,
            'ignore'   => true,
            'label'    => 'Login',
        ));

          //Chcemy pokazać wiadomość o nieudanym logowaniu,
          //jeśli jest takowa potrzebna
          //Musimy dodać odpowiedni dekorator
        $this->setDecorators(array(
            'FormElements',
            array('HtmlTag', array('tag' => 'dl', 'class' => 'zend_form')),
            array('Description', array('placement' => 'prepend')),
            'Form'
        ));
    }
}</pre>
<h2>Kontroler logowania</h2>
<p>Dodamy teraz kontroler przechwytujący akcje logowania i wylogowania. Typowy przebieg jest następujący</p>
<ul>
<li>Użytkownik wypełnia formularz</li>
<li>Użytkownik wysyła formularz</li>
<li>Kontroler reaguje na wysłany formularz</li>
</ul>
<blockquote>
<ul>
<li>Jeśli walidacja danych się nie powiedzie, wyświetlony jest stosowny komunikat</li>
<li>W przypadku sukcesu, użytkownik przekierowany jest do strony głównej &#8216;index&#8217;</li>
</ul>
</blockquote>
<ul>
<li>Zalogowany użytkownik przekierowany jest na stronę główną</li>
<li>Wywołanie akcji &#8216;wyloguj&#8217; wylogowuje użytkownika i przekierowuje na stronę główną</li>
</ul>
<p><span id="result_box" class="long_text"><span style="background-color: #ffffff;">LoginController będzie korzystał z wybranego adaptera uwierzytelniania, jak również z formularza logowania. </span><span>Będziemy przekazywać do konstruktora formularza  logowania akcję oraz metodę. </span><span style="background-color: #ffffff;">Kiedy mamy poprawne dane, będziemy przekazywać je do naszego adaptera uwierzytelniania.</span></span></p>
<p><span>Przejdźmy do stworzenia kontrolera. </span></p>
<pre lang="php">class LoginController extends Zend_Controller_Action
{
    public function getForm()
    {
        return new LoginForm(array(
            'action' => '/login/process',
            'method' => 'post',
        ));
    }

    public function getAuthAdapter(array $params)
    {
        //Miejsce do uzupełnienia przez developera
        //Nasz formularz zwraca parametry 'username' oraz 'password'
        //Prosty przykład poniżej        

    }
}</pre>
<pre lang="php"> public function  getAuthAdapter(array  $params)
    {
       $db = Zend_Db_Table_Abstract::getDefaultAdapter();
      $adapter = new Zend_Auth_Adapter_DbTable($db,'uzytkownicy','login','password', "MD5(CONCAT())");

      $select = $adapter->getDbSelect();
      $select->where('act =?', 1);

      $adapter->setIdentity($params['username']);
      $adapter->setCredential(md5($params['password']));
      $adapter->setTableName('uzytkownicy');
      return $adapter;

    }
</pre>
<p>Przy założeniu, że domyślny adapter jest skonfigurowany w application.ini np.</p>
<pre lang="php">resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = user
resources.db.params.password = pass
resources.db.params.dbname = table
</pre>
<p>Następnym krokiem jest sprawdzenie przed wysłaniem formularza czy:</p>
<ul>
<li>jeśli dane użytkownika zostały potwierdzone, a nie został wywołał akcji &#8216;wylogowanie&#8217; &#8211; przenieś na stronę główną</li>
<li>jeśli użytkownik nie jest uwierzytelniony, a wywołał akcję &#8216;wylogowanie&#8217; przekieruj na stronę logowania</li>
</ul>
<p>Poniższy preDispatch() zrobi to za nas:</p>
<pre lang="php">class LoginController extends Zend_Controller_Action
{
    // ...

    public function preDispatch()
    {
        if (Zend_Auth::getInstance()->hasIdentity()) {
            // Jeśli zalogowany, nie chcemy pokazywać formularz logowania
            // jednak akcja 'wyloguj' powinna być dostępna
            if ('logout' != $this->getRequest()->getActionName()) {
                $this->_helper->redirector('index', 'index');
            }
        } else {
            // Jeśli niezalogowany, akcja 'wyloguj' nie powinna być dos&#359;ępna
            // przekieruj wtedy do strony logowania
            if ('logout' == $this->getRequest()->getActionName()) {
                $this->_helper->redirector('index');
            }
        }
    }
}</pre>
<p>Czas teraz na nasz formularz logowania. Najprostszy pod słońcem może wyglądać następująco:</p>
<pre lang="php">class LoginController extends Zend_Controller_Action
{
    // ...

    public function indexAction()
    {
        $this->view->form = $this->getForm();
    }
}
</pre>
<p>Przetwarzanie formularza wymaga nieco więcej logiki. Musimy sprawdzić czy dane zostały wysłane metodą &#8216;POST&#8217;, czy dane są poprawne i wreszcie czy pasują do użytkownika z bazy danych (czy skądkolwiek inąd:</p>
<pre lang="php">class LoginController extends Zend_Controller_Action
{
    // ...

    public function processAction()
    {
        $request = $this->getRequest();

        // Sprawdź, czy mamy dane w POST
        if (!$request->isPost()) {
            return $this->_helper->redirector('index');
        }

        // Pobierz dane z formularza i sprawdź ich poprawność
        $form = $this->getForm();
        if (!$form->isValid($request->getPost())) {
            // gdy niepoprawne
            $this->view->form = $form;
            return $this->render('index'); // ponownie wyświetl formularz
        }

        // pobierz adapter uwierzytelniania i porównaj dane
        $adapter = $this->getAuthAdapter($form->getValues());
        $auth    = Zend_Auth::getInstance();
        $result  = $auth->authenticate($adapter);
        if (!$result->isValid()) {
            // Gdy dane niepoprawne
            $form->setDescription('Invalid credentials provided');
            $this->view->form = $form;
            return $this->render('index'); // ponownie wyświetl formularz
        }

        // Jesteśmy uwierzytelnieni! Przekieruj na stronę główną
        $this->_helper->redirector('index', 'index');
    }
}
</pre>
<p>Teraz możemy zająć się wylogowywaniem użytkowników. To prawie tak proste jak wyświetlanie formularza logowania, po prostu usuń dane z obiektu uwierzytelniania i przekieruj:</p>
<pre lang="php">class LoginController extends Zend_Controller_Action
{
    // ...

    public function logoutAction()
    {
        Zend_Auth::getInstance()->clearIdentity();
        $this->_helper->redirector('index'); //powrót na stronę logowania
    }
}
</pre>
<p>Oto i nasze procedury logowania i wylogowania. Rzuć okiem na plik widoku z formularzem:</p>
<pre lang="php">
<h2>Please Login</h2>

form ?>
</pre>
<p>I to już wszystko!. Zend_Form sprawia, że pliki widoku &#8211; tu logowania &#8211; są proste!</p>
<h2>Sprawdzenie czy użytkownik jest uwierzytelniony</h2>
<p>Ostatnim zagadnieniem, które poruszymy w tym poradniku jest: jak  mogę sprawdzić, czy użytkownik jest uwierzytelniony i ograniczyć dostęp,  jeśli nie?</p>
<p>Jeśli  uważnie przyjrzeć się metodzie preDispatch () powyżej, widać już, jak  można to zrobić. Zend_Auth przetrzymuje tożsamość w sesji, pozwalając na odwołania w tej formie:</p>
<pre lang="php">Zend_Auth::getInstance()->hasIdentity()
</pre>
<p>Możesz użyć tego do sprawdzenia, czy użytkownik jest zalogowany, a następnie użyć przekierowania do strony logowania, jeśli nie. Obiektu uwierzytelniania można użyć następująco:</p>
<pre lang="php">$identity = Zend_Auth::getInstance()->getIdentity();
</pre>
<p>Można użyć tego w do budowy prostego helpera widoku, pokazującego link z loginem:</p>
<pre lang="php">/**
 * ProfileLink helper
 *
 * Call as $this->profileLink() in your layout script
 */
class My_View_Helper_ProfileLink
{
    public $view;

    public function setView(Zend_View_Interface $view)
    {
        $this->view = $view;
    }

    public function profileLink()
    {
        $auth = Zend_Auth::getInstance();
        if ($auth->hasIdentity()) {
         $username = $auth->getIdentity()->username;
         return '<a href="http://dobre.proaukcje.pl/profile" . $username . '">Witaj, ' . $username .  '</a>';
        }

        return '<a href="http://dobre.proaukcje.pl/login">Zaloguj</a>';
    }
}
</pre>
<h2>Podsumowanie</h2>
<p>W Zend_Auth wiele dzieje się za kulisami, aby dalsze utrzymywanie danych w sesji było proste.</p>
<p>W  połączeniu z Zend_Form otrzymujesz bardzo łatwe do wdrożenia rozwiązanie do  pobierania i sprawdzenie uprawnień,   Zend_Controller dodaje opcję  filtrowania danych przed wysyłką, co umożliwia kontrolowanie dostępu do odpowiednich części witryny.</p>
]]></content:encoded>
			<wfw:commentRss>http://dobre.proaukcje.pl/logowanie-w-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

