<?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"
	>

<channel>
	<title>Блог FX'а &#187; Symfony</title>
	<atom:link href="http://blog.fxposter.org/tag/symfony/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fxposter.org</link>
	<description>Записки [web]девелопера</description>
	<pubDate>Tue, 06 May 2008 20:33:53 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Проект на Symfony</title>
		<link>http://blog.fxposter.org/2008/05/06/symfony-project/</link>
		<comments>http://blog.fxposter.org/2008/05/06/symfony-project/#comments</comments>
		<pubDate>Tue, 06 May 2008 20:07:17 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=415</guid>
		<description><![CDATA[В последнее время очень хочется написать что-нибудь на Symfony - для себя, для других, что-то открытое и интересное - наподобии материала о создании askeet&#8217;а, который я, к сожалению, до конца дочитать еще не успел (но я близок к завершению!), и чтение которого приносит мне реальное удовольствие.
Причем хочется сделать что-то подобное не только потому, что я [...]]]></description>
			<content:encoded><![CDATA[<p>В последнее время очень хочется написать что-нибудь на Symfony - для себя, для других, что-то открытое и интересное - наподобии материала о создании askeet&#8217;а, который я, к сожалению, до конца дочитать еще не успел (но я близок к завершению!), и чтение которого приносит мне реальное удовольствие.</p>
<p>Причем хочется сделать что-то подобное не только потому, что я &#8220;хочу показать, что symfony - это круто&#8221;, &#8220;хочу показать, что я крутой программист&#8221; - нет, скорее даже наоборот. Текущий мой проект на работе сейчас усиленно мной допиливается до состояния, в котором его хоть как-то можно будет показать людям, но внутренний код проекта сейчас пребывает, как мне кажется, в плачевном состоянии - кардинально его рефакторить времени и (если уж честно) опыта нет, а тот код, который сейчас там есть мне кажется абсолютно неоптимальным (и некрасивым). У меня  в последнее время стало появляться сильное ощущение того, что у меня просто не хватает опыта для того, чтобы реально расставить в рабочем проекте все по полочкам, а помогать мне в этом никто не будет, к сожалению. Поэтому я и хочу сделать какой-нибудь небольшой, несложный (по крайней мере, для начала) проект, смотря на разработку которого, вы, мои читатели, показывали бы мне на что мне стоит обратить внимание, что получается вообще плохо, какие части следует полностью пересмотреть. Я знаю, среди вам есть люди, имеющие гораздо больше опыта в разработке веб-приложений, чем я.</p>
<p>Сейчас для меня самый главный вопрос - что именно делать. Есть варианты:</p>
<ul>
<li>Блог - нужен, скорее всего, будет только мне, да и&#8230; сколько людей уже строило свои блоги&#8230; я, конечно, могу быть одним из них, но&#8230; в общем, если других вариантов не будет - возьмусь за блог</li>
<li>Простенькую социальную сеть. Даже не знаю, на какую тему, и что там вообще должно быть&#8230;</li>
<li>Может, что-нибудь еще&#8230; Хочу адекватные по сложности (и по времени разработки!) варианты услышать от вас. Что бы <strong>вы</strong> хотели, или что бы мне, на ваш взгляд, могло бы быть наиболее полезно.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/05/06/symfony-project/feed/</wfw:commentRss>
		</item>
		<item>
		<title>РИТ 2008</title>
		<link>http://blog.fxposter.org/2008/04/19/rit-2008/</link>
		<comments>http://blog.fxposter.org/2008/04/19/rit-2008/#comments</comments>
		<pubDate>Sat, 19 Apr 2008 14:36:46 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[Разное]]></category>

		<category><![CDATA[Symfony]]></category>

		<category><![CDATA[РИТ]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/04/19/rit-2008/</guid>
		<description><![CDATA[Прошла выставка&#8230; Никто практически ничего про неё не написал, по крайней мере из тех, кого я читаю сейчас - написал только Юра Артюх. Больше никаких отчетов я не видел, хотя может и пропустил что-то. Надеюсь, кстати, на следующей неделе пересечься всё-таки с человеком, который там был, послушать впечатления.
Пока же - вот здесь выложены видеозаписи выступлений [...]]]></description>
			<content:encoded><![CDATA[<p>Прошла выставка&#8230; Никто практически ничего про неё не написал, по крайней мере из тех, кого я читаю сейчас - написал только <a href="http://cssing.org.ua/2008/04/18/rit-2008-moscow/">Юра Артюх</a>. Больше никаких отчетов я не видел, хотя может и пропустил что-то. Надеюсь, кстати, на следующей неделе пересечься всё-таки с человеком, который там был, послушать впечатления.</p>
<p>Пока же - <a href="http://rutube.ru/search.html?search=%F2%E9%F4+2008">вот здесь</a> выложены видеозаписи выступлений с конференции (не все, но посмотреть есть на что). Выступления, как по мне, очень интересные. Особенно (естественно!) хочется отметить <a href="http://rutube.ru/tracks/617351.html?v=f465fd9bbbe25d3e9d779980c76d6757">выступление о моей любимой Symfony</a>.</p>
<p><em><strong>PS</strong>. Что-то не везет мне с ноутами. Заказал у знакомых HP Compaq 6720s. Обещали привезти сегодня до 12-ти из Киева. Приезжаю в час в магазин - &#8220;машина Автолюкса (служба доставки) сломалась по дороге, ноута пока нет&#8221;. </em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/04/19/rit-2008/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Symfony 1.1: Day 2 (Installing Symfony)</title>
		<link>http://blog.fxposter.org/2008/03/29/symfony-11-day-2-installing-symfony/</link>
		<comments>http://blog.fxposter.org/2008/03/29/symfony-11-day-2-installing-symfony/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 22:32:50 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[Работа]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/03/29/symfony-11-day-2-installing-symfony-2/</guid>
		<description><![CDATA[Собственно, продолжим начатое&#8230;
Сегодня мы займемся установкой Symfony на ваш компьютер. Первым делом идем на офсайт и смотрим страницу, описывающую процесс установки! Несмотря на наличие этой страницы, мне всё же задают вопросы - &#8220;как ставить&#8221;, &#8220;какой способ установки выбрать&#8221; - судя по всему, такая статья лишней не будет.
Существует 3 основных способа установки Symfony на ваш компьютер:

Скачать [...]]]></description>
			<content:encoded><![CDATA[<p>Собственно, продолжим <a href="http://blog.fxposter.org/2008/03/27/symfony-11-form-framework-day-1/">начатое</a>&#8230;</p>
<p>Сегодня мы займемся установкой <a href="http://www.symfony-project.org/">Symfony</a> на ваш компьютер. Первым делом идем на офсайт и смотрим <a href="http://www.symfony-project.org/installation/1_0">страницу, описывающую процесс установки</a>! Несмотря на наличие этой страницы, мне всё же задают вопросы - &#8220;как ставить&#8221;, &#8220;какой способ установки выбрать&#8221; - судя по всему, такая статья лишней не будет.</p>
<p>Существует 3 основных способа установки Symfony на ваш компьютер:</p>
<ol>
<li>Скачать архив</li>
<li>Установить из <a href="http://subversion.tigris.org/">SVN</a></li>
<li>Установить через <a href="http://pear.php.net/">PEAR</a></li>
</ol>
<h4>Установка путем скачивания архива</h4>
<p>Скачиваем <a href="http://www.symfony-project.org/get/symfony-1.1.0beta2.tgz">архив</a> (symfony 1.1 beta 2) с официального сайта, и распаковываем в любую директорию (не обязательно в php&#8217;шный include_path). После чего фреймворком уже можно пользоваться. Но есть неудобства - для того, чтобы пользоваться консольными командами - прийдется каждый раз прописывать в консоли путь к файлу &#8220;symfony.bat&#8221; (или &#8220;symfony&#8221;, в зависимости от того - пользуетесь вы ОС на основе *nix или Windows), этот файл находится в ./data/bin. Для того, чтобы убрать этот недостаток:</p>
<ul>
<li>под Windows - пропишите путь к &#8220;symfony.bat&#8221; в переменную PATH (помочь вам сделать это может <a href="http://www.google.com.ua/search?hl=ru&amp;client=firefox-a&amp;rls=org.mozilla%3Aru%3Aofficial&amp;hs=5r1&amp;q=Windows+environment+PATH&amp;btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&amp;meta=">Google</a>).</li>
<li>под *nix - запустите &#8220;sudo ln -s /&lt;путь к директории, куда вы распаковали архив&gt;/data/bin/symfony /usr/bin/symfony&#8221;</li>
</ul>
<p>После этого можете пользоваться в консоли командами типа &#8220;symfony init-project&#8221; и т.д.</p>
<p><strong>Плюсы</strong>: простота - кроме скачивания и распаковывания архива ничего не нужно делать; если на компьютере, на который вы собираетесь устанавливать Symfony, нет интернета - достаточно просто принести архив на этот компьютер.</p>
<p><strong>Минусы</strong>: отсутствие автоматизации - для обновления Symfony прийдется самостоятельно повторять процедуру.</p>
<h4>Установка из SVN</h4>
<p>Если вы не знакомы с SVN - лучше выберите первый вариант. Процедуру прописывания путей к ./data/bin/symfony прийдется повторять и здесь. Для установки - перейдите в директорию, куда хотите установить symfony и введите:</p>
<pre><code>svn checkout http://svn.symfony-project.com/branches/1.1</code></pre>
<p>в *nix-ОС, либо проделайте подобную процедуру (checkout) через TortoiseSVN под Windows - объяснять не буду - у TortoiseSVN интуитивно-понятный интерфейс.</p>
<p><strong>Плюсы</strong>: можно удобно обновляться до самой последней версии с помощью возможностей SVN; если на компьютере, на который вы собираетесь устанавливать Symfony, нет интернета - достаточно просто принести директорию, куда вы &#8220;установили&#8221; Symfony на этот компьютер.</p>
<p><strong>Минусы</strong>: в SVN может находится не совсем стабильная версия (стабильные версии хранятся в <code>http://svn.symfony-project.com/tags/</code>); способ сложнее для тех, кто не умеет работать с SVN.</p>
<p><strong>Установка через PEAR</strong></p>
<p>Если у вас не установлен PEAR - тогда вам пора обратится к <a href="http://www.google.com.ua/search?q=%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C+PEAR&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:ru:official&amp;client=firefox-a">Google</a>.</p>
<p>Установка очень проста (перевод доки с офсайта):</p>
<blockquote><p>Введите в коммандной строке:</p>
<pre><code>$ pear channel-discover pear.symfony-project.com</code></pre>
<p>Для установки стабильного релиза (на данный момент это 1.0.12), введите:</p>
<pre><code>$ pear install symfony/symfony</code></pre>
<p>Для установки бета-версии (на данный момент - 1.1 beta 2, т.е. то, что нам нужно), введите:</p>
<pre><code>$ pear install symfony/symfony-beta</code></pre>
<p>Для обновления Symfony воспользуйтесь следующими командами:</p>
<pre><code>$ pear upgrade symfony/symfony</code></pre>
<p>или</p>
<pre><code>$ pear upgrade symfony/symfony-beta</code></pre>
</blockquote>
<p><strong>Плюсы</strong>: очень простая установка, а также отсутствие производить махинации с переменной PATH/символическими ссылками; очень удобное и простое обновление.</p>
<p><strong>Минусы</strong>: проблемы с установкой на компьютерах без интернета (я не зря это пишу, такие вопросы уже были).</p>
<p>Есть и еще один способ:</p>
<h4> Установка sandbox&#8217;а</h4>
<p>Sandbox - это &#8220;пустое&#8221; приложение Symfony вместе с самим фреймворком. Скачать его можно <a href="http://www.symfony-project.org/get/sf_sandbox_1_1.tgz">отсюда</a>. Архив распаковываем (!!!) в директорию сервера, например: localhost у вас настроен на директорию c:\www\. Вы распаковали архив в директорию c:\www\test\ таким образом, что директория web у вас содержится в c:\www\test\web\. После этого запускаем сервер и заходим на адрес http://localhost/test/web/ и видим начальную страничку, сгенерированную Symfony.</p>
<p>Я сам в случае с Symfony 1.1 воспользуюсь именно sandbox&#8217;ом.</p>
<h4>Ссылки:</h4>
<ul>
<li>У Макса появилась <a href="http://maxsite.org/34-otlichiya-blogera-ot-kolhoznika-ili-tut-est-kto-zhivoy">отличнейшая статья</a> о том, что сейчас наблюдается в рунете с блогами с SMO. Знать бы, как с этим бороться&#8230;</li>
<li>Тем, кто использует Propel в Symfony -появился отличный плагин, упрощающий написание запросов через Criteria - <a href="http://redotheweb.com/2008/03/27/sfpropelfinder-is-like-jquery-for-propel/">sfPropelFinder</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/03/29/symfony-11-day-2-installing-symfony/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Symfony 1.1 Form Framework: Day 1</title>
		<link>http://blog.fxposter.org/2008/03/27/symfony-11-form-framework-day-1/</link>
		<comments>http://blog.fxposter.org/2008/03/27/symfony-11-form-framework-day-1/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 21:45:59 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[Работа]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/03/27/symfony-11-form-framework-day-1/</guid>
		<description><![CDATA[Ну что ж, начнем повествование&#8230;
В Symfony 1.1, в отличии от предыдущей версии, полностью изменилась работа с формами (а также еще очень многими вещами, которых, я надеюсь, я коснусь позже) - вместо кучи кода, разбросанного по многим местам (которым, впрочем, вполне удобно пользоваться благодаря достаточно удобным view helper&#8216;ам) появилось достаточно красиво спроектированная ОО-система, собирающая логику работы [...]]]></description>
			<content:encoded><![CDATA[<p>Ну что ж, начнем повествование&#8230;</p>
<p>В <a href="http://www.symfony-project.org/">Symfony</a> 1.1, в отличии от предыдущей версии, полностью изменилась работа с формами (а также еще очень многими вещами, которых, я надеюсь, я коснусь позже) - вместо кучи кода, разбросанного по многим местам (которым, впрочем, вполне удобно пользоваться благодаря достаточно удобным <a href="http://www.symfony-project.org/api/1_0/FormHelper">view helper</a>&#8216;ам) появилось достаточно красиво спроектированная ОО-система, собирающая логику работы с формами в одном месте.</p>
<p>На That&#8217;s Quality не зря назвали <a href="http://www.thatsquality.com/section-name/symfony">серию постов</a> &#8220;Forms, Widgets and Validators&#8221; - работа с формами предполагает знания именно об этих трех компонентах, которые объединены под общим названием Form Framework:</p>
<ul>
<li>Forms - компонент отвечает за логику работы формы, не зацикливаясь на её внешнем виде.</li>
<li>Widgets - собственно, классы, представляющие собой графические элементы формы. Здесь определяется то, как форма будет выглядеть внешне.</li>
<li>Validators - компонент, отвечающий за проверку правильности введенных значений в форму.</li>
</ul>
<p>На самом деле, насколько я понял из кода Symfony, эти три компонента всё же довольно сильно связаны между собой и вряд ли вам захочется использовать каждый из них по отдельности, но в общем они составляют довольно целостную структуру.</p>
<p>Как же это с этим всем великолепием работать, спросите вы? Ответы будут в следующих статьях, а пока же просто приведу пример использования формы.</p>
<p>Создаем саму форму в контроллере:</p>
<pre><code class="php">class userActions extends sfActions
{
  public function executeIndex()
  {
    $this->form = new RegisterForm();
  }
}
</code></pre>
<p>И выводим её во View:</p>
<pre><code class="html">&lt;form method="post" action="&lt;?php echo url_for('user/index') ?&gt;"&gt;

&lt;table cellspacing="0" cellpadding="0"&gt;
  &lt;?php echo $form ?&gt;
&lt;/table&gt;

&lt;div class="submit"&gt;
  &lt;input type="submit" value="Submit" /&gt;
&lt;/div&gt;

&lt;/form&gt;</code></pre>
<p>Что это еще за RegisterForm? Узнаете завтра, а пока что советую вспомнить, о чем я писал в <a href="http://blog.fxposter.org/2008/01/22/symfony-form-helpers-example/">статье про формы в Symfony 1.0</a>. Вспомнили? Теперь стало понятно название RegisterForm? <img src='http://blog.fxposter.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/03/27/symfony-11-form-framework-day-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Symfony 1.1 Form Framework - перед тем, как начать</title>
		<link>http://blog.fxposter.org/2008/03/26/symfony-11-form-framework-before-the-beginning/</link>
		<comments>http://blog.fxposter.org/2008/03/26/symfony-11-form-framework-before-the-beginning/#comments</comments>
		<pubDate>Tue, 25 Mar 2008 21:52:47 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[Работа]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/03/26/symfony-11-form-framework-before-the-beginning/</guid>
		<description><![CDATA[Засел я сейчас за написание давно обещанной статьи про новый Form Framework, который будет включен в состав Symfony 1.1. Пока разобрался, что и как подключать - Symfony 1.1 Sandbox упорно не хотел работать с базой данных так, как нужно было бы, пока поглядел в кодах - что и как нужно делать (а то порядком уже [...]]]></description>
			<content:encoded><![CDATA[<p>Засел я сейчас за написание давно обещанной статьи про новый Form Framework, который будет включен в состав Symfony 1.1. Пока разобрался, что и как подключать - <a href="http://www.symfony-project.org/get/sf_sandbox_1_1.tgz">Symfony 1.1 Sandbox</a> упорно не хотел работать с базой данных так, как нужно было бы, пока поглядел в кодах - что и как нужно делать (а то порядком уже подзабыл всё, что я смотрел при прошлом просмотре Symfony 1.1). В общем, решил я, что одной статьей дело не обойдется - слишком уж много всего рассказывать нужно, так что с завтрашнего дня я буду выкладывать одну статью в день, которые будут касаться форм в Symfony 1.1. Эти статьи можно будет считать &#8220;русским аналогом&#8221; <a href="http://www.thatsquality.com/article/section/name/symfony/">вот этого цикла статей</a> - это не будет перевод статей, скорее я буду руководствоваться тем, что написано там, чтобы знать, куда дальше двигаться в своем повествовании, при этом, возможно, останавливаясь на некоторых моментах, которые, на мой взгляд, достаточно важны для новичков в <a href="http://www.symfony-project.org/">Symfony</a>.</p>
<p>В общем, посмотрим&#8230; Завтра посмотрим. <img src='http://blog.fxposter.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em><strong>PS</strong>. Сегодня, кстати, вышла вторая бета-версия Symfony 1.1, на которой я и буду тестировать всё, что я напишу. Список изменений по сравнению с Symfony 1.0 лежит <a href="http://www.symfony-project.org/blog/2008/03/25/symfony-1-1-beta-2-released-what-s-new">здесь</a> - достаточно занимательное чтиво.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/03/26/symfony-11-form-framework-before-the-beginning/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Symfony и будущее этого блога</title>
		<link>http://blog.fxposter.org/2008/02/26/symfony-and-the-future/</link>
		<comments>http://blog.fxposter.org/2008/02/26/symfony-and-the-future/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 19:04:19 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[Работа]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/02/26/symfony-and-the-future/</guid>
		<description><![CDATA[Хочется немного прокомментировать предыдущую статью и отзывы как о ней (основная их часть, конечно, на Хабрахабре), так и о фреймворке в целом.

Я вообще считаю, что пишу не слишком интересно (по сравнению с людьми, блоги которых я читаю), но реакция на некоторые мои посты говорит совершенно иное, и я этому очень рад.
Статья, ИМХО, удалась. И, судя [...]]]></description>
			<content:encoded><![CDATA[<p>Хочется немного прокомментировать <a href="http://blog.fxposter.org/2008/02/26/symfony-how-to-begin/">предыдущую статью</a> и отзывы как о ней (основная их часть, конечно, на <a href="http://habrahabr.ru/blog/symfony/36551.html">Хабрахабре</a>), так и о фреймворке в целом.</p>
<ol>
<li>Я вообще считаю, что пишу не слишком интересно (по сравнению с людьми, блоги которых я читаю), но реакция на некоторые мои посты говорит совершенно иное, и я этому очень рад.</li>
<li>Статья, ИМХО, удалась. И, судя по отзывам, многие вполне не прочь прочитать что-нибудь еще по этой теме. Хотя, если честно, я рассчитывал на иной результат - многим (особенно в рунете) кажется, что <a href="http://www.symfony-project.org/">Symfony</a> слишком тормознутая и сложная, и что тратить время на её изучение совершенно не стоит, ведь есть всякие <a href="http://codeigniter.com/">CodeIgniter</a>&#8216;ы и прочее. Оказалось, всё не совсем так, и еще есть люди, которые думают иначе (а есть и такие, которые стали думать иначе после моей статьи)&#8230; И я этому очень рад.</li>
<li>В рунете очень мало ресурсов по Symfony&#8230; И мне хочется немного заполнить эту нишу. Да, уже есть перевод книги по Symfony (хоть и не полный) на русский язык, но этого мало. В рунете не хватает простых &#8220;туториалов&#8221; - как делать то или иное, с какой стороны подходить к этому фреймворку, пошаговых примеров разработки приложений (типа 24-хдневного <a href="http://www.symfony-project.org/askeet/1_0/">guide&#8217;а</a> по построению <a href="http://www.askeet.com/">Askeet</a>)&#8230; С одной стороны - я не сильно люблю писать тексты для чайников (либо переводить зарубежные), но с другой - мне, в принципе, не сложно, а если другим будет от этого польза - то я буду только рад. <strong>Стоит ли мне писать что-то подобное?</strong></li>
</ol>
<p>Да и вообще - хочется услышать ваши пожелания относительно того - о чем стоит писать в пределах глобальной темы - фреймворка Symfony.</p>
<p><em><strong>PS</strong>. Писать часто буду вряд ли - времени нет особо&#8230; Но я стараюсь выделять своему блогу время. :) </em></p>
<p><em><strong>PPS</strong>. Пост про Symfony 1.1 Form Framework будет&#8230; Очень надеюсь, что на этой неделе&#8230;</em></p>
<p><em><strong>PPPS</strong>. Писать на Хабрахабр интересные статьи очень выгодно:</em></p>
<p><img src="http://blog.fxposter.org/wp-content/uploads/2008/02/2261546-counter-orange-male.gif" alt="Yandex Counter" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/02/26/symfony-and-the-future/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Symfony: как начать</title>
		<link>http://blog.fxposter.org/2008/02/26/symfony-how-to-begin/</link>
		<comments>http://blog.fxposter.org/2008/02/26/symfony-how-to-begin/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 22:41:03 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[Работа]]></category>

		<category><![CDATA[Django]]></category>

		<category><![CDATA[MVC]]></category>

		<category><![CDATA[ORM]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/02/26/symfony-how-to-begin/</guid>
		<description><![CDATA[Чем больше я работаю над своим первым проектом на работе, тем больше мне хочется в нем поменять и тем больше я жалею о том, что перед началом работы я не прочитал до конца «The Definitive Guide to Symfony» и не изучил плагины для Symfony. Многие из них мне бы помогли намного сократить время разработки и, [...]]]></description>
			<content:encoded><![CDATA[<p>Чем больше я работаю над своим первым проектом на работе, тем больше мне хочется в нем поменять и тем больше я жалею о том, что перед началом работы я не прочитал до конца «<a href="http://www.symfony-project.org/book/1_0/">The Definitive Guide to Symfony</a>» и не изучил <a href="http://trac.symfony-project.com/wiki/SymfonyPlugins">плагины</a> для <a href="http://www.symfony-project.org/">Symfony</a>. Многие из них мне бы помогли намного сократить время разработки и, что самое главное, не думать о том, как красиво реализовать те или иные вещи… И еще одно — если у вас уже есть кусок системы (как это было у меня), который вы собираетесь переписывать с использованием вашего фреймворка (или просто переписывать, потому что код вам не нравиться) — то мой вам совет — <strong>потратьте время на то, чтобы спроектировать этот кусок на план вашей новой системы, не бросайтесь сразу всё переписывать</strong> (каюсь, я поступил именно так), так как после анализа (который, возможно, займет у вас не один день, и даже не одну неделю), возможно, от предыдущей архитектуры системы не останется и следа.</p>
<p><em>Вообще, я люблю проектировать, продумывать, анализировать те или иные решения, которые хочу внедрить в систему (хотя, признаюсь, опыта у меня в этом маловато), но как обьяснить заказчику, что ты провел день в раздумьях… Эх…</em></p>
<p>Ну ладно, это я отвлекся. Сегодня хочется рассказать о том, с чего стоит начать при разработке системы с помощью Symfony и каких правил следует придерживаться.</p>
<p><span id="more-368"></span>Собственно, всё начинается с создания проекта (project) и приложений (applications) в нем. Как это делается — можно почитать в книжке (ссылка приведена выше), а мне бы хотелось остановиться на обьяснении того, что такое проект и принципах выбора приложений в нем — какие им дать имена, как их структурировать и т.д.</p>
<h4>Проект</h4>
<p>Насколько я понял, в общем случае предполагается, что проект у вас будет один на весь сайт, и он будет представлять собой некое хранилище приложений, конфигурационных файлов и моделей, которыми будут пользоваться все приложения этого проекта.</p>
<h4>Приложения</h4>
<p>В отличии от <a href="http://www.djangoproject.com/">Django</a> — здесь приложение не является атомарной единицей системы, которую можно использовать в других проектах… В Symfony они созданы лишь для того, чтобы логически (ну, и физически) разграничить функциональность вашего проекта. И самое главное — приложения имеют место быть только в рамках одного проекта. Т.е. если вы в рамках проекта удалите одно приложение — другие от этого не пострадают, но вот перенести из одного проекта в другой приложение будет очень проблематично, т. к. оно зависит от настроек проекта, от модели проекта и так далее.</p>
<p>Будет нелишним сказать, что официально рекомендовано (читать как «предлагается») в проекте создавать два приложения: frontend и backend (для русскоязычной аудитории термин «админка» в данном случае будет более уместен). Сам могу порекомендовать создавать приложения только для объединения модулей, которые ставят перед собой одну цель. Например, та же админка, пользовательский интерфейс (то есть, например, профиль пользователя, всё, что пользователь может изменять на сайте) и frontend (всё, что доступно всем).</p>
<p><em>Сам я пользуюсь рекомендацией книги и имею два приложения в своем проекте.</em></p>
<p>Плюсы и минусы такого подхода мне рассматривать не хочется. Скажу лишь, что для меня Django’вский подход гораздо более удобен и логичен, и вот эти проекты/приложения для новичка выглядят достаточно сложно и непонятно, в большинстве случаев новички просто слушаются рекомендаций книги, не совсем понимая, что это и зачем это нужно. Я бы на месте разработчиков Symfony подумал бы о пересмотре этого подхода, особенно, если учитывать, что плагины в Symfony — это по сути те же Django apps, но об этом несколько позже.</p>
<h4>Окружения (environments)</h4>
<p>Останавливаться на окружениях особенно не хочется. Это очень удобный, но в то же время очень простой механизм, обеспечивающий возможность заходить в одно и то же приложение с различными серверными настройками. Если сказать проще — представьте себе, что у вас есть приложения и галочка, которая переключает режим его работы в debug-mode и обратно. В debug-mode, например, все события логгируются, все ошибки выводятся на экран и т.д. Если же debug-mode выключен — все логи выключены, и на экране никогда никаких ошибок появляться не будет. Так вот — в Symfony вместо флага debug/<nobr>не-debug</nobr> имеется просто несколько различных окружений, каждое из которых можно настроить ПОЛНОСТЬЮ, т. е. не система решает — что включить, а что выключить, а вы сами. Хочется также отметить, что особо копаться в настройках вам не прийдется — по умолчанию для каждого приложения создается 3 environment’а: production, development, testing (используется исключительно при тестировании).</p>
<p>В общем, тут придраться не к чему — всё, на мой взгляд, просто идеально.</p>
<h4>Модули (modules)</h4>
<p>… содержат в себе контроллер с действиями и представления (т.е. MV из <a href="http://ru.wikipedia.org/wiki/Model-view-controller">MVC</a>), а также конфигурационные файлы и, возможно, библиотеки, нужные только в этом конкретном модуле. Тут всё достаточно просто и понятно.</p>
<p>Модули (как и приложения с проектом) можно создавать автоматически (и помощью командной строки). Кроме создания простого модуля можно создать (опять же — автоматически) <a href="http://en.wikipedia.org/wiki/Create%2C_read%2C_update_and_delete">CRUD</a> (<a href="http://en.wikipedia.org/wiki/Scaffold_%28programming%29">Scaffolding</a>) для одной из таблиц, либо админку (опять же, для одной из таблиц). Админка отличается тем, что никакого кода писать практически не нужно — почти всё в ней (фильтрация, сортировка и т.д.) настраивается с помощью конфигурационного файла, что ОЧЕНЬ удобно (привет джангистам, они поймут). CRUD же очень полезен при начальных стадиях разработки. Пример — добавили вы таблицу пользователей, теперь вам нужно: выводить список пользователей, позволять им редактировать свой профиль и регистрироваться. Вместо того, чтобы всё писать с самого начала — создаем CRUD-модуль для таблицы пользователей, а потом уже можно начинать писать свой код, основываясь на уже сгенерированном. В неявный плюс такого решения можно отнести то, что коды модулей получаются похожими друг на друга и путаницы возникает меньше.</p>
<p>Последнее, на чем хотелось бы остановиться — это…</p>
<h4>Модели (models)</h4>
<p>Все модели хранятся в одном (или нескольких) <a href="http://yaml.org/">YAML</a>-файлах. К написанию моделей привыкаешь за <nobr>3—4</nobr> дня. Из YAML модель с помощью одной комманды преобразуется в автоматически сгенерированные базовые классы <a href="http://ru.wikipedia.org/wiki/ORM">ORM</a> (<a href="http://propel.phpdb.org/trac/">Propel</a> или <a href="http://www.phpdoctrine.org/">Doctrine</a>). Всё быстро, просто и аккуратно.</p>
<p>Пожалуй, это всё, что может понадобиться новичку при изучении Symfony (чтобы она не казалась ему <nobr>какой-то</nobr> сложной и непонятной системой, какой она мне показалась год назад).</p>
<p>А вот теперь перейдем непосредственно к моим рекомендациям. Но перед этим я расскажу вам про…</p>
<h4>Плагины (plugins)</h4>
<p>Плагины — это, по сути, тот код, который может быть использован несколько раз в разных проектах и приложениях. Плагины могут содержать:</p>
<ul>
<li>конфигурационные файлы, в том числе свои модели (!!!)</li>
<li>модули</li>
<li>библиотеки</li>
</ul>
<p>Я могу оказаться не прав, но как мне кажется, плагины — это такие себе мини-проекты, «всё в себе», чем выгодно отличаются от Symfony applications. На мой взгляд, ставку стоило делать в первую очередь на них — убрать приложения, а вместо них поставить плагины и создать некий инструмент, который бы позволил эти плагины связывать между собой.</p>
<h4>Мои рекоммендации</h4>
<ul>
<li>В первую очередь — проектирование. Не скупитесь на этом шаге, анализируйте и уточняйте у заказчика непонятные пункты.</li>
<li>Видя перед собой (да хоть в уме) макет системы — продумайте, на какие части систему можно разбить.</li>
<li>Поищите среди существующих плагинов такие части (<strong>обязательно</strong>). Я в своем проекте использовал следующие плагины:
<ul>
<li><a href="http://trac.symfony-project.com/wiki/sfGuardPlugin">sfGuardPlugin</a> — user management, security и т.д. Плагин - must have.</li>
<li><a href="http://trac.symfony-project.com/wiki/sfDateTimePlugin">sfDateTimePlugin</a> — очень удобная работа с датами и временем</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelAlternativeSchemaPlugin">sfPropelAlternativeSchemaPlugin</a> — полезен при работе с плагинами, позволяет менять модели, прописанные в плагинах, не изменяя коды самих плагинов</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelApprovableBehaviorPlugin">sfPropelApprovableBehaviorPlugin</a> — мне очень пригодился при «активации пользователей»</li>
<li><a href="http://trac.symfony-project.com/wiki/sfThumbnailPlugin">sfThumbnailPlugin</a> — уменьшение картинок (не смотрите на название — с ресайзом <nobr>3MP-фотографий</nobr> к 800×600 плагин справляется на отлично)</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelActAsTaggableBehaviorPlugin">sfPropelActAsTaggableBehaviorPlugin</a> — если вам нужны тэги</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelActAsSluggableBehaviorPlugin">sfPropelActAsSluggableBehaviorPlugin</a> — если вам нужны slug’и (а я советую их использовать — очень хорошо сказывается на читаемости url’ов, когда вместо id туда засовывать slug’и)</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelActAsRatableBehaviorPlugin">sfPropelActAsRatableBehaviorPlugin</a> — рейтинги, довольно крутые, мне, к сожалению, не подошли…</li>
<li><a href="http://trac.symfony-project.com/wiki/sfPropelActAsCommentableBehaviorPlugin">sfPropelActAsCommentableBehaviorPlugin</a> — всё, что нужно для комментариев</li>
</ul>
</li>
<li>Используйте в работе автоматически генерируемые CRUD-модули и модули для админки</li>
</ul>
<p>Вот, пожалуй, и всё на сегодня. Жду ваших комментариев.</p>
<p>Давно у меня таких больших статей не было…</p>
<p><a href="http://habrahabr.ru/blog/webdev/36551.html">Запостил</a> на Хабрахабр.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/02/26/symfony-how-to-begin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ссылки по Symfony и маленький конвертер</title>
		<link>http://blog.fxposter.org/2008/02/14/symfony-links-simple-converter/</link>
		<comments>http://blog.fxposter.org/2008/02/14/symfony-links-simple-converter/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 06:34:17 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/02/14/symfony-links-simple-converter/</guid>
		<description><![CDATA[Мдя, заработался совсем&#8230; Писать нет времени абсолютно&#8230; Поэтому сегодня будут ссылки:

Отличная серия постов по Symfony 1.1 Form Framework
Блог по  Symfony (официальный или нет, хз). Была интересна статья про Symfony IDE. Теперь я пользуюсь Eclipse + Symfoclipse.
Русскоязычное сообщество Symfony (на мой взгляд, если у вас с английским более-менее нормально, сюда лучше вообще не ходить - [...]]]></description>
			<content:encoded><![CDATA[<p>Мдя, заработался совсем&#8230; Писать нет времени абсолютно&#8230; Поэтому сегодня будут ссылки:</p>
<ul>
<li><a href="http://www.thatsquality.com/section-name/symfony">Отличная серия постов по Symfony 1.1 Form Framework</a></li>
<li><a href="http://www.symfony-framework.com/">Блог по  Symfony</a> (официальный или нет, хз). Была интересна статья про <a href="http://www.symfony-framework.com/2007/12/10/best-symfony-ide-eclipse-pdt-symfoclipse-clay/">Symfony IDE</a>. Теперь я пользуюсь Eclipse + Symfoclipse.</li>
<li><a href="http://sfproject.ru/forum/">Русскоязычное сообщество Symfony</a> (на мой взгляд, если у вас с английским более-менее нормально, сюда лучше вообще не ходить - нифига интересного).</li>
<li>Книгу по Symfony на русском лучше всего читать <a href="http://trac.symfony-project.com/wiki/Documentation/ru_RU">здесь</a> (есть несколько переводов, как я понял, один из них на вышеприведенном сайте, но тут - самый полный).</li>
</ul>
<p>И напоследок: мне недавно нужен был перевод из русского UTF-8 на латиницу в PHP. Ддо этого я его делал так: считываем по символу (или по нескольку символов) из строки и строим новую строку транслитерированием. Из плюсов - быстро, из минусов - напрягает выбирать по нескольку букв. Потом мне предложили использовать str_replace. Из плюсов - быстро пишется. К сожалению, долго работает. <img src='http://blog.fxposter.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Есть и еще один вариант:</p>
<pre><code class="php">function rus_to_translit($string)
{
  $converter = array(
    'а' => 'a',  'б' => 'b',  'в' => 'v',   'г' => 'g',  'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh',
    'з' => 'z',  'и' => 'i',  'й' => 'y',   'к' => 'k',  'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
    'п' => 'p',  'р' => 'r',  'с' => 's',   'т' => 't',  'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
    'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '\'', 'ы' => 'y', 'ъ' => '',  'э' => 'e', 'ю' => 'yu',
    'я' => 'ya',
    'А' => 'A',  'Б' => 'B',  'В' => 'V',   'Г' => 'G',  'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'ZH',
    'З' => 'Z',  'И' => 'I',  'Й' => 'Y',   'К' => 'K',  'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
    'П' => 'P',  'Р' => 'R',  'С' => 'S',   'Т' => 'T',  'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
    'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SCH', 'Ь' => '\'', 'Ы' => 'Y', 'Ъ' => '',  'Э' => 'E', 'Ю' => 'YU',
    'Я' => 'YA',
  );

  return strtr($string, $converter);
}</code></pre>
<p>При этом <strong>не забудьте файл, в который вы это пишете сохранить в кодировке UTF-8</strong>. ИМХО, оптимальный вариант.</p>
<p><em><strong>PS</strong>. Не забудьте сегодня поздравить свои половинки с днем всех влюбленных!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/02/14/symfony-links-simple-converter/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Propel - преимущества и недостатки</title>
		<link>http://blog.fxposter.org/2008/02/06/propel/</link>
		<comments>http://blog.fxposter.org/2008/02/06/propel/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 19:04:37 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[Работа]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Propel]]></category>

		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/02/06/propel/</guid>
		<description><![CDATA[В процессе написания сайта с использованием Symfony начали проявляться недостатки этой замечательной, на мой взгляд, библиотеки&#8230;
Первое, о чем хочется сказать - очень удобно реализованы связи one-to-many. Propel сама сгенерирует базовые классы, в которых такие связи будут учитываться изначально. Пользоваться очень удобно, своего кода в моделях приходится писать очень мало, а если быть более точным - [...]]]></description>
			<content:encoded><![CDATA[<p>В процессе написания сайта с использованием <a href="http://www.symfony-project.org/">Symfony</a> начали проявляться недостатки этой замечательной, на мой взгляд, библиотеки&#8230;</p>
<p>Первое, о чем хочется сказать - очень удобно реализованы связи one-to-many. <a href="http://propel.phpdb.org/">Propel</a> сама сгенерирует базовые классы, в которых такие связи будут учитываться изначально. Пользоваться очень удобно, своего кода в моделях приходится писать очень мало, а если быть более точным - почти весь код в данном случае получается именно product-specific. В случае со связями one-to-one проблемы появляются - как я этого ни добивался, Propel упрямо считает эти связи такими же, как и one-to-many и генерирует неправильный код. Исправляется обычно дописыванием правильных функций вручную, благо, обычно дописать только get&lt;PrimaryKey&gt;-функции. В моем случае я вообще перестроил БД так, что таких связей у меня не оказалось, так что конкретного ничего сказать не могу.</p>
<p>Второе - &#8220;всё - обьекты&#8221;. Очень популярное в ООП высказывание подходит к Propel&#8217;у просто замечательно. <img src='http://blog.fxposter.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Работа с Propel&#8217;ом заключается исключительно в работе с обьектами-записями и обьектами-таблицами. Никаких php&#8217;шных массивов (привет CI и CakePHP), одни классы и обьекты. Очень удобно. С эффективностью, правда, могут возникать огромные проблемы. Я, кстати, так до сих пор и не знаю, как эффективно выбрать (категория + количество продуктов в ней) за один запрос. Но беспокоиться об этом я буду уже потом. <img src='http://blog.fxposter.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<blockquote><p>Блин, вот сидишь на работе и думаешь - сколько всего можно написать, плохого и хорошего, а приходишь домой и нифига не вспоминается.</p></blockquote>
<p>Третье - many-to-many. После того, как у меня появились такие связи, я начал очень сильно жалеть о том, что я не выбрал <a href="http://www.phpdoctrine.org/">Doctrine</a>&#8230; По сравнению с ней (она дополнительную many-to-many таблицу создает сама и сама же за ней следит) в Propel&#8217;е всё ужасно - приходится создавать вручную таблицы и дописывать в них целую кучу кода, который бы вполне могла дописать сама библиотека в базовых классах. Может в том же CI это вполне нормальным кажется (контраст другой), но здесь, когда строишь модель базы данных - мыслишь исключительно в обьектах, которые тебе будут нужны. И добавлять (а еще сопровождать) эту [непонятно откуда взявшуюся, в реале-то её нет] таблицу очень неудобно.</p>
<p>Четвертое - опять по сравнению с Doctrine&#8217;ой - нет возможности &#8220;опускаться&#8221; на уровень SQL не теряя ORM&#8217;а. Т.е. либо Propel ORM, либо Creole (PDO). В Doctrine&#8217;е есть для таких случаев <a href="http://www.phpdoctrine.org/documentation/manual?chapter=dql-doctrine-query-language">DQL</a> - достаточно удобная штучка, если поглядеть по мануалу. Вообще, Doctrine, на мой взгляд, гораздо более функциональная, мощная и удобная библиотека. Да и User Guide&#8217;ы у неё гораздо более полные и, как ни странно, user-friendly.</p>
<p>Но по сравнению со всем остальным, что я видел на PHP - Propel - это <strong>очень</strong> круто.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/02/06/propel/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Symfony 1.0: работа с формами</title>
		<link>http://blog.fxposter.org/2008/01/22/symfony-form-helpers-example/</link>
		<comments>http://blog.fxposter.org/2008/01/22/symfony-form-helpers-example/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 21:34:55 +0000</pubDate>
		<dc:creator>FX Poster</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<category><![CDATA[Framework]]></category>

		<category><![CDATA[ORM]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/01/22/symfony-form-helpers-example/</guid>
		<description><![CDATA[То, что мне очень не нравилось в Symfony 1.0, а именно - работа с формами, в следующей версии, которая сейчас находится в активной разработке, должно кардинально поменяться в лучшую сторону. Ну а пока что расскажу о работе с формами в текущей стабильной версии этого замечательного фреймворка.
Работа с формами здесь реализована на основе хелперов и валидаторов, [...]]]></description>
			<content:encoded><![CDATA[<p>То, что мне очень не нравилось в <a href="http://www.symfony-project.org/">Symfony</a> 1.0, а именно - работа с формами, в следующей версии, которая сейчас находится в активной разработке, должно кардинально поменяться в лучшую сторону. Ну а пока что расскажу о работе с формами в текущей стабильной версии этого замечательного фреймворка.</p>
<p>Работа с формами здесь реализована на основе <a href="http://www.symfony-project.org/api/dev/FormHelper">хелперов</a> и валидаторов, которые напрямую друг с другом не связаны вообще никак. Поподробнее можно почитать в <a href="http://www.symfony-project.org/book/1_0/">онлайн книге</a>, в <a href="http://www.symfony-project.org/book/1_0/10-Forms">главе про формы</a>.</p>
<h4>Пример работы:</h4>
<p>Предположим, что существует следующая модель пользователя (здесь и далее все конфигурационные файлы будут пприводится в формате <a href="http://yaml.org/">YAML</a>) :</p>
<pre><code class="yaml">user:
 id:
 login:
   type: varchar(64)
   required: true
   index: unique
 password:
   type: varchar(40)
   required: true
 first_name:
   type: varchar(64)
   required: true
 last_name:
   type: varchar(64)
   required: true
 email:
   type: varchar(128)
   required: true
   index: unique

...</code></pre>
<p><span id="more-336"></span></p>
<blockquote><p>Сразу хочу предупредить - в качестве ORM&#8217;а использовался Propel, для Doctrine схема будет несколько иная, но очень похожая.</p></blockquote>
<p>Создадим для этой модели форму регистрации по адресу account/register. Для этого создадим модуль account и в его actions.class.php добавим следующий код:</p>
<pre><code class="php">public function executeRegister() {
  if($this-&gt;getRequest()-&gt;getMethod() === sfRequest::POST) {
    $user = new User();
    $user-&gt;setLogin($this-&gt;getRequestParameter('login'));
    $user-&gt;setPassword($this-&gt;getRequestParameter('password'));
    $user-&gt;setFirstName($this-&gt;getRequestParameter('first_name'));
    $user-&gt;setLastName($this-&gt;getRequestParameter('last_name'));
    $user-&gt;setEmail($this-&gt;getRequestParameter('email'));
    $user-&gt;save();
    $this-&gt;redirect('main/index');
  }
}</code></pre>
<p>Для этого метода создадим шаблон registerSuccess.php примерно следующего содержания:</p>
<pre><code class="html">&lt;?php use_helper('Validation') ?&gt;

&lt;?php echo form_tag('account/register') ?&gt;

&lt;fieldset&gt;

&lt;div&gt;
&lt;?php echo label_for('login', 'Логин'); ?&gt;
&lt;?php echo input_tag('login', $sf_params-&gt;get('login'), array('class' =&gt; 'text')); ?&gt;
&lt;?php echo form_error('login'); ?&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;?php echo label_for('password', 'Пароль'); ?&gt;
&lt;?php echo input_password_tag('password', null, array('class' =&gt; 'text')); ?&gt;
&lt;?php echo form_error('password'); ?&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;?php echo label_for('password_repeat', 'Подтверждение пароля'); ?&gt;
&lt;?php echo input_password_tag('password_repeat', null, array('class' =&gt; 'text')); ?&gt;
&lt;?php echo form_error('password_repeat'); ?&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;?php echo label_for('first_name', 'Фамилия'); ?&gt;
&lt;?php echo input_tag('first_name', $sf_params-&gt;get('first_name'), array('class' =&gt; 'text')); ?&gt;
&lt;?php echo form_error('first_name'); ?&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;?php echo label_for('last_name', 'Имя'); ?&gt;
&lt;?php echo input_tag('last_name', $sf_params-&gt;get('last_name'), array('class' =&gt; 'text')); ?&gt;
&lt;?php echo form_error('last_name'); ?&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;?php echo label_for('email', 'E-mail'); ?&gt;
&lt;?php echo input_tag('email', $sf_params-&gt;get('email'), array('class' =&gt; 'text')); ?&gt;
&lt;?php echo form_error('email'); ?&gt;
&lt;/div&gt;

&lt;/fieldset&gt;

&lt;div class="submit"&gt;
&lt;?php echo submit_tag('Зарегистрироваться') ?&gt;
&lt;/div&gt;
&lt;/form&gt;</code></pre>
<p>Всё, регистрация уже работает и вы вполне можете заходить по адресу account/register вводить данные и нажимать кнопку &#8220;Зарегистрироваться&#8221;. Одна проблема - никаких ограничений на вводимые данные нет. Давайте это исправим.</p>
<p>С этого момента в дело вступают валидаторы. Создадим директорию validate в модуле и добавим туда register.yml следующего содержания:</p>
<pre><code class="yaml">fields:
  login:
    required:
      msg: Логин не может быть пустым
    sfPropelUniqueValidator:
      class: User
      column: login
      unique_error: Уже существует пользователь с таким логином
  password:
    required:
      msg: Пароль не может быть пустым
  password_repeat:
    required:
      msg: Пароль не может быть пустым
    sfCompareValidator:
      check: password
      compare_error: Пароли не совпадают
  email:
    required:
      msg: E-mail не может быть пустым
    sfEmailValidator:
      strict: true
      email_error: Неправильный формат e-mail'а
    sfPropelUniqueValidator:
      class: User
      column: email
      unique_error: Уже существует пользователь с таким e-mail
  first_name:
    required:
      msg: Введите свою фамилию
  last_name:
    required:
      msg: Введите своё имя</code></pre>
<p>С этого момента все входные данные будут проверятся на валидность. Как можно видеть - для каждого поля формы указываются отдельные валидаторы. Перечислим используемые здесь:</p>
<ul>
<li><em>required</em> - показывает, что поле не должно быть пустым, аттрибут msg содержит тот текст, который будет выведен при вызове в шаблоне функции form_error с переданным в качестве аргумента названием поля (см. registerSuccess.php выше)</li>
<li><em>sfPropelUniqueValidator</em> - проверяет, существуют ли в указанной таблице еще записи, содержащие введенное значение в указанном домене</li>
<li><em>sfCompareValidator</em> - сравнивает текущее поле с полем, указанным в параметре check</li>
<li><em>sfEmailValidator</em> - ну, тут, я думаю, всё понятно</li>
</ul>
<p>Теперь хочется сказать, что если все входные данные не пройдут валидацию, то вместо метода executeRegister будет вызван метод handleErrorRegister из того же класса, если такой существует. В данном случае я хочу, чтобы пользователя переадресовывало на ту же страницу (чтобы пользователь мог увидеть ошибки, которые он допустил при вводе данных). Для этого я добавлю в класс простой метод handleErrorRegister следующего вида:</p>
<pre><code class="php">public function handleErrorRegister() {
  return sfView::SUCCESS;
}</code></pre>
<p>Теперь даже если данные не пройдут валидацию - всё равно будет отображена та же страничка.</p>
<h4>Выводы</h4>
<p>В плюсы можно занести следующее:</p>
<ul>
<li>В Symfony достаточно удобные хелперы для работы с формами</li>
<li>В плюсы, на мой взгляд, однозначно стоит занести возможность выносить  валидацию в YAML-файл. Таким образом мы, хоть для некоторых и неявно, но приучаемся к декларативному стилю программирования - мы не указываем, какие действия нужно сделать в валидации, мы указываем - каким законам будет подчиняться валидация.</li>
<li>В Symfony много классов-валидаторов, которые покрывают большую часть того, что нужно программисту при валидации данных</li>
</ul>
<p>К минусам можно отнести:</p>
<ul>
<li>Отсутствие динамически генерируемых форм (т.е. пишем класс формы, с определенными полями и навешиваем на них валидаторы, сразу же в этом классе, а потом просто создаем обьект класса и выводим его/осуществляем валидацию)</li>
<li>Соответственно, нет никаких связей между моделями и формами</li>
</ul>
<p>Плюсы хороши. Но минусы расстраивают, особенно при наличии таких замечательных моделей. Так что&#8230; читайте следующую статью, которая будет после последнего экзамена, 25-го числа, в которой я расскажу про новый Form Framework, разработанный для Symfony 1.1.</p>
<p><em><strong>PS</strong>. Я тут так подумал&#8230; Стоит ли писать про стандартные функции Symfony подробнее? Например, для тех, кто не знаком с этим фреймворком фраза &#8220;создадим модуль account&#8221; выглядит не совсем понятно. Стоит ли расписывать, как это нужно делать, или всё же лучше писать как сейчас, т.к. ответы на такие вопросы есть в онлайн книге?..</em></p>
<p><em><strong>PPS</strong>. Ну всё&#8230; Теперь я на 3 дня с головой ушел в подготовку к последнему экзамену.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/01/22/symfony-form-helpers-example/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
