<?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>cojack blog &#187; PHP</title>
	<atom:link href="http://www.cojack.pl/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.cojack.pl</link>
	<description>Programowanie oraz Open Source powodem do życia</description>
	<lastBuildDate>Sat, 26 Nov 2011 18:43:28 +0000</lastBuildDate>
	<language>PL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>KDevelop wykonywanie skryptów PHP</title>
		<link>http://www.cojack.pl/kdevelop-wykonywanie-skryptow-php</link>
		<comments>http://www.cojack.pl/kdevelop-wykonywanie-skryptow-php#comments</comments>
		<pubDate>Wed, 28 Sep 2011 17:36:51 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[kde]]></category>
		<category><![CDATA[kdevelop]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=540</guid>
		<description><![CDATA[
Aby wykonywać skrypt z KDevelop bezpośrednio należy wejść w menu do Run -> Configure Launchues
Następnie po lewej stronie mamy listę swoich projektów, wybieramy projekt który nas interesuje klikamy na zielony plusik pojawia się pod element naszego projektu: &#8222;New Native Application Configuration&#8221; albo coś podobnego, po wybraniu tego elementu (nie klikamy ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="KDevelop" src="http://cojack.os-cms.pl/wp-content/kdevelop.png" alt="" height="100" width="100"><br />
Aby wykonywać skrypt z KDevelop bezpośrednio należy wejść w menu do <strong>Run -> Configure Launchues</strong></p>
<p>Następnie po lewej stronie mamy listę swoich projektów, wybieramy projekt który nas interesuje klikamy na zielony plusik pojawia się pod element naszego projektu: &#8222;New Native Application Configuration&#8221; albo coś podobnego, po wybraniu tego elementu (nie klikamy w debug) po prawej stronie powinno pojawić się okno z wyborem paru elementów, w <strong>Executable</strong> wpisujemy <strong>php</strong> (chyba że chcesz podać bezwzględną ścieżkę do pliku wykonywalnego php. Poniżej mamy <strong>Behaviour</strong> w <strong>Arguments</strong> wpisujemy argumenty które chcemy podać do php czyli nazwa pliku php który ma się wykonać np: <strong>index.php</strong>. Jeszcze niżej jest <strong>Working Directory</strong>, tutaj wybieramy położenie naszego projektu w którym znajduje się powyżej wybrany plik jako argument. Jeszcze mamy environment, możemy zdefiniować stałe argumenty jakie chcemy przesyłać do php (ja tego nie  używam)</p>
<p>Zostaje wcisnąć <strong>Apply -> Ok</strong>, po zamknięciu okna, należy się upewnić jaki profil uruchamiania jest aktywny, by to zrobić przechodzimy w Menu do <strong>Run -> Current Launch Configuration</strong>, tam powinniśmy listę dostępnych konfiguracji, dobrym sposobem jest nazywanie ich (zmiana tego &#8222;New Native Application Configuration&#8221; w poprzednim oknie konfiguracji) jeżeli mamy taką potrzebę, lub też różne konfiguracje do testowania.</p>
<p>Skrót klawiaturowy do uruchomienia to <strong>Shit + F9</strong> lub też po prostu kliknąć <strong>Execute</strong> w oknie KDevelop.</p>
<p>Jak zrobić by KDevelop działał z Debug przy pomocy xdebug, jeszcze nie wiem, ale dev od kdevelop pracują nad tym <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/kdevelop-wykonywanie-skryptow-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FirePHP &#8211; jako debugger? Czemu nie!</title>
		<link>http://www.cojack.pl/firephp-jako-debugger-czemu-nie</link>
		<comments>http://www.cojack.pl/firephp-jako-debugger-czemu-nie#comments</comments>
		<pubDate>Thu, 17 Mar 2011 19:50:19 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[firephp]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=517</guid>
		<description><![CDATA[ W dalszym ciągu pracuję nad swoim Frameworkiem, z tym że teraz przyszła pora na sprawdzenie potwora. Piszę sklep internetowy, który później udostępnię na licencji GPL. No to jak już piszę Front-end (nienawidzę&#8230;) to przydałoby się jakoś debugować zapytania sql, komunikaty błędów, żeby było widać co się tam w kodzie ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" class="alignleft" title="PHP" src="http://www.cojack.pl/wp-content/arch-php.png" alt="PHP"> W dalszym ciągu pracuję nad swoim Frameworkiem, z tym że teraz przyszła pora na sprawdzenie potwora. Piszę sklep internetowy, który później udostępnię na licencji GPL. No to jak już piszę Front-end (nienawidzę&#8230;) to przydałoby się jakoś debugować zapytania sql, komunikaty błędów, żeby było widać co się tam w kodzie dzieje, posty, gety, kókisy <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Pomysł stary jak świat, a w każdym przyzwoitym narzędziu typu Zend FW, Symfony, mamy je. Pomyślałem sobie to dlaczego niby ja nie mam mieć? No i się zaczęły poszukiwania, jak to zaprezentować, później całkowicie zwątpiłem w potrzebę takiego narzędzia.</p>
<h3>Dlaczego FirePHP?</h3>
<p>Nie miałem pomysłu, jak to zaprezentować, każdy FW miał swój sposób, a to pasek wyjeżdżający z dołu, a to z góry, a i tak cały czas używam FireBug&#8217;a do debugowania zapytań ajaxowych! Oświecenie, przecież jest FirePHP. Prosty w obsłudze, nie ma żadnych skomplikowanych milionów klas i interfejsów do obsługi narzędzia. Proste metody, dokumentacja przyjazna dla developera. </p>
<h3>A jak to wygląda?</h3>
<div class="wp-caption alignright" style="width: 165px;"><a href="http://i0.simplest-image-hosting.net/168bf183b2abe8bc9188aacc163dd507/plasma-desktoptn1806.jpg"><img title="FirePHP w natarciu" src="http://i0.simplest-image-hosting.net/168bf183b2abe8bc9188aacc163dd507/plasma-desktoptn1806.jpg" alt="FirePHP w natarciu" height="100" width="155"></a>
<p class="wp-caption-text">FirePHP w natarciu </p>
</div>
<p>  Po prawej mamy zrzut ekranu, jak wygląda taki wypluty przez FirePHP kawałek kodu. Jest przejrzyste, każde zapytanie ajaxowe widzimy w firedebug, to od razu z zapytaniem, dostaniemy odpowiedzi o zapytaniach sql, errorach, routingu, no wszystko co tylko chcemy.</p>
<h3>Słów kilka na zakończenie</h3>
<p>Tym wpisem chciałem zwrócić uwagę na dostępne narzędzia jakie my developerzy mamy pod ręką, nie należy wyważać otwartych drzwi (można by się przyczepić że ja to robię pisząc swojego FW, a to się czepiajcie <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), ale gdy interfejs jest przyjazny, czas na zaimplementowanie takiego narzędzia nie kosztuje nas wiele, przy czym nie rwiemy sobie włosów z głowy magią, wystarczy poświęcić 3min na przejrzenie przykładów na stronie FirePHP. Także jeżeli ktoś nie ma pomysłu jak to zrobić u siebie, to polecam właśnie te, to, narzędzie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/firephp-jako-debugger-czemu-nie/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tablica PHP do Tablicy PostgreSQL</title>
		<link>http://www.cojack.pl/tablica-php-do-tablicy-postgresql</link>
		<comments>http://www.cojack.pl/tablica-php-do-tablicy-postgresql#comments</comments>
		<pubDate>Sun, 06 Mar 2011 14:37:43 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[PL/pgSQL]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=514</guid>
		<description><![CDATA[ Wczoraj pracowałem nad swoim Frameworkiem, miałem kłopot jakby sobie tu poradzić z parametrami przesyłanymi do procedur w funkcjach SQL, gdyż w każdym engine pl/sql mogą one różnie wyglądać, więc poszedłem po rozum do głowy użyłem pseudo Dekoratora działającego na małej fabryce, tylko zaś ten dekorator nie jest typową implementacją ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" class="alignleft" title="PHP" src="http://www.cojack.pl/wp-content/arch-php.png" alt="PHP"> Wczoraj pracowałem nad swoim Frameworkiem, miałem kłopot jakby sobie tu poradzić z parametrami przesyłanymi do procedur w funkcjach SQL, gdyż w każdym engine pl/sql mogą one różnie wyglądać, więc poszedłem po rozum do głowy użyłem pseudo Dekoratora działającego na małej fabryce, tylko zaś ten dekorator nie jest typową implementacją książkową. No ale dobra, do rzeczy. Problem był z utworzeniem tablicy PostgreSQL z tablicy PHP, i do jasnej cholery nie udało mi się rozwikłać tego problemu bez użycia rekurencji. Z tego powodu jestem bardzo niezadowolony, gdyż tak bardzo chciałem nie używać rekurencji w swoim kodzie, dobra stało się, może teraz słów kilka o tym typie tablicy w PostgreSQL?</p>
<h3>Array Postgresql</h3>
<p>Jak wiemy w php mamy tablice asocjacyjne, takich w postgresql nie ma, to jak sobie poradzić z danymi przesyłanymi do funkcji, by wiedzieć która wartość odpowiada któremu rekordowi w bazie? Trzeba przyjąć sobie jakiś schemat i się jego trzymać, nauczyłem się tego pracując wcześniejszej firmie, z czego jestem bardzo zadowolony i cenie sobie tą wiedzę do której doszedłem sam. Ale się nią z Wami podzielę.</p>
<p>Przykład tablicy w PostgreSQL: &#8216;{1234,325,513,1332}&#8217;, jest to zwykła tablica jednowymiarowa, w php zapisalibyśmy ją tak: $someArray = array(1234,325,513,1332); </p>
<p>Więcej tutaj: <a href="http://www.postgresql.org/docs/current/static/arrays.html">link</a></p>
<h3>Przykład z życia</h3>
<p>Proste oczywiste, nie stwarzającego żadnego problemu do odczytania. Z tym że takie tablice są rzadkością. Przeważnie operujemy na rekordach z tabeli, które posiadają unikatowy identyfikator w bazie, i właśnie on jest nam potrzebny. Jeżeli mamy pola wielokrotnego wyboru, np checkboxy, teoria, relacja jeden do wielu, jeden produkt może należeć do wielu kategorii w sklepie. No to przykład kawałka kodu html:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;label&gt;Jakaś kategoria&lt;/label&gt;
&lt;input type=&quot;checkbox&quot; name=&quot;categories[$incramentValue][id_category]&quot; value=&quot;$jakies_id_kategorii&quot; /&gt;
&lt;label&gt;Rabat dla kategorii tego produktu&lt;/label&gt;
&lt;input type=&quot;text&quot; name=&quot;categories[$incramentValue][discount]&quot; value=&quot;$jakas_wartosc_rabatu&quot; /&gt;</pre></div></div>

<p>To akurat jest trochę bardziej rozbudowany przykład niż ten o który mi chodziło ;d Gdyż gdybyśmy mieli tylko zwykłe przypisanie produktu do kategorii, to wystarczyło by naszej funkcji w sql 2 parametry, jeden to id produktu, a drugi to tablica z idkami kategorii, które wybraliśmy.<br />
No ale dobra, jeżeli chcemy operować czasami na paru tabelach w jednym widoku, to takie rozwiązanie jest jak najbardziej zrozumiałe, i teraz w naszej tablicy po przesłaniu do php będziemy mieli coś takiego:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
  <span style="color: #000088;">$incramentValue</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'id_category'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$jakies_id_kategorii</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'discount'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$jakas_wartosc_rabatu</span>
  <span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">...</span> itd
<span style="color: #009900;">&#41;</span></pre></div></div>

<h3>Jak to ugryźć?</h3>
<p>No i dobra, teraz tak mamy identyfikator kategorii i rabat jaki chcemy nadać temu produktowi w tej kategorii, można by tam jeszcze dorzucić id klienta, taki pełny system b2b (business-to-business). Mamy to co mamy, teraz tak jak pisałem już wyżej, musimy sobie przyjąć jakiś standard w sql którym w danej funkcji będziemy operować na tych tablicach, widząc po kolejności argumentów w tablicy wiemy jak byśmy chcieli by wyglądała nasza tablica w SQL, o tak: &#8216;{{$jakies_id_kategorii,$jakas_wartosc_rabatu},{$jakies_id_kategorii2,$jakas_wartosc_rabatu2},{&#8230;}}&#8217; czyli np: &#8216;{{2,34.2},{5,12}}&#8217;. Po przesłaniu takiej tablicy do procedury w SQL musimy ją jeszcze tylko &#8222;przelecieć&#8221; i wstawić odpowiednie rekordy, a jak utworzyć taką tablicę?</p>
<h3>Utworzenie tablicy PostgreSQL z tablicy PHP</h3>
<p>Napisałem do tego funkcję:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">   <span style="color: #000000; font-weight: bold;">function</span> phpArrayToPg<span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span> <span style="color: #000088;">$phpArray</span><span style="color: #339933;">,</span> <span style="color: #000088;">$inner_glue</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">','</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;">$phpArray</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</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;">is_array</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$value</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$output</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;{&quot;</span><span style="color: #339933;">.</span>phpArrayToPg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #339933;">,</span> <span style="color: #000088;">$inner_glue</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;}&quot;</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;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #000088;">$value</span> <span style="color: #009900;">&#41;</span>
               <span style="color: #000088;">$output</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$value</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;'</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">else</span>
               <span style="color: #000088;">$output</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
         <span style="color: #009900;">&#125;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$inner_glue</span><span style="color: #339933;">,</span> <span style="color: #000088;">$output</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Która się nie podoba depeszowi ;d  Dlaczego? Pytał się mnie co z wartościami które będą posiadały w sobie jakieś nietypowe wartości, czyli np: &#8216;, \, / itp znaki escape, szczerze to mało mnie interesują takie wartości, dlaczego? Używam PDO do bindowania takich wartości, to że w stringu będzie &#8216; czy \ czy ¬ a nawet ¿ jest mi to totalnie obojętne, znaki te nie wyescepują zapytania i to jest najważniejsze, a jak strzelę gafę przy validacji podczas wprowadzania wartości przez użytkowników to jest już tylko i wyłącznie mój błąd a nie że funkcji która ma na celu tylko utworzenie tablic z tablicy.</p>
<p>Wywołanie:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;E'{&quot;</span><span style="color: #339933;">.</span>phpArrayToPg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$someArray</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;}'&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Słów kilka na zakończenie</h3>
<p>Wiem wiem, znów chaos, znowu zagmatwałem&#8230; Ale chciałem tylko pokazać funkcję, która tworzy tablicę sql&#8217;ową z pehapowej.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/tablica-php-do-tablicy-postgresql/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Routing w PHP</title>
		<link>http://www.cojack.pl/routing-w-php</link>
		<comments>http://www.cojack.pl/routing-w-php#comments</comments>
		<pubDate>Wed, 02 Feb 2011 14:15:22 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[horde routes]]></category>
		<category><![CDATA[routing]]></category>
		<category><![CDATA[seo url]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=424</guid>
		<description><![CDATA[ Kiedyś już pisałem o Seo Url na blogu, co prawda temat stary jak świat, ale jakoś nigdy nie miałem koncepcji by to jakoś skrzętnie napisać. Otóż może tak trochę historii, ogólnie routing to wymyślili chłopacy od ruby on rails, napisali i tam im śmigało, następnie paru maniaków przepisało to ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="PHP" src="http://www.cojack.pl/wp-content/arch-php.png" title="PHP" class="alignleft"> Kiedyś już pisałem o Seo Url na blogu, co prawda temat stary jak świat, ale jakoś nigdy nie miałem koncepcji by to jakoś skrzętnie napisać. Otóż może tak trochę historii, ogólnie routing to wymyślili chłopacy od ruby on rails, napisali i tam im śmigało, następnie paru maniaków przepisało to do pythona, widać mieli w tym jakiś cel (dla mnie to masochizm pisać strony w pythonie ale co ich to ich). I nadszedł czas by ktoś przepisał koncept do PHP. Chwała im za to. A teraz ja ogarnięty szałem pisania swojego systemu, z nadszarpniętą przez kolegę Glossego dumą że pierdzę w stołek i nic nie robię postanowiłem wykorzystać dobrodziejstwo Open Sourcowych Licencji.</p>
<h3>Routing wtf?</h3>
<p>Czym jest routing? W sumie to wikipedia ma o tym swoje zdanie co prawda, ale moje jest takie: &#8222;Przepływem informacji&#8221;. O i na tym mógłbym zakończyć, ale że jakoś nie chce mi się jeszcze spać to sobie popiszę trochę. Jak dobrze wiemy, żeby nasza aplikacja napisana w jakże to niebanalnym języku którym jest PHP, wiedziała co robimy, co wywołać, co zepsuć. Musimy jej przesłać akcję, najczęściej po staremu byśmy to zrobili metodą łopatologiczną czyli: index.php?action=urwij. I w także oto cudowny sposób (prawie że magiczny), przesyłamy do naszej aplikacji GETa z danym kluczem i wartością, która po danej wartości z klucza wykona odpowiednią dla nas akcję. Ale czy to nie zubożałe? Takie prymitywne. W ten sposób to piszą strony gimnazjaliści za 50zł i zabierają nam chleb. Z tą różnicą że pewnie nawet nie wiedzą jak bardzo ich aplikacja jest crackerFriendly. Ale who care?</p>
<p>(&#8230; wdech &#8230; wydech&#8230; )</p>
<p>Czy nie ładniej by było gdyby nasza aplikacja miała jakiś bardziej zaawansowany system URL? Otóż oczywiście że ładniej, a np taki: www.domena.pl/:controller/:action ?</p>
<h3>Horde Routes</h3>
<p>Z pomocą przychodzi nam horde routes, horde to jest w ogóle zbiór przygotowanych do użycia regexpów którę sparsują nam naszego urla, zwrócą nam akcję i controllery. Także wszystko mamy gotowe. Nie działa to inaczej niż routing w Symfony. Też mamy statycznie routingi, nazwane, funkcje filtrujące, wildcard, grupowanie ścieżek, oraz warunkowe ścieżki (ciekawa sprawa swoją drogą).</p>
<h3>Do dzieła!</h3>
<p>Idziemy na stronę: http://dev.horde.org/routes/ pobieramy paczkę albo z pear&#8217;a instalujemy:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> pear channel-discover pear.horde.org
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> pear <span style="color: #c20cb9; font-weight: bold;">install</span> horde<span style="color: #000000; font-weight: bold;">/</span>routes</pre></div></div>

<p>Wymagania co do php to 5.1 lub wyżej a najlepiej 5.2 lub wyżej. Dziwne, nie zagłębiałem się w kod, ani changeloga pomiędzy tymi ver nie sprawdzałem skąd taka rozbieżność.</p>
<p>No to pierwsze uruchomienie:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Horde/Routes/Mapper.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Horde/Routes/Exception.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Horde/Routes/Route.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Horde/Routes/Utils.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$mapper</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Horde_Routes_Mapper<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$mapper</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':controller/:action'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Poprzez metodę Horde_Routes_Mapper::connect() dodajemy nasze ścieżki które będziemy chcieli by mapper wyłapał który z adresów przesyłany do adresu url jest pasujący. A mało tego, przydałby się jakiś .htaccess, ja korzystam z tego z drupala, oczywiście przerobionego na moje potrzeby, ale w wcześniejszym <a href="http://www.cojack.pl/seo-url-mod-rewrite" title="Seo url mod rewrite">link</a> wpisie o routingu już podawałem jak może taki .htaccess wyglądąć.</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">Options</span> +<span style="color: #0000ff;">FollowSymLinks</span>
<span style="color: #00007f;">DirectoryIndex</span> index.php
&lt;<span style="color: #000000; font-weight:bold;">IfModule</span> mod_rewrite.c&gt;
  <span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">On</span>
  <span style="color: #00007f;">RewriteBase</span> /
  <span style="color: #00007f;">RewriteCond</span> %{REQUEST_FILENAME} !-f
  <span style="color: #00007f;">RewriteCond</span> %{REQUEST_FILENAME} !-d
  <span style="color: #00007f;">RewriteRule</span> ^(.*)$ index.php?q=$1 [L,QSA]
&lt;/<span style="color: #000000; font-weight:bold;">IfModule</span>&gt;</pre></div></div>

<p>Amen.</p>
<p>Ból jest taki, żeby Horda wiedziała co ma mapować musi znać listę kontrolerów które ma mapować, także musimy to w jakiś sposób podać:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$mapper</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createRegs</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'default'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'message'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>i to jest teraz nasza lista kontrolerów jakie mamy dostępne w aplikacji.</p>
<p>Ok a skąd Horda ma wiedzieć z czego ma pobierać te dane? O stąd:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$co_znalazlo</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$mapper</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">match</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nasz_adres_url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>I teraz w $co_znalazlo, będziemy mieli tablicę takiego patha jakiego podaliśmy w connect(); o ile coś znajdzie w innym wypadku NULL z tego co pamiętam. Np dla urla: &#8222;/user/new&#8221; zwróci nam tablicę:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'action'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'new'</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Tadam!</p>
<h3>Słów kilka na zakończenie</h3>
<p>To jest bardzo prosty przykład, chciałem tylko zwrócić uwagę na samo narzędzie bo jest, działa znakomicie, przepisane z pyhtona. Także przetestowane na pewno, sam używam i polecam. Postaram się o więcej wpisów na ten temat, obowiązkowo odsyłam do manuala link w stopce oraz do zakładki Integration na ich stronie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/routing-w-php/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Klasa Collection i CollectionIterator</title>
		<link>http://www.cojack.pl/klasa-collection-collectioniterator</link>
		<comments>http://www.cojack.pl/klasa-collection-collectioniterator#comments</comments>
		<pubDate>Fri, 20 Aug 2010 18:10:20 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[collection]]></category>
		<category><![CDATA[collectioniterator]]></category>
		<category><![CDATA[iterator]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=435</guid>
		<description><![CDATA[ Dobra, trochę na speedzie jest pisany ten wpis, także może być w nim parę nieścisłości i niedociągnięć, ale mam nadzieje że poprawicie mnie w komentarzach. O co chodzi? Kod tutaj opisany poniżej nie jest mojego autorstwa, niektóre treści też zrzynam bezpośrednio z książki bo nie ma innych słów by ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="PHP" src="http://www.cojack.pl/wp-content/arch-php.png" title="PHP" class="alignleft"> Dobra, trochę na speedzie jest pisany ten wpis, także może być w nim parę nieścisłości i niedociągnięć, ale mam nadzieje że poprawicie mnie w komentarzach. O co chodzi? Kod tutaj opisany poniżej nie jest mojego autorstwa, niektóre treści też zrzynam bezpośrednio z książki bo nie ma innych słów by to opisać. Jest prawie na żywca zdarty z książki &#8222;PHP 5 Zaawansowane Programowanie&#8221;, także odczepić się proszę, nie piszę że ja to napisałem, jak już ktoś coś wymyślił, to nie mam zamiaru wymyślać koła na nowo, tylko poskładać wszystko do kupy i połączyć by to działało. No dobra to jedziemy. Trochę nie po kolei, z tymi klasami, ale wybaczcie. Zaczynamy.</p>
<h3>Słowem wstępu</h3>
<p>Jest sobie taki interfejs w php, który się zwie <strong>Iterator</strong>, posiadający 5 metod, które informują foreach jak sobie ma radzić z argumentami niebędącymi tablicą. On zaś (co jeszcze dziwniejsze) dziedziczy po kolejnym interfejsie który się zwie <strong>Travesrable</strong>. To co poniżej zobaczycie w pełnej krasie, jest implementacją <strong>mapy</strong>.<br />
Ale do rzeczy, po cholerę nam takie pyszne rzeczy? Otóż jeżeli chcielibyśmy sobie obiektowo przechowywać elementy w zmiennej nie będącej tablicą i przeiterować jest foreachem, to jak to zrobicie? No to pokaże Wam jak to można było by zrobić:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #666666; font-style: italic;">/* odpowiedni foreach dla ($objIt as $key =&gt; $value ) */</span>
<span style="color: #000088;">$objIt</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyIterator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$objIt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rewind</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$objIt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$objIt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">key</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$member</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$objIt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Trochę mało to Wam mówi jeszcze, ale jak spojrzycie na dalszą część tekstu to się sami przekonacie.</p>
<h3>Klasa Collection</h3>
<p>Na omówieniu tej klasy, przysłużę się przykładem z książki.</p>
<blockquote><p>
Pisząc aplikację, często zachodzi potrzeba utworzeniu obiektów, które zawierają w sobie grupę innych obiektów. Na przykład w systemie obsługi dziekanatu potrzebna będzie klasa <strong>Student</strong> oraz <strong>Course</strong>. Obiekt <strong>Student</strong> zapewne będzie miał przypisany więcej niże jeden obiekt <strong>Course</strong>. Pierwsze nasuwające się rozwiążanie to dodanie tablicy obiektów <strong>Course</strong> jako zmiennej składowej obiektu <strong>Student</strong>.
</p></blockquote>
<p>Przykład z książki:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Student <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$courses</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: #666666; font-style: italic;">//... itd</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$objStudent</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Student<span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">124</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$objStudent</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">courses</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$objCourse</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">print</span> <span style="color: #000088;">$objCourse</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>I wracamy do omówienia problemu:</p>
<blockquote><p>
Oczywiście gdyby taki sposób był najlepszy, to by nie było mowy o klasie Collection (trochę to przerobiłem <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  )</p>
<p>Powyższe rozwiązanie sprawia kilka problemów. Po pierwsze, publiczny dostęp do tablicy obiektów Course nie jest zgodny z zasadą hermetyzacji. Nie ma możliwości weryfikacji zmian w tablicy czy modyfikacji stanu obiektu Student, gdyby zaszła taka potrzeba. Po drugie, taka implementacja nie określa porządku elementów w tablicy ani sposobu odnalezienia poszukiwanego obiektu. Po trzecie, i najważniejsze, aby zapewnić dostęp do informacji o kursach każdemu użytkownikowi klasy Student, informacje te muszą zostać pobrane z bazy danych za każdym razem, gdy pobierane są informacje o studencie. Oznacza to że nawet jeśli konieczne jest jedynie wyświetlenie imienia studenta, pobierane są wszystkie informacje o kursach. Niepotrzebnie zwiększa to obciążenie serwera baz danych i zmniejsza wydajność aplikacji.<br />
Klasa <strong>Collection</strong> została zaprojektowana tak, aby rozwiązać wszystkie te problemy. Zapewnia obiektową otoczkę dla tablicy i implementuje mechanizm <strong>leniwej konkretyzacji</strong>, czyli opóźnienia procesu tworzenia elementów kolekcji aż do czasu, gdy są one naprawdę potrzebne. Nazywa się ją &#8222;leniwą&#8221;, ponieważ decyzja o tym, kiedy tworzyć konkretne egzemplarze obiektów, jest podejmowana przez samą aplikację.
</p></blockquote>
<p>Dobra, o co ogólnie chodzi? Chodzi o to że nasza klasa Collection, jak sama nazwa wskazuje jest kolekcją obiektów, czyli dodajemy do niej obiekty, a ona zgrabnie je przechowuje w swoim ciele. I to by było na tyle z filozofią klasy Collection, żeby zbytnio nie przeciągać, to poniżej mamy już dwie gotowe klasy które razem z sobą współpracują, są na żywca wydarte z mojego FW, także BDT_Loader, jak po samej nazwie można się domyślić, wczytuje klasy, także nie mam tu nic więcej do dodania. Klasa BDT_Collection_Exception jest po prostu klasą wyjątków, i tu też nie mam nic więcej do dodania.<br />
W naszym przykładzie będziemy potrzebowali dwie klasy, Collection (BDT_Collection) oraz CollectionIterator (BDT_Collection_Iterator). Obiekt klasy CollectionIterator jest tworzony w metodzie <strong>getIterator</strong>. Pod ciałem klasy, krótki opis.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
BDT_Loader<span style="color: #339933;">::</span><span style="color: #004000;">loadFile</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
   <span style="color: #0000ff;">'./lib/BDT/Collection/BDT_Collection_Iterator.php'</span><span style="color: #339933;">,</span>
   <span style="color: #0000ff;">'./lib/BDT/Exception/BDT_Collection_Exception.php'</span>
<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> BDT_Collection implements IteratorAggregate <span style="color: #009900;">&#123;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_members</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: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_onload</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_isLoaded</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> addItem<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</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;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
            <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Exception<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Klucz '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' jest już zajęty'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #b1b100;">else</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span>
         <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> removeItem<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <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;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</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>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">else</span>
         <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Exception<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Błędny klucz '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getItem<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <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;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
         <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">else</span>
         <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Exception<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Błędny klucz '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> keys<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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #990000;">array_keys</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> length<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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> exists<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getIterator<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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Iterator<span style="color: #009900;">&#40;</span> clone <span style="color: #000088;">$this</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setLoadCallback<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$functionName</span><span style="color: #339933;">,</span> <span style="color: #000088;">$objOrClass</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$objOrClass</span> <span style="color: #009900;">&#41;</span>
         <span style="color: #000088;">$callback</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$objOrClass</span><span style="color: #339933;">,</span> <span style="color: #000088;">$functionName</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">else</span>
         <span style="color: #000088;">$callback</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$functionName</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">is_callable</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$callback</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #000088;">$callableName</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Exception<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Funkcja zwrotna '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$callableName</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' nieprawidłowa!'</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;">FALSE</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_onload <span style="color: #339933;">=</span> <span style="color: #000088;">$callback</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _checkCallback<span style="color: #009900;">&#40;</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;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_onload <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_isLoaded <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_isLoaded <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
         <span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_onload<span style="color: #339933;">,</span> <span style="color: #000088;">$this</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></pre></div></div>

<p>Jak łatwo zauważyć w każdej z metod, sprawdzamy callbacka, czyli funkcje która powinna zostać wywołana przy utworzeniu kolekcji obiektów. Taka funkcja lub metoda może zostać utworzona w ciele klasy, w której wykorzystujemy kolekcje obiektów, lub po prostu jako zwykła funkcja, poniżej będzie przykład.</p>
<h3>Klasa CollectionIterator</h3>
<p>W tej klasie nie ma co zmieniać, no chyba że nazwy klas, bo metod to nie można, są wymagane przez interfejs który klasa implementuje. To też nie może być klasa abstrakcyjna, gdyż jest tworzony jej obiekt. Klasa jak klasa, przepisać, skopiować, pozmieniać nazwy jak komu się podoba klas, i używać.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> BDT_Collection_Iterator implements Iterator <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_collection</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_currIndex</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_keys</span><span style="color: #339933;">;</span>
&nbsp;
   <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> BDT_Collection <span style="color: #000088;">$objCol</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>_collection <span style="color: #339933;">=</span> <span style="color: #000088;">$objCol</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_collection<span style="color: #339933;">-&gt;</span><span style="color: #004000;">keys</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">rewind</span><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>_currIndex <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">key</span><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>_keys<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_currIndex <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">current</span><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>_collection<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_currIndex <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #339933;">++</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_currIndex<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> valid<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: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_currIndex <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></pre></div></div>

<h3> Narzucanie wymagań co do kolekcji </h3>
<p>Możemy też wymusić na danym obiekcie jakiego typu dana kolekcja musi być, a możemy to zrobić dzięki dziedziczeniu:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> OwnCollection <span style="color: #000000; font-weight: bold;">extends</span> BDT_Collection <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> addItem<span style="color: #009900;">&#40;</span> OwnClass <span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</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>
    parent<span style="color: #339933;">::</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>I dzięki takiemu zastosowaniu, nie tworzymy obiektu BDT_Collection, w swojej klasie, tylko OwnCollection, i obiekty które prześlemy do naszej kolekcji muszą być pochodzenia klasy OwnClass.</p>
<h3>Implementacja</h3>
<p>Prosty przykład z użyciem callbacka, dla Collection ( z książki ):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Singer<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
&nbsp;
  <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;">$name</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;">name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> NightClub <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$singers</span><span style="color: #339933;">;</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;">$name</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;">name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">singers</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection<span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">singers</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setLoadCallback</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'_loadSingers'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> _loadSingers<span style="color: #009900;">&#40;</span> BDT_Collection <span style="color: #000088;">$col</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$col</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Singer<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Maciek&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$col</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Singer<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Grzesiek&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$col</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Singer<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Wojtek&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$objNightClub</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> NightClub<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Rotunda&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Witamy w klubie &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$objNightClub</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Dziś zaśpiewa nam &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$objNightClub</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">singers</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; piosenkarzy &lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Oto oni: &lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$objNightClub</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">singers</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$objSinger</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Piosenkarz &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$objSinger</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; &lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Powitajmy ich gorąco oklaskami&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Słów kilka na zakończenie</h3>
<p>Nie mam zbytnio jak tego sprawdzić, gdyż leże chory w łóżku i pisze na dziewczyny laptopie (mój lap też ma chorobowe), a tutaj jest winzgroza, także wybaczcie jak się tam jakieś błędy wtargnęły. Szkic ten ma już trochę czasu, stąd miałem kod z swojego FW. Klasa bardzo przyjemna, można ją w wielu rzeczach zaimplementować, u mnie działa jako kolekcja widoków i slotów w klasie szablonów (templatek), jak się uda to ją zaimplementuje w większej ilości miejsc, bo jest na prawdę ciekawa, chociażby do przechowywania wyników zapytań, przy pobieraniu z bazy danych. Za wszelkie błędy z góry przepraszam, za to że kod prawie żywcem zdarty z książki, nie przepraszam <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Za to że klasy nie opisane, przepraszam (jak wyzdrowieje to poprawie). Mam nadzieje że nie tylko mi się przyda taka klasa ale i zarówno Wam.</p>
<p>Na zakończenie, dodam że kolega Wojciech Soczyński, też omówił na swoim blogu, implementację interfejsu Iterator. Link poniżej.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/klasa-collection-collectioniterator/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>BDT &#8211; Basic PHP Develop Tools</title>
		<link>http://www.cojack.pl/bdt-basic-php-develop-tools</link>
		<comments>http://www.cojack.pl/bdt-basic-php-develop-tools#comments</comments>
		<pubDate>Sun, 08 Aug 2010 11:55:40 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[bdt]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=414</guid>
		<description><![CDATA[ Jako iż każdy chce po sobie zostawić ślad tak i ja mam taki plan. Moje założenie: Napisać prosty i ciekawy system, który byłby fundamentem do tworzenia stron, stąd też nazwa Basic PHP Develop Tools, czyli podstawowe narzędzia. Zarazem podstawowe narzędzia i pełna moc w pisaniu aplikacji. Na pewno nie ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" class="alignleft" title="PHP" src="http://www.cojack.pl/wp-content/arch-php.png" alt="PHP"> Jako iż każdy chce po sobie zostawić ślad tak i ja mam taki plan. Moje założenie: Napisać prosty i ciekawy system, który byłby fundamentem do tworzenia stron, stąd też nazwa Basic PHP Develop Tools, czyli podstawowe narzędzia. Zarazem podstawowe narzędzia i pełna moc w pisaniu aplikacji. Na pewno nie jeden z Was spotkał się z Drupalem, i opiniami o nim jaki to on nie jest wyczesany, jaki to on jest wspaniały, no cud malina. Tak tylko czy ktoś próbował w nim pisać cokolwiek? No właśnie i ja podziękuje za taką fanaberię. Prędzej bym &#8222;wyklikał&#8221; w nim moduł niż go napisał. Ale nie w tym sęk, chciałbym by ta aplikacja nie przerodziła się w Frameworka, nie chce nazywać tego Frameworkiem, i nie chce by ktokolwiek o nim w ten sposób myślał. Bardzo nie lubię tego stwierdzenia, i w ogóle nie przypada mi do gustu, powiem więcej wręcz się nim brzydzę.</p>
<h3>Założenia do BDT</h3>
<p>- W pełni obiektowy<br />
- Podstawowe narzędzia dla developera<br />
- Darmowy na licencji GPL</p>
<p>to by było na tyle <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Użyte narzędzia</h3>
<p>- Horde Routes<br />
- Cache by MatheW ( linki na dole )<br />
- Laptop, klawiatura, myszka, monitor, trochę palców&#8230;  własne pomysły + podpatrzone.</p>
<h3>Co już mam zrobione</h3>
<p>- Obsługa akcji,<br />
- Routing (ta już był tylko zaimplementować),<br />
- Cache (j/w),<br />
- System szablonów ( php + html, żadne smarty opty i inne śmiecie ),<br />
- Obsługa błędów ( wyjątki + trigger_error ),<br />
- Obsługa SQL w 40%,<br />
- Confingi ( w XML )</p>
<h3>Czego jeszcze nie mam zrobione</h3>
<p>- Requesty (ale mam już koncept)<br />
- Weryfikacja danych (j/w)<br />
- Headery (szczerze, to mi się w to nie chce bawić, oprócz takich podstawowych jak 404 itp)<br />
- MultiLanguage ( dla błędów to będzie na 100% gettext, i l18n dla treści )<br />
- Instalator ( jeszcze nie wiem czy będzie )</p>
<h3>Co chcę uzyskać</h3>
<p>Chcę napisać wydajny system, który usprawni mi pracę, która sprawi mi jeszcze więcej przyjemności niż Wam się wydaje, gdyż dla mnie programowanie to frajda. Olałem Doctrine, gdyż z tymi pajacami z dev nie można się w żaden sposób dogadać, myślą że pozjadali wszystkie rozumy i są najlepsi na świecie, także ORM będzie trochę inny niż wszystkie. Piszę swój system do zarządzania SQL&#8217;em, oczywiście nie będzie tam żadnych INSERT, UPDATE czy DELETE w kodzie wykonanego wszystko będzie oparte o język proceduralny PL/pgSQL nazwałem tą aplikację PGFM (PostgreSQL Function Mapper) &#8230; ( przy okazji refaktoryzacji kodu już zdążyłem zmienić nazwy większości klas, także ciekawe co z tego wyjdzie&#8230;) . Czyli dodanie rekordów do bazy danych czy ich aktualizacja lub/i usunięcie będzie się wykonywało poprzez procedury. W pewnym stopniu jest to przeniesienie logiki aplikacji do SQL&#8217;a, ale dlaczego nie? Jest to ciekawe rozwiązanie i nigdzie wcześniej nie widziałem takiego rozwiązania ( no prawie nigdzie ale nie mogę powiedzieć gdzie ;] domyślcie się gdzie ).</p>
<h3>Dlaczego darmowy?</h3>
<p>Dlatego że chce by każdy miał dostęp do innego spojrzenia na problem by też mógł się rozwijać analizując czyjś kod, może znajdzie ktoś jakiś błąd i pomoże mi go naprawić. Ale szczerze powiedziawszy nie liczę na to że będziecie chcieli używać tych narzędzi, nie zależy mi na tym. Piszę go dla siebie i dla firmy mojego kolegi <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Bezpieczeństwo</h3>
<p>Dużą wagę przekładam na bezpieczeństwo aplikacji, zatem data wydania będzie się przeciągać w czasie, będę chciał uniknąć falstartów i śpieszyć się z tym byście ujrzeli moje wypociny, jakoś mi się nie śpieszy. Rdzeń aplikacji będzie a przynajmniej będę miał takie założenie, odporny na taki typu sql injecty, xss&#8217;y i masę innych dupereli.</p>
<h3>Słów kilka na zakończenie</h3>
<p>Pewnie nie jeden z Was zapyta się po co to piszę? No napisałem powyżej, chce to zrobić by zostawić jakiś ślad po sobie. Oraz piszę też to po to by się samemu rozwijać, widzieć problem i znaleźć rozwiązanie dla niego. Na prawdę fajnie się idzie owkurw**** jak coś nie wychodzi, a później olśnienie i tona euforii jak zaczyna działać. To jest właśnie to dlaczego piszę swoją aplikację. Poza tym TAO programowania.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/bdt-basic-php-develop-tools/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>KDevelop jako IDE dla PHP</title>
		<link>http://www.cojack.pl/kdevelop-jako-ide-dla-php</link>
		<comments>http://www.cojack.pl/kdevelop-jako-ide-dla-php#comments</comments>
		<pubDate>Sat, 15 May 2010 11:12:47 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[ide dla php]]></category>
		<category><![CDATA[kdevelop]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=394</guid>
		<description><![CDATA[ Kto z Was nigdy nie łamał sobie głowy jakie jest najlepsze środowisko edytorskie dla naszego &#8222;ukochanego&#8221; języka skryptowego pod linuksem? Założę się że każdy z Was, a ja chciałbym Wam zaproponować KDevelop. Nie tak dawno temu zespół KDevelop ogłosił publicznie finalną ver. oznaczoną numerkiem 4.0, w całości zostało przeportowane ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="KDevelop" src="http://cojack.os-cms.pl/wp-content/kdevelop.png" alt="" height="100" width="100"> Kto z Was nigdy nie łamał sobie głowy jakie jest najlepsze środowisko edytorskie dla naszego &#8222;ukochanego&#8221; języka skryptowego pod linuksem? Założę się że każdy z Was, a ja chciałbym Wam zaproponować KDevelop. Nie tak dawno temu zespół KDevelop ogłosił publicznie finalną ver. oznaczoną numerkiem 4.0, w całości zostało przeportowane na qt 4. Nie dość że ślicznie wygląda to jeszcze komuś się chciało napisać plugin dla PHP! To już całkiem niezły wyczes z wypasem.</p>
<h3>Co nam oferuje KDevelop</h3>
<p><div style="width: 165px;" class="wp-caption alignright">
<a href="http://www.cojack.pl/wp-content/kdevelop-ide.png" class="fancybox" rel="fancybox" title="KDevelop i PHP"><img height="100" width="155" alt="KDevelop IDE" src="http://www.cojack.pl/wp-content/kdevelop-ide.png" title="KDevelop i PHP"></a></p>
<p class="wp-caption-text"> KDevelop i PHP </p>
</div>
<ul>
<li>Tworzenie projektów</li>
<li>Obsługa SVN z poziomu programu</li>
<li>Kolorowanie składni</li>
<li>Integracja z manualem PHP</li>
<li>Autosugestia metod w klasach</li>
<li>Autosugestia nazw zmiennych ( :p )</li>
<li>i wiele wiele wiele&#8230; more</li>
</ul>
<p>Otóż po rozmowie z twórcą pluginu i zgłoszeniu paru błędów wiem czego na razie nie ma, nie działają podpowiedzi w statycznym wywoływaniu metod np:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">SomeClassName<span style="color: #339933;">::</span></pre></div></div>

<p>Nie dostaniemy listeningu metod statycznych. Mi przynajmniej nie działa, on mówi że mu działa, eee nie wiem co jest grane ;]</p>
<p>KDevelop posiada kolorowanie składni również dla wielu wielu innych języków skryptowych. Wspaniałością jest to iż posiada kolorowanie składni dla skryptów SQL, tudzież PostgreSQL. Gdzie dla mnie to jest po prostu cudowna sprawa, ale był błąd w kolorowaniu składni procedur w języku pl/pgsql (będzie mini kurs wprowadzający w programowaniu pl/sql). By naprawić kolorowanie w tymże języku należy pobrać:<br />
<a href="http://gitorious.org/kate/kate/blobs/raw/master/part/syntax/data/sql-postgresql.xml" title="Kolorowanie składni w SQL (PostgreSQL)" alt="Kolorowanie składni w SQL (PostgreSQL)">sql-postgresql.xml</a> plik i wrzucić go do:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>kde4<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>katepart<span style="color: #000000; font-weight: bold;">/</span>syntax<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>tam już takowy plik będzie, zróbmy sobie pierw jego kopie, a następnie wrzućmy nowy. Po tej całej operacji restart KDevelop i będzie nam piknie działać. Napisałem że ma błąd w kolorowaniu składni ale nie napisałem jaki, otóż sprawa ma się tak, przyjrzyjmy się funkcji:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> <span style="color: #ff0000;">&quot;getMenuPath&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;_idMenu&quot;</span> <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">RETURNS</span> LTREE <span style="color: #993333; font-weight: bold;">AS</span> $BODY$
	<span style="color: #993333; font-weight: bold;">SELECT</span>
	   <span style="color: #ff0000;">&quot;menuPath&quot;</span>
	<span style="color: #993333; font-weight: bold;">FROM</span>
	   <span style="color: #ff0000;">&quot;menu&quot;</span>
	<span style="color: #993333; font-weight: bold;">WHERE</span>
	   <span style="color: #ff0000;">&quot;idMenu&quot;</span> <span style="color: #66cc66;">=</span> $1;
$BODY$ <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #ff0000;">'SQL'</span> <span style="color: #993333; font-weight: bold;">WITH</span> <span style="color: #66cc66;">&#40;</span>ISCACHABLE<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Jak widzimy po strukturze $BODY$ mamy ciało SQL, natomiast KDevelop interpretował to jako string, i tutaj był problem z kolorowaniem składni.
</p>
<h3>Błędy w KDevelop</h3>
<p>
Jest parę błędów w KDevelop które często powodują że nurtują mnie pytania czy dobrze zrobiłem że się na KDevelop przesiadłem, otóż mimo iż jest to oficjalne wydanie środowisko jest dosyć nie stabilne. Potrafi się często wyłożyć w najmniej oczekiwanych momentach, dlatego np odradzam korzystanie z SVN w KDevelop a wykorzystać do tego zewnętrzny program np: kdesvn, lub po prostu jechać z konsoli.<br />
Czasami potrafi się też wysypać przy zamykaniu zakładek otwartych dokumentów. Innym ficzerem jest też taka opcja że gdy się najedzie na funkcję w php to pokazuje się tooltip ballon z informacją o funckji z linkiem w środku: <strong>Show uses</strong>, po kliknięciu na niego najprawdopodobniej powinny się pojawić jakieś przykłady jak to użyć, ale pojawia się nowe okno z paskiem postępu i cały KDevelop zdechł.
</p>
<h3>Praca z KDevelop</h3>
<p>
Wszystko co nam potrzebne do pracy z KDevelop to kawałek internetu, 3kilo root&#8217;a i z 2 głośniki. Polecam też zainstalowanie paczek z debug symbols.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> kdevelop kdevelop-php <span style="color: #7a0874; font-weight: bold;">&#91;</span> kdevelop-php-docs <span style="color: #660033;">--</span> integracja z manualem php.net<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> kdevplatform-dbg <span style="color: #660033;">--</span> opcjonalne <span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

<p>I możemy zacząć naszą pracę z KDevelop, utworzyć sobie projekt, później do projektu pobrać dane po svn, lub też i nie jeżeli takiego projektu nigdzie nie przechowujemy na zewnątrz.
</p>
<p>To by było na tyle, te informacje miały Was zachęcić do przejścia na platformę KDE oraz używania IDE KDevelop.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/kdevelop-jako-ide-dla-php/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Spojrzenie w studnie</title>
		<link>http://www.cojack.pl/spojrzenie-w-studnie</link>
		<comments>http://www.cojack.pl/spojrzenie-w-studnie#comments</comments>
		<pubDate>Fri, 26 Mar 2010 09:58:15 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=371</guid>
		<description><![CDATA[ Dzisiaj w pracy kolega się mnie spytał czy jest taka możliwość by z klasy rodzica wywołać metodę w klasie dziecka, której nie ma w klasie rodzica. Urodził mi się uśmiech na twarzy i odparłem nie ma takiej możliwości, z logicznego pkt widzenia to jest awykonalne by w klasie bazowej ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="" src="http://www.cojack.pl/wp-content/arch-php.png" title="PHP" class="alignleft"> Dzisiaj w pracy kolega się mnie spytał czy jest taka możliwość by z klasy rodzica wywołać metodę w klasie dziecka, której nie ma w klasie rodzica. Urodził mi się uśmiech na twarzy i odparłem nie ma takiej możliwości, z logicznego pkt widzenia to jest awykonalne by w klasie bazowej móc wywołać metody z klasy, która dziedziczy nie definiując ich w tejże klasie bazowej. No ale spójrzmy co nam nasze php oferuje.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> A <span style="color: #009900;">&#123;</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: #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;">fuck</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>  
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> B <span style="color: #000000; font-weight: bold;">extends</span> A <span style="color: #009900;">&#123;</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: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
  <span style="color: #009900;">&#125;</span>  
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> fuck<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;yo<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> 
&nbsp;
<span style="color: #000088;">$objB</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>A teraz zgadnijcie jaki będzie wynik, otóż zaskoczę Was, wynik to <strong>yo</strong>. A teraz wytłumaczenie dlaczego tak to działa:</p>
<p>&#8222;Obiekt jeszcze przed wywołaniem konstruktora klasy A już posiada wszystkie metody klasy B&#8221;</p>
<p>Innymi słowy metody są przypisane do obiektu a nie do klasy.</p>
<p>A żeby jeszcze było śmieszniej to kolejność wykonywania funkcji, popatrzcie sami:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> A <span style="color: #009900;">&#123;</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: #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;">fuck</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> fuck<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;wow<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>  
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> B <span style="color: #000000; font-weight: bold;">extends</span> A <span style="color: #009900;">&#123;</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: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
  <span style="color: #009900;">&#125;</span>  
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> fuck<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;yo<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    parent<span style="color: #339933;">::</span><span style="color: #004000;">fuck</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> 
&nbsp;
<span style="color: #000088;">$objB</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>W kolejności wywoła się : <strong>yo</strong> a następnie <strong>wow</strong>. Dla mnie to powinna być pętla wow -> yo -> wow, a oczywiście jest inaczej.</p>
<p>Boże zlituj się nad developerami php i nie zważaj na grzechy ich.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/spojrzenie-w-studnie/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Role Based Access Control cz.3</title>
		<link>http://www.cojack.pl/role-based-access-control-cz-3</link>
		<comments>http://www.cojack.pl/role-based-access-control-cz-3#comments</comments>
		<pubDate>Fri, 22 Jan 2010 09:41:53 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[rbac]]></category>
		<category><![CDATA[role based access control]]></category>
		<category><![CDATA[uprawnienia]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=326</guid>
		<description><![CDATA[ Tak więc w poprzednim wpisie, pokazałem w jaki sposób zaimplementować taką strukturę w sql, w tym wpisie chciałbym rozważyć pewne dodatkowe możliwości, które mogą chodź nie muszą okazać się przydatne w cale. A więc, mamy tutaj sprawdzanie uprawnień tylko i wyłącznie dla grup użytkowników. Co nie było naszym założeniem, ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="PHP" src="http://www.cojack.pl/wp-content/arch-php.png" alt="" height="100" width="100"> Tak więc w poprzednim wpisie, pokazałem w jaki sposób zaimplementować taką strukturę w sql, w tym wpisie chciałbym rozważyć pewne dodatkowe możliwości, które mogą chodź nie muszą okazać się przydatne w cale. A więc, mamy tutaj sprawdzanie uprawnień tylko i wyłącznie dla grup użytkowników. Co nie było naszym założeniem, więc by kontynuować i rozszerzyć możliwości naszego rbac&#8217;a należy wprowadzić pewne zmiany. Tabela rbac_privilages powinna zostać przemianowana na rbac_group_privilages, musimy też utworzyć drugą tabelę rbac_user_privilages o podobnej strukturze jak ta poprzednia. Taka zmiana pozwoli nam już dodawać indywidualne uprawnienia dla użytkowników. Z założeń pozostało nam jeszcze grupa do grup zadań czyli naszych controllerów, oraz użytkownik do grupy zadań. Jakby nie patrzeć są to dodatkowe dwie tabele, których utworzenie nie powinno przysporzyć większych problemów.</p>
<h3>Logika struktury sql</h3>
<p>Można by się zapytać po co tyle tabel? A bardzo chętnie na to pytanie odpowiem, otóż baza danych nie jest stworzona po to by trzymać w niej to co się chce i nawet bez sensu, takie rzeczy dyskryminują nas od razu w oczach pracodawcy. Więc dane nie powinny się powtarzać, kolumny powinny być tak tworzone by zawierały jak najmniej wartości NULL chyba że ma to pewien sens. Coś na zasadzie &#8222;Dziel i zwyciężaj&#8221; tylko tutaj prawda nie mamy żadnych algorytmów <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Priorytety w Role Based Access Control</h3>
<p>Mamy taki problem: Czy pobrać wszystko za jednym zamachem i sprawdzać dostęp za pomocą tego co mamy, czy sprawdzać pobierając dane po kolei? I odpowiedź bez sprawdzenia tego, które z założeń jest szybsze jest chyba absurdem, niestety nie mam na razie na to czasu by to sprawdzić, lecz chciałbym ustalić kolejność priorytetów. Założenie jest takie: Każdy użytkownik jest przypisany do jakiejś grupy, użytkownik bez grupy też jest w grupie użytkowników a mowa tutaj o osobach które nie są zarejestrowane na naszej stronie, można przyjąć ich za grupę Guest, czyli gości. Taki paradoks. I teraz priorytety wg mnie można by ustalić w ten sposób:</p>
<ol>
<li>Sprawdzanie czy grupa ma dostęp do controllera, czyli naszej grupy zadań.
<ol>
<li>Ma, sprawdzamy czy grupa ma dostęp do akcji w kontrolerze, czyli naszego zadania
<ol>
<li> Ma, zezwalamy</li>
<li>Nie ma, przechodzimy do pkt 2</li>
</ol>
</li>
<li>Nie ma, przechodzimy do pkt 2</li>
</ol>
</li>
<li>Grupa nie ma uprawnień do zadania w controllerze, sprawdzamy czy użytkownik ma dostęp do controllera
<ol>
<li>Ma, sprawdzamy czy ma dostęp do akcji w kontrolerze
<ol>
<li>Ma, zezwalamy</li>
<li>Nie ma, odmawiamy</li>
</ol>
</li>
<li>Nie ma, odmawiamy</li>
</ol>
</li>
<li> Amen </li>
</ol>
<h3>Hierarchia, czyli dziedziczenie uprawnień</h3>
<p>Szczerze jak sobie pomyślę o takim założeniu to zaczyna mnie głowa boleć, bo już sobie w głowie tworzę taką aplikację w sql która musi to sprawdzać, no daję głowę, szczęka opada&#8230; Więc nie wiem czy aby na pewno jest to słuszne by tworzyć to, ale słowo się rzekło, to i się to napisze. Tylko obawiam się że bez rekurencji to nie przejdzie, chociaż nie jestem tego jeszcze do końca pewien, być może nie będzie tak źle na jak to wygląda. Dodatkowe akcje wchodzą w grę, należy sprawdzać czy jeżeli np grupa nie ma uprawnień do akcji, czy nad grupa ma pozwolenie na tą akcję oraz czy pozwala ją dziedziczyć, gdyby ktoś wyjechał z pomysłem komu pozwala ją dziedziczyć to w ogóle jeszcze więcej roboty, więc proszę nie dobijać leżącego <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Huh chociaż dobrze że nie ma sensu robić hierarchie użytkowników, bo od tego jest rbac właśnie by zrobił to za nas.</p>
<h4>Słów kilka na zakończenie</h4>
<p>Myślę że jest to optymalne sprawdzanie, chyba że coś pominąłem to mnie poprawcie, trochę z rana mogę być jeszcze nie ogarnięty z wszystkim, więc pisać w komentarzach co i jak.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/role-based-access-control-cz-3/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Role Based Access Control</title>
		<link>http://www.cojack.pl/role-based-access-control</link>
		<comments>http://www.cojack.pl/role-based-access-control#comments</comments>
		<pubDate>Mon, 18 Jan 2010 14:14:42 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[acl]]></category>
		<category><![CDATA[rbac]]></category>
		<category><![CDATA[role based access control]]></category>
		<category><![CDATA[uprawnienia]]></category>

		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=229</guid>
		<description><![CDATA[Ostatnio naszła mnie potrzeba na utworzenie listy kontroli dostępu dla użytkowników do modułów i akcji, cel zadania:

Użytkownik w wielu grupach
Grupy użytkowników	
Zadania
Grupy zadań
Dostęp grupie użytkowników do zadań
Dostęp grupie użytkowników do grupy zadań
Dostęp pojedynczemu użytkownikowi do zadań
Dostęp pojedynczemu użytkownikowi do grupy zadań
Hierarchia grup (dziedziczenie z rodzica grupy)

No i z pomocą przyszło google, ...]]></description>
			<content:encoded><![CDATA[<p>Ostatnio naszła mnie potrzeba na utworzenie listy kontroli dostępu dla użytkowników do modułów i akcji, cel zadania:</p>
<ol>
<li>Użytkownik w wielu grupach</li>
<li>Grupy użytkowników	</li>
<li>Zadania</li>
<li>Grupy zadań</li>
<li>Dostęp grupie użytkowników do zadań</li>
<li>Dostęp grupie użytkowników do grupy zadań</li>
<li>Dostęp pojedynczemu użytkownikowi do zadań</li>
<li>Dostęp pojedynczemu użytkownikowi do grupy zadań</li>
<li>Hierarchia grup (dziedziczenie z rodzica grupy)</li>
</ol>
<p>No i z pomocą przyszło google, a dokładnie strona: <a href="http://www.tonymarston.net/" rell="nofollow">link</a>, kolega przedstawił wzór graficzny w jaki sposób wszystko z sobą połączyć:</p>
<p><img src="http://www.tonymarston.net/php-mysql/rbac-05.png" alt="RBAC" /></p>
<p>W tablicy TASK (czyli zadania, będę przechowywał moduły i akcje, w postaci drzewa <em>(tak drzewo, mam już sposób w doctrine na prace z drzewem, opiszę nie długo, albo ltree się zobaczy)</em>, po adresie albo routerze, jeżeli będzie przepisany link, będę pobierał moduł i akcję którą w danej chwili wykonuje użytkownik, na samym początku będzie sprawdzanie czy użytkownik ma dostęp do grupy zadań, jeżeli ma, jest szansa na to że będzie miał dostęp do zadania, jeżeli nie, sprawdzimy grupę użytkownika, czy ma dostęp do grupy zadań, biorąc pod uwagę czy ma ojca i jakie on ma uprawnienia do zadań oraz czy pozwala na dziedziczenie tych uprawnień.</p>
<p>Do: <strong>Zyx</strong><br />
W ten sposób rozwiązuje nawet problem taki jaki mi przedstawiłeś dotyczący kategorii artykułów dopisując je jako dziecko articles.</p>
<p>Co o Tym sądzicie? Już nie długo przedstawię pełny kod <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/role-based-access-control/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

