<?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>webbricks &#187; CakePHP 1.2</title>
	<atom:link href="http://blog.grzegorzpawlik.com/tag/cakephp-12/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.grzegorzpawlik.com</link>
	<description>Doświadczenie, to coś, co zdobywamy tuż po chwili w której było nam potrzebne ...</description>
	<lastBuildDate>Tue, 07 Feb 2012 10:09:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Skróć swoje listingi</title>
		<link>http://blog.grzegorzpawlik.com/2010/02/skroc-swoje-listingi/</link>
		<comments>http://blog.grzegorzpawlik.com/2010/02/skroc-swoje-listingi/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 17:00:48 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Inne]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[CakePHP 1.2]]></category>
		<category><![CDATA[DRY]]></category>
		<category><![CDATA[element]]></category>

		<guid isPermaLink="false">http://blog.grzegorzpawlik.com/?p=615</guid>
		<description><![CDATA[Pewnie w niemal każdym swoim widoku index.ctp masz fragment kodu podobny do tego: &#60;?php $i = 0; foreach ($tracks as $track): $class = null; if ($i++ % 2 == 0) { $class = ' class="altrow"'; } ?&#62; &#60;tr&#60;?php echo $class;?&#62;&#62; &#8230; <a href="http://blog.grzegorzpawlik.com/2010/02/skroc-swoje-listingi/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Pewnie w niemal każdym swoim widoku index.ctp masz fragment kodu podobny do tego:</p>
<pre name="code" class="php">
&lt;?php
$i = 0;
foreach ($tracks as $track):
	$class = null;
	if ($i++ % 2 == 0) {
		$class = ' class="altrow"';
	}
?&gt;
	&lt;tr&lt;?php echo $class;?&gt;&gt;
		&lt;td&gt;
			&lt;?php echo $track['Track']['id']; ?&gt;
		&lt;/td&gt;
		&lt;td&gt;
			&lt;?php echo $track['Track']['name']; ?&gt;
		&lt;/td&gt;
		&lt;td&gt;
			&lt;?php echo $track['Car']['name']; ?&gt;
		&lt;/td&gt;
		&lt;td&gt;
			&lt;?php echo $track['Track']['begin']; ?&gt;
		&lt;/td&gt;
		&lt;td&gt;
			&lt;?php echo $track['Track']['end']; ?&gt;
		&lt;/td&gt;
		&lt;td&gt;
			&lt;?php echo $track['Track']['length']; ?&gt;
		&lt;/td&gt;
		&lt;td class="actions"&gt;
			&lt;?php echo $html-&gt;link(
			   __('Edycja', true),
			   array(
			      'action' =&gt; 'edit',
			      $track['Track']['id'] ,
			      $track['Car']['id']
			   )
			  );
			?&gt;

		&lt;/td&gt;
	&lt;/tr&gt;
&lt;?php endforeach; ?&gt;
&lt;/table&gt;
</pre>
<p>Chce Ci się pisać ten kod kilkadziesiąt razy w jednym projekcie? Mnie też nie. Dlatego napisałem prosty element, który to trochę automatyzuje (nazwałem go &#8220;list&#8221;):</p>
<pre name="code" class="php">
// app/views/elements/list.ctp
&lt;?php
   $i = 0;
   foreach($elements as $key =&gt; $element):
   $class = null;
   if ($i++ % 2 == 0) {
      $class = ' class="altrow"';
   }
?&gt;
   &lt;tr &lt;?php echo $class?&gt;&gt;
      &lt;?php foreach($fields as $path): ?&gt;
         &lt;td&gt;
            &lt;?php echo Set::classicExtract($element, $path) ?&gt;
         &lt;/td&gt;
      &lt;?php endforeach; ?&gt;
         &lt;?php if(isset($links)): ?&gt;
            &lt;td&gt;
               &lt;?php foreach($links as $name =&gt; $url): ?&gt;
                  &lt;?php
                     if(!is_array($url["params"])) {
                        $url["params"] = array($url["params"]);
                     }
                     foreach($url["params"] as $key =&gt; $path){
                        $url[$key] = Set::classicExtract(
                           $element,
                           $path
                        );
                     }
                     unset($url["params"]);
                  ?&gt;
                  &lt;?php echo $html-&gt;link($name, $url)?&gt;
               &lt;?php endforeach; ?&gt;
            &lt;/td&gt;
         &lt;?php endif; ?&gt;
   &lt;/tr&gt;
&lt;?php endforeach; ?&gt;
</pre>
<p>Jego użycie jest dość proste. Dla przykładu wygenerujemy ten sam &#8220;output&#8221; dla pierwszego listingu z tego postu:</p>
<pre name="code" class="php">
echo $this->renderElement(
         "list",
         array(
            "elements" => $tracks,
            "fields" => array(
               "Track.name", "Car.name", "Track.begin",
               "Track.end", "Track.length"
            ),
            "links"=> array(
               "edycja" => array(
                  "controller"=> "tracks", "action"=> "edit",
                  "params" => array(
                     "Track.id", "Car.id"
                  )
               )
            )
         )
      )
</pre>
<p>Opiszę poszczególne parametry przekazywane do tego elementu:</p>
<ul>
<li>&#8220;elements&#8221; &#8211; kolekcja (w tym wypadku tablica) elementów zwrócona na przykład przez $this->Track->find(&#8220;all&#8221;)</li>
<li>&#8220;fields&#8221; &#8211; pola, które mają się pojawić w komórkach tabeli</li>
<li>&#8220;links&#8221; &#8211; tu definiujemy jakie linki mają się pojawić w ostatniej kolumnie (zazwyczaj tam znajdują się &#8220;opcje&#8221;). Indeksy kolejnych elementów to nazwy linków (tutaj &#8220;edycja&#8221;).
<ul>
<li>&#8220;controller&#8221; i &#8220;action&#8221; są identycznie używane jak w metodzie <a href="http://api12.cakephp.org/class/html-helper#method-HtmlHelperlink">HtmlHelper::link()</a></li>
<li>&#8220;params&#8221; jest dość ciekawy. Jeśli chcemy w wygenerowanym linku mieć jeden parametr (najczęściej id), robimy to tak:
<pre name="code" class="php">
            "edycja" => array(
               "controller"=> "cars", "action"=> "edit", "params"=>"Car.id"
            ),
</pre>
<p>gdy parametrów ma być więcej &#8211; ścieżki do nich przekazujemy w tablicy (tak jak w przykładzie):</p>
<pre name="code" class="php">
                "edycja" => array(
                   "controller"=> "tracks", "action"=> "edit",
                   "params" => array(
                      "Track.id", "Car.id"
                   )
                )
</pre>
<p>Można także używać parametrów typu <a href="http://book.cakephp.org/pl/view/541/Named-parameters">&#8220;named&#8221;</a>, wystarczy podać dodatkowo indeksy:</p>
<pre name="code" class="php">
                "edycja" => array(
                   "controller"=> "tracks", "action"=> "edit",
                   "params" => array(
                     "parametr_1"=> "Track.id", "parametr_2"=> "Car.id"
                   )
                )
</pre>
</li>
</ul>
</ul>
<p>Zachęcam do korzystania z tego elementu i zgłaszania wszelkich niedociągnięć :)</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2010/02/skroc-swoje-listingi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zarządzanie wersjami STRUKTURY bazy danych w cakePHP 1.2</title>
		<link>http://blog.grzegorzpawlik.com/2009/03/zarzadzanie-wersjami-struktury-bazy-danych-w-cakephp-12/</link>
		<comments>http://blog.grzegorzpawlik.com/2009/03/zarzadzanie-wersjami-struktury-bazy-danych-w-cakephp-12/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 14:39:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP 1.2]]></category>
		<category><![CDATA[DRY]]></category>
		<category><![CDATA[zarządzanie projektem]]></category>

		<guid isPermaLink="false">http://meta.vipserv.org/blog.grzegorzpawlik.com/?p=62</guid>
		<description><![CDATA[W poprzednich postach (m.in. zarządzanie wersjami oprogramowania) udało mi się nakreślić problem przy zarządzaniu oprogramowaniem pojawiający się na styku kod-baza danych. Nawet mogę powiedzieć, że mały sukces na tym polu odnotowałem przy pomocy&#160;ImageBehavior, jednak jeśli chodzi o strukturę &#8211; ciągle &#8230; <a href="http://blog.grzegorzpawlik.com/2009/03/zarzadzanie-wersjami-struktury-bazy-danych-w-cakephp-12/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>W poprzednich postach (m.in. <a href="http://webbricks.blogspot.com/2008/12/zarzdzanie-wersjami-oprogramowania.html">zarządzanie wersjami oprogramowania</a>) udało mi się nakreślić problem przy zarządzaniu oprogramowaniem pojawiający się na styku kod-baza danych. Nawet mogę powiedzieć, że mały sukces na tym polu odnotowałem przy pomocy&nbsp;<a href="http://webbricks.blogspot.com/2009/03/imagebehavior-uploaduj-pliki-prosto-do.html">ImageBehavior</a>, jednak jeśli chodzi o strukturę &#8211; ciągle zmagałem się do tej pory z przeciwnościami.</p>
<p>Jednak okazuje się, że cake w nowym wydaniu wychodzi nam na przeciw razem z klasą Schema, oraz z narzędziem konsolowym ./cake schema &#8230; po krótce opowiem o co chodzi.</p>
<p>Zabawę z tym narzędziem najlepiej zacząć mając już jakiś zalążek aplikacji (tabele + modele). Jeśli sprawiamy ten podstawowy warunek możemy wpisać w konsoli ./cake schema generate &#8230; ot tak, dla jaj.</p>
<p>Następnie możemy się w katalogu app/config/sql/ namierzyć plik schema.php. To właśnie artefakt wygenerowany przez nas przed sekundą. Można w celach samorozwojowych zajrzeć do środka&#8230;</p>
<p>Jednak ciekawe rzeczy dzieją się, kiedy ponownie wywołamy to samo polecenie: otóż cake rezolutnie zauważy, że plik schema.php już istnieje i zapyta nas co dalej. Polecam wybór opcji [S]napshot i ponowny rzut oka do wspomnianego wyżej katalogu. Co widzimy? Dokładnie! Nowy plik o nazwie schema_2.php :D Zachęcam do zapoznania się z helpem (./cake schema help).</p>
<p>Wystarczy, że teraz przekonam zespół, aby w sytuacji, gdy nastąpiły zmiany w bazie, przed commitem wywołali to polecenie. Jest jeden problem, którego ewentualnie można się spodziewać &#8211; sporadycznych konfliktów. To znaczy sytuacji, w której dwóch programistów:</p>
<ol>
<li> ściąga repozytorium,&nbsp;</li>
<li>dokonuje (nawet różnych) zmian w bazie,&nbsp;</li>
<li>zatwierdza dane:&nbsp;</li>
<ol>
<li>schema generate,&nbsp;</li>
<li>svn add schema_X.php,&nbsp;</li>
<li>svn commit</li>
</ol>
</ol>
<p>Problem w tym, że w takiej sytuacji w punkcie 3.3 jeden z nich dostanie informację</p>
<blockquote><p>Nie mogę dodać schema_X.php do repozytorium, gdyż takowy&nbsp; już w repozytorium istnieje.<br />
Z poważaniem Twój<br />
SVN</p></blockquote>
<p>Nie jest to jakaś wielka tragedia, jak przy każdym konflikcie trzeba będzie go rozwiązać (w tym wypadku przy spotkaniu tych dwóch programistów). Jednak myślę, że takie sytuacje można by zlikwidować wywołując tą sekwencję w jednym ciągu (nie np. commit po dwóch godzinach od schema generate), może nawet napisać prosty skrypt, który załatwi to za nas (taki svncommitwithcakeschemagenerate.sh ;))</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2009/03/zarzadzanie-wersjami-struktury-bazy-danych-w-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakeTestSuite i pokrycie kodu (code coverage)</title>
		<link>http://blog.grzegorzpawlik.com/2009/03/caketestsuite-i-pokrycie-kodu-code-coverage/</link>
		<comments>http://blog.grzegorzpawlik.com/2009/03/caketestsuite-i-pokrycie-kodu-code-coverage/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 12:47:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP 1.2]]></category>
		<category><![CDATA[CakeTestSuite]]></category>

		<guid isPermaLink="false">http://meta.vipserv.org/blog.grzegorzpawlik.com/?p=59</guid>
		<description><![CDATA[Nareszcie działa ;) Okazuje się, że zmuszenie powyższego do poprawnego działania za pomocą dostępnych oficjalnych opisów nie jest takie proste. Np. metoda podana pod http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite dla testu modelu się nie sprawdza. Okazuje się, że tam jest podany stary model tworzenia &#8230; <a href="http://blog.grzegorzpawlik.com/2009/03/caketestsuite-i-pokrycie-kodu-code-coverage/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nareszcie działa ;) Okazuje się, że zmuszenie powyższego do poprawnego działania za pomocą dostępnych oficjalnych opisów nie jest takie proste.</p>
<p>Np. metoda podana pod <a href="http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite">http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite</a> dla testu modelu się nie sprawdza. Okazuje się, że tam jest podany stary model tworzenia testów. Poprawna klasa powinna wyglądać mniej więcej tak:</p>
<p><code lang="php"><br />
App::import('model', 'Article');<br />
class ArticleTestCase extends CakeTestCase {<br />
   var $fixtures = array( 'app.article' );</p>
<p>   function start() {<br />
      parent::start();<br />
      $this->Article= &#038; ClassRegistry::init('article');<br />
   }</p>
<p>   function testPublished() {<br />
      $result = $this->Article->published(array('id', 'title'));<br />
      $expected = array(<br />
      array('Article' => array( 'id' => 1, 'title' => 'First Article' )),<br />
      array('Article' => array( 'id' => 2, 'title' => 'Second Article' )),<br />
      array('Article' => array( 'id' => 3, 'title' => 'Third Article' ))<br />
   );<br />
      $this->assertEqual($result, $expected);<br />
   }<br />
}<br />
</code><br />
zamiast podanej:<br />
<code lang="php"><br />
loadModel('Article');<br />
class ArticleTest extends Article {<br />
 var $name = 'ArticleTest';<br />
 var $useDbConfig = 'test_suite';<br />
}<br />
class ArticleTestCase extends CakeTestCase {<br />
 var $fixtures = array( 'article_test' );<br />
 function testPublished() {<br />
  $this->ArticleTest =&#038; new ArticleTest();<br />
  $result = $this->ArticleTest->published(array('id', 'title'));<br />
  $expected = array(<br />
   array('ArticleTest' => array( 'id' => 1, 'title' => 'First Article' )),<br />
   array('ArticleTest' => array( 'id' => 2, 'title' => 'Second Article' )),<br />
   array('ArticleTest' => array( 'id' => 3, 'title' => 'Third Article' ))<br />
  );<br />
  $this->assertEqual($result, $expected);<br />
 }<br />
}<br />
</code></p>
<p>Drugi przypadek generuje następujące problemy:</p>
<ol>
<li>Gdy testy masz ustawione tak, żeby korzystały z tej samej bazy, gdzie masz &#8220;normalne&#8221; tabele, to testy na zmianę będą wykonywać się poprawnie i zgłaszać błąd z nieistniejącą tabelą (`articles_test`)</li>
<li>Gdy masz osobną baze do testów &#8211; będą się sypać relacje. Pewnie zdefiniowanie wszystkich fixtures powiązanych z testowanym modelem rozwiązało by problem, ale nie sprawdzałem.</li>
</ol>
<p>Kolejnym przypadkiem jest zmuszenie CakeTestSuite do wywalenia informacji o procentowym pokryciu kodu testami. Pominę problemy przy instalacji xdebug, założę, że już to masz za sobą.</p>
<p>Prawdopodobnie będziesz dostawał Segmentation Fault po kliknięciu &#8220;Analyze Code Coverage&#8221;. Jeśli tak, odnajdź poniższą linię w pliku cake/test/lib/code_coverage_manager.php:<br />
<code lang="php"><br />
xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);<br />
</code><br />
Niestety Xdebug sypie się przy takim wykonaniu xdebug_start_code_coverage. Możesz zmienić tą linię na<br />
<code lang="php"><br />
xdebug_start_code_coverage(XDEBUG_CC_UNUSED)<br />
</code><br />
lub<br />
<code lang="php"><br />
xdebug_start_code_coverage(XDEBUG_CC_DEAD_CODE)<br />
</code><br />
O rożnicy możesz poczytać w dokumentacji Xdebug.</p>
<p>Ostatnia sprawa to pokrycie kodu, gdy wykonujesz test całej grupy. Jeśli chcesz dostawać informacje o pokryciu dla poszczególnych testów, nie używaj TestManager::loadTestCasesFromFile, ale raczej ładuj każdy plik osobno za pomocą TestManager::addTestFile.</p>
<p>To na razie tyle. Miłego testowania ;)</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2009/03/caketestsuite-i-pokrycie-kodu-code-coverage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pliki w formie binarnej w bazie</title>
		<link>http://blog.grzegorzpawlik.com/2009/02/pliki-w-formie-binarnej-w-bazie/</link>
		<comments>http://blog.grzegorzpawlik.com/2009/02/pliki-w-formie-binarnej-w-bazie/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 13:39:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP 1.2]]></category>

		<guid isPermaLink="false">http://meta.vipserv.org/blog.grzegorzpawlik.com/?p=55</guid>
		<description><![CDATA[Wcześniej pisałem o tym problemie, gdy pliki trzymamy fizycznie na dysku a w bazie tylko informację np. nazwę pliku (Co się dzieje, gdy dane są nie tylko w bazie). Jako, że nowe projekty także służą do eksperymentowania z nowymi rozwiązaniami, &#8230; <a href="http://blog.grzegorzpawlik.com/2009/02/pliki-w-formie-binarnej-w-bazie/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wcześniej pisałem o tym problemie, gdy pliki trzymamy fizycznie na dysku a w bazie tylko informację np. nazwę pliku (<a href="http://webbricks.blogspot.com/2008/10/co-si-dzieje-gdy-dane-s-nie-tylko-w.html">Co się dzieje, gdy dane są nie tylko w bazie</a>).</p>
<p>Jako, że nowe projekty także służą do eksperymentowania z nowymi rozwiązaniami, dlatego próbujemyz nowymi rozwiązaniami:</p>
<ol>
<li>Po pierwsze komponent: ma dostawać tablicę po uploadzie (chodzi o pola &#8220;file&#8221;), zwracać nazwę zapisanego pliku (dla standardowego podejścia) lub zawartość gotową do wrzucenia do BLOBa</li>
<li>Po drugie Helper, który będzie się zajmował wyświetlaniem takich zdjęć (a w przyszłości także zajmie się cache&#8217;owaniem ze wspomnianą w powyższym artykule metodą z nagłówkami expire)</li>
</ol>
<p>W takim rozwiązaniu niestety pojawia się problem (strzałki oznaczają przepływ danych, uwaga: diagram nie przedstawia dosłownie przebiegu jednego zapytania, ale dwóch zapisu (do kontrolera) i wyświetlenia obrazka (od kontrolera)) :</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="http://1.bp.blogspot.com/__if8bJ36VqY/SaVk4DO9IXI/AAAAAAAAAcY/ShAQCZzOH3A/s1600-h/uploadComponent%2BFileHelper.png" rel="lightbox[55]" title="Pliki w formie binarnej w bazie"><img style="cursor: move;" src="http://1.bp.blogspot.com/__if8bJ36VqY/SaVk4DO9IXI/AAAAAAAAAcY/ShAQCZzOH3A/s400/uploadComponent%2BFileHelper.png" border="0" alt="" /></a></div>
<p>Chodzi o fragment zaznaczony na czerwono. To jest nadmiarowe zachowanie. Lepiej byłoby, gdyby komponent (poprzez kontroler) przekazał nazwę pliku, Helper sprawdził, czy plik istnieje, a w razie gdyby nie istniał &#8211; musiałby &#8216;poprosić&#8217; komponent o aktualizację pliku. A to jest w konflikcie z tym co napisałem przy okazji <a href="http://webbricks.blogspot.com/2009/02/dobre-praktyki-programowania-w-cakephp.html">Dobrych praktyk #2</a> &#8211; Helper nie może używać kontrolera, ani komponentu.</p>
<p>I tu się wydarzyła rzecz ciekawa, w tym poście chciałem napisac o problemie, na który nie widzę dobrego sposobu. Chciałem przedstawić ideę pierwszego podejścia.<br />
Dla bardziej przejrzystego przekazania idei postanowiłem zbudowac diagram i uświadomiłem sobie jak bardzo wizualizacja pomaga w zrozumieniu problemu.<br />
A od zrozumienia problemu do jego rozwiązania jest raczej niedaleko.</p>
<p>No i w tym momencie wpadłem na pomysł bez komponentu i bez Helpera, ale za to sam Behavior. Myślę sobie, że Behaviors są rozszerzeniem Modeli, które odpowiadają za warstwę przechowywania danych.<br />
Pomysł jest taki, że -pomijając kwestię uploadu i sapisu &#8211; behavior w afterRead() sprawdził, czy plik fizycznie jest aktualny, jeśli jest &#8211; zwróci jego nazwę. Jeśli nie jest &#8211; utworzy go na podstawie danych w bazie (koniecznie z inną nazwą) i zwróci jego nazwę (relatywną do img/) ścieżką.</p>
<p>Sprawdzę to empirycznie i napiszę Wam jak poszło.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2009/02/pliki-w-formie-binarnej-w-bazie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>firePHP zbawieniem twym (w przypadku nieprzejednanych klientów)</title>
		<link>http://blog.grzegorzpawlik.com/2008/08/firephp-zbawieniem-twym-w-przypadku-nieprzejednanych-klientow/</link>
		<comments>http://blog.grzegorzpawlik.com/2008/08/firephp-zbawieniem-twym-w-przypadku-nieprzejednanych-klientow/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 09:49:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Inne]]></category>
		<category><![CDATA[CakePHP 1.2]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://meta.vipserv.org/blog.grzegorzpawlik.com/?p=34</guid>
		<description><![CDATA[Jeśli nigdy nie musiałeś wprowadzać poprawek na systemie w wersji produkcyjnej &#8211; jesteś prawdziwym szczęściarzem. Często jednak bywa tak, że musisz poprawić kilka &#8220;pierdół&#8221;, więc robisz to bezpośrednio. Jednak jeśli Twój klient nie może zaakceptować informacji z debugowania na stronie, &#8230; <a href="http://blog.grzegorzpawlik.com/2008/08/firephp-zbawieniem-twym-w-przypadku-nieprzejednanych-klientow/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Jeśli nigdy nie musiałeś wprowadzać poprawek na systemie w wersji produkcyjnej &#8211; jesteś prawdziwym szczęściarzem.<br />
Często jednak bywa tak, że musisz poprawić kilka &#8220;pierdół&#8221;, więc robisz to bezpośrednio. Jednak jeśli Twój klient nie może zaakceptować informacji z debugowania na stronie, a Ty bez nich nie możesz efektywnie pracować &#8211; FirePHP przyjdzie Ci z pomocą.</p>
<p><a href="http://www.firephp.org/">FirePHP</a> to rozszerzenie, do <a href="http://getfirebug.com/">Firebug</a> &#8211; rozszerzenia do Firefoxa :)<br />
Pozwoli Ci wyświetlać debug z kodu PHP w konsoli firebuga właśnie. Jak go zintegrować z Cake (1.2) jest opisane na <a href="http://bakery.cakephp.org/articles/view/baking-cakes-with-firephp">http://bakery.cakephp.org/articles/view/baking-cakes-with-firephp</a>.</p>
<p>Poniżej efekt:</p>
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/__if8bJ36VqY/SLUvqmYjLgI/AAAAAAAAAUo/c89O5C_0yx0/s1600-h/firephp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" rel="lightbox[34]" title="firePHP zbawieniem twym (w przypadku nieprzejednanych klientów)"><img border="0" src="http://1.bp.blogspot.com/__if8bJ36VqY/SLUvqmYjLgI/AAAAAAAAAUo/LEW3FrpP5lQ/s400-R/firephp.png" /></a></div>
<p>Przy wykorzystaniu tych narzędzi twój debug jest widoczny tylko dla Ciebie (no i jeszcze tych co mają zainstalowany ten dodatek&#8230; na 99% Twój klient nie ma).</p>
<p>Życzę Wam i sobie więcej takich narzędzi, które pojawiają się zanim uświadomimy sobie ich potrzebę.</p>
<p>ps. Radzę raczej użyć firebuga w wersji beta 7, gdyż w nowszych pojawia się błąd, w którym aby zobaczyć informacje w konsoli &#8211; trzeba najpierw przełączyć się na inną zakładkę, a później do niej wrócić. Zatem jeśli nie potrzebujesz poprawek z wersji beta 15 (taka była najnowsza w momencie pisania tego tekstu) &#8211; wybierz 7.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2008/08/firephp-zbawieniem-twym-w-przypadku-nieprzejednanych-klientow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HttpSocket z cake 1.2 w cake 1.1.x</title>
		<link>http://blog.grzegorzpawlik.com/2008/08/httpsocket-z-cake-12-w-cake-11x/</link>
		<comments>http://blog.grzegorzpawlik.com/2008/08/httpsocket-z-cake-12-w-cake-11x/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 14:59:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CakePHP 1.1]]></category>
		<category><![CDATA[CakePHP 1.2]]></category>
		<category><![CDATA[HttpSocket]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://meta.vipserv.org/blog.grzegorzpawlik.com/?p=31</guid>
		<description><![CDATA[Jeśli potrzebujesz funkcjonalności zapewnianej przez HttpSocket(na przykład musisz pracować na danych w xml-u dostarczanych choćby przez kanał rss), a z jakichś powodów nie możesz korzystać/migrować na CakePhp1.2, zastosuj poniższą sztuczkę: Z biblioteki CakePhp1.2 (cake/libs/) do katalogu vendors w Twojej aplikacji &#8230; <a href="http://blog.grzegorzpawlik.com/2008/08/httpsocket-z-cake-12-w-cake-11x/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Jeśli potrzebujesz funkcjonalności zapewnianej przez HttpSocket(na przykład musisz pracować na danych w xml-u dostarczanych choćby przez kanał rss), a z jakichś powodów nie możesz korzystać/migrować na CakePhp1.2, zastosuj poniższą sztuczkę:</p>
<p>Z biblioteki CakePhp1.2 (cake/libs/) do katalogu vendors w Twojej aplikacji (1.1.x) skopiuj pliki<br />
- socket.php<br />
- http_socket.php</p>
<p>W pliku socket.php gdzieś na początku, przed definicją klasy jest linia<br />
uses(&#8216;validation&#8217;);<br />
zakomentuj ją (lub usuń) .<br />
Z kolei w pliku http_socket.php linię<br />
uses( &#8216;socket&#8217;,  &#8216;set&#8217;);<br />
Zamień na<br />
vendor(&#8216;socket&#8217;);<br />
uses(&#8216;set&#8217;);</p>
<p>Sposób działający pomiedzy wersją 1.2.0.6311 beta a 1.1.16.5421.<br />
Powodzenia<br />
<ins datetime="2009-06-29T08:17:53+00:00"><br />
Uwaga: działa jedynie przy zapytaniach GET. Dla POST brakuje potrzebnych klas i trzeba by nieco pogrzebać w kodzie HttpSocket, żeby można było wywoływać zapytania POST.<br />
</ins></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2008/08/httpsocket-z-cake-12-w-cake-11x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

