<?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>Code42 &#187; Symfony</title>
	<atom:link href="http://code42.pl/kategoria/symfony/feed/" rel="self" type="application/rss+xml" />
	<link>http://code42.pl</link>
	<description>Wielkie Pytanie o Życie, Kod i całą resztę</description>
	<lastBuildDate>Wed, 25 Jan 2012 14:16:01 +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>Symfony: domyślny wygląd modułu</title>
		<link>http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/</link>
		<comments>http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 16:31:45 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=879</guid>
		<description><![CDATA[Mając utworzony projekt Symfony (1.4) mamy dostęp do zadań (tasków), którymi możemy wygenerować aplikację i moduł: ./symfony generate:app nazwa_aplikacji ./symfony generate:module nazwa_aplikacji nazwa_modułu O ile aplikacji zwykle jest jedna albo dwie, to modułów może być w danym projekcie całkiem sporo. Więc, jeżeli nie zadowala Cię domyślny wygląd modułu, warto sobie go dostosować do własnych potrzeb. [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/02/16/dostosowanie-grep-a-do-svn-i-symfony/' rel='bookmark' title='Dostosowanie grep-a do SVN i Symfony'>Dostosowanie grep-a do SVN i Symfony</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
<li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/randomness_01.jpg" alt="" title="randomness_01" width="536" height="69" class="aligncenter size-full wp-image-884" /></p>
<p>Mając utworzony projekt Symfony (1.4) mamy dostęp do zadań (<code>tasków</code>), którymi możemy wygenerować aplikację i moduł:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>symfony generate:app nazwa_aplikacji
.<span style="color: #000000; font-weight: bold;">/</span>symfony generate:module nazwa_aplikacji nazwa_modułu</pre></div></div>

<p>O ile aplikacji zwykle jest jedna albo dwie, to modułów może być w danym projekcie całkiem sporo. Więc, jeżeli nie zadowala Cię domyślny wygląd modułu, warto sobie go dostosować do własnych potrzeb. Opłaca się to zrobić choćby dla jednego zmienionego znaku, gdyż sprawa jest bardzo prosta.</p>
<p>Domyślnie Symfony wykorzystuje szkielet, który dostępny jest w jej źródłach w katalogu: <code>lib/task/generator/skeleton</code>.</p>
<p>Aby zmienić domyślny wygląd modułów, wystarczy skopiować ten katalog do własnego projektu do katalogu <code>data</code>. Czyli w katalogu projektu, w <code>data/skeleton</code> powinniśmy mieć takie katalogi jak:</p>
<ul>
<li>app</li>
<li>module</li>
<li>project</li>
</ul>
<p>Teraz pozostaje tylko edytować zawartość katalogu <code>data/skeleton/module</code> (nie zmieniamy w źródłach tylko tokena <code>##MODULE_NAME##</code>), a po utworzeniu nowego modułu, w standardowy sposób, wszystko będzie wyglądać po naszemu.</p>
<h2>Co warto zmienić, czyli co ja zmieniam?</h2>
<ul>
<li>Usuwam zbędne komentarze na początku pliku <code>actions.class.php</code>.</li>
<li>Formatuję sobie kod wg lepszego standardu (np. taby zamiast spacji).</li>
<li>Zmieniam dziedziczenie w akcjach na <code>myActions</code>.</li>
<li>Przygotowuję sobie akcje i widoki pod kątem projektu. Zwykle jest to jakiś prosty <a href="http://pl.wikipedia.org/wiki/CRUD">CRUD</a>, w którym wystarczy wykonać kilka razy <em>search &amp; replace</em>.</li>
</ul>
<h2>Zmiana domyślnego wyglądu aplikacji i projektu</h2>
<p>Jeśli spojrzymy na zawartość katalogu <code>skeleton</code> to widać, że nie tylko moduł może być dostosowany do naszych potrzeb. Ja jednak w katalogach do aplikacji nie mieszałem, bo zbyt rzadko się je generuje, a wygląd początkowy jest zadowalający. Natomiast katalog do generowania projektu musiałby by edytowany w źródłach Symfony co nie jest zbyt fajne. Ale może trafią się komuś takie projekty, że i ten „ficzer” znajdzie zastosowanie.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/02/16/dostosowanie-grep-a-do-svn-i-symfony/' rel='bookmark' title='Dostosowanie grep-a do SVN i Symfony'>Dostosowanie grep-a do SVN i Symfony</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
<li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony+Propel: domyślne sortowanie</title>
		<link>http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/</link>
		<comments>http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 07:29:32 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=551</guid>
		<description><![CDATA[W przypadku gdy mamy wiele różnych metod pobierających kolekcje obiektów z bazy danych i chcemy, żeby były posortowane w podobny sposób — można dodać sortowanie w metodzie doSelect. public static function doSelect &#40;Criteria $criteria, PropelPDO $con = null&#41; &#123; if &#40;!$criteria-&#62;getOrderByColumns&#40;&#41;&#41; &#123; $criteria-&#62;addAscendingOrderByColumn &#40;self::YEAR&#41;; $criteria-&#62;addAscendingOrderByColumn &#40;self::MONTH&#41;; $criteria-&#62;addAscendingOrderByColumn &#40;self::DAY&#41;; &#125; return parent::doSelect &#40;$criteria, $con&#41;; &#125; Warunek [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='PHP: Sortowanie obiektów po dacie utworzenia'>PHP: Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/posortuj_mnie1.jpg" alt="Posortuj mnie" height="240"/><br />
W przypadku gdy mamy wiele różnych metod pobierających kolekcje obiektów z bazy danych i chcemy, żeby były posortowane w podobny sposób — można dodać sortowanie w metodzie <code>doSelect</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> doSelect <span style="color: #009900;">&#40;</span>Criteria <span style="color: #000088;">$criteria</span><span style="color: #339933;">,</span> PropelPDO <span style="color: #000088;">$con</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getOrderByColumns</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
     <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addAscendingOrderByColumn</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">YEAR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addAscendingOrderByColumn</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">MONTH</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addAscendingOrderByColumn</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">DAY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">,</span> <span style="color: #000088;">$con</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Warunek <code>if</code> umożliwia nam zdefiniowanie dowolnego innego sortowania <em>wcześniej</em>. W przypadku, gdy jakaś metoda (np. <code>getAll</code>) nie definiowała sortowania za pomocą obiektu <code>Criteria</code> — zostanie użyte domyślne (tutaj: po dacie).</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='PHP: Sortowanie obiektów po dacie utworzenia'>PHP: Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formularze Symfony: select ograniczony przez wartość innego pola</title>
		<link>http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/</link>
		<comments>http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/#comments</comments>
		<pubDate>Wed, 12 May 2010 19:38:52 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[sfWidgetFormChoice]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=538</guid>
		<description><![CDATA[Opis na przykładzie Propela. Problem Jak ograniczyć liczbę opcji w sfWidgetFormChoice na podstawie wartości z innego pola formularza. Mowa o ograniczeniu stałym, zdefiniowanym w klasie formularza. Rozwiązanie Będąc w klasie formularza mamy dostęp do wartości odpowiadającego obiektu, tylko gdy dany formularz zostanie zainicjalizowany poprzez podanie obiektu do konstruktora (czyli przykładowo $this-&#62;form = new SampleForm ($sample_object)). [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-546" title="html-select" src="http://code42.pl/wp-content/uploads/html-select.png" alt="" width="367" height="223" /></p>
<p><em>Opis na przykładzie Propela.</em></p>
<h2>Problem</h2>
<p>Jak ograniczyć liczbę opcji w <code>sfWidgetFormChoice</code> na podstawie wartości z innego pola formularza. Mowa o ograniczeniu stałym, zdefiniowanym w klasie formularza.</p>
<h2>Rozwiązanie</h2>
<p>Będąc w klasie formularza mamy dostęp do wartości odpowiadającego obiektu, tylko gdy dany formularz zostanie zainicjalizowany poprzez <strong>podanie obiektu do konstruktora</strong> (czyli przykładowo <code>$this-&gt;form = new SampleForm ($sample_object)</code>). Wtedy możemy pobrać jakąś informację z obiektu i na jej podstawie stworzyć <code>Criteria</code> ograniczające:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span> <span style="color: #009900;">&#40;</span>APeer<span style="color: #339933;">::</span><span style="color: #004000;">XYZ</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getObject</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAsd</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widgetSchema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'asd'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sfWidgetFormPropelChoice <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'model'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'B'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'criteria'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Walidacja jednego pola formularza w symfony</title>
		<link>http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/</link>
		<comments>http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 13:31:23 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[baseformpropel]]></category>
		<category><![CDATA[sfvalidator]]></category>
		<category><![CDATA[walidacja]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=315</guid>
		<description><![CDATA[Natknąłem się ostatnio na problem. Otóż wszystkie formularze walidujemy przy wykorzystaniu symfoniowych Formsów. Standardowe użycie podczas aktualizacji obiektu Place wygląda następująco: $this->form = new PlaceForm ($place); $this->form->bind ($request->getParameter ('place')); if ($this->form->isValid()) { $place = $this->form->updateObject(); $place->save(); } Co jednak kiedy nie chcemy walidować całego formularza? Np. w przypadku kiedy używając InPlaceEditora zmieniamy jedno pole. Podpowiem, [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/' rel='bookmark' title='Symfony: domyślny wygląd modułu'>Symfony: domyślny wygląd modułu</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Natknąłem się ostatnio na problem. Otóż wszystkie formularze walidujemy przy wykorzystaniu <a href="http://www.symfony-project.org/book/forms/1_2/en/">symfoniowych Formsów</a>. Standardowe użycie podczas aktualizacji obiektu <code>Place</code> wygląda następująco:</p>
<pre>$this->form = new PlaceForm ($place);
$this->form->bind ($request->getParameter ('place'));

if ($this->form->isValid())
{
	$place = $this->form->updateObject();
	$place->save();
}</pre>
<p>Co jednak kiedy nie chcemy walidować całego formularza? Np. w przypadku kiedy używając <a href="http://wiki.github.com/madrobby/scriptaculous/ajax-inplaceeditor">InPlaceEditora</a> zmieniamy jedno pole. Podpowiem, że próba wysłania tylko tego jednego pola i wykorzystaniu tej samej akcji skończy się wyzerowaniem pozostałych pól.</p>
<p>Dokumentacja symfony niestety milczy na ten temat (choć przyznam się, że nie szukałem jakoś strasznie dokładnie), a wiemy chyba wszyscy co jest jej największą bolączką &#8211; opisanie tylko kilku funkcjonalności poszczególnych modułów. Jak się chce czegoś więcej, to droga wolna &#8211; szukajcie sobie sami w kodzie.</p>
<p>Tak też postąpiłem. I po koszmarnie długim czasie odkryłem, że do walidowania każdego z pól służy metoda o intuicyjnej nazwie&#8230; <code>clean()</code>. Przykład walidacji jednego pola:</p>
<pre>$form = new PlaceForm($place);
try
{
	$cleaned = $form->getValidator($field_name)->clean($value); #1

	$place->setByName($field_name, $cleaned, BasePeer::TYPE_FIELDNAME); #2
	$place->save();
}
catch (sfValidatorError $e) #3
{
	#Obsługa błędu
}</pre>
<ol>
<li>Pobranie odpowiedniego walidatora oraz wywołanie na nim metody <code>clean()</code>, która w przypadku, gdy pole ma poprawną wartość zwraca je. A w przypadku błędu wyrzuca wyjątek <code>sfValidatorError</code>,</li>
<li>Zapisanie wyczyszczonej wartości tego pola do obiektu,</li>
<li>Kod obsługujący przypadek niewalidującego się pola.</li>
</ol>
<p>Mam nadzieję, że ten krótki artykuł pozwoli komuś zaoszczędzić trochę czasu.</p>
<p>Wpis opublikowałem także na prywatnym blogu <a href="http://reinmar.jogger.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/">reinmar.jogger.pl</a>.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/' rel='bookmark' title='Symfony: domyślny wygląd modułu'>Symfony: domyślny wygląd modułu</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Vim: Znajdowanie plików w podkatalogach</title>
		<link>http://code42.pl/2009/03/26/vim-znajdowanie-plikow-w-podkatalogach/</link>
		<comments>http://code42.pl/2009/03/26/vim-znajdowanie-plikow-w-podkatalogach/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 13:43:12 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Vim]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=289</guid>
		<description><![CDATA[Jak wiadomo, Vim nie jest IDE. I w sumie dobrze. Jednak jest kilka funkcjonalności typowych dla IDE, które by się w nim przydały. Jedną z nich jest łatwe otwieranie plików w projekcie. Jako, że nie ma nic takiego wbudowanego, trzeba sobie poradzić samemu. Jak mogło by takie wyszukiwanie i otwieranie plików działać? Otóż, w naszym przykładzie, po naciśnięciu [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/21/uprawnienia-plikow-w-repo-svn/' rel='bookmark' title='Uprawnienia plików w repo SVN'>Uprawnienia plików w repo SVN</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
<li><a href='http://code42.pl/2010/12/24/ignorowanie-plikow-w-svn/' rel='bookmark' title='Ignorowanie plików w SVN'>Ignorowanie plików w SVN</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/lego_search-536x230.jpg" alt="" title="lego_search" width="536" height="230" class="aligncenter size-medium wp-image-705" /></p>
<p>Jak wiadomo, Vim nie jest <abbr title='Integrated development environment'>IDE</abbr>. I w sumie dobrze. Jednak jest kilka funkcjonalności typowych dla IDE, które by się w nim przydały. Jedną z nich jest łatwe otwieranie plików w projekcie. Jako, że nie ma nic takiego wbudowanego, trzeba sobie poradzić samemu.</p>
<p>Jak mogło by takie wyszukiwanie i otwieranie plików działać? Otóż, w naszym przykładzie, po naciśnięciu <kbd>ctrl+f</kbd> i wpisaniu interesującej nas nazwy pliku (np. <em>BasePlace</em>) otrzymujemy taki wynik:</p>
<p><a href="http://code42.pl/wp-content/uploads/2009/03/vim-find.png"><img src="http://code42.pl/wp-content/uploads/2009/03/vim-find-300x245.png" alt="vim-find" title="vim-find" width="300" height="245" class="aligncenter size-medium wp-image-292" /></a></p>
<p>Sposób na uruchomienie tego mechanizmu jest przedstawiony na stronie <a href='http://vim.wikia.com/wiki/Find_files_in_subdirectories'>http://vim.wikia.com/wiki/Find_files_in_subdirectories</a>. Jednakże, jest on dość chaotyczny, a efekt końcowy ma pewne wady. Dlatego przedstawiam sprawę po mojemu.</p>
<p>Cały kod podany poniżej trzeba wstawić do własnego <code>.vimrc</code>. Pierwsza część to funkcja do znajdowania, w niezmienionej postaci:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;">&quot; Find file in current directory and edit it.</span>
<span style="color: #804040;">function</span><span style="color: #000000;">!</span> Find<span style="color: #000000;">&#40;</span>name<span style="color: #000000;">&#41;</span>
  <span style="color: #804040;">let</span> l<span style="color: #000000;">:</span><span style="color: #668080;">list</span>=<span style="color: #25BB4D;">system</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;find . -name '&quot;</span><span style="color: #000000;">.</span>a<span style="color: #000000;">:</span>name<span style="color: #000000;">.</span><span style="color: #C5A22D;">&quot;' | perl -ne 'print <span style="">\&quot;</span>$.<span style="">\\</span>t$_<span style="">\&quot;</span>'&quot;</span><span style="color: #000000;">&#41;</span>
  <span style="color: #804040;">let</span> l<span style="color: #000000;">:</span>num=<span style="color: #25BB4D;">strlen</span><span style="color: #000000;">&#40;</span><span style="color: #25BB4D;">substitute</span><span style="color: #000000;">&#40;</span>l<span style="color: #000000;">:</span><span style="color: #668080;">list</span>, <span style="color: #C5A22D;">&quot;[^<span style="">\n</span>]&quot;</span>, <span style="color: #C5A22D;">&quot;&quot;</span>, <span style="color: #C5A22D;">&quot;g&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
  <span style="color: #804040;">if</span> l<span style="color: #000000;">:</span>num <span style="color: #000000;">&lt;</span> <span style="color: #000000; font-weight:bold;">1</span>
    <span style="color: #804040;">echo</span> <span style="color: #C5A22D;">&quot;'&quot;</span><span style="color: #000000;">.</span>a<span style="color: #000000;">:</span>name<span style="color: #000000;">.</span><span style="color: #C5A22D;">&quot;' not found&quot;</span>
    <span style="color: #804040;">return</span>
  <span style="color: #804040;">endif</span>
  <span style="color: #804040;">if</span> l<span style="color: #000000;">:</span>num <span style="color: #000000;">!</span>= <span style="color: #000000; font-weight:bold;">1</span>
    <span style="color: #804040;">echo</span> l<span style="color: #000000;">:</span><span style="color: #668080;">list</span>
    <span style="color: #804040;">let</span> l<span style="color: #000000;">:</span><span style="color: #25BB4D;">input</span>=<span style="color: #25BB4D;">input</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;Which ? (CR=nothing)<span style="">\n</span>&quot;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #804040;">if</span> <span style="color: #25BB4D;">strlen</span><span style="color: #000000;">&#40;</span>l<span style="color: #000000;">:</span><span style="color: #25BB4D;">input</span><span style="color: #000000;">&#41;</span>==<span style="color: #000000; font-weight:bold;">0</span>
      <span style="color: #804040;">return</span>
    <span style="color: #804040;">endif</span>
    <span style="color: #804040;">if</span> <span style="color: #25BB4D;">strlen</span><span style="color: #000000;">&#40;</span><span style="color: #25BB4D;">substitute</span><span style="color: #000000;">&#40;</span>l<span style="color: #000000;">:</span><span style="color: #25BB4D;">input</span>, <span style="color: #C5A22D;">&quot;[0-9]&quot;</span>, <span style="color: #C5A22D;">&quot;&quot;</span>, <span style="color: #C5A22D;">&quot;g&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&gt;</span><span style="color: #000000; font-weight:bold;">0</span>
      <span style="color: #804040;">echo</span> <span style="color: #C5A22D;">&quot;Not a number&quot;</span>
      <span style="color: #804040;">return</span>
    <span style="color: #804040;">endif</span>
    <span style="color: #804040;">if</span> l<span style="color: #000000;">:</span>input<span style="color: #000000;">&lt;</span><span style="color: #000000; font-weight:bold;">1</span> <span style="color: #000000;">||</span> l<span style="color: #000000;">:</span>input<span style="color: #000000;">&gt;</span>l<span style="color: #000000;">:</span>num
      <span style="color: #804040;">echo</span> <span style="color: #C5A22D;">&quot;Out of range&quot;</span>
      <span style="color: #804040;">return</span>
    <span style="color: #804040;">endif</span>
    <span style="color: #804040;">let</span> l<span style="color: #000000;">:</span><span style="color: #25BB4D;">line</span>=<span style="color: #25BB4D;">matchstr</span><span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;<span style="">\n</span>&quot;</span><span style="color: #000000;">.</span>l<span style="color: #000000;">:</span><span style="color: #668080;">list</span>, <span style="color: #C5A22D;">&quot;<span style="">\n</span>&quot;</span><span style="color: #000000;">.</span>l<span style="color: #000000;">:</span><span style="color: #25BB4D;">input</span><span style="color: #000000;">.</span><span style="color: #C5A22D;">&quot;<span style="">\t</span>[^<span style="">\n</span>]*&quot;</span><span style="color: #000000;">&#41;</span>
  <span style="color: #804040;">else</span>
    <span style="color: #804040;">let</span> l<span style="color: #000000;">:</span><span style="color: #25BB4D;">line</span>=l<span style="color: #000000;">:</span><span style="color: #668080;">list</span>
  <span style="color: #804040;">endif</span>
  <span style="color: #804040;">let</span> l<span style="color: #000000;">:</span><span style="color: #25BB4D;">line</span>=<span style="color: #25BB4D;">substitute</span><span style="color: #000000;">&#40;</span>l<span style="color: #000000;">:</span><span style="color: #25BB4D;">line</span>, <span style="color: #C5A22D;">&quot;^[^<span style="">\t</span>]*<span style="">\t</span>./&quot;</span>, <span style="color: #C5A22D;">&quot;&quot;</span>, <span style="color: #C5A22D;">&quot;&quot;</span><span style="color: #000000;">&#41;</span>
  <span style="color: #804040;">execute</span> <span style="color: #C5A22D;">&quot;:e &quot;</span><span style="color: #000000;">.</span>l<span style="color: #000000;">:</span><span style="color: #25BB4D;">line</span>
endfunction
<span style="color: #668080;">command</span><span style="color: #000000;">!</span> <span style="color: #668080;">-nargs</span>=<span style="color: #000000; font-weight:bold;">1</span> Find <span style="color: #000000;">:</span><span style="color: #804040;">call</span> Find<span style="color: #000000;">&#40;</span><span style="color: #C5A22D;">&quot;&lt;args&gt;&quot;</span><span style="color: #000000;">&#41;</span></pre></div></div>

<p>Następnie wstawiamy funkcję napisaną w Pythonie, również pochodząca ze wcześniej wspomnianej strony. Jest ona odpowiedzialna za sam proces wyszukiwania plików. Jednak tutaj zaszło klika zmian:</p>
<ul>
<li>szukanie jest niewrażliwe na wielkość znaków,</li>
<li>szukanie ignoruje katalogi .svn</li>
<li>rozpoczynając szukanie, nie trzeba potwierdzić (ale też nie można zmienić) katalogu, w którym się szuka; domyślnie jest to katalog w którym otwarliśmy Vima.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">python <span style="color: #66cc66;">&lt;&lt;</span> EOL
<span style="color: #ff7700;font-weight:bold;">import</span> vim
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> Finder<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args<span style="color: black;">&#41;</span>:
    start_dir = vim.<span style="color: #008000;">eval</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'getcwd()'</span><span style="color: black;">&#41;</span>
    find_cmd = <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'find %s -iname &quot;*%s*&quot; ! -name &quot;*.svn*&quot; -type f -printf %%p:1:-<span style="color: #000099; font-weight: bold;">\\</span>n'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>start_dir, args<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    vim.<span style="color: black;">command</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;cgete system('%s')&quot;</span> <span style="color: #66cc66;">%</span> find_cmd<span style="color: black;">&#41;</span>
    vim.<span style="color: black;">command</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'botright copen'</span><span style="color: black;">&#41;</span>
EOL
command<span style="color: #66cc66;">!</span> -nargs=<span style="color: #ff4500;">1</span> Find :py Finder<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&lt;args&gt;&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>I na koniec pozostało przypisanie sobie funkcji do skrótu <kbd>ctrl-f</kbd>:</p>

<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">map</span><span style="color: #000000;">!</span> <span style="color: #000000;">&lt;</span>C<span style="color: #000000;">-</span>f<span style="color: #000000;">&gt;</span> <span style="color: #668080;">&lt;Esc&gt;</span> <span style="color: #000000;">:</span>Find ;
<span style="color: #804040;">map</span>  <span style="color: #000000;">&lt;</span>C<span style="color: #000000;">-</span>f<span style="color: #000000;">&gt;</span> <span style="color: #000000;">:</span>Find ;</pre></div></div>

<p>Po <code>:Find</code> jest spacja, aby nie trzeba było jej dopisywać za każdym razem. Teraz wystarczy wykonać <code>:source ~/.vimrc</code> lub zrestartować Vima, a następnie <kbd>ctrl+f</kbd> i voilà!</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/21/uprawnienia-plikow-w-repo-svn/' rel='bookmark' title='Uprawnienia plików w repo SVN'>Uprawnienia plików w repo SVN</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
<li><a href='http://code42.pl/2010/12/24/ignorowanie-plikow-w-svn/' rel='bookmark' title='Ignorowanie plików w SVN'>Ignorowanie plików w SVN</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/03/26/vim-znajdowanie-plikow-w-podkatalogach/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Propel: lazyLoad</title>
		<link>http://code42.pl/2009/01/31/propel-lazyload/</link>
		<comments>http://code42.pl/2009/01/31/propel-lazyload/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 11:06:58 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[lazy load]]></category>
		<category><![CDATA[propel]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=192</guid>
		<description><![CDATA[Użycie LazyLoadingu w Propelu jest bardzo proste, jednak słabo udokumentowane. Polega ono na dodaniu lazyLoad: true w schemacie bazy danych (dla wybranych kolumn). Przykładowy fragment schematu: images: _attributes: { phpName: Image } id: { type: serial } data_large: { type: blob, lazyLoad: true } data_small: { type: blob, required: true, lazyLoad: true } … Czym jest LazyLoad? [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/lazy-cat-536x265.jpg" alt="" title="lazy-cat" width="536" height="265" class="aligncenter size-medium wp-image-694" /></p>
<p>Użycie LazyLoadingu w Propelu jest bardzo proste, jednak słabo udokumentowane. Polega ono na dodaniu <code>lazyLoad: true</code> w schemacie bazy danych (dla wybranych kolumn). Przykładowy fragment schematu:</p>
<pre>
  images:
    _attributes: { phpName: Image }
    id: { type: serial }
    data_large: { type: blob, <strong>lazyLoad: true</strong> }
    data_small: { type: blob, required: true, <strong>lazyLoad: true</strong> }
    …
</pre>
<h2>Czym jest LazyLoad?</h2>
<p>Dla nieznających tego mechanizmu wyjaśnienie. LazyLoad to technika stosowana w warstwie modelu dla wybranych kolumn tabeli. Atrybuty oznaczone do LazdyLoadingu pobierane są tylko i wyłączenie, gdy nastąpi jawne zapytanie o nie. Przykładowo (bazując na powyższym kawałku schematu), podczas wyszukiwania zdjęć, chcemy dostać miniaturki wyników — jednak bez tego mechanizmu pobrane byłyby również duże wersje zdjęć, które w aktualnym widoku nie są potrzebne, a to może bardzo spowolnić wygenerowanie strony.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/01/31/propel-lazyload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Krótko: uwaga na sfPropelPager::getResults()</title>
		<link>http://code42.pl/2009/01/09/optymalizacje-sfpropelpagergetresults/</link>
		<comments>http://code42.pl/2009/01/09/optymalizacje-sfpropelpagergetresults/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 13:18:54 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[optymalizacja]]></category>
		<category><![CDATA[propel]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=157</guid>
		<description><![CDATA[Obiekt sfPropelPager nie potrafi „keszować” w sobie wyników zapytania do bazy. Innymi słowy każde wywołanie metody getResults() odpytuje bazę danych. Nieświadomość tego faktu możne doprowadzić naszą aplikację do generowania dużych i bezsensownych obciążeń serwera. Dlatego też, trzeba uważać czy nie wywołuje się tej metody więcej niż jeden raz podczas jednego żądania (np. przy kilkukrotnym iterowaniu [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
<li><a href='http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/' rel='bookmark' title='Symfony: domyślny wygląd modułu'>Symfony: domyślny wygląd modułu</a></li>
<li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Obiekt <code>sfPropelPager</code> nie potrafi „keszować” w sobie wyników zapytania do bazy. Innymi słowy każde wywołanie metody <code>getResults()</code> odpytuje bazę danych. Nieświadomość tego faktu możne doprowadzić naszą aplikację do generowania dużych i bezsensownych obciążeń serwera.</p>
<p>Dlatego też, trzeba uważać czy nie wywołuje się tej metody więcej niż jeden raz podczas jednego żądania (np. przy kilkukrotnym iterowaniu po wynikach).</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
<li><a href='http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/' rel='bookmark' title='Symfony: domyślny wygląd modułu'>Symfony: domyślny wygląd modułu</a></li>
<li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/01/09/optymalizacje-sfpropelpagergetresults/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</title>
		<link>http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/</link>
		<comments>http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 17:42:13 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[criteria]]></category>
		<category><![CDATA[propel]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=137</guid>
		<description><![CDATA[Pobieranie obiektów bez wykorzystywania obiektu klasy Criteria jest dość proste. Jednak standardowy paginator w Symfony ma taką właściwość, że jako parametr przyjmuje obiekt tejże klasy. Stwarza to trochę problemów, gdy odpytujemy bazę w niezbyt typowy sposób, a chcemy podzielić wyniki na strony. Przykład: w wyszukiwarce sprawdzamy czy połączone kolumny pasują do podanej frazy. Prawdę mówiąc nie [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/book-pages-536x239.jpg" alt="" title="book-pages" width="536" height="239" class="aligncenter size-medium wp-image-685" /></p>
<p>Pobieranie obiektów bez wykorzystywania obiektu klasy <code>Criteria</code> jest dość proste. Jednak standardowy paginator w <a href='http://www.symfony-project.org/'>Symfony</a> ma taką właściwość, że jako parametr przyjmuje obiekt tejże klasy. Stwarza to trochę problemów, gdy odpytujemy bazę w niezbyt typowy sposób, a chcemy podzielić wyniki na strony. Przykład: w wyszukiwarce sprawdzamy czy połączone kolumny pasują do podanej frazy.</p>
<p>Prawdę mówiąc nie wiem jak to zrobić w <a href='http://propel.phpdb.org/'>Propelu</a> 1.2 (tym samym Symfony < 1.2), jednak w wersji 1.3 jest już na to sposób dzięki <code>Criteria::CUSTOM</code>. Przykładowo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span> <span style="color: #009900;">&#40;</span>CarPeer<span style="color: #339933;">::</span><span style="color: #004000;">BRAND</span><span style="color: #339933;">,</span>
         CarPeer<span style="color: #339933;">::</span><span style="color: #004000;">BRAND</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;||' '||&quot;</span><span style="color: #339933;">.</span>CarPeer<span style="color: #339933;">::</span><span style="color: #004000;">MODEL</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' ILIKE \'%'</span><span style="color: #339933;">.</span><span style="color: #000088;">$phrase</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'%\''</span><span style="color: #339933;">,</span>
         Criteria<span style="color: #339933;">::</span><span style="color: #004000;">CUSTOM</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
…
<span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCriteria</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>code<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Rzeczą, na którą koniecznie trzeba zwrócić uwagę, jest podanie dowolnej kolumny (pierwszy parametr), mimo że nie będzie ona wykorzystywana. Jako drugi parametr podajemy już dokładnie to, co ciężko było normalnie zbudować wykorzystując propelowe kryteria (może to być fragment czystego <code>SQL</code> występującego po klauzuli <code>WHERE</code>). Ostatni parametr jest narzucony i służy do aktywowania całej „magii”.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aktualizacja oprogramowania a wydajność</title>
		<link>http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/</link>
		<comments>http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 11:54:35 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[apache benchmark]]></category>
		<category><![CDATA[optymalizacja]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=79</guid>
		<description><![CDATA[Krótkie spostrzeżenie na temat wydajności aplikacji (praktycznie nie wypełnionej danymi) po następujących aktualizacjach: Symfony 1.1 → Symfony 1.2 Propel 1.2 → Propel 1.3 PHP 5.2.0 → PHP 5.2.6 PostgreSQL 8.1 → PostgreSQL 8.3 Prosty test został wykonany za pomocą ApacheBenchmarka: ab -c 5 -n 300 -H 'Connection: close'. Jak widać symulacja bazowała na 300 użytkownikach, przy czym [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
<li><a href='http://code42.pl/2009/01/14/czas-zycia-krotki-w-postgresie/' rel='bookmark' title='PostgreSQL: obliczanie odstępów czasu'>PostgreSQL: obliczanie odstępów czasu</a></li>
<li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/speedometer-536x282.jpg" alt="" title="speedometer" width="536" height="282" class="aligncenter size-medium wp-image-676" /></p>
<p>Krótkie spostrzeżenie na temat wydajności aplikacji (praktycznie nie wypełnionej danymi) po następujących aktualizacjach:</p>
<ul>
<li>Symfony 1.1 → Symfony 1.2</li>
<li>Propel 1.2 → Propel 1.3</li>
<li>PHP 5.2.0 → PHP 5.2.6</li>
<li>PostgreSQL 8.1 → PostgreSQL 8.3</li>
</ul>
<p>Prosty test został wykonany za pomocą <a href='http://code42.pl/?p=93' title='Connection: close + Apache Benchmark'>ApacheBenchmarka</a>:<br />
<code>ab -c 5 -n 300 -H 'Connection: close'</code>. Jak widać symulacja bazowała na 300 użytkownikach, przy czym do 5 na raz wchodziło na stronę.</p>
<h2>Przed aktualizacją</h2>
<p>Próba 1:</p>
<pre>
Requests per second:    4.34 [#/sec] (mean)
Time per request:       1152.770 [ms] (mean)
Time per request:       230.554 [ms] (mean, across all concurrent requests)
</pre>
<p>Próba 2:</p>
<pre>
Requests per second:    4.79 [#/sec] (mean)
Time per request:       1043.581 [ms] (mean)
Time per request:       208.716 [ms] (mean, across all concurrent requests)
</pre>
<h2>Po aktualizacji</h2>
<p>Próba 1:</p>
<pre>
Requests per second:    5.33 [#/sec] (mean)
Time per request:       937.318 [ms] (mean)
Time per request:       187.464 [ms] (mean, across all concurrent requests)
</pre>
<p>Próba 2:</p>
<pre>
Requests per second:    5.39 [#/sec] (mean)
Time per request:       927.979 [ms] (mean)
Time per request:       185.596 [ms] (mean, across all concurrent requests)
</pre>
<p>Oczywiście z uwagi na brak testów pomiędzy poszczególnymi zmianami ciężko jest powiedzieć coś więcej, niż tyle że warto aktualizować, choćby o tego jednego requesta na sekundę ;). Ot, taka ciekawostka.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
<li><a href='http://code42.pl/2009/01/14/czas-zycia-krotki-w-postgresie/' rel='bookmark' title='PostgreSQL: obliczanie odstępów czasu'>PostgreSQL: obliczanie odstępów czasu</a></li>
<li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</title>
		<link>http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/</link>
		<comments>http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 10:05:23 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[propel]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=5</guid>
		<description><![CDATA[Jako, że w MySQL nie dzieje się najlepiej postanowiliśmy zmigrować jeden z naszych projektów na Postgresa. Bazuje on na Symfony 1.1, co oznacza starego Propela 1.2. Samo przestawienie połączenia nie stwarzało większych problemów, wystarczyło w databases.yml i propel.ini przerobić mysql na pgsql: all: propel: class: sfPropelDatabase param: persistent: true phptype: pgsql … propel.database = pgsql propel.database.createUrl = pgsql://zdzislaw@localhost/ [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/' rel='bookmark' title='Aktualizacja oprogramowania a wydajność'>Aktualizacja oprogramowania a wydajność</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/great-migration-536x194.jpg" alt="" title="great-migration" width="536" height="194" class="aligncenter size-medium wp-image-672" /></p>
<p>Jako, że w <a title="Założyciel MySQL ostrzega przed aktualną wersją" href="http://www.heise-online.pl/news/Zalozyciel-MySQL-ostrzega-przed-aktualna-wersja--/6612">MySQL nie dzieje się najlepiej</a> postanowiliśmy zmigrować jeden z naszych projektów na Postgresa. Bazuje on na Symfony 1.1, co oznacza starego Propela 1.2. </p>
<p>Samo przestawienie połączenia nie stwarzało większych problemów, wystarczyło w <code>databases.yml</code> i <code>propel.ini</code> przerobić <code>mysql</code> na <code>pgsql</code>:</p>
<pre>
all:
  propel:
    class:          sfPropelDatabase
    param:
    persistent:       true
    phptype:          pgsql
…
</pre>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">propel.database            <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> pgsql</span>
propel.database.createUrl  <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> pgsql://zdzislaw@localhost/</span>
propel.database.url        <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> pgsql://zdzislaw@localhost/piwo</span></pre></div></div>

<p>Przebudowanie modelu, utworzeniu bazy i jej struktury również wykonało się bez problemu, ale to był koniec tego dobrego.</p>
<h2>Brak SERIAL</h2>
<p>Niestety, propelowy generator skryptu SQL tworzącego schemat bazy nie uraczył nas typem <code>SERIAL</code> przy identyfikatorach, jednakże w samej aplikacji nie stwarza to problemów, ponieważ sekwencje i bez tego są wykorzystywane. Także trzeba po prostu uważać podczas zabawy w <abbr title='Command Line Interface'>CLI</abbr> Postgresa, gdy mogą one doprowadzić do anomalii z identyfikatorami.</p>
<h2>Dane binarne pobierane „ręcznie”</h2>
<p>Drobny problem pojawił się w miejscach, gdzie pobieraliśmy dane binarne (BLOB/BYTEA) własnym zapytaniem, omijając wbudowany we framework Active Record. Dane takie trzeba było dodatkowo „od-eskejpować” funkcją <a href='http://php.net/manual/en/function.stripcslashes.php'><code>stripcslashes</code></a>.</p>
<p class='notice'>
AKTUALIZACJA: Po aktualizacji projektu do Symfony 1.2 (chociaż tutaj właściwie chodzi o aktualizację Propela do wersji 1.3) okazało się, że żadne <code>stripcslashes</code> nie będzie potrzebne, ponieważ dane binarne (blob) są pobierane jako… stream. Innymi słowy, przy zapytaniach tworzonych samodzielnie, do akcji musiała wkroczyć funkcja <a href='http://php.net/manual/en/function.stream-get-contents.php'><code>stream_get_contents</code></a>.
</p>
<h2>GROUP BY</h2>
<p>Najwięcej problemów sprawiło grupowanie, ponieważ PostgreSQL ostro trzyma się standardów i wymusza podanie wszystkich używanych kolumn w klauzuli <code>GROUP BY</code>. MySQL natomiast „po cichu” sam sobie je dołączał. Różnicę w zachowaniu prezentuje poniższy (nie mający większego sensu) przykład:</p>
<pre>psql=# select sum(id), id from users;
ERROR:  column "users.id" must appear in the GROUP BY clause
or be used in an aggregate function</pre>
<pre>mysql>  select sum(id), id from users;
+---------+----+
| sum(id) | id |
+---------+----+
|  45     |  1 |
+---------+----+
</pre>
<h2>CONCAT</h2>
<p>Łącznie ciągów znaków odbywa się całkiem inaczej w MySQL i PgSQL. W tym pierwszym wykonuje się to za pomocą funkcji <code>CONCAT()</code>, natomiast w drugim wykorzystuje się operator <code>||</code>. Także trzeba było wykonać małą robótkę ręczną.</p>
<h2>FORMAT</h2>
<p>W naszym kodzie używaliśmy MySQL-owego <code>FORMAT()</code>, aby ograniczyć liczbę cyfr po przecinku, którego w Postgresie nie ma. Można by tutaj użyć funkcji <code>ROUND()</code>, obecnej i tu i tu, jednak zdecydowaliśmy się przenieść rozwiązanie tego problemu do warstwy języka programowania.</p>
<h2>LIKE</h2>
<p><code>LIKE</code> w Postgresie, w przeciwieństwie do MySQL, rozróżnia wielkość znaków. Jednak naprawa tej przypadłości sprowadza się jedynie od zamiany <code>LIKE</code> na <code>ILIKE</code>.</p>
<h2>Coś dziwnego</h2>
<p>Na koniec coś, czego do końca nie udało nam się zrozumieć. Zaraz po przestawieniu konfiguracji na <code>pgsql</code>, strona przestała odpowiadać (a dokładniej odpowiadała, gdy połączenie z bazą przekroczyło czas oczekiwania). Niemniej jednak PostgreSQL sam w sobie działał, jak również możliwe było połączenie z „czystego” PHP. Jedynie aplikacja Symfony dziwnie się zachowywała. W logach pojawiało się następujące stwierdzenie:</p>
<p><code>Dec  4 11:20:22 myhost httpd:  [wrapped: Could not connect [Native Error: pg_pconnect() [function.pg-pconnect]: Unable to connect to PostgreSQL server: server closed the connection unexpectedly  This probably means the server terminated abnormally    before or while processing the request.] [User Info: host=localhost port=80 dbname='piwo' user='zdzislaw'] [User Info: Array]]</code></p>
<p>Taka sama sytuacja powtórzyła się na dwóch różnych maszynach (jednak na tym samym <a title="Arch Linux" href="http://archlinux.org">systemie operacyjnym</a>). Niezrozumiałe jest to, że w czasie różnych zabaw z konfiguracją wszystko wracało do normy, jednak nie bardzo da się znaleźć konkretną przyczynę. Innymi słowy nie potrafimy zreprodukować tej sytuacji.</p>
<h2>Krótkie podsumowanie</h2>
<p>Migracja rozwiniętego projektu w Symfony okazała się być stosunkowo mało problematyczna. Kłopotów mogło by być jeszcze mniej, gdyby unikać rozwiązań specyficznych dla danego systemu baz danych. Ale w końcu jak często migruje się z jednej systemu zarządzania bazami danych do innego?</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/' rel='bookmark' title='Aktualizacja oprogramowania a wydajność'>Aktualizacja oprogramowania a wydajność</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
<li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

