<?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; tricks</title>
	<atom:link href="http://blog.grzegorzpawlik.com/tag/tricks/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>SVN i zarządzanie wersjami (cykl pracy)</title>
		<link>http://blog.grzegorzpawlik.com/2009/04/svn-i-zarzadzanie-wersjami-cykl-pracy/</link>
		<comments>http://blog.grzegorzpawlik.com/2009/04/svn-i-zarzadzanie-wersjami-cykl-pracy/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 11:35:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Inne]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://meta.vipserv.org/blog.grzegorzpawlik.com/?p=63</guid>
		<description><![CDATA[Przy okazji ostatniego projektu udało nam się wypracować dobrze spisujący się proces wgrywania poprawek do działających serwisów. Chciałbym się nim z Wami podzielić&#8230; Oczywiście korzystamy z SVN&#8217;a na jego mechanizmach ten proces został oparty. Zasada jest dość prosta: kolejne działające &#8230; <a href="http://blog.grzegorzpawlik.com/2009/04/svn-i-zarzadzanie-wersjami-cykl-pracy/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Przy okazji ostatniego projektu udało nam się wypracować dobrze spisujący się proces wgrywania poprawek do działających serwisów. Chciałbym się nim z Wami podzielić&#8230;</p>
<p>Oczywiście korzystamy z SVN&#8217;a na jego mechanizmach ten proces został oparty.<br />
Zasada jest dość prosta: kolejne działające wersje to <a href="http://svnbook.red-bean.com/en/1.1/ch04s06.html">tagi</a>. A żeby kopię roboczą ustawić na nowy tag wykonujemy tak zwany <a href="http://svnbook.red-bean.com/en/1.5/svn.ref.svn.c.switch.html">switch</a>.</p>
<p>Jedynym problemem była kwestia poprawek, które należy na przykład wprowadzić bezpośrednio w prodykcyjnej wersji systemu. Pomysł, aby każdą taką poprawkę wprowadzić najpierw do repozytorium, a następnie update wersji jest zbyt kosztowny. Z kolei wprowadzenie tych poprawek na wersji produkcyjnej często owocował wieloma konfliktami, które są bardzo nieporządane z uwagi na to, że serwis jest ogólnodostępny i priorytetem jest jego dostępność.</p>
<p>Rozwiązaniem jest następująca zasada:<br />
Możesz zawsze dokonać poprawki na wersji produkcyjnej. Jednak, żeby poprawka była trwała &#8211; musi być niezależnie wprowadzona do repozytorium (commit do trunk). Poprawki dokonane tylko w produkcyjnej kopii roboczej zostaną najprawdopodobniej utracone przy następnym uaktualnieniu.</p>
<p>W takim wypadku przed switch&#8217;em wystarczy wykonać polecenie revert, np<br />
svn revert ./ &amp;&amp; svn sw https://moje.repozytorium.com/tags/beta-1<br />
Lokalne zmiany są wycofywane, a kopia robocza zostaje przełączona na wersję beta-1.</p>
<p>W takim podejściu do problemu update&#8217;y zajmują od 3 do 10 minut, co jest akceptowalne.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2009/04/svn-i-zarzadzanie-wersjami-cykl-pracy/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>
		<item>
		<title>Jak korzystać z requestAction w CakePHP</title>
		<link>http://blog.grzegorzpawlik.com/2008/06/jak-korzystac-z-requestaction-w-cakephp/</link>
		<comments>http://blog.grzegorzpawlik.com/2008/06/jak-korzystac-z-requestaction-w-cakephp/#comments</comments>
		<pubDate>Thu, 19 Jun 2008 13:05:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[DRY]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://meta.vipserv.org/blog.grzegorzpawlik.com/?p=30</guid>
		<description><![CDATA[Ta bardzo przydatna funkcja nie jest zbyt dobrze opisana w dokumentacji, dlatego pozwolę sobie ją tu opisać. Object::requestAction(string $url, array $extra); Służy do łatwego wywoływania funkcji z jednego kontrolera w innym kontrolerze. Sprawa jest prosta, jeżeli wywoływana funkcja potrzebuje jedynie &#8230; <a href="http://blog.grzegorzpawlik.com/2008/06/jak-korzystac-z-requestaction-w-cakephp/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ta bardzo przydatna funkcja nie jest zbyt dobrze opisana w dokumentacji, dlatego pozwolę sobie ją tu opisać.</p>
<p>Object::requestAction(string $url, array $extra);<br />
Służy do łatwego wywoływania funkcji z jednego kontrolera w innym kontrolerze. Sprawa jest prosta, jeżeli wywoływana funkcja potrzebuje jedynie parametrów, które możemy przekazać w url-u (/posts/show/1).<br />
Jednak sprawa komplikuje się, kiedy potrzebna metoda korzysta z danych przesłanych w formularzu. Komplikuje się o tyle, że w wyniku ubogiej dokumentacji, trudno odgadnąć czy jest to możliwe.<br />
Jednak m.in. po to jest parametr $extra. Jeśli wasz kontroler czeka na dane z formularza ['User']['username'] i ['User']['password'], to można je &#8220;wcisnąć&#8221; do kontrolera poprzez requestAction w następujący sposób:</p>
<p><code lang="php"><br />
$data['data'][['User'] = array('username'=&gt; 'ala', 'password' =&gt; 'makota');<br />
$this-&gt;requestAction('/users/login', $data);<br />
</code></p>
<p>Dzięki tej sztuczce uda Ci się ominąć kilka sytuacji, w których wcześniej pisalibyście osobną funkcję.</p>
<p>Ps. Cake jest pełen takich nieudokumentowanych niespodzianek, które czekają na odkrycie &#8211; zachęcam do eksperymentów.<br />
Pps. Szczególnie przydatność requestAction odczujesz, kiedy zaczniesz intensywniej korzystać z pluginów w CakePhp.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2008/06/jak-korzystac-z-requestaction-w-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Sprytny&#8221; redirect (cakePHP 1.2)</title>
		<link>http://blog.grzegorzpawlik.com/2008/03/sprytny-redirect-cakephp-12/</link>
		<comments>http://blog.grzegorzpawlik.com/2008/03/sprytny-redirect-cakephp-12/#comments</comments>
		<pubDate>Sat, 22 Mar 2008 17:02:00 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[DRY]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://meta.vipserv.org/blog.grzegorzpawlik.com/?p=19</guid>
		<description><![CDATA[Załóżmy, że mamy mały system bloga (posty + komentarze). Cake upiekł za nas widoki i metody. No i powiedzmy, że teraz w post/view/[id_posta] chcesz umieścić możliwość dodania komentarza. Oczywiście tworzysz formularz, którego action=&#8217;/comments/add&#8217; i w CommentsController::add() wpisujesz na sztywno (hard-coding) &#8230; <a href="http://blog.grzegorzpawlik.com/2008/03/sprytny-redirect-cakephp-12/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Załóżmy, że mamy mały system bloga (posty + komentarze).<br />
Cake upiekł za nas widoki i metody. No i powiedzmy, że teraz w post/view/[id_posta] chcesz umieścić możliwość dodania komentarza. Oczywiście tworzysz formularz, którego action=&#8217;/comments/add&#8217; i w CommentsController::add() wpisujesz na sztywno (hard-coding) $this-&gt;redirect(&#8216;/posts/view/&#8217;.$comment['post_id']).</p>
<p>Wszystko pięknie i ładnie działa, ale powiedzmy teraz chciałbyś w widoku posts/list_all, w którym wyświetlasz skrócone wersje wszystkich postów dać możliwość szybkiego dodania komentarza. No i znów pakujesz do środka formularz z action=&#8217;/comments/add&#8217; i fajnie działa, ale redirect jest do jakiegoś jednego konkretnego posta, a nie listy w której szanowny user kliknął &#8216;submit&#8217;. Niby nic złego się  nie dzieje, ale szanowny user odczuwa dyskomfort, jest wręcz zagubiony.</p>
<p>Ostatnio wymyśliłem i z powodzeniem zastosowałem mały trik, który ten problem rozwiązuje w sposób uniwersalny i (w miarę) elegancki.<br />
Zazwyczaj, jeśli tworzę formularz do innego kontrolera, to najczęściej wtedy wiem, gdzie po przerobieniu tych danych powinien się odbyć redirect&#8230; najczęściej z powrotem. Zatem preparuję parametr action w następujący sposób:</p>
<p>action=&lt;?php echo $html-&gt;url(&#8216;/comments/add&#8217;) ?&gt;?r=/posts/list_all/&#8221;</p>
<p>A w AppController<br />
<code lang="php"><br />
function beforeRender(){<br />
  if(isset($this->params['url']['r'])){<br />
    $this->redirect($this->params['url']['r']);<br />
  }<br />
}<br />
</code></p>
<p>Prosta metoda, która zawsze sprawdzi mi czy przekazałem informację o przekierowaniu i w razie czego ustawi odpowiedni adres przekierowania. Nie muszę pamiętać o tym w każdej metodzie, w której jest prawdopodobne, że będę chciał zrobić redirect w różne miejsca. Po prostu implementuję to na początku projektu i cieszę się kolejnymi zaoszczędzonymi minutami :D</p>
<p>Smacznych jajec ;)</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.grzegorzpawlik.com/2008/03/sprytny-redirect-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

