<?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>fxposter&#039;s wave &#187; Framework</title>
	<atom:link href="http://blog.fxposter.org/tag/framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fxposter.org</link>
	<description>Stories about Ruby, JavaScript, Objective-C and other cool tools</description>
	<lastBuildDate>Sun, 30 Oct 2011 20:00:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<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>fxposter</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>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>PHP Frameworks: предложение</title>
		<link>http://blog.fxposter.org/2008/01/20/php-frameworks-suggestion/</link>
		<comments>http://blog.fxposter.org/2008/01/20/php-frameworks-suggestion/#comments</comments>
		<pubDate>Sun, 20 Jan 2008 19:44:01 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/01/20/php-frameworks-suggestion/</guid>
		<description><![CDATA[Не так давно я задавал вопрос относительно выбора PHP-фреймворка из множества ныне существующих&#8230; Отзывы послушал&#8230; Кое-что почитал по самим фреймворкам&#8230; В итоге для себя я выбрал Symfony (пусть тормозная, но вы часто делаете сайты с количеством посетителей от 10 000 в день?). Почему - вопрос сложный и, наверное, я сам до конца не знаю ответа [...]]]></description>
			<content:encoded><![CDATA[<p>Не так давно я задавал вопрос относительно выбора PHP-фреймворка из множества ныне существующих&#8230; Отзывы послушал&#8230; Кое-что почитал по самим фреймворкам&#8230; В итоге для себя я выбрал Symfony (пусть тормозная, но вы часто делаете сайты с количеством посетителей от 10 000 в день?). Почему - вопрос сложный и, наверное, я сам до конца не знаю ответа на него&#8230; Хотя одну из основных причин могу сказать - это модель, а именно Propel/Doctrine. Это единственные на данный момент ORM&#8217;ы с которыми мне реально нравится работать, разработчики которых понимают отличия функциональности уровня таблицы и уровня записи и т.д. (может есть еще хорошие ORM&#8217;ы, но я с ними просто незнаком :)) Да, кстати, я сейчас использую Symfony по работе, за что огромное спасибо <a href="http://lyubomirs.blogspot.com/">Любомиру</a>, моему &#8220;шефу&#8221;. :)</p>
<p>Но сейчас я хотел бы поговорить не об этом&#8230; Есть одна &#8220;маленькая&#8221;  идея - затеять сравнение фреймворков друг с другом. По каким критериям сравнивать - вопрос довольно сложный, я составил следующий список:</p>
<ul>
<li>Controller</li>
<li>Model</li>
<li>View</li>
<li>наличие/удобство хелперов</li>
<li>взаимодействие с JS/AJAX</li>
<li>работа с формами (сейчас с этим в Symfony, кстати, достаточно большие проблемы)</li>
<li>&#8230;</li>
</ul>
<p>Пунктов, я думаю, с вашей помощью добавится еще с десяток. Так что жду предложений.</p>
<p>Следующий вопрос - список фреймворков. Опять же, мой список пока что состоит из таких претендентов:</p>
<ul>
<li><a href="http://kohanaphp.com/">Kohana</a> (или всё же <a href="http://www.codeigniter.com/">CodeIgniter</a>)</li>
<li><a href="http://cakephp.org/">CakePHP</a></li>
<li><a href="http://www.symfony-project.org/">Symfony</a></li>
<li><a href="http://framework.zend.com/">Zend Framework</a></li>
<li>&#8230;</li>
</ul>
<p>Писать хочу в виде &#8220;один пост рассматривает все фреймворки по одному критерию&#8221;. Т.е., например, через две недели будет опубликовано сравнение моделей в выбранных фреймворках - возможности, удобства, недостатки, пожелания относительно улучшения и т.д.</p>
<p>Теперь я подошел к самому главному - хотелось бы попробовать устроить действительно коллективную работу&#8230; Никто не хочет помочь мне в этом деле? Я вот лично могу на себя взять Symfony и (хотя и не хочется) Kohana. Никто не хочет написать про CakePHP или про &lt;<em>вставьте сюда название вашего любимого фреймворка</em>&gt;? На каждый пост будет отводится, скажем, неделя-две. После этого кто-то (думаю я, если кто-то захочет помочь - пишите) скомпонует все посты в одно сравнение, сделает выводы&#8230;</p>
<p>Первым критерием для сравнения предлагаю сделать Controller и всё что с ним связано (routes, dispatchers  и т.д.). Если меня кто-то поддержит - жду ваши тексты до 1-го февраля. И 3-го будет первый пост по сравнению фреймворков.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/01/20/php-frameworks-suggestion/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>PHP Frameworks</title>
		<link>http://blog.fxposter.org/2007/01/30/php-frameworks/</link>
		<comments>http://blog.fxposter.org/2007/01/30/php-frameworks/#comments</comments>
		<pubDate>Tue, 30 Jan 2007 18:38:27 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2007/01/30/php-frameworks/</guid>
		<description><![CDATA[После полного прочтения блога Ивана Сагалаева, у меня возникла мысль, что надо бы поискать фреймворки для PHP. Все же интересно, насколько они ускоряют процесс разработки приложений/сайтов и увеличивают удобство работы вообще. Сказано - сделано. При разборе запросов гугля я наткнулся на 2 статейки (одна и вторая), в которых было представлено 2 субъективных взгляда на существующие [...]]]></description>
			<content:encoded><![CDATA[<p>После полного прочтения <a href="http://softwaremaniacs.org/blog/">блога Ивана Сагалаева</a>, у меня возникла мысль, что надо бы поискать фреймворки для PHP. Все же интересно, насколько они ускоряют процесс разработки приложений/сайтов и увеличивают удобство работы вообще. Сказано - сделано. При разборе запросов <a href="http://www.google.com/">гугля</a> я наткнулся на 2 статейки (<a href="http://www.phpit.net/article/ten-different-php-frameworks/">одна</a> и <a href="http://www.mustap.com/phpzone_post_73_top-10-php-mvc-frameworks">вторая</a>), в которых было представлено 2 субъективных взгляда на существующие PHP фреймворки.</p>
<p>В обоих статьях больше всего (как мне показалось), хвалили <a href="http://www.symfony-project.com/">Symfony</a>. Также мне приглянулись <a href="http://framework.zend.com/">Zend Framework</a> (от разработчиков PHP) и <a href="http://www.pradosoft.com/">Prado</a> (.NET-подобный фреймворк, ориентированный на обработку event&#8217;ов).</p>
<h3>Symphony</h3>
<p>Наверное, один из лучших фреймворков для PHP (блин, надоело, далее будет просто &#8220;пхп&#8221;), построенный на принципах ROR (о нем я уже <a href="/2007/01/21/ror-12/">чуть-чуть</a> писал). Он использует сторонние разработки (Propel для ORM, Creole для работы с БД и т.д.), &#8220;объединяя&#8221; их в одно целое. Здесь действительно есть очень многое, НО, по-моему, фреймворк ОЧЕНЬ сложен для новичков. Прочитав начало их документации (end-user которая), стало понятно, что МНЕ такое использовать либо еще рановато, либо вообще не стоит. Скорее всего второе :)</p>
<h3>Prado</h3>
<p>Общение с фреймворком закончилось после прочтения документации. Задумка хорошая (как я узнал позже, она сюда перекочевала из asp.net), но меня она не устроила в принципе. Мне ото фреймворка нужно было немного другое (да, <em>каюсь</em>, с MVC-паттерном я знаком лишь очень отдаленно, никогда его не использовал и узнал о нем, собственно, из <a href="http://softwaremaniacs.org/blog/">блога SM.org</a>).</p>
<h3>Zend Framework</h3>
<p>Фреймворк от разработчиков пхп. Как мне кажется, в него комманда зенда решила вложить то, чего не хватало самому языку пхп, правда в некоторых моментах они перестарались (сделайте Zend::dump() от строки с русскими буквами в юникоде), но все же пользоваться фреймворком, как по мне, вполне удобно. Он содержит много разных вещей, с помощью которых можно делать многие вещи гораздо удобнее. Им я сейчас и пользуюсь.</p>
<p>Кстати, заметил за собой такую &#8220;штуку&#8221; - вот сделал что-то с этим фреймворком, теперь мне как-то без него неуютно&#8230; Что посоветуете/скажете по этому поводу?</p>
<p>Сейчас зенд находится в стадии beta. Многие вещи еще будут переделываться (особенно это касается тех вещей, которые сейчас находятся в incubator&#8217;е), но им УЖЕ можно пользоваться и он РЕАЛЬНО помогает.<br />
Чего не то, чтобы не хватает, а что хотелось бы увидеть в этом фреймворке - так это ORM, потому как сейчас ее нет даже в инкубаторе, а жаль.</p>
<p>Я думаю, я еще вернусь к этой теме.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2007/01/30/php-frameworks/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: blog.fxposter.org @ 2012-02-05 03:16:46 -->
