<?xml version="1.0" encoding="UTF-8" ?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Ostatnie artykuły</title><link>http://www.tomaszmazur.eu/</link><description>Ostatnie artykuły z tomaszmazur.eu</description><language>pl-pl</language><item><title>CakePHP: JSON w widokach</title><link>http://www.tomaszmazur.eu/artykul/58-CakePHP-JSON-w-widokach</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/58-CakePHP-JSON-w-widokach</guid><description>&lt;p&gt;
	Pomysł jak i klasa do realizacji pomysłu są zaczerpnięte z tego &lt;a href=&quot;http://nuts-and-bolts-of-cakephp.com/2011/02/14/speed-things-up-with-a-custom-baked-json-view/&quot; target=&quot;_blank&quot;&gt;wpisu&lt;/a&gt;. Jeżeli mamy akcję, kt&amp;oacute;rej zadaniem jest zwr&amp;oacute;cić wynik w JSON; zazwyczaj nie ma potrzeby korzystania z plik&amp;oacute;w widok&amp;oacute;w i layout&amp;oacute;w. Niekt&amp;oacute;rzy pokusiliby się o wyłączenie autorenderowania i następnie wpisali &lt;code&gt;echo json_encode;&lt;/code&gt;.Bardziej doświadczeni programiście wiedzą, że jest to niezgodne z architekturą MVC. Do tego celu stworzona została klasa &lt;em&gt;JsonView&lt;/em&gt;. Poniższy kod ląduje w pliku &lt;code&gt;app/views/json.php&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
class JsonView extends View {
  var $content = null;
  function __construct {
    if  &amp;amp;&amp;amp; isset) {
      $this-&amp;gt;content = $controller-&amp;gt;viewVars[&amp;#39;json&amp;#39;];
    }
    if  {
      ClassRegistry::addObject;
    }
    Configure::write;
  }

  function render {
    if  {
      $data = &amp;#39;&amp;#39;;
    } else {
      $data = json_encode;
    }
    return $data;
  }
}&lt;/pre&gt;
&lt;p&gt;
	Teraz w naszej akcji, kt&amp;oacute;rej zadaniem jest wypisać obiekt JSON wystarczy wpisać:&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
function my_action {
    $this-&amp;gt;view=&amp;#39;json&amp;#39;;
    $json = array;
    $this-&amp;gt;set);
}&lt;/pre&gt;
&lt;p&gt;
	W odpowiedzi akcji powinniśmy otrzymać:&lt;/p&gt;
&lt;pre class=&quot;brush:jscript;&quot;&gt;
{&amp;quot;myobject&amp;quot;:true,&amp;quot;mvc&amp;quot;:&amp;quot;not broken&amp;quot;}&lt;/pre&gt;
&lt;p&gt;
	Mechanizm bardzo prosty w implementacji, pozwalający znacząco przyspieszyć pisanie kodu z użyciem JSON.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sat, 27 Aug 2011 11:31:13 +0200</pubDate></item><item><title>CakePHP: Linki absolutne</title><link>http://www.tomaszmazur.eu/artykul/57-CakePHP-Linki-absolutne</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/57-CakePHP-Linki-absolutne</guid><description>&lt;p&gt;
	Ostatnio napotkałem problem tworzenia link&amp;oacute;w w mailu wysyłanym z sekcji administratorskiej aplikacji napisanej w CakePHP. Linki tworzyłem za pomocą metody &lt;em&gt;link&lt;/em&gt; w &lt;em&gt;HtmlHelper&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
echo $this-&amp;gt;Html-&amp;gt;link
);&lt;/pre&gt;
&lt;p&gt;
	Tak utworzony link tworzony jest z prefixem &amp;#39;admin&amp;#39;; jakoże został utworzony z poziomu sekcji admin, kt&amp;oacute;ra jest uzyskana za pomocą takiego prefixu. Pozbywamy się prefixu podająć w tablicy drugiego parametru element o kluczu takim jak nazwa prefixu, a w wartości prefixu &lt;code&gt;FALSE&lt;/code&gt;. Zaleca się aby w każdym tworzonym linku anuluwać nieużywane, a zdefiniowane prefixy. Dla przypomnienia prefixy te zdefiniowane są w pliku &lt;code&gt;app/config/routes.php&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
echo $this-&amp;gt;Html-&amp;gt;link
);&lt;/pre&gt;
&lt;p&gt;
	Teraz wystarczy tylko uzyskać link absolutny, czyli zaczynający się od &lt;code&gt;http://tomaszmazur.eu/&lt;/code&gt; zamiast standardowego &lt;code&gt;/&lt;/code&gt;. W tablicy drugiego parametru tworzymy element o kluczu &lt;code&gt;full_base&lt;/code&gt; i wartości &lt;code&gt;TRUE&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
echo $this-&amp;gt;Html-&amp;gt;link
);&lt;/pre&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Fri, 26 Aug 2011 21:46:20 +0200</pubDate></item><item><title>CakePHP: Jeden silnik dla wielu aplikacji</title><link>http://www.tomaszmazur.eu/artykul/56-CakePHP-Jeden-silnik-dla-wielu-aplikacji</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/56-CakePHP-Jeden-silnik-dla-wielu-aplikacji</guid><description>&lt;p&gt;
	Jak posiadać jedną kopię framework&amp;#39;a dla wielu aplikacji? Standardowe podejście to jeden silnik dla jednej aplikacji. Zakładając, że na serwerze posiadamy 10 aplikacji, w chwili gdy zechcemy zaktualizować silnik, musimy wgrać nową wersję 10 razy. Dodatkowo posiadamy 10 identycznych kopii źr&amp;oacute;deł CakePHP. Rozwiązaniem tego problemu jest posiadanie jednego silnika CakePHP wykorzystywanego przez wszystkie 10 aplikacji.&lt;/p&gt;
&lt;p&gt;
	Na moim serwerze struktura katalog&amp;oacute;w wygląda następująco:&lt;/p&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
~/domains/domena1.pl/public_html/
~/domains/domena2.com/public_html/&lt;/pre&gt;
&lt;p&gt;
	W każdym z tych katalog&amp;oacute;w posiadam 2 działające aplikacje CakePHP, zawartość tych katalog&amp;oacute;w to:&lt;/p&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
app/
cake/
plugins/
vendors/
.htaccess
index.php&lt;/pre&gt;
&lt;p&gt;
	W momencie, gdy będę chciał zastosować strategię &amp;#39;jeden silnik dla wielu aplikacji&amp;#39;, zawartość folderu ograniczy się do:&lt;/p&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
app/
.htaccess
index.php&lt;/pre&gt;
&lt;p&gt;
	Pozostałe foldery zostaną przeniesione do innej dowolnej lokalizacji. W moim przypadku przenoszę je do &lt;code&gt;~/cakephp_nr_wersji&lt;/code&gt;. Otrzymuję przykładowy efekt:&lt;/p&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
~/cakephp_1_3_10/cake
~/cakephp_1_3_10/plugins
~/cakephp_1_3_10/vendors/&lt;/pre&gt;
&lt;p&gt;
	Aby aplikacje wiedziały, gdy znajduje się silnik CakePHP, musimy dokonać modyfikacji pliku &lt;code&gt;app/webroot/index.php&lt;/code&gt;&lt;br /&gt;
	&amp;nbsp;ustawiając stałą &lt;code&gt;CAKE_CORE_INCLUDE_PATH&lt;/code&gt; na ścieżkę do katalogu zawierającego katalogi &lt;code&gt;cake&lt;/code&gt; i &lt;code&gt;vendors&lt;/code&gt; . W wyżej opisanym przykładzie wyglądałoby to następująco:&lt;/p&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
define)).DS.&amp;#39;cakephp1_3_10&amp;#39;);&lt;/pre&gt;
&lt;p&gt;
	Zmiany musimy oczywiście dokonać w każdej aplikacji z osobna, lecz jest to działanie tylko jednorazowe. Możemy p&amp;oacute;jść krok dalej i wyrzucić zawartość katalogu &lt;code&gt;app&lt;/code&gt; bezpośrednio do &lt;code&gt;public_html&lt;/code&gt;, ale o tym w oddzielnym wpisie.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Mon, 22 Aug 2011 01:02:28 +0200</pubDate></item><item><title>Linux: Kilka przydatnych komend dla programistów</title><link>http://www.tomaszmazur.eu/artykul/55-Linux-Kilka-przydatnych-komend-dla-programistow</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/55-Linux-Kilka-przydatnych-komend-dla-programistow</guid><description>&lt;p&gt;
	Przedstawię kilka komend linuxowych, kt&amp;oacute;re przydają się w codziennej pracy programisty. Niekażdy programista zna linuxa na wylot, w większości przypadk&amp;oacute;w wystarczy znajomość podstaw i kilku, specyficznych dla danej działalności komend. Polecenia są dość jednoznaczne, dlatego nie zamieszczam dokładnego opisu komend.&lt;/p&gt;
&lt;h4&gt;
	1. Zrzut/kopia bazy danych&lt;/h4&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
mysqldump -h localhost -u username -p database &amp;gt; file.sql
&lt;/pre&gt;
&lt;p&gt;
	-p oznacza, że konieczne jest podanie hasła dla użytkownika.&lt;/p&gt;
&lt;h4&gt;
	2. Wgranie/import bazy danych&lt;/h4&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
mysql --host localhost --user username -p database &amp;lt; file.sql&lt;/pre&gt;
&lt;p&gt;
	-p jak w punkcie 1&lt;/p&gt;
&lt;h4&gt;
	3. Policzenie liczby plik&amp;oacute;w/folder&amp;oacute;w w danym katalogu&lt;/h4&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
ls /my/dir/ -l | wc -l
&lt;/pre&gt;
&lt;h4&gt;
	4. Wylistowanie plik&amp;oacute;w/katalog&amp;oacute;w zawierających w nazwie określony ciąg znak&amp;oacute;w&lt;/h4&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
ls /my/dir | grep &amp;quot;.jpg&amp;quot;&lt;/pre&gt;
&lt;p&gt;
	Komendy z punkt&amp;oacute;w 3 i 4 można połączyć&lt;/p&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
ls /my/dir -l | grep &amp;quot;.jpg&amp;quot; | wc -l&lt;/pre&gt;
&lt;p&gt;
	Post będzie uzupełniany w miarę potrzeb.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sat, 20 Aug 2011 17:39:22 +0200</pubDate></item><item><title>SQL: Przechowywanie IP w bazie danych</title><link>http://www.tomaszmazur.eu/artykul/54-SQL-Przechowywanie-IP-w-bazie-danych</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/54-SQL-Przechowywanie-IP-w-bazie-danych</guid><description>&lt;p&gt;
	Wpis dotyczy tematu &lt;strong&gt;przechowywania adres&amp;oacute;w IP&lt;/strong&gt; w bazie danych &lt;strong&gt;MySQL&lt;/strong&gt;. Najczęściej spotykanym sposobem przechowywania takiego adresu IP jest pole &lt;em&gt;VARCHAR&lt;/em&gt;. Jest to zdecydowanie niewłaściwe podejście, wymaga zastosowania pola co najmniej &lt;em&gt;VARCHAR&lt;/em&gt;, jednak w praktyce można spotkać nawet &lt;em&gt;VARCHAR&lt;/em&gt;. Polecanym rozwiązaniem jest skorzystanie z pola &lt;em&gt;UNSIGNED INT&lt;/em&gt;. Aby jednak wcisnąć adres IP do tego pola, potrzebna jest jego pewna obr&amp;oacute;bka, na szczęście zar&amp;oacute;wno &lt;strong&gt;PHP&lt;/strong&gt; jak i &lt;strong&gt;MySQL&lt;/strong&gt; posiadają funkcje pozwalające na obustronna konwersje adres&amp;oacute;w. Przejdźmy do praktyki i utw&amp;oacute;rzmy nasze pole:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:sql;&quot;&gt;
CREATE TABLE IF NOT EXISTS `ips`  unsigned NOT NULL AUTO_INCREMENT,
  `ip` int unsigned NOT NULL,
  PRIMARY KEY ,
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Aby wstawić do bazy danych adres IP 127.0.0.1 możemy skorzystać z zapytania:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:sql;&quot;&gt;
INSERT INTO `ips`  VALUES)&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	W bazie danych pojawi się wpis, kt&amp;oacute;ry w polu ip będzie zawierał adres IP:&lt;/p&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
2130706433&lt;/pre&gt;
&lt;p&gt;
	Adres ten odczytujemy za pomocą MySQL korzystając ze składni&lt;/p&gt;
&lt;pre class=&quot;brush:sql;&quot;&gt;
SELECT INET_NTOA as ip_address FROM `ips`&lt;/pre&gt;
&lt;p&gt;
	Co pozwoli nam na odczyt adresu IP w znanej nam formie. Jak wspomniałem, czynności te można r&amp;oacute;wnież wykonać z poziomu PHP. Służą do tego odpowiednio funkcje &lt;span class=&quot;methodname&quot;&gt;&lt;b&gt;ip2long&lt;/b&gt; i &lt;/span&gt;&lt;strong&gt;long2ip&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$ip = &amp;#39;127.0.0.1&amp;#39;;
$encoded = ip2long;
echo $encoded; //wyświetli 2130706433
$ip_2 = long2ip;
echo $ip_2; //wyświetli 127.0.0.1&lt;/pre&gt;
&lt;p&gt;
	Jak widać korzystanie z tego sposobu przechowywania adres&amp;oacute;w IP w bazie danych nie jest takie straszne jak mogłoby się wydawać. Pozatym, że rozwiązanie to jest dużo wydajniesze od zwykłego pola &lt;em&gt;VARCHAR&lt;/em&gt;. Należy wspomnieć że udostępnia dodatkową funkcjonalność jak np. wyszukiwanie adres&amp;oacute;w IP z danego zakresu adres&amp;oacute;w, sprawdzanie czy adres należy do danej puli itd.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sat, 12 Feb 2011 00:03:43 +0100</pubDate></item><item><title>Javascript: Przypisać this, czyli metoda apply i call obiektu Function</title><link>http://www.tomaszmazur.eu/artykul/53-Javascript-Przypisac-this-czyli-metoda-apply-i-call-obiektu-Function</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/53-Javascript-Przypisac-this-czyli-metoda-apply-i-call-obiektu-Function</guid><description>&lt;p&gt;
	Czasami, szczeg&amp;oacute;lnie przy obiektowym javascriptcie istnieje potrzeba określenia czym jest &lt;em&gt;this&lt;/em&gt; w danej funkcji/metodzie. Istnieją dwa sposoby określenia &lt;em&gt;this&lt;/em&gt;, za pomocą metod &lt;em&gt;&lt;strong&gt;apply&lt;/strong&gt;&lt;/em&gt; i &lt;strong&gt;&lt;em&gt;call&lt;/em&gt;&lt;/strong&gt; obiektu Function:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:jscript;&quot;&gt;
function car {
    this.name = &amp;#39;car&amp;#39;; 
}
car.prototype.getName = function {
    alert: &amp;#39;+this.name);
}

function person {
    this.name = &amp;#39;person&amp;#39;;
}
person.prototype.getName = function {
     alert: &amp;#39;+this.name);
}
person.prototype.test1 = function {
     car.getName.apply;   
}
person.prototype.test2 = function {
     car.getName.call;   
}


var car = new car;
var person = new person;
car.getName;
person.getName;
person.test1;
person.test2;
&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Pierwszym parametrem w obydwu metodach jest zmienna, kt&amp;oacute;ra w wywołanej funkcji/metodzie będzie przypisana do &lt;em&gt;this&lt;/em&gt;. Wykonując powyższy kod, tworzymy 2 obiekty, person i car. Wywołujemy po koleji metody &lt;em&gt;getName&lt;/em&gt; obudwu obiekt&amp;oacute;w i dostajemy w komunikatach:&lt;/p&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
car.getName: car
person.getName: person&lt;/pre&gt;
&lt;p&gt;
	Czyli wszystko standardowo. W obiekcie car &lt;em&gt;this&lt;/em&gt;=car, a w obiekcie person &lt;em&gt;this&lt;/em&gt;=person; W kolejnych 2 wywołaniach, metody &lt;em&gt;test1&lt;/em&gt; i &lt;em&gt;test2&lt;/em&gt; obiektu person, wywołujemy metode &lt;em&gt;getName&lt;/em&gt; obiektu car, przekazując w pierwszym argumencie metod &lt;em&gt;apply/call&lt;/em&gt; &lt;em&gt;this&lt;/em&gt;, czyli person. Spodziewamy się wywołać z poziomu obiektu car metode &lt;em&gt;getName&lt;/em&gt; z &lt;em&gt;this&lt;/em&gt;=person. Brzmi absurdalnie, ale w kolejnych dw&amp;oacute;ch komunikatach dostajemy:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:jscript;&quot;&gt;
car.getName: person
car.getName: person&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Przykład ten nie niesie większego sensu, ale wydaje mi się, że dobrze oddaje ideę działania tych metod. Metody &lt;em&gt;&lt;strong&gt;apply&lt;/strong&gt;&lt;/em&gt; i &lt;em&gt;&lt;strong&gt;call&lt;/strong&gt;&lt;/em&gt; r&amp;oacute;żnią się sposobem przekazywania dodatkowych argument&amp;oacute;w, co nie zostanie om&amp;oacute;wione w tym artykule.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sun, 02 Jan 2011 12:47:30 +0100</pubDate></item><item><title>CakePHP: HABTM - podstawy relacji hasAndBelongsToMany</title><link>http://www.tomaszmazur.eu/artykul/52-CakePHP-HABTM-podstawy-relacji-hasAndBelongsToMany</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/52-CakePHP-HABTM-podstawy-relacji-hasAndBelongsToMany</guid><description>&lt;h4&gt;
	&lt;span style=&quot;font-size: 16px;&quot;&gt;1. Wprowadzenie&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;
	W artykule tym opiszę wszystkie istotne informacje dotyczące relacji &lt;strong&gt;HABTM&lt;/strong&gt;. Na początku podam przykład takiej relacji wzięty z tej strony. Mamy artykuły i kategorie; artykuł może być przypisany do wielu kategorii, a kategoria może posiadać wiele artykuł&amp;oacute;w. To jest istotą relacji &lt;strong&gt;HABTM&lt;/strong&gt;. Aby utworzyć tą relację konieczne jest stworzenie w bazie danych, tabeli łączącej artykuły z kategoriami. Definicja w kodzie wygląda następująco:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
&amp;lt;?php
//definicja modelu artykuł&amp;oacute;w
class Article extends AppModel {
     var $name = &amp;#39;Article&amp;#39;;
     var $hasAndBelongsToMany = array;//definicja relacji HABTM
}&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
&amp;lt;?php
//definicja modelu kategorii
class Category extends AppModel {
     var $name = &amp;#39;Category&amp;#39;;
     var $hasAndBelongsToMany = array;//definicja relacji HABTM
}&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	W powyższym kodzie nie zdefiniowałem tabeli łączącej obydwa modele, jest spowodowane tym, że &lt;strong&gt;CakePHP&lt;/strong&gt; domyślnie przyjmuje nazwę wziętą z konwencji; w tym wypadku &lt;em&gt;articles_categories&lt;/em&gt;. Dodatkowo zostanie utworzony automodel &lt;em&gt;ArticlesCategory&lt;/em&gt;, kt&amp;oacute;ry umożliwi dostęp bezpośrednio do danych zawartych w tabeli łączącej. Należy jednak pamiętać o tym, że utworzony &lt;strong&gt;automodel&lt;/strong&gt; nie jest powiązany ani z artykułem, ani z kategorią. Powiązanie takie można wywołać ręcznie:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
//utworzenie relacji naszego automodelu do kategorii
$this-&amp;gt;Article-&amp;gt;ArticlesCategory-&amp;gt;bindModel));&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;
	&lt;span style=&quot;font-size: 16px;&quot;&gt;2. Modyfikacja relacji&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;
	Co jednak jeśli nazwa automodelu nam nie pasuje? Albo chcemy użyć innej nazwy tabeli łączącej? Nazwe te możemy dowolnie modyfikować, należy jednak pamiętać o tym aby zmiany wprowadzić w obu modelach. Wprowadzenie ich tylko w jednym modelu będzie skutkowało dużym bałaganem i niespodziewanym zachowaniem aplikacji.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
&amp;lt;?php
//definicja modelu artykuł&amp;oacute;w
class Article extends AppModel {
     var $name = &amp;#39;Article&amp;#39;;
     var $hasAndBelongsToMany = array
     );//definicja relacji HABTM
}&lt;/pre&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
&amp;lt;?php
//definicja modelu kategorii
class Category extends AppModel {
     var $name = &amp;#39;Category&amp;#39;;
     var $hasAndBelongsToMany = array
     );//definicja relacji HABTM
}&lt;/pre&gt;
&lt;p&gt;
	Po zastosowaniu podanego wyżej kodu nasz automodel będzie się nazywał &lt;em&gt;ArticlesCategories&lt;/em&gt; a tabela łącząca &lt;em&gt;articles_categories_joined&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;
	&lt;span style=&quot;font-size: 16px;&quot;&gt;3. Analiza relacji&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;
	Wr&amp;oacute;cmy jednak do nazewnictwa proponowanego przez konwencję &lt;strong&gt;CakePHP&lt;/strong&gt;. Jeśli chcemy wejść w szczeg&amp;oacute;ły relacji &lt;strong&gt;HABTM&lt;/strong&gt;, jest to nic innego niż 2 relacje hasMany z zastosowaniem modelu pośredniego. Podaję przykład jak utworzyć relację zachowującą się podobnie jak &lt;strong&gt;HABTM&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
//definicja modelu artykuł&amp;oacute;w
class Article extends AppModel {
     var $name = &amp;#39;Article&amp;#39;;
     var $hasMany = array;
}


//definicja modelu kategorii
class Category extends AppModel {
     var $name = &amp;#39;Category&amp;#39;;
     var $hasMany = array;
}

//definicja modelu łączącego
class ArticleCategory extends AppModel {
     var $name = &amp;#39;ArticleCategory&amp;#39;;
     var $belongsTo = array;
}
&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Jak widać wymaga to zdefiniowania dodatkowego modelu, pełniącego rolę łącznika. Nie polecam definiowania relacji w ten spos&amp;oacute;b, przykład ten został podany jedynie w celu zrozumienia zasady działania relacji &lt;strong&gt;HABTM&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;
	&lt;span style=&quot;font-size: 16px;&quot;&gt;4. Tworzenie i usuwanie relacji&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;
	Relacja &lt;strong&gt;HABTM&lt;/strong&gt; jest dość specyficzną relacją. Aby przypisać artykuł o id=1 do kategorii o id=1 wywołujemy:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$this-&amp;gt;Article-&amp;gt;save,
    &amp;#39;Category&amp;#39; =&amp;gt; array,
    ),
)); 
&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Jeżeli chcemy przypisać nasz artykuł dodatkowo do kategorii 2 może skorzystać z kodu:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$this-&amp;gt;Article-&amp;gt;save,
    &amp;#39;Category&amp;#39; =&amp;gt; array,
    ),
)); &lt;/pre&gt;
&lt;p&gt;
	Spowoduje to jednak usunięcie relacji z kategoria o id=1. Należy zatem pamietać, że przy modyfikacji relacji HABTM CakePHP najpierw kasuje wszystkie istniejące relacje. Poprawny kod wygląda następująco:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$this-&amp;gt;Article-&amp;gt;save,
    &amp;#39;Category&amp;#39; =&amp;gt; array,
    ),
)); &lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Jak można się już domyślić, jeśli chcemy aby nasz artykuł nie należał do żadnej kategorii wywołujemy:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$this-&amp;gt;Article-&amp;gt;save,
    &amp;#39;Category&amp;#39; =&amp;gt; array,
    ),
)); &lt;/pre&gt;
&lt;p&gt;
	Aby zmienić to zachowanie można skorzystać z &lt;a href=&quot;http://bakery.cakephp.org/articles/bparise/2007/05/09/add-delete-habtm-behavior&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;add-delete-habtm-behavior&lt;/a&gt;. Osobiście nie korzystałem z tego dodatku, ale w niekt&amp;oacute;rych przypadkach może on okazać sie użytyczny.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;
	&lt;span style=&quot;font-size: 16px;&quot;&gt;5. Więcej informacji&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;
	&lt;a href=&quot;http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Cookbook o HABTM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	W przyszłości planuję opisać spos&amp;oacute;b filtrowania danych objętych relacją &lt;strong&gt;HABTM&lt;/strong&gt;.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sun, 26 Dec 2010 22:01:55 +0100</pubDate></item><item><title>MySQL: Reorganizacja kluczy głównych tabeli</title><link>http://www.tomaszmazur.eu/artykul/51-MySQL-Reorganizacja-kluczy-glownych-tabeli</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/51-MySQL-Reorganizacja-kluczy-glownych-tabeli</guid><description>&lt;p&gt;
	Kr&amp;oacute;tki post o tym jak należy postępować gdy chcemy dokonać reogranizacji kluczy gł&amp;oacute;wnych tabeli. Tyczy się to tylko tabel, kt&amp;oacute;re mają indeks gł&amp;oacute;wny numerowany automatycznie. Przykładowo mamy tabelę w kt&amp;oacute;rej istnieją wpisy dla kluczy gł&amp;oacute;wnych: 1,3,5,10, a chcemy ją tak przenumerować, żeby te klucze przyjmowały wartości: 1,2,3,4. Rozwiązanie sprowadza się do 3 zapytań SQL:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:sql;&quot;&gt;
ALTER TABLE `users` DROP `id`;
ALTER TABLE `users` AUTO_INCREMENT = 1;
ALTER TABLE `users` ADD `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Oczywiście rozwiązanie posiada jedną ogromną wadę: nadaje się do zastosowania tylko tam, gdzie nie mamy relacji z tabelą kt&amp;oacute;rą modyfikujemy. Na szczęscie m&amp;oacute;j obiekt testowy spełniał to założenie.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Wed, 22 Dec 2010 23:55:00 +0100</pubDate></item><item><title>CakePHP: Optymalizacja tabel ACL</title><link>http://www.tomaszmazur.eu/artykul/50-CakePHP-Optymalizacja-tabel-ACL</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/50-CakePHP-Optymalizacja-tabel-ACL</guid><description>&lt;p&gt;
	Natknąłem się w sieci na ciekawy kawałek kodu SQL, kt&amp;oacute;ry drastycznie zwiększa wydajność zapytań do tabel ACL. Zmiana polega jedynie na nałożeniu indeks&amp;oacute;w i kluczy obcych. Kod został znaleziony na &lt;a href=&quot;http://groups.google.com/group/cake-php/browse_thread/thread/8d07ed7c99b0983b&quot; rel=&quot;nofollow&quot;&gt;grupie dyskusyjnej CakePHP&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush:sql;&quot;&gt;
/* ACL Tables */

CREATE TABLE acos  DEFAULT &amp;#39;&amp;#39;,
	foreign_key INT UNSIGNED DEFAULT NULL,
	alias VARCHAR DEFAULT &amp;#39;&amp;#39;,
	lft INT DEFAULT NULL,
	rght INT DEFAULT NULL
) ENGINE = INNODB;
-- table name is quoted because it is a reserved word
CREATE INDEX idx_acos_lft_rght ON `acos`;
CREATE INDEX idx_acos_alias ON `acos`;
CREATE INDEX idx_acos_model_foreign_key ON `acos`,foreign_key);

CREATE TABLE aros  DEFAULT &amp;#39;&amp;#39;,
	foreign_key INT UNSIGNED DEFAULT NULL,
	alias VARCHAR DEFAULT &amp;#39;&amp;#39;,
	lft INT DEFAULT NULL,
	rght INT DEFAULT NULL
) ENGINE = INNODB;
-- table name is quoted because it is a reserved word
CREATE INDEX idx_aros_lft_rght ON `aros`;
CREATE INDEX idx_aros_alias ON `aros`;
CREATE INDEX idx_aros_model_foreign_key ON `aros`,foreign_key);

CREATE TABLE aros_acos  NOT NULL DEFAULT 0,
	_read CHAR NOT NULL DEFAULT 0,
	_update CHAR NOT NULL DEFAULT 0,
	_delete CHAR NOT NULL DEFAULT 0
) ENGINE = INNODB;
-- table names are quoted because they are reserved words
CREATE UNIQUE INDEX idx_aros_acos_aro_id_aco_id ON `aros_acos`;
ALTER TABLE aros_acos ADD CONSTRAINT FOREIGN KEY  REFERENCES `aros`;
ALTER TABLE aros_acos ADD CONSTRAINT FOREIGN KEY  REFERENCES `acos`;
&lt;/pre&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Tue, 02 Nov 2010 11:55:11 +0100</pubDate></item><item><title>Aktualizacja licznika długu publicznego - dane z VI 2010</title><link>http://www.tomaszmazur.eu/artykul/49-Aktualizacja-licznika-dlugu-publicznego-dane-z-VI-2010</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/49-Aktualizacja-licznika-dlugu-publicznego-dane-z-VI-2010</guid><description>&lt;p&gt;
	Kolejna aktualizacja licznika długu publiczego. Dane są obecnie pobierane z okresu 01.06.2009 - 31.05.2010. Aktualizacja spowodowała skok licznika o 25 mld złotych do przodu! Jest to rekordowy skok odkąd uruchomiono licznik. Szczeg&amp;oacute;łowe dane można zobaczyć na stronie &lt;a href=&quot;../../projekty/dlugpubliczny2&quot;&gt;projektu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Dodatkowo licznik długu publicznego obchodzi swoje ciche pierwsze urodziny. ;) Od tego czasu zyskał znaczy rozgłos. W planach jest stworzenie niezależnego skryptu PHP zwracającego wartość tekstową lub graficzną aktualnego długu.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Standardowo informuję: Aby dane licznika się zaktualizowały może być konieczne wyczyszczenie cache, lub po prostu wciśnięcie klawisza F5 na stronie z licznikiem.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sun, 19 Sep 2010 23:26:00 +0200</pubDate></item><item><title>CakePHP: Checkbox zamiast multiselect</title><link>http://www.tomaszmazur.eu/artykul/48-CakePHP-Checkbox-zamiast-multiselect</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/48-CakePHP-Checkbox-zamiast-multiselect</guid><description>&lt;p&gt;
	Zał&amp;oacute;żmy, że mamy model Post i Tag posiadający relację HABTM. Tworząc widok dodawania nowego postu chcemy mieć możliwość wyboru tag&amp;oacute;w kt&amp;oacute;re są przypisane do postu. Standardowo napiszemy w naszym widoku:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
echo $this-&amp;gt;Form-&amp;gt;input
));&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Spowoduje to stworzenie elementu select z opcją wielokrotnego wyboru. Jest to element na og&amp;oacute;ł kłopotliwy ze względu na konieczność używania przycisku control w trakcie zaznaczanie, co ze strony użyteczności jest wielkim nieporozumieniem. CakePHP przychodzi nam z pomocą i umożliwia bardzo proste rozwiązanie problemu. Wystarczy do tablicy parametr&amp;oacute;w dodać klucz multiple z wartością checkbox. Skutkuje to stworzeniem serii element&amp;oacute;w checkbox. Całość wygląda następująco.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
echo $this-&amp;gt;Form-&amp;gt;input
	,&amp;#39;multiple&amp;#39;=&amp;gt;&amp;#39;checkbox&amp;#39;
));&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Na og&amp;oacute;ł jest to rozwiązanie lepsze niż element select. Sposobem najlepszym jest jednak stworzenie elementu ktory nazywam &amp;#39;multiselect-checkbox&amp;#39;. Do stworzenia jego potrzebujemy jednak użyć nieco javascriptu. Można się wkr&amp;oacute;tce spodziewać artykułu na ten temat.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sun, 19 Sep 2010 12:17:25 +0200</pubDate></item><item><title>jQuery: Jak sprawdzić czy element istnieje?</title><link>http://www.tomaszmazur.eu/artykul/47-jQuery-Jak-sprawdzic-czy-element-istnieje</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/47-jQuery-Jak-sprawdzic-czy-element-istnieje</guid><description>&lt;p&gt;
	Jak sprawdzić czy element istnieje za pomocą jQuery? Jak sprawdzić ile takich element&amp;oacute;w istnieje? Ostatnio spotkałem się z takim problemem. Naturalnym odruchem jest napisanie następującego kawałka kodu:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:jscript;&quot;&gt;
var x = $;
if {//zakładamy że ten fragment kodu wykona się tylko wtedy gdy element istnieje
   alert; 
}&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Niestety rozwiązanie to jest jak najbardziej błędne. Zmienna x zawsze będzie istnieć, będzie obiektem jQuery. Prawidłowy spos&amp;oacute;b polega na sprawdzeniu właściwości length tego obiektu. Wartość tej właściwości jes r&amp;oacute;wna ilości znaleźionych element&amp;oacute;w.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:jscript;&quot;&gt;
var x = $;
if {
   alert;
}&lt;/pre&gt;
&lt;p&gt;
	Rozwiązanie proste, ale może wpędzić w chwilę zakłopotania, jeżeli nie znamy prawidłowego sposobu.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sat, 18 Sep 2010 22:48:09 +0200</pubDate></item><item><title>CakePHP: Korzystanie z helpera z poziomu innego helpera</title><link>http://www.tomaszmazur.eu/artykul/46-CakePHP-Korzystanie-z-helpera-z-poziomu-innego-helpera</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/46-CakePHP-Korzystanie-z-helpera-z-poziomu-innego-helpera</guid><description>&lt;p&gt;
	Co należy zrobić żeby m&amp;oacute;c korzystać z jakiegoś helpera w CakePHP z poziomu innego helpera? Zadanie jest banalne i nie r&amp;oacute;żni się niczym od korzystania z helper&amp;oacute;w w zwykłym kontrolerze. Zar&amp;oacute;wno spos&amp;oacute;b zaincludowania jak i spos&amp;oacute;b dostępu do helpera jest identyczny. W zaprezentowanym fragmencie kodu korzystam z HtmlHelper z poziomu stworzonego przezemnie MyHelper.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
class MyHelper extends AppHelper {
    var $helpers = array;

    function myMethod {
        return $this-&amp;gt;Html-&amp;gt;link;
    }
}
&lt;/pre&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Thu, 16 Sep 2010 23:30:56 +0200</pubDate></item><item><title>CakePHP: Dynamiczne ładowanie zewnętrznych modeli</title><link>http://www.tomaszmazur.eu/artykul/45-CakePHP-Dynamiczne-ladowanie-zewnetrznych-modeli</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/45-CakePHP-Dynamiczne-ladowanie-zewnetrznych-modeli</guid><description>&lt;p&gt;
	Czasami zdarza się konieczność korzystania z modelu niepowiązanego z danym modelem/kontrolerem. Przykładem z życia wziętym jest model Setting - prosta tablica zawierajaca r&amp;oacute;żne ustawienia do naszej aplikacji, prawdopodobnie modyfikowalne z poziomu panelu administracyjnego. Będziemy korzystać z tego modelu w bardzo wielu niepowiązanych modelach. W moich aplikacjach model ten zazwyczaj nie posiada żadnych powiązań. Częstym błędem początkujących programist&amp;oacute;w CakePHP jest pr&amp;oacute;ba korzystania z modelu z poziomu kontroler&amp;oacute;w za pomocą właściwości $uses.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
var $uses = array&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Spowoduje to załadowanie modelu Setting przy każdym uruchomieniu kontrolera. Jezeli kontroler posiada metody dla kt&amp;oacute;rych model Setting jest niepotrzebny, to podany kawalek kodu nie jest optymalny. Korzystanie z modelu Setting obywa sie teraz na zasadach analogicznych do korzystania z natywnego modelu kontrolera.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$results = $this-&amp;gt;Setting-&amp;gt;findById;&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Zalecaną metodą ładowania zewnętrznych modeli jest ładowanie dynamiczne. Następującą linijkę kodu należy umieścić w metodzie wymagającej dostęp do modelu Setting.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$this-&amp;gt;loadModel;&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Korzystanie z modelu odbywa się na zasadach analogicznych do metody z $uses. Jest to zalecana metoda korzystania z zewnętrznych modeli.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Jeżeli zajdzie konieczność skorzystania z zewnętrznego, niepowiązanego modelu z poziomu jakiegos modelu, z przyczyn oczywistch nie możemy skorzystać z powyższej metody. Informacja dla nieco mniej obeznanych czytelnik&amp;oacute;w, metoda loadModel istnieje w klasie Controller, kt&amp;oacute;ra jest niedostępna z poziomu modelu. Należy zatem skorzystać z ClassRegistry::init w następujący spos&amp;oacute;b&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$setting = ClassRegistry::init;
$results = $setting-&amp;gt;findById;&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Dodam, że nie zdażyła mi się jeszcze koniecznośc załadowania zewnętrznego modelu z poziomu innego modelu. Można oczywiście korzystać z instrukcji ClassRegistry::init z poziomu kontrolera. Należy jednak pamiętać, aby przypisać model do zmiennej, z kt&amp;oacute;rej będzie korzystać.&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;highlight: [2];&quot;&gt;
$setting = ClassRegistry::init;
//$results = $this-&amp;gt;Setting-&amp;gt;findById;
$results = $setting-&amp;gt;findById;&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Zakomentowana linijka nr 2 jest niepoprawna i zwr&amp;oacute;ci błąd. Tyle w temacie dynamicznego ładowania modeli.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sat, 04 Sep 2010 12:33:26 +0200</pubDate></item><item><title>CakePHP: IdeaCache - Internal Server Error 500</title><link>http://www.tomaszmazur.eu/artykul/44-CakePHP-IdeaCache-Internal-Server-Error-500</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/44-CakePHP-IdeaCache-Internal-Server-Error-500</guid><description>&lt;p&gt;
	Artykuł ten jest kontynuacją poprzedniego, dotyczącego błędu w aplikacjach CakePHP na serwerach home.pl. Element, kt&amp;oacute;ry sprawia kłopot na tych serwerach to &lt;strong&gt;IdeaCache&lt;/strong&gt;. Ten i podobne problemy zostały opisane w następujących linkach:&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	1. &lt;a href=&quot;http://cakephp.lighthouseapp.com/projects/42648/tickets/817-class-cakelog-not-found&quot;&gt;http://cakephp.lighthouseapp.com/projects/42648/tickets/817-class-cakelog-not-found&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	2. &lt;a href=&quot;http://cakephp.lighthouseapp.com/projects/42648/tickets/923&quot;&gt;http://cakephp.lighthouseapp.com/projects/42648/tickets/923&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Aby naprawić ten błąd należy zamienić kawałek kodu w pliku &lt;code&gt;/cake/libs/cake_log.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;
	z&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
if ) {
    set_error_handler);
}
&lt;/pre&gt;
&lt;p&gt;
	na&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
if ) {
    $cakeLog =&amp;amp; CakeLog::getInstance;
    set_error_handler);
}
&lt;/pre&gt;
&lt;p&gt;
	Musimy pamiętać o tym, że jest to ingerencja w źr&amp;oacute;dła CakePHP. Przy każdej aktualizacji, będziemy musieli podmieniać wyżej wymieniony fragment kodu. Pomimo tej wady, zdecydowałem się na zastosowanie tego fixa. Jeżeli to nie zadziała, to w wyżej wymienionych linkach są r&amp;oacute;wnież podane inne sposoby naprawy.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Thu, 02 Sep 2010 15:33:20 +0200</pubDate></item><item><title>CakePHP: home.pl - Internal Server Error 500</title><link>http://www.tomaszmazur.eu/artykul/43-CakePHP-home-pl-Internal-Server-Error-500</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/43-CakePHP-home-pl-Internal-Server-Error-500</guid><description>&lt;p&gt;
	&lt;span style=&quot;font-size: 16px;&quot;&gt;UWAGA!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	&lt;span style=&quot;font-size: 16px;&quot;&gt;Artykuł ten jest nieaktualny! Rozwiązanie problemu jest niepoprawne, prawidłowe rozwiązanie znajduje się w artykule: &lt;a class=&quot;title&quot; href=&quot;../../../artykul/44-CakePHP-IdeaCache-Internal-Server-Error-500&quot;&gt;CakePHP: IdeaCache - Internal Server Error 500&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Natknąłem się dzisiaj na błąd podczas przenoszenia serwisu opartego na &lt;strong&gt;CakePHP&lt;/strong&gt; na serwer firmy &lt;strong&gt;home.pl&lt;/strong&gt;. Nigdy nie podobała mi się ta firma, ale do tej pory nie stwarzała mi specjalnych kłopot&amp;oacute;w.&lt;/p&gt;
&lt;p&gt;
	Po wgraniu strony na nowy serwer, ustawilem &lt;code&gt;debug&lt;/code&gt; na wartość 2 celem odswieżenia wewnetrznego cache&amp;#39;a &lt;strong&gt;CakePHP&lt;/strong&gt;. Po pomyślnym otworzeniu strony ustawilem &lt;code&gt;debug&lt;/code&gt; na wartość 0. Po ponownym otwarciu strony wyskoczył mi błąd &lt;strong&gt;Internal Server Error 500&lt;/strong&gt;. Po przeszukaniu internetu, doszedłem do tego, że należy dodać do pliku &lt;code&gt;.htaccess&lt;/code&gt; znajdującego się w nadrzędnym naszej aplikacji, tj. katalog zawierający katalogi &lt;code&gt;app,cake,plugins,vendors&lt;/code&gt;; linię &lt;code&gt;RewriteBase /podkatalog/&lt;/code&gt;. A zatem cały plik będzie wyglądał następująco&lt;/p&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;
&amp;lt;ifmodule mod_rewrite.c=&amp;quot;&amp;quot;&amp;gt;
    RewriteEngine on
    RewriteBase /podkatalog/
    RewriteRule    ^$    webroot/    [L]
    RewriteRule     webroot/$1    [L]
 &amp;lt;/ifmodule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
	Z moich obserwacji wynika, że bez tej linijki &lt;strong&gt;CakePHP&lt;/strong&gt; nie jest w stanie przeładować swoich wewnetrznych cache. Odpalamy naszą aplikację z &lt;code&gt;debug&lt;/code&gt; ustawionym na &lt;code&gt;2&lt;/code&gt;, następnie zmieniamy na &lt;code&gt;0&lt;/code&gt; i wszystko powinno ładnie chodzić. Co ciekawe mogę r&amp;oacute;wnież usunąc dodaną linijkę kodu i wszystko będzie działać jak należy. Można wnioskować, że dodanie tej linijki jest konieczne jedynie dlatego, aby &lt;strong&gt;CakePHP&lt;/strong&gt; m&amp;oacute;gł przeładować wewnętrzne cache. Mam nadzieję, że ktoś z podobnym problemem trafi na ten artykuł.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sun, 29 Aug 2010 21:07:59 +0200</pubDate></item><item><title>Aktualizacja licznika długu publicznego</title><link>http://www.tomaszmazur.eu/artykul/42-Aktualizacja-licznika-dlugu-publicznego</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/42-Aktualizacja-licznika-dlugu-publicznego</guid><description>&lt;p&gt;Kolejna aktualizacja mojego licznika. Dane są obecnie pobierane z okresu 01.03.2009 - 28.02.2010. Aktualizacja spowodowała skok licznika o 2 mld złotych do przodu. Szczegółowe dane można zobaczyć na stronie &lt;a href=&quot;/projekty/dlugpubliczny2&quot;&gt;projektu&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;
&lt;p&gt;Bardzo ważna informacja, wraz z tą aktualizacją naprawiłem licznik dla IE, wcześniej były z tym problemy. Testy poprowadzone przeze mnie wykazały, że licznika chodzi na IE6+.&lt;/p&gt; 
&lt;p&gt;Standardowo informuję: Aby dane licznika się zaktualizowały może być konieczne wyczyszczenie cache, lub po prostu wciśnięcie klawisza F5 na stronie z licznikiem.&lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sat, 28 Aug 2010 20:04:01 +0200</pubDate></item><item><title>CakePHP: Usuwanie rekurencyjne (kaskadowe)</title><link>http://www.tomaszmazur.eu/artykul/41-CakePHP-Usuwanie-rekurencyjne-kaskadowe</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/41-CakePHP-Usuwanie-rekurencyjne-kaskadowe</guid><description>&lt;p&gt;
	Jeżeli chcemy skasować rekord z bazy danych, wraz z wszystkimi powiązaniami rekordami z innych modeli wystarczy ustawić odpowiednie parametry w modelu&lt;/code&gt; na modelu. Nazwijmy to &lt;strong&gt;usuwanie rekurencyjne&lt;/strong&gt;, lub &lt;strong&gt;usuwanie kaskadowe&lt;/strong&gt;. Zał&amp;oacute;żmy, że mamy model &lt;code&gt;User&lt;/code&gt;, kt&amp;oacute;ry posiada powiązanie &lt;code&gt;hasOne&lt;/code&gt; z modelem &lt;code&gt;Account&lt;/code&gt;, &lt;code&gt;hasAndBelongsToMany&lt;/code&gt; z modelem &lt;code&gt;Tag&lt;/code&gt;, oraz powiązanie &lt;code&gt;hasMany&lt;/code&gt; z modelem &lt;code&gt;Photo&lt;/code&gt;. Dodatkowo model &lt;code&gt;Account&lt;/code&gt; posiada powiązanie &lt;code&gt;hasMany&lt;/code&gt; z modelem &lt;code&gt;Information&lt;/code&gt;. Pomijam powiązanie &lt;code&gt;belongsTo&lt;/code&gt;, gdyż nie wyobrażam sobie sytuacji, że chcemy usunąć model z takim powiązaniem. Nasze modele wyglądają następująco.&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
class User extends AppModel {
  var $hasOne = array;
  var $hasMany = array;
  var $hasAndBelongsToMany = array;
}

class Account extends AppModel {
  var $hasMany = array;
}
&lt;/pre&gt;
&lt;p&gt;
	Wywołując w kontrolerze &lt;code&gt;users&lt;/code&gt; &lt;code&gt;$this-&amp;gt;User-&amp;gt;delete;&lt;/code&gt; skasujemy rekord z modelu User oraz wszystkie rekordy z tabeli &lt;code&gt;tags_users&lt;/code&gt;, czyli z tabeli łączącej model User z modelem Tag. Dzieje się tak dlatego, że relacje &lt;strong&gt;HABTM&lt;/strong&gt; są domyślnie zależne od siebie. Co zrobić aby skasować powiązanie rekordy z modeli Account, Photo, Information? Wystarczy określić, że modele są zależne od siebie. Nasze modele wyglądają teraz następująco.&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
class User extends AppModel {
  var $hasOne = array);
  var $hasMany = array);
  var $hasAndBelongsToMany = array;
}

class Account extends AppModel {
  var $hasMany = array);
}
&lt;/pre&gt;
&lt;p&gt;
	Tak określone modele tworzą zależności pomiędzy modelami. Kasując użytkownika kasujemy wszystkie jego zdjecia, konto, oraz informacje należące do konta. Bardzo prosta i przydatna procedura.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Mon, 23 Aug 2010 14:12:52 +0200</pubDate></item><item><title>PHP: zmienne zmiennych - zmienne dynamiczne</title><link>http://www.tomaszmazur.eu/artykul/40-PHP-zmienne-zmiennych-zmienne-dynamiczne</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/40-PHP-zmienne-zmiennych-zmienne-dynamiczne</guid><description>&lt;p&gt;
	Spotkałem się ostatnio z problemem dostępu do zmiennej w PHP, kt&amp;oacute;rej nazwa nie jest znana do chwili uruchomienia skryptu. Rozwiązanie okazuje się banalne. Dla przykładu zał&amp;oacute;żmy że chcemy wyświetlić zmienną o nazwie &lt;code&gt;$nieznana_nazwa&lt;/code&gt;. Należy skorzystać z następującej składni.&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$name = &amp;#39;nieznana_nazwa&amp;#39;;
echo ${$name};&lt;/pre&gt;
&lt;p&gt;
	Jest to r&amp;oacute;wnoznaczne z napisaniem &lt;code&gt;echo $nieznana_nazwa&lt;/code&gt;. Sytuacja kiedy nie znamy nazwy zmiennej nie wydaje się częsta, istnieje prawdopodobnie milion innych sposob&amp;oacute;w aby to obejść, np. skorzystać z tablicy. Ten spos&amp;oacute;b wydaje się ciekawy, dlatego nie chciałbym o nim zapomnieć. ;)&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Mon, 02 Aug 2010 00:19:57 +0200</pubDate></item><item><title>Aktualizacja licznika długu publicznego - dobre wieści</title><link>http://www.tomaszmazur.eu/artykul/39-Aktualizacja-licznika-dlugu-publicznego-dobre-wiesci</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/39-Aktualizacja-licznika-dlugu-publicznego-dobre-wiesci</guid><description>&lt;p&gt;Kolejna aktualizacja mojego licznika. Dane są obecnie pobierane z okresu I.2009 - XII.2009. Wzrost zadłużenia w tym okresie wyniósł 72 228,187 mln zł. Jest to spadek o niemalże połowę w porównaniu do okresu X.2008-IX.2009 w którym wzrost ten wyniósł 121 330,126 mln zł. Stan długu na koniec grudnia 2009 wyniósł 669 992,2 mln zł. Zmiany te zaowocowały spadkiem cyferek na liczniku z 721 mld zł do 688 mld zł. Dodam, że nie do końca wiem dlaczego, ale w źródle ze strony ministerstwa finansów dane te są oznaczone jako wstępne. Będę monitorował tą sytuację i w razie czego dokonam niezwłocznej aktualizacji. W razie wątpliwości odsyłam do &lt;a href=&quot;http://www.mf.gov.pl/dokument.php?const=5&amp;dzial=590&amp;id=70517&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;źródła&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;
&lt;p&gt;Standardowo informuję: Aby dane licznika się zaktualizowały może być konieczne wyczyszczenie cache, lub po prostu wciśnięcie klawisza F5 na stronie z licznikiem.&lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sat, 03 Apr 2010 10:18:23 +0200</pubDate></item><item><title>CakePHP: Linki w array</title><link>http://www.tomaszmazur.eu/artykul/38-CakePHP-Linki-w-array</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/38-CakePHP-Linki-w-array</guid><description>&lt;p&gt;
	Dzisiaj kr&amp;oacute;tki, ale bardzo przydatny wpis dotyczący tworzenia link&amp;oacute;w w &lt;strong&gt;CakePHP&lt;/strong&gt; za pomocą tablic.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
	Na początek przedstawię ideę &lt;strong&gt;link&amp;oacute;w w array&lt;/strong&gt;. W szablonach strony możemy tworzyć odnośniki w zwyczajny spos&amp;oacute;b, ale korzystanie z tablic niesie za sobą liczne korzyści, w szczeg&amp;oacute;lności jeśli chcemy korzystać z funkcjonalności &lt;a href=&quot;/artykul/37-CakePHP-Przyjazne-linki&quot;&gt;&lt;strong&gt;reverse routing&lt;/strong&gt;&lt;/a&gt;. Pozwala to na łatwe, szybkie i sprawne operowanie linkami. Nie musimy się martwić &amp;quot;treścią&amp;quot; linku, a jedynie kontrolerem/akcją jaką mamy obsłużyć, oraz danymi jakie chcemy przekazać.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
	W og&amp;oacute;le struktura link&amp;oacute;w wygląda następująco:&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
&amp;lt;?php echo $html-&amp;gt;link,
    array,
    &amp;quot;Komunikat pytający czy chcieliśmy kliknąć w link?&amp;quot;
);?&amp;gt;&lt;/pre&gt;
&lt;p&gt;
	Wymagane są oczywiście tylko pierwsze dwa parametry. Pierwszy parametr to treść linku, tekst kt&amp;oacute;ry widzi użytkownik. Parametr nr 2 to jest &amp;quot;Nasz&amp;quot; array, zawiera on informacje najistotniejsze czyli nazwę kontrolera oraz akcję do kt&amp;oacute;rej kieruje link. Możemy r&amp;oacute;wnież podać id kt&amp;oacute;re &lt;strong&gt;CakePHP&lt;/strong&gt; przekazuje do akcji. Aby zobaczyć korzyści płynące z tego rozwiązania ponownie odsyłam do &lt;a href=&quot;/artykul/37-CakePHP-Przyjazne-linki&quot;&gt;wpisu o przyjaznych linkach&lt;/a&gt;. Parametr nr 3 to atrybuty html, np. &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;id&lt;/code&gt;. Parametr nr 4 to javascript&amp;#39;owy komunikat pytający czy aby na pewno chcieliśmy kliknąć w link. M&amp;oacute;wiąc fachowo ostatni parametr dodaje do linku &lt;code&gt;onclick=&amp;quot;confirm;&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
	W celu zgłębienia wiedzy odsyłam do:&lt;br /&gt;
	1. &lt;a href=&quot;http://book.cakephp.org/view/206/Inserting-Well-Formatted-elements#link-836&quot;&gt;Cookbook&lt;/a&gt;&lt;br /&gt;
	2. &lt;a href=&quot;http://api13.cakephp.org/class/html-helper#method-HtmlHelperlink&quot;&gt;API 1.3&lt;/a&gt;&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sat, 27 Mar 2010 14:07:33 +0100</pubDate></item><item><title>CakePHP: Przyjazne linki</title><link>http://www.tomaszmazur.eu/artykul/37-CakePHP-Przyjazne-linki</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/37-CakePHP-Przyjazne-linki</guid><description>&lt;p&gt;
	Tak jak obiecywałem, postanowiłem napisać małą serię artykuł&amp;oacute;w o &lt;strong&gt;CakePHP&lt;/strong&gt;, w wersji 1.3, chociaż znaczna większość ma identyczne zastosowanie w wersji 1.2. Zacznę od wyjaśnienia się co to są przyjazne linki, znane szerzej jako &lt;span class=&quot;i&quot;&gt;Search Engine Friendly URLs&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;
	Przyjazne linkowanie służy gł&amp;oacute;wnie do lepszego indeksowania naszej strony przez wyszukiwarki internetowe, np. Google. Efekt uboczny to taki, że linki lepiej oddają swoją treść. Najlepiej pokazać to na przykładzie.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
	Tutaj mała dygresja, w każdym z artykuł&amp;oacute;w zakładam, że Czytelnik jest zapoznany z podstawami &lt;strong&gt;CakePHP&lt;/strong&gt;, jeżeli tak nie jest to odsyłam do najlepszego źr&amp;oacute;dła: &lt;a href=&quot;http://book.cakephp.org/&quot; target=&quot;_blank&quot;&gt;CakePHP Cookbook&lt;/a&gt;. Dodatkowo, trzymam się konwencji angielskiego nazewnictwa.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
	Zał&amp;oacute;żmy, że mamy kontroler &lt;span class=&quot;i&quot;&gt;Posts&lt;/span&gt;, i model &lt;span class=&quot;i&quot;&gt;Post&lt;/span&gt;, kt&amp;oacute;ry jest oczywiście postem, bądź w moim przypadku artykułem. Nie pytajcie dlaczego nie nazwałem tego Article. ;) Chcąc stworzyć link do konkretnego artykułu, w kontrolerze tworzymy metodę &lt;span class=&quot;i&quot;&gt;view&lt;/span&gt;. Zapełniamy ją dość oczywistym kodem:&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$this-&amp;gt;Post-&amp;gt;id = $id;
$post = $this-&amp;gt;Post-&amp;gt;find;
$this-&amp;gt;set;&lt;/pre&gt;
&lt;p&gt;
	Stosujemy &lt;span class=&quot;i&quot;&gt;find&lt;/span&gt;, zamiast &lt;span class=&quot;i&quot;&gt;read&lt;/span&gt;, gdyż nie ma potrzeby zapełniać kontroler danymi. Teraz możemy utworzyć widok naszego artykułu, dla naszego przykładu wystarczy najprostszy z możliwych:&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
&amp;lt;?php echo $post[&amp;#39;Post&amp;#39;][&amp;#39;body&amp;#39;]; ?&amp;gt;&lt;/pre&gt;
&lt;p&gt;
	Teraz możemy się odwołać do Naszego artykułu poprzez link: &lt;code&gt;http://localhost/posts/view/1&lt;/code&gt;. Oczywiście jest to link, kt&amp;oacute;ry kompletnie nic nie m&amp;oacute;wi użytkownikowi o treści jakiej prezentuje, oraz nie jest przyjazny dla wyszukiwarek. W moim przypadku chciałem osiągnąć następującą postać linku: &lt;code&gt;http://localhost/artykul/id_artykulu-tytul_artykulu&lt;/code&gt;. Aby to osiągnąć musimy skorzystać z &lt;span class=&quot;i&quot;&gt;router&amp;#39;a&lt;/span&gt; CakePHP.&lt;/p&gt;
&lt;p&gt;
	Otwieramy plik &lt;code&gt;/app/config/routes.php&lt;/code&gt;. W tym pliku będzie się dziać cała magia. Robiąc to krok po kroku, najpierw chcemy uzyskać postać &lt;code&gt;http://localhost/artykul/id&lt;/code&gt;. Osiągamy to poprzez dodanie następującego kodu:&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
Router::connect,
        array,
            &amp;#39;id&amp;#39; =&amp;gt; &amp;#39;[0-9]+&amp;#39;
        )
);&lt;/pre&gt;
&lt;p&gt;
	Zakładamy tutaj, że pole &lt;span class=&quot;i&quot;&gt;id&lt;/span&gt; przyjmuje wartości numeryczne. Chcąc uzyskać postać końcową zamieniamy ten fragment kodu na następujący:&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
Router::connect,
        array,
            &amp;#39;id&amp;#39; =&amp;gt; &amp;#39;[0-9]+&amp;#39;,
            &amp;#39;slug&amp;#39;=&amp;gt;&amp;#39;.+&amp;#39;
        )
);&lt;/pre&gt;
&lt;br /&gt;
&lt;p&gt;
	Teraz pojawia się pytanie, jak z poziomu &lt;strong&gt;CakePHP&lt;/strong&gt; uzyskać następujące linki. W widoku w kt&amp;oacute;rym chcemy wyświetlić link piszemy:&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
&amp;lt;?php echo $html-&amp;gt;link
); ?&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;p&gt;
	Część z Was może się spytać co to jest to tajemnicze &lt;code&gt;$slug&lt;/code&gt;. Jest to kr&amp;oacute;tki ciąg znak&amp;oacute;w, najlepiej oddający treść linka. Nie może zawierać spacji, ani znak&amp;oacute;w specjalnych; zamieniamy je najlepiej na myślnik. Dodatkowo &lt;strong&gt;slug&lt;/strong&gt; jest zoptymalizownay pod względem &lt;strong&gt;SEO&lt;/strong&gt;. W Naszym przypadku najlepszym kandydatem na &lt;strong&gt;slug&lt;/strong&gt;&amp;#39;a będzie tytuł artykułu. Musimy go jednak odpowiednio obrobić. Na szczęście &lt;strong&gt;CakePHP&lt;/strong&gt; posiada do tego odpowiednie narzędzie.&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;
	Posługujemy się metodą &lt;code&gt;Inflector::slug;&lt;/code&gt;. Pierwszy argument to ciąg znak&amp;oacute;w do &amp;#39;oczyszczenia&amp;#39;, a kolejny to znak, na jaki zamieniamy znaki niedozwolone. Wynikiem będzie &lt;code&gt;tytuł-pierwszego-artykułu&lt;/code&gt;. Nie jest to do końca poprawne, nie możemy posługiwać się znakami specjalnymi w adresie, jest to niezgodne z formatem URI. Niestety na dzień dzisiejszy &lt;strong&gt;CakePHP&lt;/strong&gt; w wersji 1.3 nie zamienia znak&amp;oacute;w diaktrycznych na ich łacińskie odpowiedniki. Aby dodać taką funkcję, możemy stworzyć własną funkcję do tego celu, bądź też dokonać zmiany w pliku &lt;code&gt;/cake/libs/inflector.php&lt;/code&gt;. Zmiany dokonujemy w metodzie &lt;code&gt;slug&lt;/code&gt;, zamieniając wartość zmiennej &lt;code&gt;$default&lt;/code&gt; na:&lt;/p&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;
$default = array =&amp;gt; &amp;#39;&amp;#39;,
);&lt;/pre&gt;
&lt;p&gt;
	Spowoduje to poprawne tworzenie &lt;strong&gt;slug&lt;/strong&gt;&amp;oacute;w z polskimi znakami. Musimy jednak pamiętać o dokonywanie takiej modyfikacji przy każdej aktualizacji &lt;strong&gt;CakePHP&lt;/strong&gt;. Liczę na to, że w przyszłych wersjach ta funkcjonalność będzie w oficjalnych źr&amp;oacute;dłach. Odpowiedni ticket został już złożony. ;) Pozdrawiam i mam nadziję, że się przyda.&lt;/p&gt;
</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Tue, 23 Feb 2010 22:20:09 +0100</pubDate></item><item><title>Podsumowanie licznika długu publicznego</title><link>http://www.tomaszmazur.eu/artykul/36-Podsumowanie-licznika-dlugu-publicznego</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/36-Podsumowanie-licznika-dlugu-publicznego</guid><description>&lt;p&gt;W przeciągu 5 miesięcy istnienia licznika długów zyskał on znaczny rozgłos. Wartość licznika również dokonała sporego wzrostu. ;)&lt;/p&gt;&lt;br/&gt;
&lt;p&gt;Poniżej zamieszam listę stron, z których systematycznie odnotowuje  wejścia na moją stronę. Być może w przyszłości należałoby pomyśleć nad jakąś stałą, bardziej widoczną listą?&lt;/p&gt;&lt;br/&gt;
&lt;p&gt;Kolejność alfabetyczna: &lt;br/&gt;&lt;br/&gt;http://aaugustow.blogspot.com/&lt;br/&gt;
http://www.adamduda.pl/&lt;br/&gt;
http://adamkrukowski.com/&lt;br/&gt;
http://www.czuma.pl/posel/&lt;br/&gt;
http://kuczynski.blogbank.pl/&lt;br/&gt;
http://panmusk.blogspot.com/&lt;br/&gt;
http://partiawip.pl/&lt;br/&gt;
http://piechula.jogger.pl/&lt;br/&gt;
http://slomski.us/&lt;br/&gt;
http://www.zegardlugu.pl/&lt;br/&gt;
http://zezorro.blogspot.com/&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;

PS. Przepraszam, że nie są to linki, ale boję się Wujka Google. ;)&lt;/p&gt;
&lt;p&gt;Jeżeli ktoś chciałby zostać dopisany/wypisany z powyższej listy to proszę o kontakt.&lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sun, 21 Feb 2010 19:33:45 +0100</pubDate></item><item><title>Zmiana w systemie komentarzy</title><link>http://www.tomaszmazur.eu/artykul/35-Zmiana-w-systemie-komentarzy</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/35-Zmiana-w-systemie-komentarzy</guid><description>&lt;p&gt;Dokonałem małej zmiany w systemie komentarzy. Od dzisiaj komentarze są weryfikowane po stronie serwera, a nie po stronie klienta jak to miało wcześniej miejsce. Weryfikacja jest przeprowadzana przez silnik &lt;strong&gt;CakePHP&lt;/strong&gt;, w przypadku nie powodzenia weryfikacji zwracamy obiekt &lt;strong&gt;JSON&lt;/strong&gt; z treścią błędów. Jeżeli weryfikacja przebiegła pomyślnie, zwracam treść komentarza, który jest dynamicznie dołączany do strony. Rozwiązanie z pewnością lepsze, zajmuje mniej miejsca w kodzie, umożliwia lepsze rozpoznanie błędów.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Jeżeli nic mi nie przeszkodzi to następny artykuł będzie właśnie na ten temat. :)&lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Thu, 11 Feb 2010 00:57:14 +0100</pubDate></item><item><title>Aktualizacja licznika długu publicznego</title><link>http://www.tomaszmazur.eu/artykul/34-Aktualizacja-licznika-dlugu-publicznego</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/34-Aktualizacja-licznika-dlugu-publicznego</guid><description>&lt;p&gt;Dokonałem aktualizacji licznika długu publicznego. Początkowo miałem zamiar dokonać aktualizacji jedynie licznika długu w wersji drugiej, jednak zauważyłem, że znaczna liczba stron korzysta z starszej wersji licznika. Postanowiłem więc uaktualnić obie wersje.&lt;/p&gt;&lt;br/&gt;&lt;p&gt; Obliczenia prowadzę na podstawie okresu X.2008-IX.2009. Tak jak przewidywałem, dług dokonał przeskoku o prawie 3 mld zł do przodu! Wartość przyrostu w skali rocznej wzrosła z 106 572,61 mln zł do 121 330,126 mln zł. Jest to przyrost o 14 757,516 mln zł, lub o prawie 14%. W skrócie mówiąc tempo wzrostu Naszego długu wzrosło o 14%! Informacja jak dla mnie szokująca. Z niecierpliwością czekam na zamieszczenie danych z ostatniego kwartału roku 2009.&lt;/p&gt;&lt;br/&gt;
&lt;p&gt;W najbliższym czasie planuję zamieścić listę stron, które korzystają z licznika. Nie wiem jeszcze w jakiej formie tego dokonam, chętnie wysłucham propozycji.&lt;/p&gt;&lt;br/&gt;
&lt;p&gt;PS. Aby licznik się może być konieczne wyczyszczenie cache, lub po prostu wciśnięcie klawisza F5 na stronie z licznikiem.&lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Tue, 09 Feb 2010 12:39:13 +0100</pubDate></item><item><title>Strona w nowej odsłonie</title><link>http://www.tomaszmazur.eu/artykul/33-Strona-w-nowej-odslonie</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/33-Strona-w-nowej-odslonie</guid><description>&lt;p&gt;Chociaż może na pierwszy rzut oka tego nie widać, to strona przeszła znaczną modyfikację. Obecnie oparta jest na &lt;strong&gt;frameworku CakePHP&lt;/strong&gt; w wersji 1.3 beta. Wcześniej była napisana w czystym &lt;strong&gt;PHP&lt;/strong&gt;. Zdecydowałem się na taką zmianę głównie dlatego, żeby lepiej poznać &lt;strong&gt;CakePHP&lt;/strong&gt;. Do funkcji serwis dodałem możliwość komentowania projektów.&lt;/p&gt;&lt;p&gt;Jutro dokonam aktualizacji licznika długów. Wygląda na to, że licznik dokona nieznacznego skoku do przodu, ale o tym dokłądnie już jutro. W najbliższym czasie planuję napisać co nie co o tym co mnie spotkało w trakcie przepisywania serwisu pod nowy engine. Jeżeli się w końcu zmotywuję to uzupełnię działy CV i portfolio. W  dalszej przyszłości planuję kolejne udogodnienia na stronie. &lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Mon, 08 Feb 2010 23:19:51 +0100</pubDate></item><item><title>Idą zmiany</title><link>http://www.tomaszmazur.eu/artykul/31-Ida-zmiany</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/31-Ida-zmiany</guid><description>&lt;p&gt;Kolejny post niestety informacyjny. Wkrótce strona pojawi się w nowej odsłonie. Design pozostaje ten sam. Nowy silnik będzie oparty na &lt;strong&gt;CakePHP&lt;/strong&gt;. Towarzyszyć temu będzie dodanie kilku nowych funkcji i usprawnień. Szczegóły zostawiam jako niespodziankę. &lt;/p&gt;
&lt;p&gt;Pomimo tego, że silnik strony jest już praktycznie ukończony, trzeba będzie na niego jeszcze trochę poczekać. Jest to związane z niezwykle przykrym wydarzeniem w roku jakim jest sesja. ;)&lt;/p&gt;
&lt;p&gt;Przechodząc do przyszłości, czyli po wprowadzaniu nowego silnika; wydam cykl artykułów odnośnie &lt;strong&gt;CakePHP&lt;/strong&gt;. Planuję opisać jego wady i zalety, trudności i ułatwienia jakie napotkałem przy tworzeniu swojej pierwszej aplikacji opartej na tym &lt;strong&gt;frameworku&lt;/strong&gt;. Zdradzę jedynie tyle, że jestem wciąż zachwycany możliwościami tego młodego &lt;strong&gt;frameworku&lt;/strong&gt;. Polecam każdemu zapoznać się na początek z &lt;strong&gt;wzorcem MVC&lt;/strong&gt;. Odsyłam do wiki i google.&lt;/p&gt;
&lt;p&gt;PS. Istnieje polska nazwa na &#039;framework&#039;?&lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Thu, 21 Jan 2010 18:15:44 +0100</pubDate></item><item><title>Zaległe informacje...</title><link>http://www.tomaszmazur.eu/artykul/30-Zalegle-informacje</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/30-Zalegle-informacje</guid><description>&lt;p&gt;Trochę narobiłem sobie zaległości... Nie tylko na stronie. Obiecuję się poprawić ;) &lt;/p&gt;
&lt;p&gt;Od czasu ostatniego wpisu otrzymałem wiele propozycji współpracy. Jedne mniej, drugie bardziej ciekawe. Bardzo mnie to cieszy. Zagłębiałem również systematycznie swoją wiedzę na temat &lt;strong&gt;PHP&lt;/strong&gt;. Poznałem ideę &lt;strong&gt;wzorca MVC&lt;/strong&gt;, oraz &lt;strong&gt;framework CakePHP&lt;/strong&gt;. Jego prostota i ogromne możliwości dają mi dużą nadzieję. Zastanawiam się nad przepisaniem strony pod ten framework. Ze strony praktycznej nie ma to większego sensu, aczkolwiek ciekawi mnie jak sprawuje się serwis postawiony na takim frameworku.&lt;/p&gt;
&lt;p&gt;Co do samej strony. W najbliższym czasie można się spodziewać artykułu na temat &lt;strong&gt;CakePHP&lt;/strong&gt;. Jeszcze nie zdecydowałem się na jaki temat, także jeśli ktoś ma jakieś propozycje to proszę pisać w komentarzach, a być może napiszę o tym artykuł. Można również liczyć na aktualizację portfolio. Zobaczę również, czy można w jakiś sposób usprawnić licznik długów. &lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Sat, 05 Dec 2009 12:50:48 +0100</pubDate></item><item><title>Szukam zleceń</title><link>http://www.tomaszmazur.eu/artykul/29-Szukam-zlecen</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/29-Szukam-zlecen</guid><description>&lt;p&gt;Wpis nietypowy, bo dotyczyć będzie pracy. ;) W związku z pewnymi kłopotami w obecnej pracy chciałbym zwrócić się do Czytelników strony o pomoc. W tym miejscu chciałbym zwrócić uwagę na to, że nie mam żadnego wpływu na te &quot;kłopoty&quot;.&lt;/p&gt;
&lt;p&gt;Jeżeli sami potrzebujecie, lub macie znajomych, którzy poszukują osoby do zrobienia strony internetowej proszę o kontakt. Zapewniam, że cena nie będzie wygórowana równocześnie zwracając uwagę na to, że nie interesują mnie oferty &quot;tydzień pracy za 50zł&quot;. Chętnie podejmę małe prace typu kilka poprawek na stronie, a także tworzenia stron od podstaw.&lt;/p&gt;
&lt;p&gt;Zapraszam do &lt;a href=&quot;/cv&quot;&gt;działu CV&lt;/a&gt;, gdzie można ściągnąć moje CV. Liczę na pozytywną reakcję Czytelników.&lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Mon, 12 Oct 2009 18:04:14 +0200</pubDate></item><item><title>Menu z opisem</title><link>http://www.tomaszmazur.eu/artykul/28-Menu-z-opisem</link><guid isPermaLink="true">http://www.tomaszmazur.eu/artykul/28-Menu-z-opisem</guid><description>&lt;p&gt;Dodałem nowy projekt, który od jakiegoś czasu czekał na wrzucenie. Jest to proste menu z podświetlaniem i opisem, po najechaniu na pozycje. Zapraszam do testowania i komentowania. Link do &lt;a href=&quot;/projekty/menu&quot;&gt;Menu z opisem&lt;/a&gt;.&lt;/p&gt;</description><dc:creator>Tomasz Mazur</dc:creator><pubDate>Wed, 07 Oct 2009 22:05:04 +0200</pubDate></item></channel></rss><!-- 0.1058s -->
