<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5873664775038223487</id><updated>2011-12-27T21:24:09.199+04:00</updated><category term='грабли'/><category term='CKEditor'/><category term='url'/><category term='unique'/><category term='i18n'/><category term='csrf'/><category term='fixtures'/><category term='mail'/><category term='авторизация'/><category term='installation'/><category term='mysql'/><category term='ajax'/><category term='doctrine'/><category term='оптимизация'/><category term='date'/><category term='validation'/><category term='админ-генератор'/><category term='form'/><category term='required'/><category term='swift'/><category term='jquery'/><category term='css'/><category term='denver'/><category term='2.0'/><category term='helper'/><category term='windows'/><category term='routing'/><category term='testing'/><category term='plugins'/><category term='widget'/><category term='sfDoctrineGuardPlugin'/><title type='text'>Discover the symfony framework</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-6675002209530484370</id><published>2011-07-14T12:37:00.005+04:00</published><updated>2011-07-14T14:01:42.131+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='routing'/><title type='text'>Разбиваем routing.yml на несколько файлов</title><content type='html'>Если количество роутов в вашем routing.yml уверенно перевалило за 50, то, вероятно, ориентироваться в таком файле стало трудно. Самое очевидное решение - разбить его на несколько файлов. Но, увы, в symfony1 нет такой штатной возможности. Решение несложное. Как известно, в .yml можно использовать РНР-код. Что ж, попробуем! Пишем в самом начале routing.yml:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;//Подключаем файлы роутингов из папки /app/config/routing/&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$dir=dirname(__FILE__).'/routing/';&lt;br /&gt;$dh = opendir($dir);&lt;br /&gt;while ($file = readdir($dh))&lt;br /&gt;{&lt;br /&gt;  if (is_dir($file))&lt;br /&gt;    continue;&lt;br /&gt;    &lt;br /&gt;  require_once($dir.$file);&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;затем создаем папку /frontend/config/routing/&lt;br /&gt;&lt;br /&gt;затем создаем там любое количество файлов .yml, по которым распределяем наши роуты так, как нам этого хочется (переносим все роуты из routing.yml). Таким образом в rounting.yml остается только РНР-код, а все роуты структурированы по отдельным файлам.&lt;br /&gt;&lt;br /&gt;На производительности такое решение не скажется совершенно, т.к. все yml-файлы в dev преобразовываются в РНР-код и кэшируются.&lt;br /&gt;&lt;br /&gt;Совет: поскольку имеет значение порядок, в котором описаны роуты, именуйте файлы в соответствии с порядком их подключения:&lt;br /&gt;&lt;br /&gt;10.blog.routing.yml&lt;br /&gt;20.news.routing.yml&lt;br /&gt;30.private.routing.yml&lt;br /&gt;40.common.routing.yml&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-6675002209530484370?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/6675002209530484370/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2011/07/symfony-routing-in-many-files.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/6675002209530484370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/6675002209530484370'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2011/07/symfony-routing-in-many-files.html' title='Разбиваем routing.yml на несколько файлов'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-9133295622035779599</id><published>2011-03-21T12:28:00.004+03:00</published><updated>2011-03-21T12:41:39.703+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csrf'/><category scheme='http://www.blogger.com/atom/ns#' term='validation'/><title type='text'>How to change "csrf attack detected" message in symfony</title><content type='html'>It is proposed &lt;a href="http://stackoverflow.com/questions/2578397/symfony-1-4-custom-error-message-for-csrf-in-forms" target="_blank"&gt;some&lt;/a&gt; &lt;a href="http://bluehorn.co.nz/2010/07/15/how-to-change-csrf-attack-message-in-symfony-1-2/" target="_blank"&gt;methods&lt;/a&gt; how to change this message.&lt;br /&gt;&lt;br /&gt;I wrote another simple one:&lt;br /&gt;&lt;br /&gt;1. Override addCSRFProtection in BaseForm.class.php:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public function addCSRFProtection($secret = null)&lt;br /&gt;  {&lt;br /&gt;    parent::addCSRFProtection($secret);&lt;br /&gt;    $validatorSchema=$this-&gt;getValidatorSchema();&lt;br /&gt;    if (isset($validatorSchema[self::$CSRFFieldName])) &lt;br /&gt;    {&lt;br /&gt;      $validatorSchema[self::$CSRFFieldName]=new myValidatorCSRFToken($validatorSchema[self::$CSRFFieldName]-&gt;getOptions());&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. Add new myValidatorCSRFToken.class.php with contents:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class myValidatorCSRFToken extends sfValidatorBase&lt;br /&gt;{&lt;br /&gt;  protected function configure($options = array(), $messages = array())&lt;br /&gt;  {&lt;br /&gt;    $this-&gt;addRequiredOption('token');&lt;br /&gt;&lt;br /&gt;    $this-&gt;setOption('required', true);&lt;br /&gt;&lt;br /&gt;    $this-&gt;addMessage('csrf_attack', 'Время сессии истекло.');&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected function doClean($value)&lt;br /&gt;  {&lt;br /&gt;    if ($value != $this-&gt;getOption('token'))&lt;br /&gt;    {&lt;br /&gt;      $exception=new sfValidatorError($this, 'csrf_attack');&lt;br /&gt;      throw new sfValidatorErrorSchema($this, array($exception));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return $value;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;3. That's all :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-9133295622035779599?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/9133295622035779599/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2011/03/how-to-change-csrf-attack-detected-in.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/9133295622035779599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/9133295622035779599'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2011/03/how-to-change-csrf-attack-detected-in.html' title='How to change &quot;csrf attack detected&quot; message in symfony'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-3609961898224928532</id><published>2010-12-19T23:05:00.001+03:00</published><updated>2010-12-19T23:05:49.271+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабли: andWhere( id != ?, null)</title><content type='html'>Простой код&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$id=null;&lt;br /&gt;&lt;br /&gt;    $q=Doctrine_Query::create()&lt;br /&gt;      -&gt;from('sfGuardUser u')&lt;br /&gt;      -&gt;andWhere('u.id != ?',$id);&lt;br /&gt;      &lt;br /&gt;    print_r($q-&gt;fetchArray());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Дает совершенно неожиданные результаты:&lt;br /&gt;&lt;br /&gt;1. SQL-запрос составляется правильный (в этом можно убедиться в дебаг-панели и в логах)&lt;br /&gt;&lt;br /&gt;2. Результат (массив или коллекция) всегда будут пустыми.&lt;br /&gt;&lt;br /&gt;Решение: &lt;br /&gt;&lt;pre&gt;-&gt;andWhere('u.id != ?',(int)$id);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Вот уж не думал, что надо приводить типы в prepare_sql Доктрины!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-3609961898224928532?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/3609961898224928532/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/12/andwhere-id-null.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/3609961898224928532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/3609961898224928532'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/12/andwhere-id-null.html' title='Грабли: andWhere( id != ?, null)'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-5632264685486096395</id><published>2010-12-11T01:05:00.000+03:00</published><updated>2010-12-11T01:05:25.977+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='widget'/><title type='text'>Как убрать поле "День" из виджета даты?</title><content type='html'>Предположим, нужно сделать виджет для выбора ГОДА+МЕСЯЦА. Проще всего для этих целей подойдет стандартный sfWidgetFormDate. Убираем у него поле для выбора дня:&lt;br /&gt;&lt;pre&gt;$this-&gt;widgetSchema['month']-&gt;setOption('format','%month% %year%');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Но теперь сохранение формы дает ошибку Invalid на этом поле. Конечно: валидатор-то ожидает все три поля. Хорошо, не будем обманывать его ожиданий :) Дописываем в классе формы:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  function doBind(array $values)&lt;br /&gt;  {&lt;br /&gt;    $values['your_month_field_name']['day']=1;&lt;br /&gt;    parent::doBind($values);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;вот и все&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-5632264685486096395?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/5632264685486096395/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/5632264685486096395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/5632264685486096395'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/12/blog-post.html' title='Как убрать поле &quot;День&quot; из виджета даты?'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-3168751518571320575</id><published>2010-12-09T18:12:00.002+03:00</published><updated>2010-12-09T18:17:36.769+03:00</updated><title type='text'>Смена email пользователем</title><content type='html'>Часто в целях безопасности при регистрации пользователей их просят подтвердить свой email. Средства для генерации письма с подтверждением и экшены проверки кода подтверждения предоставляет, например, плагин sfApply. Однако, тот же плагин довольно топорно решает проблему смены email пользователем: &lt;br /&gt;&lt;pre&gt;unset($this['email'])&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Иначе говоря, все, кто хочет изменить email, идут лесом: это не разрешается. Как быть тем, кто хочет сделать более дружелюбный интерфейс?&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;На самом деле, Америки я открывать не собираюсь, но иногда готовый алгоритм может сэкономить час-другой времени. &lt;br /&gt;&lt;br /&gt;Итак, чтобы разрешить пользователю изменять свой email, нужно:&lt;br /&gt;1. Добавить поле для смены email в форму редактирования своего профиля&lt;br /&gt;2. Добавить в схему данных новое поле new_email&lt;br /&gt;3. В форме редактирования профиля добавляем обработчик данных: если email изменился, то отправляем письмо со сгенерированной ссылкой на подтверждение email&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;function updateObject($values=null)&lt;br /&gt;  {&lt;br /&gt;    $old_email=$this-&gt;getObject()-&gt;email;&lt;br /&gt;    $new_email=$this-&gt;getValue('email');&lt;br /&gt;    &lt;br /&gt;    parent::updateObject($alues);&lt;br /&gt;    &lt;br /&gt;    if ($old_email != $new_email)&lt;br /&gt;    {&lt;br /&gt;      $this-&gt;getObject()-&gt;email=$old_email;&lt;br /&gt;      $this-&gt;getObject()-&gt;new_email=$new_email;&lt;br /&gt;      $this-&gt;getObject()-&gt;validate=self::createGuid();&lt;br /&gt;      &lt;br /&gt;      $this-&gt;getOption('action')-&gt;mail(array(&lt;br /&gt;        'subject' =&gt; 'Смена email на сайте XXX.XX',&lt;br /&gt;        'name' =&gt; $this-&gt;getObject()-&gt;name,&lt;br /&gt;        'email' =&gt; $this-&gt;getObject()-&gt;new_email,&lt;br /&gt;        'parameters' =&gt; array('name' =&gt; $this-&gt;getObject()-&gt;name, 'validate' =&gt; $this-&gt;getObject()-&gt;validate),&lt;br /&gt;        'text' =&gt; 'profile/sendValidateEmailText',&lt;br /&gt;        'html' =&gt; 'profile/sendValidateEmail'&lt;br /&gt;        ));&lt;br /&gt;      &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    return $this-&gt;getObject();&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4. Составляем письмо со ссылкой:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Здравствуйте, &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вы запросили изменение регистрационного email на сайте XXX.XX. Подтвердите изменение переходом по ссылке:&lt;br /&gt;&lt;br /&gt;[php echo url_for('@confirm_new_email?validate='.$validate, true) ]&lt;br /&gt;&lt;br /&gt;Если вы не понимаете о чем речь, просто проигнорируйте это письмо.&lt;br /&gt;&lt;br /&gt;------&lt;br /&gt;Почтовый робот&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5. Добавляем роут для подтверждения смены email&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;confirm_new_email:&lt;br /&gt;  url:  /profile/confirm_new_email/:validate&lt;br /&gt;  param: { module: profile, action: confirmNewEmail }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;6. Экшен обработки подтверждения:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public function executeConfirmNewEmail(sfRequest $request)&lt;br /&gt;  {&lt;br /&gt;    $validate = $this-&gt;request-&gt;getParameter('validate');&lt;br /&gt;&lt;br /&gt;    if (!strlen($validate))&lt;br /&gt;      return 'Invalid';&lt;br /&gt;      &lt;br /&gt;    $user=Doctrine::getTable('sfGuardUser')-&gt;findOneByValidate($validate);&lt;br /&gt;    &lt;br /&gt;    if (!$user)&lt;br /&gt;      return 'Invalid';&lt;br /&gt;    &lt;br /&gt;    if (!$user-&gt;new_email)&lt;br /&gt;      return 'Invalid';&lt;br /&gt;      &lt;br /&gt;    $user-&gt;email=$user-&gt;new_email;&lt;br /&gt;    $user-&gt;validate=null;&lt;br /&gt;    $user-&gt;save();&lt;br /&gt;      &lt;br /&gt;    $this-&gt;user = $user;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-3168751518571320575?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/3168751518571320575/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/12/email.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/3168751518571320575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/3168751518571320575'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/12/email.html' title='Смена email пользователем'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-6165997211827927397</id><published>2010-11-02T01:29:00.000+03:00</published><updated>2010-11-02T01:29:36.781+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Отменяем кэширование CSS</title><content type='html'>Если вы часто (или хотя бы иногда!) меняете CSS-файлы фронтенда, то имеет смысл подумать над тем, чтобы не вводить в ступор пользователей, которые видят сайт в стилях, закэшированных их браузером. Иными словами, вы поменяли стили, а юзер думает "какого хрена у меня оно так выглядит?". &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Самое простое решение, которое пришло в голову: добавлять к пути CSS-файла таймштамп его последней модификации. Всего два шага: &lt;br /&gt;&lt;br /&gt;1. Во view.yml пишем: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  stylesheets:    [&amp;lt?php echo filemtime(sfConfig::get('sf_web_dir').'/css/main.css').'/main.css' ?&amp;gt;]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. В .htaccess добавляем: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  RewriteRule ^css/[0-9]+/(.*?)$ /css/$1 [L]&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-6165997211827927397?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/6165997211827927397/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/11/css.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/6165997211827927397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/6165997211827927397'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/11/css.html' title='Отменяем кэширование CSS'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-5995081868561855581</id><published>2010-07-21T23:22:00.002+04:00</published><updated>2010-07-21T23:28:32.017+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><title type='text'>Делаем "Направленный список чего-нибудь"</title><content type='html'>Заказчиком была поставлена следующая задача: сделать возможность создавать направленные списки (списки, в которых порядок следования элементов имеет значение), состоящие из произвольных объектов любых моделей проекта. Практическое применение: вывести в определенной последовательности 5 товаров, потом еще 10 товаров (в другой последовательности), затем 7 категорий товаров, и, наконец, 12 новостей (тоже в заранее заданной последовательности). Назовем этот список "рейтингом". Ниже представлена концепция с основными моментами реализации.&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# Рейтинг (например, "Пять лучших товаров сезона")&lt;br /&gt;Rating:&lt;br /&gt;  columns:&lt;br /&gt;    name: string(255)&lt;br /&gt;    object_name: string(255)&lt;br /&gt;    &lt;br /&gt;# Собственно, товары (или любые другие объекты)&lt;br /&gt;RatingObject:&lt;br /&gt;  columns:&lt;br /&gt;    rating_id: integer&lt;br /&gt;    object_id: integer&lt;br /&gt;    position: integer&lt;br /&gt;  relations:&lt;br /&gt;    Rating:&lt;br /&gt;      local: rating_id&lt;br /&gt;      foreign: id&lt;br /&gt;      foreignAlias: Objects&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Опускаю создание и первичную настройку админ-генератора для рейтинга. Гораздо интереснее, как добавлять (и выводить) в админке элементы рейтинга. Добавление элементов вынесем в компонент rating/objects. Я решил создавать рейтинг в два хода: сначала объект рейтинга, а потом аяксом прикреплять к нему объекты (собственно, создание направленного списка). Поэтому если рейтинг isNew(), то выводим "Будет доступно после сохранения". Шаблон компонента:&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;div&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;class&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"sf_admin_form_row sf_admin_text"&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;div&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;label&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;Объекты&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;label&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;div&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;class&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"content"&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;isNew&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;        Будет доступно после сохранения&lt;br /&gt;      &lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;else&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;      &lt;br /&gt;        &lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; include_partial&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'objects_list'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'rating'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getObject&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;      &lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;endif&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;div&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;div&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;div&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Партиал rating/objects_list довольно прост: &lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$object_in_rating_name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$rating&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;object_name&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;count&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$rating&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getObjects&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;table&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;foreach&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$rating&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;Objects&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;as&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$object&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;tr&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;td&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$object&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;position&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;td&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;td&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$object&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$object_in_rating_name&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;td&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;td&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;a&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;href&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;""&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;��зменить номер&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;a&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;a&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;href&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;""&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;Удалить&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;a&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;td&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;tr&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;endforeach&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;table&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;endif&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Реализацию добавления элемента аяксом оставлю на ваше усмотрение.&lt;br /&gt;&lt;br /&gt;Наибольший интерес представляет функция $rating-&gt;getObjects(), которая должна вывести не только позиции, но и названия элементов: НЕЧТО-&gt;__toString().&lt;br /&gt;&lt;br /&gt;Внимание, магия!&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;public&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; getObjects&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;//Вот это крут&lt;/span&gt;&lt;span style='color:#ffffff; background:#808000; '&gt;о!!&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt; Динамическое создание связи между моделями!&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$rating_object&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;new&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; RatingObject&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$rating_object&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;hasOne&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;object_name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'local'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'object_id'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'foreign'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'id'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'foreignAlias'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'RatingObject'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;return&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; Doctrine_Query&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;::&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;create&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;from&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'RatingObject r'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;leftJoin&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'r.'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;object_name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;' obj'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;where&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'r.rating_id = ?'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;id&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;orderBy&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'r.position'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;execute&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Вот и все, список создается и выводится. Спасибо за внимание.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-5995081868561855581?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/5995081868561855581/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/07/blog-post_21.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/5995081868561855581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/5995081868561855581'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/07/blog-post_21.html' title='Делаем &quot;Направленный список чего-нибудь&quot;'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-2320425244042110443</id><published>2010-07-13T18:00:00.003+04:00</published><updated>2010-07-21T23:31:20.495+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sfDoctrineGuardPlugin'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Критический баг в sfGuardPlugin</title><content type='html'>Ахтунг! Ахтунг! Метод генерации случайного ключа, используемый в sfDoctrineGuardPlugin не обеспечивает необходимый уровень случайности! Полюбуйтесь&lt;a name='more'&gt;&lt;/a&gt; на результат выполнения такого скрипта:&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;function generateRandomKey&lt;span style='color:#808030; '&gt;(&lt;/span&gt;$len &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#008c00; '&gt;20&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;    $string &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#ffffff; background:#dd0000; font-weight:bold; font-style:italic; '&gt;''&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    $pool   &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#ffffff; background:#dd0000; font-weight:bold; font-style:italic; '&gt;'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;for&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;$i &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt; $i &lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; $len&lt;span style='color:#800080; '&gt;;&lt;/span&gt; $i&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;      $string &lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; substr&lt;span style='color:#808030; '&gt;(&lt;/span&gt;$pool&lt;span style='color:#808030; '&gt;,&lt;/span&gt; rand&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#008c00; '&gt;0&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;61&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style='color:#800000; font-weight:bold; '&gt;return&lt;/span&gt; md5&lt;span style='color:#808030; '&gt;(&lt;/span&gt;$string&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  $a&lt;span style='color:#808030; '&gt;=&lt;/span&gt;array&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#800000; font-weight:bold; '&gt;for&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;$i&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt; $i&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#008c00; '&gt;10000&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt; $i&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#808030; '&gt;+&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;    $a&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;generateRandomKey&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  sort&lt;span style='color:#808030; '&gt;(&lt;/span&gt;$a&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  echo &lt;span style='color:#ffffff; background:#dd0000; font-weight:bold; font-style:italic; '&gt;'&amp;lt;pre&gt;'&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt; print_r&lt;span style='color:#808030; '&gt;(&lt;/span&gt;$a&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;echo &lt;span style='color:#ffffff; background:#dd0000; font-weight:bold; font-style:italic; '&gt;'&amp;lt;/pre&gt;'&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;Array&lt;br /&gt;(&lt;br /&gt;    [0] =&gt; 00040277cdd17cb1bcf5c1fe6b6bfa3f&lt;br /&gt;    [1] =&gt; 0005049e526fb4e0d81cacfd00dfbdb9&lt;br /&gt;    [2] =&gt; 0005049e526fb4e0d81cacfd00dfbdb9&lt;br /&gt;    [3] =&gt; 000c98ce3692ad65e04cfb8195c4ccf1&lt;br /&gt;    [4] =&gt; 001a78a81e33dd2404ca77b26fe5062e&lt;br /&gt;    [5] =&gt; 001afd9fd0211cc203732dbfff0e1a27&lt;br /&gt;    [6] =&gt; 002609dc56a8a0b1ec954f8564a6d095&lt;br /&gt;    [7] =&gt; 002698f027698c6c6870f168d3c16175&lt;br /&gt;    [8] =&gt; 002698f027698c6c6870f168d3c16175&lt;br /&gt;    [9] =&gt; 00551944377e6cd88423dd6bd4a405d7&lt;br /&gt;    [10] =&gt; 0060cdb784e19b4e1a249eb7c41b9ad2&lt;br /&gt;    [11] =&gt; 00660d7bf051a31e5711522567d0d896&lt;br /&gt;    [12] =&gt; 0072e0ad1d3f4580525aa56a6e06760e&lt;br /&gt;    [13] =&gt; 0072e0ad1d3f4580525aa56a6e06760e&lt;br /&gt;    [14] =&gt; 007d0d32e7679d6d2993bbc22ee23855&lt;br /&gt;    [15] =&gt; 009551f3c99ea3171996f5a7d6e81d00&lt;br /&gt;    [16] =&gt; 00aa621d976fec56a6e026fbcd1eae8d&lt;br /&gt;    [17] =&gt; 00aa621d976fec56a6e026fbcd1eae8d&lt;br /&gt;    [18] =&gt; 00aba8e04b4bf5a9791cca1389cd6f8f&lt;br /&gt;    [19] =&gt; 00aba8e04b4bf5a9791cca1389cd6f8f&lt;br /&gt;    [20] =&gt; 00ad8cbda706afb345c67b2465e88415&lt;br /&gt;    [21] =&gt; 00bc4422fee4df8afe008aa6427b4796&lt;br /&gt;    [22] =&gt; 00c34e04985077b351ba3d837e342c37&lt;br /&gt;    [23] =&gt; 00c34e04985077b351ba3d837e342c37&lt;br /&gt;    [24] =&gt; 00c4b5ecd1e25055a077229da427289e&lt;br /&gt;    [25] =&gt; 00c628de764e4c6e14cb86e7f3a9dfd1&lt;br /&gt;    [26] =&gt; 00c9817c76bae39e19d81548808050e3&lt;br /&gt;    [27] =&gt; 00cc63af717523d58c2ed046558f59f5&lt;br /&gt;    [28] =&gt; 00ce29af4fa16fc8378ffc51c5f1ca5b&lt;br /&gt;    [29] =&gt; 00dda66628da954f7143cdc6facf56ba&lt;br /&gt;    [30] =&gt; 00e740ae0d8ca9a4a76fdfe0ffca12ac&lt;br /&gt;    [31] =&gt; 00eb6e71364f207c6d12cc9f3ec8bd73&lt;br /&gt;    [32] =&gt; 00f8924f002e0c06659ead91a08d9145&lt;br /&gt;    [33] =&gt; 01059913459e6be4f1acec18741bfeba&lt;br /&gt;    [34] =&gt; 01196c8cc40b501ee458d31ae9e73c51&lt;br /&gt;    [35] =&gt; 011e964d7a31cbab2fd283cccc5f262a&lt;br /&gt;    [36] =&gt; 012b16ee76bce5867639b0862f17ca4f&lt;br /&gt;    [37] =&gt; 01317d9af5a85c702c537eb7b3e35839&lt;br /&gt;    [38] =&gt; 0132bd4f35d4c4298f29d29cba2d5e28&lt;br /&gt;    [39] =&gt; 0143bc1d79ba55b0f40b37562dd5687a&lt;br /&gt;    [40] =&gt; 0143bc1d79ba55b0f40b37562dd5687a&lt;br /&gt;    [41] =&gt; 01496015c9a2854cf0d1963bc8ac71cd&lt;br /&gt;    [42] =&gt; 01512e05313deb2150fa3750009ad54a&lt;br /&gt;    [43] =&gt; 01512e05313deb2150fa3750009ad54a&lt;br /&gt;    [44] =&gt; 016ca64bc48ecc9bcbc5caaa27a356de&lt;br /&gt;    [45] =&gt; 0174c23b7fa76bcb661cfa0e6c533b05&lt;br /&gt;    [46] =&gt; 017b21fbb2c8527ed77681d3cb664fde&lt;br /&gt;    [47] =&gt; 01809d2b6744ae47e67d6b65c059671e&lt;br /&gt;    [48] =&gt; 01809d2b6744ae47e67d6b65c059671e&lt;br /&gt;    [49] =&gt; 01873ea6c960562ba274bdb905a9ba01&lt;br /&gt;    [50] =&gt; 01873ea6c960562ba274bdb905a9ba01&lt;br /&gt;    [51] =&gt; 018adc381b6bd657131bc0ee372ca16d&lt;br /&gt;    [52] =&gt; 01938aa6ebe2c429f5b01ff2e9a82293&lt;br /&gt;    [53] =&gt; 01984d122e243e9b44ba7bf4606b8db9&lt;br /&gt;    [54] =&gt; 01a33d182f20206fa48c91eb759e3dbf&lt;br /&gt;    [55] =&gt; 01a729cfd1919861621a4dc6acadb5f8&lt;br /&gt;    [56] =&gt; 01adf93d27dd99ee5ca83dac2b06ccd8&lt;br /&gt;    [57] =&gt; 01b16badcbdd820adca7868b932e98fa&lt;br /&gt;    [58] =&gt; 01b16badcbdd820adca7868b932e98fa&lt;br /&gt;    [59] =&gt; 01ba3447370591b93aa22259fa9e38a1&lt;br /&gt;    [60] =&gt; 01be17f3718779abbb31d5b1a9683c8c&lt;br /&gt;    [61] =&gt; 01c0e6d3df469509433306a1cf60c760&lt;br /&gt;    [62] =&gt; 01c2a5d4e137bf1c5a3bee343e42fc8d&lt;br /&gt;    [63] =&gt; 01c2d87fc95d3fbfa456b5e4e821c11b&lt;br /&gt;    [64] =&gt; 01c8a03886384d09782228af3b651ad9&lt;br /&gt;    [65] =&gt; 01d517c30a07d0fb93f57f5bbbb9d4e1&lt;br /&gt;    [66] =&gt; 01db12722f6e15b935f864a307e6f86c&lt;br /&gt;    [67] =&gt; 01ddba314acb878e7ccbca842d7e113e&lt;br /&gt;    [68] =&gt; 01e32bf20daff39513ef4c192ac75bad&lt;br /&gt;    [69] =&gt; 01e48d154f6e5d41125ca2272a60ea2a&lt;br /&gt;    [70] =&gt; 01effb42d483d6df520329a4c54a73ba&lt;br /&gt;    [71] =&gt; 01f090603f553070e60c09bd50863bc8&lt;br /&gt;    [72] =&gt; 01fc209ca27bfc847e33e6c44bcf192c&lt;br /&gt;    [73] =&gt; 02036537652ed8ced10493d0696436d9&lt;br /&gt;    [74] =&gt; 0209322e533c0304d9546f0db2335671&lt;br /&gt;    [75] =&gt; 0211c6f1dba88cc94bcecfc1fef1ffa4&lt;br /&gt;    [76] =&gt; 0211de83e3667b3b7f03034fdea8ce33&lt;br /&gt;    [77] =&gt; 0211de83e3667b3b7f03034fdea8ce33&lt;br /&gt;    [78] =&gt; 02291c6954d348af82621c15041b90fc&lt;br /&gt;    [79] =&gt; 0236aa8ca0010e068af2b60d074b3836&lt;br /&gt;    [80] =&gt; 0245aadacfd27b526ce9be501e0ac224&lt;br /&gt;    [81] =&gt; 02481d1c850e3a1e964764c467052108&lt;br /&gt;    [82] =&gt; 02497a3803ded174a0b2748ac0cd3cc7&lt;br /&gt;    [83] =&gt; 024c35d5350ee3397bf231256f08722c&lt;br /&gt;    [84] =&gt; 024c46e69b0b5e5e24ae1ecafd250657&lt;br /&gt;    [85] =&gt; 02531e7d2071325c24b7797860b0f05f&lt;br /&gt;    [86] =&gt; 0255131fc2d1179ff287fc473cf75ad2&lt;br /&gt;    [87] =&gt; 025c0aace99127307554c1751af7e629&lt;br /&gt;    [88] =&gt; 025c1fa493776894f9c11170cba6f969&lt;br /&gt;    [89] =&gt; 026472f34996e7b86d93098732fa1330&lt;br /&gt;    [90] =&gt; 0267824b7de2d6fc9b6ab781045cf8a8&lt;br /&gt;    [91] =&gt; 026a5ba54042c5451abc3cb1642c27d1&lt;br /&gt;    [92] =&gt; 0271b7f6b8f94cedf3ab35f871383f8a&lt;br /&gt;    [93] =&gt; 02770b26c329b717fed37f5b23f5795d&lt;br /&gt;    [94] =&gt; 0278d8a67053e27178ec9e9d83a12033&lt;br /&gt;    [95] =&gt; 027fa55ff85ec3416f6137d332804e32&lt;br /&gt;    [96] =&gt; 0283795037596004f80830cb201c320c&lt;br /&gt;    [97] =&gt; 0286e923cdc3660d792fe996147f970a&lt;br /&gt;    [98] =&gt; 028ab27242b582c59d79cfa63e62654a&lt;br /&gt;    [99] =&gt; 028cf917bcef4254854048098cd7afbe&lt;br /&gt;    [100] =&gt; 028cf917bcef4254854048098cd7afbe&lt;br /&gt;    [101] =&gt; 02982254d08b2e6ee99139146fee7f4c&lt;br /&gt;    [102] =&gt; 02982254d08b2e6ee99139146fee7f4c&lt;br /&gt;    [103] =&gt; 029d546f32b00faa5ed5018dd2c8e238&lt;br /&gt;    [104] =&gt; 029e1b28f8dc027ee36b1bdc813d6130&lt;br /&gt;    [105] =&gt; 029e1b28f8dc027ee36b1bdc813d6130&lt;br /&gt;    [106] =&gt; 02a51e68bdc049f520281e8b8b6c1ea2&lt;br /&gt;    [107] =&gt; 02a51e68bdc049f520281e8b8b6c1ea2&lt;br /&gt;    [108] =&gt; 02a84bc9cef9ceafefc8ec9f51af9473&lt;br /&gt;    [109] =&gt; 02a84bc9cef9ceafefc8ec9f51af9473&lt;br /&gt;    [110] =&gt; 02b02bc759bba1e0029076dca4337229&lt;br /&gt;    [111] =&gt; 02b8fce804b8f09b5b3175d357013adb&lt;br /&gt;    [112] =&gt; 02c9734bdbf18d69c9321ae3f3b59911&lt;br /&gt;    [113] =&gt; 02d212cbb02f0bf98831352a1b11c2ea&lt;br /&gt;    [114] =&gt; 02d212cbb02f0bf98831352a1b11c2ea&lt;br /&gt;    [115] =&gt; 02d3c3c51d18094feedc29cd92888754&lt;br /&gt;    [116] =&gt; 02d3c3c51d18094feedc29cd92888754&lt;br /&gt;    [117] =&gt; 02dcf05f8bbcaf7d55d4829b3d6be8c4&lt;br /&gt;    [118] =&gt; 02f007d2c5c35fc3f9f14b59e174a7ff&lt;br /&gt;    [119] =&gt; 02f3a1fb3571d21af8965ea5540d8191&lt;br /&gt;    [120] =&gt; 02f4538ee8c0c0865ebd2e0ec7d3ad30&lt;br /&gt;    [121] =&gt; 02fbe963d51a128b1ae3823fd466ab96&lt;br /&gt;    [122] =&gt; 030a7b87921f9a16dd6feb42fa94bfb2&lt;br /&gt;    [123] =&gt; 030b13b71536daaa75072d6a7e43d3da&lt;br /&gt;    [124] =&gt; 030b13b71536daaa75072d6a7e43d3da&lt;br /&gt;    [125] =&gt; 03148b3639475eb5e3e76a406dac3dca&lt;br /&gt;    [126] =&gt; 0314c19fb2de0d4c979c2d48c80b0c35&lt;br /&gt;    [127] =&gt; 0320c6b711869bdfc3c72dd921c45ef2&lt;br /&gt;    [128] =&gt; 032568d40e531a8961132a3857366ffc&lt;br /&gt;    [129] =&gt; 0325ee296206a1a98dd2a90d94de36b2&lt;br /&gt;    [130] =&gt; 032b32d34c8e7c03e94169b238469d00&lt;br /&gt;    [131] =&gt; 032c82d26c1f03dc95ded89f3741e74c&lt;br /&gt;    [132] =&gt; 032d4cce0451512577b23f55104ac717&lt;br /&gt;    [133] =&gt; 032d4cce0451512577b23f55104ac717&lt;br /&gt;    [134] =&gt; 03433e1537b387393975f25bf274ef4d&lt;br /&gt;    [135] =&gt; 03657c51b7183d70bb1bc244288b9512&lt;br /&gt;    [136] =&gt; 0366a72b731aaa8318cff6b6f8d0caa4&lt;br /&gt;    [137] =&gt; 036945e69ec93894ab481f6ab12953a5&lt;br /&gt;    [138] =&gt; 0375a37524fe2ad6feec755b86ccb3ac&lt;br /&gt;    [139] =&gt; 0375e69481e5585b92775c98f01ba47a&lt;br /&gt;    [140] =&gt; 0375e69481e5585b92775c98f01ba47a&lt;br /&gt;    [141] =&gt; 039150c6ba39ef0af3f490cdc3fbdf3a&lt;br /&gt;    [142] =&gt; 03967e6442d234ae3000328a8c912f6e&lt;br /&gt;    [143] =&gt; 03a3b50c8b6d26da97bf21047f7c41b8&lt;br /&gt;    [144] =&gt; 03a3b50c8b6d26da97bf21047f7c41b8&lt;br /&gt;    [145] =&gt; 03abc75f55a1ff014285c5a24d39ba1c&lt;br /&gt;    [146] =&gt; 03b93c6a8b372082aecfc622b6ea6f9c&lt;br /&gt;    [147] =&gt; 03b93c6a8b372082aecfc622b6ea6f9c&lt;br /&gt;    [148] =&gt; 03cdea2d10c5be0895cfe43805c5e1d8&lt;br /&gt;    [149] =&gt; 03da5360cbe6a412b615f5b83fa68636&lt;br /&gt;    [150] =&gt; 03ddfda092dcd7469aa4dabeeddb3bbe&lt;br /&gt;    [151] =&gt; 03e17f1519c5c68b5cf839e943cb067c&lt;br /&gt;    [152] =&gt; 03e534ddc3c394a5f5e510c9c0b940f5&lt;br /&gt;    [153] =&gt; 03e534ddc3c394a5f5e510c9c0b940f5&lt;br /&gt;    [154] =&gt; 03ebb7e5ff03ed3ad87f0367f6afd264&lt;br /&gt;    [155] =&gt; 03f5e2ffd04a9d15024a61f386c02bc9&lt;br /&gt;    [156] =&gt; 03f7ee33e650659c0b2c1611d120c6f5&lt;br /&gt;    [157] =&gt; 03fd00cf3f80478683b68920c9c3e088&lt;br /&gt;    [158] =&gt; 03fd00cf3f80478683b68920c9c3e088&lt;br /&gt;    [159] =&gt; 03feb872baf61cd15816aa4a157e530f&lt;br /&gt;    [160] =&gt; 0400784770b6d83ac76edf37d9f2029f&lt;br /&gt;    [161] =&gt; 04049cc9384831e7b5683675d02309d6&lt;br /&gt;    [162] =&gt; 0418d202582d7140734f5b524ee8883a&lt;br /&gt;    [163] =&gt; 0418d202582d7140734f5b524ee8883a&lt;br /&gt;    [164] =&gt; 041b4cec1af39c1f614bab6d9c975fb9&lt;br /&gt;    [165] =&gt; 041f03de201e0329663b88b2a9676938&lt;br /&gt;    [166] =&gt; 041f03de201e0329663b88b2a9676938&lt;br /&gt;    [167] =&gt; 0421cf8d5b8dfaae46b70a991eeabffd&lt;br /&gt;    [168] =&gt; 0421cf8d5b8dfaae46b70a991eeabffd&lt;br /&gt;    [169] =&gt; 04269e9932f1d5a900e60849d3386c51&lt;br /&gt;    [170] =&gt; 042ffd45a2dabc5dee028db885cf0e4c&lt;br /&gt;    [171] =&gt; 043a25f3fe2037e704e6bd254304f87a&lt;br /&gt;    [172] =&gt; 043affbadeafa3c60983eb5943f06434&lt;br /&gt;    [173] =&gt; 043affbadeafa3c60983eb5943f06434&lt;br /&gt;    [174] =&gt; 043c20e9a8002c483c8b3bd5d35f819c&lt;br /&gt;    [175] =&gt; 0445706e315ca1fe62da7e2f62910cdd&lt;br /&gt;    [176] =&gt; 044b245ee9beb39432082e565722be5d&lt;br /&gt;    [177] =&gt; 044d05c180083efa375f9c01b1fa47c5&lt;br /&gt;    [178] =&gt; 044ef92eaf05bd225a73391b9ba32a51&lt;br /&gt;    [179] =&gt; 044ef92eaf05bd225a73391b9ba32a51&lt;br /&gt;    [180] =&gt; 0465db45baa1fd36a0d9a1cc3d23bedf&lt;br /&gt;    [181] =&gt; 046db175fd949308bacdcc74d06ab9de&lt;br /&gt;    [182] =&gt; 0473fbe235b4cb7cb84519fb218ad7f6&lt;br /&gt;    [183] =&gt; 047469b75a0f40a0a381fecf5351b1e4&lt;br /&gt;    [184] =&gt; 0478b130d2b1728e6ada3f53968c3e37&lt;br /&gt;    [185] =&gt; 0485462399a82b1dd51a578dbf5325a6&lt;br /&gt;    [186] =&gt; 0485462399a82b1dd51a578dbf5325a6&lt;br /&gt;    [187] =&gt; 048f75e54d45fdb17575c4278d8962d2&lt;br /&gt;    [188] =&gt; 048f75e54d45fdb17575c4278d8962d2&lt;br /&gt;    [189] =&gt; 0490c4cf021e0fb6734b026370b75b89&lt;br /&gt;    [190] =&gt; 049113faeaf50a4c4313d73e01e1859e&lt;br /&gt;    [191] =&gt; 04a03394c5d1037b8d2b3e0c95065951&lt;br /&gt;    [192] =&gt; 04a03394c5d1037b8d2b3e0c95065951&lt;br /&gt;    [193] =&gt; 04c3cd78a2301b625ffc8bebe6766e76&lt;br /&gt;    [194] =&gt; 04cb72cf92a4c82a401a39d037980b73&lt;br /&gt;    [195] =&gt; 04ce0db0bb29f8f64ec944772f0c03e1&lt;br /&gt;    [196] =&gt; 04d0f8e3a2ba9f03a5e3928d342c37a0&lt;br /&gt;    [197] =&gt; 04d80813adbf2624c931895561f2779f&lt;br /&gt;    [198] =&gt; 04e2607a76d5bbd936d7c94f34041643&lt;br /&gt;    [199] =&gt; 05005ce0ca1bbc76ac9ef70a12ed1a19&lt;br /&gt;    [200] =&gt; 051b3f208bf05ed7364d1b47a5b3bb4a&lt;br /&gt;    [201] =&gt; 051b3f208bf05ed7364d1b47a5b3bb4a&lt;br /&gt;    [202] =&gt; 053662192a19ed99ba2516ff17bbdae7&lt;br /&gt;    [203] =&gt; 053be8a824e724f4916626de45ba974c&lt;br /&gt;    [204] =&gt; 053c9b974d38b4125801341cc86eeb4c&lt;br /&gt;    [205] =&gt; 05421b1c1af6ae94585a7340b469aa9f&lt;br /&gt;    [206] =&gt; 0546e49529000bcaaad28b9b138bb256&lt;br /&gt;    [207] =&gt; 05484057ee95dd4d524180af71f2dad1&lt;br /&gt;    [208] =&gt; 0549d5756561a668371a2607d7673e4a&lt;br /&gt;    [209] =&gt; 05545c4f0f87876823fb37554206123e&lt;br /&gt;    [210] =&gt; 055c3f443bfa0e744ffb0130724bc703&lt;br /&gt;    [211] =&gt; 056cd71cf3aa097c60074634a9a24bfb&lt;br /&gt;    [212] =&gt; 0577ca943aab1c32e21fb6e81916b674&lt;br /&gt;    [213] =&gt; 0585571f873787c135e0dac2f733a5dc&lt;br /&gt;    [214] =&gt; 058ed81f7276d74fff8dde8f3f097004&lt;br /&gt;    [215] =&gt; 05976731c940e6a146b6a02d183f4a63&lt;br /&gt;    [216] =&gt; 059f91fdd2706ea0650cabf49c4d9121&lt;br /&gt;    [217] =&gt; 05a60d25b4ae534ac96d3f87b73cd4df&lt;br /&gt;    [218] =&gt; 05aefee4323a61900eca13fd490a3feb&lt;br /&gt;    [219] =&gt; 05bceca040babbfd957e229acafe5a3d&lt;br /&gt;    [220] =&gt; 05bef6dce1911f7e0f359d5ead2d2068&lt;br /&gt;    [221] =&gt; 05c22fd1024358412c81d8656908d5a2&lt;br /&gt;    [222] =&gt; 05c95edd3e88a0901b04b8ca898992ae&lt;br /&gt;    [223] =&gt; 05c95edd3e88a0901b04b8ca898992ae&lt;br /&gt;    [224] =&gt; 05c9b2eb63b643e8829f061ead34d100&lt;br /&gt;    [225] =&gt; 05d197dbbccee6665740a656b9901bf5&lt;br /&gt;    [226] =&gt; 05df5fe6c8c12ca6fbad68b97d5c37a7&lt;br /&gt;    [227] =&gt; 05e6e869afc0807325fc6188e5d69a7f&lt;br /&gt;    [228] =&gt; 06055fea883edf47e724abb52bceab08&lt;br /&gt;    [229] =&gt; 06185c71244c60c0f716a1c28e2e76de&lt;br /&gt;    [230] =&gt; 061a9a552d26f21c17f847561d7bf58f&lt;br /&gt;    [231] =&gt; 061ccc4d3cd49e746a5bec447bf43f6d&lt;br /&gt;    [232] =&gt; 0622e0a7f2113c378e0d63464a9f9398&lt;br /&gt;    [233] =&gt; 0622e0a7f2113c378e0d63464a9f9398&lt;br /&gt;    [234] =&gt; 0625d57e6a45175a11f6181732c4e3a6&lt;br /&gt;    [235] =&gt; 0627b966591dc374008e875f32807976&lt;br /&gt;    [236] =&gt; 06325ad662c408b8b711d08b291510ec&lt;br /&gt;    [237] =&gt; 063347a70465cc588341a252c99738cd&lt;br /&gt;    [238] =&gt; 06339f235a5bcc95ef54385823bc94d8&lt;br /&gt;    [239] =&gt; 06366d6b3c2df38a6e87d410fe376e36&lt;br /&gt;    [240] =&gt; 0647eb6f66f6f557f08c5edd6dfcc4d1&lt;br /&gt;    [241] =&gt; 064b655ec52a8a3b316d2b94cc57f141&lt;br /&gt;    [242] =&gt; 065a085b595b0818a62cbbc535d133b1&lt;br /&gt;    [243] =&gt; 067c3ca5e43ff08fa89a8420514a4a66&lt;br /&gt;    [244] =&gt; 067c3ca5e43ff08fa89a8420514a4a66&lt;br /&gt;    [245] =&gt; 067f69ffba109a56a662b390b40db200&lt;br /&gt;    [246] =&gt; 06835ca2b69b20dc67ad9104757a19ec&lt;br /&gt;    [247] =&gt; 06889ca36100ceb68e84fc9bac9cc258&lt;br /&gt;    [248] =&gt; 06889ca36100ceb68e84fc9bac9cc258&lt;br /&gt;    [249] =&gt; 0688ca65d633ee6e03a00132ed55b6fe&lt;br /&gt;    [250] =&gt; 06890d84d1bcacd7d83ab364c086606d&lt;br /&gt;    [251] =&gt; 068997232d17b7b9262f513cf5d177f5&lt;br /&gt;    [252] =&gt; 068997232d17b7b9262f513cf5d177f5&lt;br /&gt;    [253] =&gt; 068dbc0b9c99f5226da28e88251d7c3d&lt;br /&gt;    [254] =&gt; 068e5d31da448eb30a7c8be77f097383&lt;br /&gt;    [255] =&gt; 0691cdfdd04a40df77335941686da8bf&lt;br /&gt;    [256] =&gt; 0697be7da0fd8e8541c59528a6d37ed6&lt;br /&gt;    [257] =&gt; 069ba38e6a034ead4813aba5862e794c&lt;br /&gt;    [258] =&gt; 069c05db9602ae7167a3775c07a2e353&lt;br /&gt;    [259] =&gt; 069c32a87d299cf421dc8d135d9bf9aa&lt;br /&gt;    [260] =&gt; 06b19d62af34b0c37e46c7efb9e369eb&lt;br /&gt;    [261] =&gt; 06b5359ace9211d622bae7aeef5d9b91&lt;br /&gt;    [262] =&gt; 06b7fa1055d28050b082229bc73d33d0&lt;br /&gt;    [263] =&gt; 06c15e320a72f09eb2d9634a5d48284d&lt;br /&gt;    [264] =&gt; 06c15e320a72f09eb2d9634a5d48284d&lt;br /&gt;    [265] =&gt; 06c6a7db2df70bd408b6c7f70f0b41db&lt;br /&gt;    [266] =&gt; 06d2475559530a4e183f90408bf15733&lt;br /&gt;    [267] =&gt; 06d2475559530a4e183f90408bf15733&lt;br /&gt;    [268] =&gt; 06dba9a99dcaeddae330de1e280de12f&lt;br /&gt;    [269] =&gt; 06dcdba434f1d368f9d9ed41add12c5b&lt;br /&gt;    [270] =&gt; 06de71f9635ca30a133fc8ef4c8dbc5b&lt;br /&gt;    [271] =&gt; 06edb3c27104a66412daac409765634c&lt;br /&gt;    [272] =&gt; 06edb3c27104a66412daac409765634c&lt;br /&gt;    [273] =&gt; 06f153b68b95fd2a586e8d2065a91b34&lt;br /&gt;    [274] =&gt; 06f71cb0e294d3f7a83b867579b71208&lt;br /&gt;    [275] =&gt; 06f71cb0e294d3f7a83b867579b71208&lt;br /&gt;    [276] =&gt; 06fd76743edf23fafd9cf78397ed01db&lt;br /&gt;    [277] =&gt; 06fd76743edf23fafd9cf78397ed01db&lt;br /&gt;    [278] =&gt; 07056502ae5dceca6e2d733e198bf30c&lt;br /&gt;    [279] =&gt; 070b97edf2a67b567f8144008b920f94&lt;br /&gt;    [280] =&gt; 0710ac1d3e0609f09aa628c241cb4e03&lt;br /&gt;    [281] =&gt; 07140d434e15fbdc1bfe17d4361775a8&lt;br /&gt;    [282] =&gt; 07140d434e15fbdc1bfe17d4361775a8&lt;br /&gt;    [283] =&gt; 071699171636f93e74eb01304c724b36&lt;br /&gt;    [284] =&gt; 072b309bbb4d068b02f3b5602129efb3&lt;br /&gt;    [285] =&gt; 072b309bbb4d068b02f3b5602129efb3&lt;br /&gt;    [286] =&gt; 0730390bf65c638d757c2fb81e93d63c&lt;br /&gt;    [287] =&gt; 074c311e52c03fb473991434d4634f93&lt;br /&gt;    [288] =&gt; 0757475f8cc96be23fc075ed02deacb2&lt;br /&gt;    [289] =&gt; 076e9144314e5ce57257ce9a451803d2&lt;br /&gt;    [290] =&gt; 077460611ef9ca13b4d92b2c2b743b6d&lt;br /&gt;    [291] =&gt; 078b1693c06cf0dc8362051735d00a08&lt;br /&gt;    [292] =&gt; 0790db7339507ba6470b2240642aae01&lt;br /&gt;    [293] =&gt; 0797b8cf0a233568347a465b2f7771ce&lt;br /&gt;    [294] =&gt; 079b9fe0d22fc92b508e5ffbfdf71c52&lt;br /&gt;    [295] =&gt; 079f047d7645afe4990d6d93989bf650&lt;br /&gt;    [296] =&gt; 07b815cc89798d961baa65c47c6a0a99&lt;br /&gt;    [297] =&gt; 07c4390f347a311539623bcd0e1de125&lt;br /&gt;    [298] =&gt; 07c4390f347a311539623bcd0e1de125&lt;br /&gt;    [299] =&gt; 07d2a6aefc9eb0b7d24f142a1ee6ec77&lt;br /&gt;    [300] =&gt; 07dc9c054e2670e56140a435ba323f93&lt;br /&gt;    [301] =&gt; 07dc9c054e2670e56140a435ba323f93&lt;br /&gt;    [302] =&gt; 07ddd6de7a0d52be7154ca762fdc842e&lt;br /&gt;    [303] =&gt; 07ddd6de7a0d52be7154ca762fdc842e&lt;br /&gt;    [304] =&gt; 07e40890425125f143dcd0e75d2da032&lt;br /&gt;    [305] =&gt; 07e4de1a3b877852c0f9072ac2104430&lt;br /&gt;    [306] =&gt; 07e4de1a3b877852c0f9072ac2104430&lt;br /&gt;    [307] =&gt; 07eab6ca4daa7ca0b6ff59a41d231a4b&lt;br /&gt;    [308] =&gt; 07ee3787620082a525f70a5a7249595f&lt;br /&gt;    [309] =&gt; 080ae9f0f947a561663746b4e2c62009&lt;br /&gt;    [310] =&gt; 080c888a8b0ac06108b50dec94831856&lt;br /&gt;    [311] =&gt; 08114671f5d2e59ddd2e1a1aaf302eb7&lt;br /&gt;    [312] =&gt; 08114671f5d2e59ddd2e1a1aaf302eb7&lt;br /&gt;    [313] =&gt; 08151b4e83ad462e68e01cbdfc70f8f1&lt;br /&gt;    [314] =&gt; 081c72f36a4243a5afc817aa21d8355b&lt;br /&gt;    [315] =&gt; 081c72f36a4243a5afc817aa21d8355b&lt;br /&gt;    [316] =&gt; 08238dfee9f5e0d329ca27ce9b07635c&lt;br /&gt;    [317] =&gt; 08238dfee9f5e0d329ca27ce9b07635c&lt;br /&gt;    [318] =&gt; 0830db123bfb567a1c8bb65688e99d64&lt;br /&gt;    [319] =&gt; 08328825a2cc92080902b32037cf7c88&lt;br /&gt;    [320] =&gt; 08328825a2cc92080902b32037cf7c88&lt;br /&gt;    [321] =&gt; 0833a03b535203482d9c746b2915337c&lt;br /&gt;    [322] =&gt; 0833d0ccd8710ff513722ff7aeb5b17e&lt;br /&gt;    [323] =&gt; 0842e648afd3c8bfe9d1a53a0018610c&lt;br /&gt;    [324] =&gt; 0842e648afd3c8bfe9d1a53a0018610c&lt;br /&gt;    [325] =&gt; 0844a46f3083b4c95fb1343860ae5445&lt;br /&gt;    [326] =&gt; 08499e2cb274d63697e964a742a8c637&lt;br /&gt;    [327] =&gt; 0854e43f12ee56861f5bc113ce53e663&lt;br /&gt;    [328] =&gt; 085722008af67535d0eb25f620fc8acc&lt;br /&gt;    [329] =&gt; 085722008af67535d0eb25f620fc8acc&lt;br /&gt;    [330] =&gt; 085d4b89f4ab3bfc678cdccd725ba0b9&lt;br /&gt;    [331] =&gt; 0860e1234ea101be80b8f89e080811ed&lt;br /&gt;    [332] =&gt; 086807492a03a7f5bd1ca4602d63030c&lt;br /&gt;    [333] =&gt; 086807492a03a7f5bd1ca4602d63030c&lt;br /&gt;    [334] =&gt; 0870847994bca74b666ce798b4e52964&lt;br /&gt;    [335] =&gt; 0870847994bca74b666ce798b4e52964&lt;br /&gt;    [336] =&gt; 08719098a48f398a9a748d736e4bc7d9&lt;br /&gt;    [337] =&gt; 08729e96f99000a5709f142f83927ac4&lt;br /&gt;    [338] =&gt; 08729e96f99000a5709f142f83927ac4&lt;br /&gt;    [339] =&gt; 0873705ac77005f83ba8083c6d8af319&lt;br /&gt;    [340] =&gt; 087573be9184efb044e86511c27c9641&lt;br /&gt;    [341] =&gt; 0875fdcd002efa06a2e24c5ef1dd95e9&lt;br /&gt;    [342] =&gt; 0880dcc72f2901f1e7da2811c9cd1e72&lt;br /&gt;    [343] =&gt; 088a034b843f38fd48e4fae024f27e56&lt;br /&gt;    [344] =&gt; 088d29418fae8106e6a4eaa96a6fa0fd&lt;br /&gt;    [345] =&gt; 0892b26d665abd28594cd118ec4c608e&lt;br /&gt;    [346] =&gt; 0892b26d665abd28594cd118ec4c608e&lt;br /&gt;    [347] =&gt; 08935d6fd827f6705703779a53dbd30c&lt;br /&gt;    [348] =&gt; 08935d6fd827f6705703779a53dbd30c&lt;br /&gt;    [349] =&gt; 08a2d4ae6103943f2f902bbcf92caaef&lt;br /&gt;    [350] =&gt; 08b3a830224fd11b7b935f94f37ddc33&lt;br /&gt;    [351] =&gt; 08b7c8f82cccbf7af61314c24417f693&lt;br /&gt;    [352] =&gt; 08b836176bf218aa7219b88214d4311f&lt;br /&gt;    [353] =&gt; 08d8c053489afb41352d4adee806db85&lt;br /&gt;    [354] =&gt; 08e54a310f41b89a9bb1af90293befe2&lt;br /&gt;    [355] =&gt; 08edb6f9a7e1d4286d2b983ac7c4690f&lt;br /&gt;    [356] =&gt; 08f3af834135175a0338699fa72c8d5a&lt;br /&gt;    [357] =&gt; 08f3af834135175a0338699fa72c8d5a&lt;br /&gt;    [358] =&gt; 08fb51a5bb49851492090fa3b3780d7f&lt;br /&gt;    [359] =&gt; 08fb51a5bb49851492090fa3b3780d7f&lt;br /&gt;    [360] =&gt; 0904e60378de08b03fb8c18f6283584a&lt;br /&gt;    [361] =&gt; 0904e60378de08b03fb8c18f6283584a&lt;br /&gt;    [362] =&gt; 090de1d0b52b17046584c4ff5bc6916f&lt;br /&gt;    [363] =&gt; 091942d158a5de56c6b76f284f7f7c42&lt;br /&gt;    [364] =&gt; 09228ac00d4d7d8cf9d38e21ad5ff94a&lt;br /&gt;    [365] =&gt; 0924e97987f15d0aedf96c005d60ea78&lt;br /&gt;    [366] =&gt; 092a36d3166214eda940fc07c0d86f2d&lt;br /&gt;    [367] =&gt; 092a40c692a4cea09b4bd36aca56f776&lt;br /&gt;    [368] =&gt; 092a40c692a4cea09b4bd36aca56f776&lt;br /&gt;    [369] =&gt; 092a58d1d69f9ee2bad0cd4b96807211&lt;br /&gt;    [370] =&gt; 09388fa93c0c1c485ef5c015b07b5f76&lt;br /&gt;    [371] =&gt; 0938ebc4183ff7190fcc107095d192ca&lt;br /&gt;    [372] =&gt; 093bdd9a7ffbb622c91b0bb0d8eecd88&lt;br /&gt;    [373] =&gt; 093bdd9a7ffbb622c91b0bb0d8eecd88&lt;br /&gt;    [374] =&gt; 09443de4662a8676320bc534b717d4cb&lt;br /&gt;    [375] =&gt; 09443de4662a8676320bc534b717d4cb&lt;br /&gt;    [376] =&gt; 0947e1d04692fb4b4d99e4be171e6033&lt;br /&gt;    [377] =&gt; 09543a485f1388e90ad46b4a35d58204&lt;br /&gt;    [378] =&gt; 09543a485f1388e90ad46b4a35d58204&lt;br /&gt;    [379] =&gt; 096292fdc8f0a29e2a17685176c70723&lt;br /&gt;    [380] =&gt; 0965db4f7126a7389ba2e87581b029d2&lt;br /&gt;    [381] =&gt; 0965db4f7126a7389ba2e87581b029d2&lt;br /&gt;    [382] =&gt; 097186d62989a518ccd579fc49ffb20b&lt;br /&gt;    [383] =&gt; 097186d62989a518ccd579fc49ffb20b&lt;br /&gt;    [384] =&gt; 097554dad7b0cd076c8c323bda86781f&lt;br /&gt;    [385] =&gt; 097bd239a3b22ccdb6b4c1986696976f&lt;br /&gt;    [386] =&gt; 0989df3c0de6831fc259ebcad63c9b80&lt;br /&gt;    [387] =&gt; 099c4620f081d764ffbcb5b4748ff612&lt;br /&gt;    [388] =&gt; 099fd3632e41f7498061ed35492d32b7&lt;br /&gt;    [389] =&gt; 09a4d26f81d708e40fe83fd1be5a194a&lt;br /&gt;    [390] =&gt; 09a4d26f81d708e40fe83fd1be5a194a&lt;br /&gt;    [391] =&gt; 09a51e1a34da7a8c506ab0467c2caa12&lt;br /&gt;    [392] =&gt; 09a91c5707a87132904ea853f84af4fd&lt;br /&gt;    [393] =&gt; 09ba8bbb6b5b466783ae7604fdf393c3&lt;br /&gt;    [394] =&gt; 09d21387d4f9a8a31285a942c503f31e&lt;br /&gt;    [395] =&gt; 09d21387d4f9a8a31285a942c503f31e&lt;br /&gt;    [396] =&gt; 09d8b5546e98c1068c3a04d7027010a8&lt;br /&gt;    [397] =&gt; 09f08b915dd9b5192e55971ae59ee467&lt;br /&gt;    [398] =&gt; 09fd9a8245cb97b10fdcd910e63b83b0&lt;br /&gt;    [399] =&gt; 09fd9a8245cb97b10fdcd910e63b83b0&lt;br /&gt;    [400] =&gt; 0a0e3368d4bce730a2a9433c25ab9475&lt;br /&gt;    [401] =&gt; 0a11e04ec5b03ce706b7dcae7f01a1cd&lt;br /&gt;    [402] =&gt; 0a11e04ec5b03ce706b7dcae7f01a1cd&lt;br /&gt;    [403] =&gt; 0a1370ce0ddaa49f692486d4b5a45d03&lt;br /&gt;    [404] =&gt; 0a1370ce0ddaa49f692486d4b5a45d03&lt;br /&gt;    [405] =&gt; 0a1a9a79bde511d87f08cf37456f66fa&lt;br /&gt;    [406] =&gt; 0a20bbc80ddaaa9971f9fa8a3befe679&lt;br /&gt;    [407] =&gt; 0a20bbc80ddaaa9971f9fa8a3befe679&lt;br /&gt;    [408] =&gt; 0a31e76dde78e98d19eef7f171f25fe2&lt;br /&gt;    [409] =&gt; 0a3c69d29a7d3e975e0e363344cd330c&lt;br /&gt;    [410] =&gt; 0a3c69d29a7d3e975e0e363344cd330c&lt;br /&gt;    [411] =&gt; 0a3e0e3cebb102bf691b64922cdeec1f&lt;br /&gt;    [412] =&gt; 0a41487ef47a9378e97927e708b9d771&lt;br /&gt;    [413] =&gt; 0a41487ef47a9378e97927e708b9d771&lt;br /&gt;    [414] =&gt; 0a4b538f8bbbcf7a05182cbf07bb7701&lt;br /&gt;    [415] =&gt; 0a6a50faebf515ef666a306e5d4d45d0&lt;br /&gt;    [416] =&gt; 0a7be52862a94f74186da63e3ab366c3&lt;br /&gt;    [417] =&gt; 0a83f9604b86a705c00153537b22634b&lt;br /&gt;    [418] =&gt; 0a8682796f8cacc16433586a330ba6b9&lt;br /&gt;    [419] =&gt; 0a8682796f8cacc16433586a330ba6b9&lt;br /&gt;    [420] =&gt; 0a88909790af0f4cd5d74c571ed94569&lt;br /&gt;    [421] =&gt; 0a94ae31e9ae6b85c6dd487bab7a51fd&lt;br /&gt;    [422] =&gt; 0a94b4fb0979e056618328a7ed51c0cd&lt;br /&gt;    [423] =&gt; 0a9baf19697c59a209223f3a235cc15d&lt;br /&gt;    [424] =&gt; 0a9de12c2938226b7afa8a8932914c89&lt;br /&gt;    [425] =&gt; 0a9de12c2938226b7afa8a8932914c89&lt;br /&gt;    [426] =&gt; 0a9f992d6d45ac93c6006e0c2042d3a4&lt;br /&gt;    [427] =&gt; 0aa3846535dbf4fb5404eeaa5cf52999&lt;br /&gt;    [428] =&gt; 0ab92e7f1e374669cb7b635030b6adce&lt;br /&gt;    [429] =&gt; 0abecb87ebb157edb87a7c1a6cc5c296&lt;br /&gt;    [430] =&gt; 0acdaf612fc1c99e9e10cccefeeec8af&lt;br /&gt;    [431] =&gt; 0acff759415e064c6b70d11b0c6c92a6&lt;br /&gt;    [432] =&gt; 0ad5f64d4d28f9a5a696f087ba559289&lt;br /&gt;    [433] =&gt; 0adb16043780ace972193addd8d497c8&lt;br /&gt;    [434] =&gt; 0adc0e4b7f838bf83832c664e9ff94e6&lt;br /&gt;    [435] =&gt; 0adc0e4b7f838bf83832c664e9ff94e6&lt;br /&gt;    [436] =&gt; 0ae3f3545b5030a8e77d0630f1cce754&lt;br /&gt;    [437] =&gt; 0ae8df03cec69ceaaeefd1ceda981651&lt;br /&gt;    [438] =&gt; 0aee2db7716e5fb26f0ae19cab60d129&lt;br /&gt;    [439] =&gt; 0aee2db7716e5fb26f0ae19cab60d129&lt;br /&gt;    [440] =&gt; 0aeff7e6f6b049c7f2e89525ac5d4ecb&lt;br /&gt;    [441] =&gt; 0b012298632c432b44ebdf5845369072&lt;br /&gt;    [442] =&gt; 0b1106d405b2d146eec9627dc1c0f1b7&lt;br /&gt;    [443] =&gt; 0b1106d405b2d146eec9627dc1c0f1b7&lt;br /&gt;    [444] =&gt; 0b1b0f41c0e1165a896fe1deec75dec0&lt;br /&gt;    [445] =&gt; 0b1b0f41c0e1165a896fe1deec75dec0&lt;br /&gt;    [446] =&gt; 0b1f568468d191478c8815328b743a08&lt;br /&gt;    [447] =&gt; 0b1f568468d191478c8815328b743a08&lt;br /&gt;    [448] =&gt; 0b48e3a16950403e8998b75fdabfda1c&lt;br /&gt;    [449] =&gt; 0b4ea288cf284959cf2601fbdfb62aa5&lt;br /&gt;    [450] =&gt; 0b5c31cdc75de8af51349236ae1559d8&lt;br /&gt;    [451] =&gt; 0b5c31cdc75de8af51349236ae1559d8&lt;br /&gt;    [452] =&gt; 0b5fc8bb53a0beb525679009a569010c&lt;br /&gt;    [453] =&gt; 0b6ce38a2b9e693c9670be7eacc4aedd&lt;br /&gt;    [454] =&gt; 0b6e251cfefca631e29701b3732d74b0&lt;br /&gt;    [455] =&gt; 0b6e251cfefca631e29701b3732d74b0&lt;br /&gt;    [456] =&gt; 0b734aea51e86c471b8d4c0fcf293fea&lt;br /&gt;    [457] =&gt; 0b734aea51e86c471b8d4c0fcf293fea&lt;br /&gt;    [458] =&gt; 0b7d74f953e442e77e263270db8c9a7d&lt;br /&gt;    [459] =&gt; 0b83d436bc72e994223d92db29a6ab3a&lt;br /&gt;    [460] =&gt; 0b83d436bc72e994223d92db29a6ab3a&lt;br /&gt;    [461] =&gt; 0b8ba6e03162a4800acfc01b9c736c66&lt;br /&gt;    [462] =&gt; 0b92918b5ccadadc538f193fa91080ca&lt;br /&gt;    [463] =&gt; 0b96f11fc371099ca0031716ebc39078&lt;br /&gt;    [464] =&gt; 0b973fc58a574f4a097197bda99a69b1&lt;br /&gt;    [465] =&gt; 0b9d8aeea3a04a9a5d2f16715111c592&lt;br /&gt;    [466] =&gt; 0bb88f940820313b724fc3aee44b0951&lt;br /&gt;    [467] =&gt; 0bba63455607f94109603ab5d191c630&lt;br /&gt;    [468] =&gt; 0bbafbc9c13c4784a92239da4accb0a0&lt;br /&gt;    [469] =&gt; 0bbbeb79ce058c1c570159810790656d&lt;br /&gt;    [470] =&gt; 0bbbeb79ce058c1c570159810790656d&lt;br /&gt;    [471] =&gt; 0bbdf9f5a375cf4af5e85f12b2884781&lt;br /&gt;    [472] =&gt; 0bbe27af8aa2a98cf71c90df4559aafa&lt;br /&gt;    [473] =&gt; 0bc2aa6e5777b9704f5b7c4d511d91f4&lt;br /&gt;    [474] =&gt; 0bcc3ce0ad636573745b8d24c45b1231&lt;br /&gt;    [475] =&gt; 0bdd4d1862623f0f005c04ea09aaf936&lt;br /&gt;    [476] =&gt; 0be5fbc64e3bebd0b4f548c9229df2bc&lt;br /&gt;    [477] =&gt; 0be8a801c078187be15e52223eacc208&lt;br /&gt;    [478] =&gt; 0becdf572d0c74f109f53a21787d7d97&lt;br /&gt;    [479] =&gt; 0bf43f63075ec66815e337cc5c38607d&lt;br /&gt;    [480] =&gt; 0bf43f63075ec66815e337cc5c38607d&lt;br /&gt;    [481] =&gt; 0c0650e822e759980bd348883d81c280&lt;br /&gt;    [482] =&gt; 0c0650e822e759980bd348883d81c280&lt;br /&gt;    [483] =&gt; 0c21d34ecd5c5bcc8cdf9b4cd2fba043&lt;br /&gt;    [484] =&gt; 0c2be6f64a10a6015eeea853d349fd60&lt;br /&gt;    [485] =&gt; 0c305b681f1ce53d5e822e1ffb450731&lt;br /&gt;    [486] =&gt; 0c3947d801e1c7eeb0e100d3c682e3a1&lt;br /&gt;    [487] =&gt; 0c4975a6c89e7ba0654b82bf82ab7ab2&lt;br /&gt;    [488] =&gt; 0c4f0dd63f988a1f6c7b7b7f0ac2c2c1&lt;br /&gt;    [489] =&gt; 0c5f062726d57645af677198028560d2&lt;br /&gt;    [490] =&gt; 0c76b2176a1f9aeace6a9c509ecd3e0e&lt;br /&gt;    [491] =&gt; 0c8eea3eb34e3f3001becfb09653c0be&lt;br /&gt;    [492] =&gt; 0c9d1db7657b2423c6140ac75f921c78&lt;br /&gt;    [493] =&gt; 0c9d1db7657b2423c6140ac75f921c78&lt;br /&gt;    [494] =&gt; 0ca01b36cf79a85c1c508c272e599c56&lt;br /&gt;    [495] =&gt; 0ca01b36cf79a85c1c508c272e599c56&lt;br /&gt;    [496] =&gt; 0ca0518a086c9edcc5612cc34b6b44ef&lt;br /&gt;    [497] =&gt; 0ca3ce290a7723d316d55378d3da9f5a&lt;br /&gt;    [498] =&gt; 0cb281ffb6acabd2a438245c9803ba4c&lt;br /&gt;    [499] =&gt; 0cbef6e0942fb907b06ded51cc3b7036&lt;br /&gt;    [500] =&gt; 0cbfb366dccb3e8e93f868388835a993&lt;br /&gt;    [501] =&gt; 0cc41bd0cb9b1ca7ccc4092e6e9de429&lt;br /&gt;    [502] =&gt; 0cc7c0b4e47744f6f9e71e58849b4fb8&lt;br /&gt;    [503] =&gt; 0ccb1c8e8de9fa05e64731be5be1e703&lt;br /&gt;    [504] =&gt; 0ccb7069f4bff64ef1203d7b66d4f2b8&lt;br /&gt;    [505] =&gt; 0ccb7069f4bff64ef1203d7b66d4f2b8&lt;br /&gt;    [506] =&gt; 0ce9272908905897321647de247be6f6&lt;br /&gt;    [507] =&gt; 0ce9272908905897321647de247be6f6&lt;br /&gt;    [508] =&gt; 0cf2064cfb0b2960cb3dba840c7a0592&lt;br /&gt;    [509] =&gt; 0cfddb415dfa0766bfa0ee1ff7a33931&lt;br /&gt;    [510] =&gt; 0d022f17d3fcaeda2f9306ef1c3a006c&lt;br /&gt;    [511] =&gt; 0d09efa0abb188d995f1534b1dd542b6&lt;br /&gt;    [512] =&gt; 0d0f237b138b41e83a24cc238b375c47&lt;br /&gt;    [513] =&gt; 0d0f237b138b41e83a24cc238b375c47&lt;br /&gt;    [514] =&gt; 0d1542ccf5acf031db162c56528ab77c&lt;br /&gt;    [515] =&gt; 0d1542ccf5acf031db162c56528ab77c&lt;br /&gt;    [516] =&gt; 0d17176bdc6fc0bd8858ebeddaf6310f&lt;br /&gt;    [517] =&gt; 0d187a38ff21e9c36305874bca29911c&lt;br /&gt;    [518] =&gt; 0d193484cb0374bd5a97ba44feb6d522&lt;br /&gt;    [519] =&gt; 0d350f28cf35d981221baa93d8e39450&lt;br /&gt;    [520] =&gt; 0d350f28cf35d981221baa93d8e39450&lt;br /&gt;    [521] =&gt; 0d3b1a480cbf32f3f3cca7450320e209&lt;br /&gt;    [522] =&gt; 0d3ef0c9d8be451b425f79b81063e8d6&lt;br /&gt;    [523] =&gt; 0d3ef0c9d8be451b425f79b81063e8d6&lt;br /&gt;    [524] =&gt; 0d40caa6996e50357516ef3e6b051cb2&lt;br /&gt;    [525] =&gt; 0d40caa6996e50357516ef3e6b051cb2&lt;br /&gt;    [526] =&gt; 0d587df373148f07b10c108b654b6f74&lt;br /&gt;    [527] =&gt; 0d587df373148f07b10c108b654b6f74&lt;br /&gt;    [528] =&gt; 0d58a3af10a8a6ebb6716714d861fe86&lt;br /&gt;    [529] =&gt; 0d67e1173d43eee55b58ad13907d71a4&lt;br /&gt;    [530] =&gt; 0d71bbb25c0cc59fd1ea6cf7ecd4e08b&lt;br /&gt;    [531] =&gt; 0d8bca713f6567afbfc5ffbe06423923&lt;br /&gt;    [532] =&gt; 0d8bca713f6567afbfc5ffbe06423923&lt;br /&gt;    [533] =&gt; 0d90bcc1dbe70b355635b6a1701c5812&lt;br /&gt;    [534] =&gt; 0d90bcc1dbe70b355635b6a1701c5812&lt;br /&gt;    [535] =&gt; 0d935f87712c35aebf5a0d8ed82e28f0&lt;br /&gt;    [536] =&gt; 0d9604cbc438bb1c8bfb5f7b33f1df31&lt;br /&gt;    [537] =&gt; 0da2f09db89f7eab61c0724d10cfdccf&lt;br /&gt;    [538] =&gt; 0dbf7e569b00dc4357e1aeac88df16d0&lt;br /&gt;    [539] =&gt; 0dbf7e569b00dc4357e1aeac88df16d0&lt;br /&gt;    [540] =&gt; 0dc20e73038e9d11be7572f5ae732cae&lt;br /&gt;    [541] =&gt; 0dc20e73038e9d11be7572f5ae732cae&lt;br /&gt;    [542] =&gt; 0dc503620fd1c1ed94cf76ce8d113187&lt;br /&gt;    [543] =&gt; 0dca52a20c2dd71ec91d9a207c6ce984&lt;br /&gt;    [544] =&gt; 0dd2fb0ac0bfb20b8d25eaa40b0e77c3&lt;br /&gt;    [545] =&gt; 0dd2fb0ac0bfb20b8d25eaa40b0e77c3&lt;br /&gt;    [546] =&gt; 0dd46345111c3a4117e79d573c825191&lt;br /&gt;    [547] =&gt; 0dd46345111c3a4117e79d573c825191&lt;br /&gt;    [548] =&gt; 0dd98a5cc4c7c8b39826c970f2b4feb3&lt;br /&gt;    [549] =&gt; 0ddef3df913734bcbde2af25fe5bfff0&lt;br /&gt;    [550] =&gt; 0ddef3df913734bcbde2af25fe5bfff0&lt;br /&gt;    [551] =&gt; 0df048173706da9bb4e012195823bf9f&lt;br /&gt;    [552] =&gt; 0df129696237932c3fe830a58ea5a0fa&lt;br /&gt;    [553] =&gt; 0df129696237932c3fe830a58ea5a0fa&lt;br /&gt;    [554] =&gt; 0df8f4fe607dee5c052e577785297a8d&lt;br /&gt;    [555] =&gt; 0dff8028245d7136213428aaf332b051&lt;br /&gt;    [556] =&gt; 0dffd21d51c9871eddec92dea819443e&lt;br /&gt;    [557] =&gt; 0e032438fa50e36e95163846be5d62eb&lt;br /&gt;    [558] =&gt; 0e18a415322f25170d5394bcbfa7148b&lt;br /&gt;    [559] =&gt; 0e2095cc6c4e9c7808481cf9ca2eedfa&lt;br /&gt;    [560] =&gt; 0e2095cc6c4e9c7808481cf9ca2eedfa&lt;br /&gt;    [561] =&gt; 0e24ed229a77c925d0656cc1b677761f&lt;br /&gt;    [562] =&gt; 0e26a23c642b3ba9bf08fc7804ff239e&lt;br /&gt;    [563] =&gt; 0e2e464d32e4eafa9c5f2325c73d9212&lt;br /&gt;    [564] =&gt; 0e2e464d32e4eafa9c5f2325c73d9212&lt;br /&gt;    [565] =&gt; 0e2f8bba90d2da668c8b49859f0be0de&lt;br /&gt;    [566] =&gt; 0e3462ba500f851bb65dad1573d8ff74&lt;br /&gt;    [567] =&gt; 0e4671350e816cd5e58d0bdce1422445&lt;br /&gt;    [568] =&gt; 0e53de7d163a30a6ddea20c0178e41bd&lt;br /&gt;    [569] =&gt; 0e53de7d163a30a6ddea20c0178e41bd&lt;br /&gt;    [570] =&gt; 0e6de792784655be09c54e00414f0f26&lt;br /&gt;    [571] =&gt; 0e828ee937e840b4cda0467c3f29de0c&lt;br /&gt;    [572] =&gt; 0e8eba3301c4fd43ae9a77c28896d780&lt;br /&gt;    [573] =&gt; 0e9469e86da1f535f12e93f6f1aa57ab&lt;br /&gt;    [574] =&gt; 0e9469e86da1f535f12e93f6f1aa57ab&lt;br /&gt;    [575] =&gt; 0e973b8823ababacdaec1042d423d3cf&lt;br /&gt;    [576] =&gt; 0ea06bb9f4dc5caa65477df5fd4d1b66&lt;br /&gt;    [577] =&gt; 0ea7442909267bd81c79e66c24fad176&lt;br /&gt;    [578] =&gt; 0eaa549b359d70257260bc1abb5cb99d&lt;br /&gt;    [579] =&gt; 0ebc4d6571251df9942d2f3f6b08f9af&lt;br /&gt;    [580] =&gt; 0ec585c51f2f1bcba6412d7df643b2c4&lt;br /&gt;    [581] =&gt; 0ec86450c3fe4e052ba2609755eb7123&lt;br /&gt;    [582] =&gt; 0ec885e665fca9679cbc2764276fce77&lt;br /&gt;    [583] =&gt; 0ecc4bc131e8996849d24582d226d471&lt;br /&gt;    [584] =&gt; 0ed25e764889787b66b879ba7dab2843&lt;br /&gt;    [585] =&gt; 0ed25e764889787b66b879ba7dab2843&lt;br /&gt;    [586] =&gt; 0edabb8d91a0a0efe572bbf31f43601f&lt;br /&gt;    [587] =&gt; 0ee0314c1c735ba042547e89cfad6e14&lt;br /&gt;    [588] =&gt; 0ee502f7672d32d0f73312d405d6a7d1&lt;br /&gt;    [589] =&gt; 0f00685f01dfd419b7024234a3417400&lt;br /&gt;    [590] =&gt; 0f13a5f3ccab681b17fd615adb432828&lt;br /&gt;    [591] =&gt; 0f1658f7fa70258bdf24874fc7ba1501&lt;br /&gt;    [592] =&gt; 0f294e1a325f5d3f18d91023edfac6b4&lt;br /&gt;    [593] =&gt; 0f29df4a4d3eea90056932c948467ae0&lt;br /&gt;    [594] =&gt; 0f30ce3ad6602843d9d049a684da6210&lt;br /&gt;    [595] =&gt; 0f38fc27561b64ef0ba6fe2177cced90&lt;br /&gt;    [596] =&gt; 0f3f042e543f2545dd2ab1b2fb36a4f4&lt;br /&gt;    [597] =&gt; 0f40b4c5e1e92cad01676f06a5201ba5&lt;br /&gt;    [598] =&gt; 0f4486ed802432abe28f8ba090c4027f&lt;br /&gt;    [599] =&gt; 0f4d1b8bcfdfc983a3d0931b15606a95&lt;br /&gt;    [600] =&gt; 0f4e429a0f92223c550951946291506a&lt;br /&gt;    [601] =&gt; 0f59e03bb022ae452c67adb99eb00884&lt;br /&gt;    [602] =&gt; 0f59e03bb022ae452c67adb99eb00884&lt;br /&gt;    [603] =&gt; 0f6d8c47e943bb07b0383cafd9df5347&lt;br /&gt;    [604] =&gt; 0f6fca2282f572c09f729c8c40b79699&lt;br /&gt;    [605] =&gt; 0f880c489026be808c39bcf7ff3af692&lt;br /&gt;    [606] =&gt; 0f880c489026be808c39bcf7ff3af692&lt;br /&gt;    [607] =&gt; 0f905ba2d9ccbec42b0bb5d510620cb4&lt;br /&gt;    [608] =&gt; 0f96f0c1bcb7e09f6f563b072c70a84e&lt;br /&gt;    [609] =&gt; 0f9c103ce45b1f22a7304bff6c614321&lt;br /&gt;    [610] =&gt; 0f9c103ce45b1f22a7304bff6c614321&lt;br /&gt;    [611] =&gt; 0f9fbf22955450c6dbfdf57c30f5d592&lt;br /&gt;    [612] =&gt; 0f9ff6b4d76083946969a86a8b9d9eff&lt;br /&gt;    [613] =&gt; 0fa1bfef1a269135cd7ec6f1a834e583&lt;br /&gt;    [614] =&gt; 0fa51a0d2dee026ec65a40162ca55243&lt;br /&gt;    [615] =&gt; 0fa9a44274bb3895171d1878a13263f0&lt;br /&gt;    [616] =&gt; 0facc206c9d4a4661be0de76d5ff0952&lt;br /&gt;    [617] =&gt; 0fae065d534d10248d03f49995315333&lt;br /&gt;    [618] =&gt; 0faee18c2f383a196c675b0e887e6c9d&lt;br /&gt;    [619] =&gt; 0faee18c2f383a196c675b0e887e6c9d&lt;br /&gt;    [620] =&gt; 0fb6620ef70b4e56b7dcb7bfc8373c01&lt;br /&gt;    [621] =&gt; 0fc1d82a655e134cbf8fc1e961c1038d&lt;br /&gt;    [622] =&gt; 0fd2266f9e530bc66e6d384d9d769a88&lt;br /&gt;    [623] =&gt; 0fd7fde3c1a9d95d1c7087219269fd6d&lt;br /&gt;    [624] =&gt; 0fdc9cea992703ef5fb1d432ab558aee&lt;br /&gt;    [625] =&gt; 0fe60095f545c15936a6a791a67a6deb&lt;br /&gt;    [626] =&gt; 0fe63c0edb03beb93b55d659f449f6b1&lt;br /&gt;    [627] =&gt; 0feb393504ef877e1eca63a2008f6936&lt;br /&gt;    [628] =&gt; 0ffb33600c3b130342d878dd07f590b3&lt;br /&gt;    [629] =&gt; 1000b0218dabdb40681ce76facae3f16&lt;br /&gt;    [630] =&gt; 10061e4e5c937f0f6bafadf40a3fd962&lt;br /&gt;    [631] =&gt; 100ecac34c74e4494e1741b120cfd0e4&lt;br /&gt;    [632] =&gt; 1012b09757e4b70d7bfe2d3d453a20e8&lt;br /&gt;    [633] =&gt; 10201484cafb02d30509955d805eceb3&lt;br /&gt;    [634] =&gt; 10203b0f3b3cf1de9afafe9de2c32373&lt;br /&gt;    [635] =&gt; 1036c6b1d3be7124cca10385324f392a&lt;br /&gt;    [636] =&gt; 10437abf1515d3a6c2fd40b7d2eb790f&lt;br /&gt;    [637] =&gt; 10437abf1515d3a6c2fd40b7d2eb790f&lt;br /&gt;    [638] =&gt; 1047dadea9e4426288f62df4daf167a5&lt;br /&gt;    [639] =&gt; 1047dadea9e4426288f62df4daf167a5&lt;br /&gt;    [640] =&gt; 105d250410f2d584874c2d11ffdc277f&lt;br /&gt;    [641] =&gt; 105e1b582c7c940a3ba38a0a296dc66d&lt;br /&gt;    [642] =&gt; 1070d6a7dc50c1e13c7629f0c2b64713&lt;br /&gt;    [643] =&gt; 10765c556bfab3ba2162ea144d083ab4&lt;br /&gt;    [644] =&gt; 108c349876b6352f824115ca33c8fe40&lt;br /&gt;    [645] =&gt; 109240a7dff14d881cf8b1aa05db9e91&lt;br /&gt;    [646] =&gt; 10aac565858f3c56dd0d689f41023081&lt;br /&gt;    [647] =&gt; 10b7bc3dc0a95a453cf281324c0e2787&lt;br /&gt;    [648] =&gt; 10bcc1fa1cd6721ed5bab271b4d894a9&lt;br /&gt;    [649] =&gt; 10bd6d847ffe01e541997d4dd7557daa&lt;br /&gt;    [650] =&gt; 10bd6d847ffe01e541997d4dd7557daa&lt;br /&gt;    [651] =&gt; 10c40dc8e3b77677a5dbeff7cf9ebfb9&lt;br /&gt;    [652] =&gt; 10d13e6e5f6dafdcbfa7d575ed503d7e&lt;br /&gt;    [653] =&gt; 10e460e3821f632b886a35a3008b4d9b&lt;br /&gt;    [654] =&gt; 10e5280a4e1732370a90031aa1f4cc7e&lt;br /&gt;    [655] =&gt; 10e5280a4e1732370a90031aa1f4cc7e&lt;br /&gt;    [656] =&gt; 10e64994117386ef90ef36e09905aa2d&lt;br /&gt;    [657] =&gt; 10ebdeb172cfefe47e31a79973254e8a&lt;br /&gt;    [658] =&gt; 10efd4787c84b0696de595124d284205&lt;br /&gt;    [659] =&gt; 10efd4787c84b0696de595124d284205&lt;br /&gt;    [660] =&gt; 10f34c53faf787f6f15141692cb5892b&lt;br /&gt;    [661] =&gt; 11095e83339a60245855b6e7ce874350&lt;br /&gt;    [662] =&gt; 110eeec9894419575af4724a3c1e0846&lt;br /&gt;    [663] =&gt; 1117096bc711bb8925bde6804d33e7b7&lt;br /&gt;    [664] =&gt; 1128d2bb2eb5f4cc8cbed7207dab2ab8&lt;br /&gt;    [665] =&gt; 112e470ccc1e0c6841b97e48d23959b6&lt;br /&gt;    [666] =&gt; 1130cb6d0b419e1e25a5c0c8325d9755&lt;br /&gt;    [667] =&gt; 1130cb6d0b419e1e25a5c0c8325d9755&lt;br /&gt;    [668] =&gt; 113534d9796eea9d4a1944e0a01ea376&lt;br /&gt;    [669] =&gt; 114cd1cacf50d1ca1239839661f3304e&lt;br /&gt;    [670] =&gt; 115d7158aa2d66005551001611df2a7d&lt;br /&gt;    [671] =&gt; 1164f34d3f95495176672933390a5892&lt;br /&gt;    [672] =&gt; 1164f34d3f95495176672933390a5892&lt;br /&gt;    [673] =&gt; 117a160cce4e45231306c035f0541a37&lt;br /&gt;    [674] =&gt; 117d207ae4c62af54e45be646a0737b5&lt;br /&gt;    [675] =&gt; 11817529589915c2159cfaa85a041469&lt;br /&gt;    [676] =&gt; 1187d4e9dca66d2141a885db4499af3c&lt;br /&gt;    [677] =&gt; 119ec3f4b74c7dc4379d718f4305dc3f&lt;br /&gt;    [678] =&gt; 119ec3f4b74c7dc4379d718f4305dc3f&lt;br /&gt;    [679] =&gt; 11a2598c00a9c6f20e64b7c359d83bec&lt;br /&gt;    [680] =&gt; 11aa723373050e4424ca1ffa87bb88e6&lt;br /&gt;    [681] =&gt; 11b0ef4c036644587dcefe738c3fdd93&lt;br /&gt;    [682] =&gt; 11b66c7483efb54119b626962c8fe8d9&lt;br /&gt;    [683] =&gt; 11b6cecdf441338c15d1adb2f8181b4d&lt;br /&gt;    [684] =&gt; 11b879c82c41721386b46fcd0a085464&lt;br /&gt;    [685] =&gt; 11bf12303400017ca6a094ba807591a4&lt;br /&gt;    [686] =&gt; 11c3d2ef052697b0330d1f21ce40e491&lt;br /&gt;    [687] =&gt; 11c984487a009f8381b3e535257c014e&lt;br /&gt;    [688] =&gt; 11d9cb6e98b0f36af33eb117f602ee94&lt;br /&gt;    [689] =&gt; 11d9cb6e98b0f36af33eb117f602ee94&lt;br /&gt;    [690] =&gt; 11f28bfebdc66409928fd06797b11127&lt;br /&gt;    [691] =&gt; 11f3c31de92569051d0f77710f2a72f7&lt;br /&gt;    [692] =&gt; 11f4d0d9a4490f0588f5d4b422fdcccb&lt;br /&gt;    [693] =&gt; 11fa1e2070ef1ec24c0d20c57958dfd5&lt;br /&gt;    [694] =&gt; 1207aa1444dcadd2ce25dfe206134401&lt;br /&gt;    [695] =&gt; 1208e9957d1cdb502227a0dfc4c3e59e&lt;br /&gt;    [696] =&gt; 1208e9957d1cdb502227a0dfc4c3e59e&lt;br /&gt;    [697] =&gt; 12194a02b8bf2b1f527e5f7dd40f599c&lt;br /&gt;    [698] =&gt; 121da6538856d04f457a23f2a3b95b25&lt;br /&gt;    [699] =&gt; 1225ca4404fa588fefb4ed3bd1e38092&lt;br /&gt;    [700] =&gt; 122a95d61f4bd17374b55cb1e8e08a1e&lt;br /&gt;    [701] =&gt; 12408c0a2e59f1da153081d4a59c6c8f&lt;br /&gt;    [702] =&gt; 125225c4a3128a19ca5d66fa6ee78391&lt;br /&gt;    [703] =&gt; 125a763bfe7deb4f56c36c7ed8dc0b3e&lt;br /&gt;    [704] =&gt; 125d83e52ed349b85846592863afb9c3&lt;br /&gt;    [705] =&gt; 125d83e52ed349b85846592863afb9c3&lt;br /&gt;    [706] =&gt; 125f84faeb728a449f39966b02077266&lt;br /&gt;    [707] =&gt; 125fcf5f3efaab751daa5a078eaf39f0&lt;br /&gt;    [708] =&gt; 1261ad4a1bd529d3dd51781708fa3097&lt;br /&gt;    [709] =&gt; 1265f577cbddf8799de63275299da35b&lt;br /&gt;    [710] =&gt; 126f856a578d0a12bd9133b7260090eb&lt;br /&gt;    [711] =&gt; 1270ee38ed0eb95d950905f92de929d2&lt;br /&gt;    [712] =&gt; 12733f6e14a46878b771f16d11fff627&lt;br /&gt;    [713] =&gt; 1274965cd8f1e59e8aeea9060ec93d6b&lt;br /&gt;    [714] =&gt; 12832fe684040b3d60540850576b0b81&lt;br /&gt;    [715] =&gt; 128e0b659cfc98588d1e666361abf4c4&lt;br /&gt;    [716] =&gt; 129d44f06bd59155022215b1865f42c9&lt;br /&gt;    [717] =&gt; 129d44f06bd59155022215b1865f42c9&lt;br /&gt;    [718] =&gt; 12a5f64b50640f832bc8437390943161&lt;br /&gt;    [719] =&gt; 12b14d152e7c9e4d821077b327ce8ef8&lt;br /&gt;    [720] =&gt; 12b649c2e98796308bff3b089d6c33df&lt;br /&gt;    [721] =&gt; 12bb160eb34ade054ed81710acf3e7dc&lt;br /&gt;    [722] =&gt; 12c7963a8d509ed68a560f92617fb34a&lt;br /&gt;    [723] =&gt; 12ca27d37aa527d19d12da6f7e4152d8&lt;br /&gt;    [724] =&gt; 12ca27d37aa527d19d12da6f7e4152d8&lt;br /&gt;    [725] =&gt; 12d334d1ef89abf282598545592400cd&lt;br /&gt;    [726] =&gt; 12e9eddd716056bc7500153513555d95&lt;br /&gt;    [727] =&gt; 12ead0759929a9c73b3b3cc46af45581&lt;br /&gt;    [728] =&gt; 12f0554018a99a8e4a8105bbee906c76&lt;br /&gt;    [729] =&gt; 13050e3aa415d266c17b42450fb7cfa4&lt;br /&gt;    [730] =&gt; 130da997036e38d6e9554490a3c0d282&lt;br /&gt;    [731] =&gt; 130ea73828dea9145ff855fb53a3e179&lt;br /&gt;    [732] =&gt; 1314e0ced38a1b4c377227aca7ec5d43&lt;br /&gt;    [733] =&gt; 131fc62d57343e40d6ab7772c46daa4f&lt;br /&gt;    [734] =&gt; 1322070a95032b432194c5d1fee1b6ab&lt;br /&gt;    [735] =&gt; 13246ab224e7517bf2a6817df1ee926f&lt;br /&gt;    [736] =&gt; 1330dd42b894164df8fdc249196ba556&lt;br /&gt;    [737] =&gt; 1330dd42b894164df8fdc249196ba556&lt;br /&gt;    [738] =&gt; 1337839c339889f505fc00c3947326e0&lt;br /&gt;    [739] =&gt; 133ae55ca3780d36fb29c5657f4db538&lt;br /&gt;    [740] =&gt; 133ca687b268fc94c5f9a7e5c25d6dac&lt;br /&gt;    [741] =&gt; 133e56525514dc4ce436580c0828d8a1&lt;br /&gt;    [742] =&gt; 133ef4c931613c8d8b7e61072dbe0cca&lt;br /&gt;    [743] =&gt; 13469218fd16e478b6c90ade6a8469d2&lt;br /&gt;    [744] =&gt; 135320c8d06dfb264525b4b7b1c0e587&lt;br /&gt;    [745] =&gt; 13562f4682f95a3c9e18799d84910327&lt;br /&gt;    [746] =&gt; 1359807a62c5643795ad87bcbb3e8a84&lt;br /&gt;    [747] =&gt; 1361e354df13b819f9e9aaa2e7bb5674&lt;br /&gt;    [748] =&gt; 1362d6c17beab0a0057def1d4ebd7c23&lt;br /&gt;    [749] =&gt; 13660fae937f8c6f8d02823a8c28fda6&lt;br /&gt;    [750] =&gt; 1373c394b8ac9a4ca06d3fc0ece1c5be&lt;br /&gt;    [751] =&gt; 137deeb30ab85085fb42798695c69b3b&lt;br /&gt;    [752] =&gt; 1380bf62d865d3b09c21b57a2c64804b&lt;br /&gt;    [753] =&gt; 1380bf62d865d3b09c21b57a2c64804b&lt;br /&gt;    [754] =&gt; 13852bfa2f3ed6dc50d1f5b5b79896f6&lt;br /&gt;    [755] =&gt; 13989b4f50eca2665a357280481cfeda&lt;br /&gt;    [756] =&gt; 139d21d0d62ff2ca149aa2bf805bdd5a&lt;br /&gt;    [757] =&gt; 139d21d0d62ff2ca149aa2bf805bdd5a&lt;br /&gt;    [758] =&gt; 13acefd40a8fc6bb0748c7af1e1b412e&lt;br /&gt;    [759] =&gt; 13b3642a46eaa010fc3081501789fb84&lt;br /&gt;    [760] =&gt; 13b7d0c66094e38eb8f50da109a28f4f&lt;br /&gt;    [761] =&gt; 13c4c425f781559a70ac77f3d752c5c7&lt;br /&gt;    [762] =&gt; 13c63a1b225d01aa2f5cae42f7685f18&lt;br /&gt;    [763] =&gt; 13d411b5f57a2b1517e18c125d5dde03&lt;br /&gt;    [764] =&gt; 13d6578b9ac27b734367743ec0e2c8a9&lt;br /&gt;    [765] =&gt; 13d6fb0d11453451667c2eeeeeb5c1cd&lt;br /&gt;    [766] =&gt; 13d8abf41f1bf4e7a89f7ea3ce114710&lt;br /&gt;    [767] =&gt; 13da7f1597189b6b580ba7126e147aec&lt;br /&gt;    [768] =&gt; 13db75c75e0d356accdd52f161a7c4dc&lt;br /&gt;    [769] =&gt; 13dd97ecc1d1861a141769b838cdcf39&lt;br /&gt;    [770] =&gt; 13e8ce3c459dff4c7932883f566cad04&lt;br /&gt;    [771] =&gt; 13e8ce3c459dff4c7932883f566cad04&lt;br /&gt;    [772] =&gt; 13eaa487057f1c0bfebbe9e2c76dcceb&lt;br /&gt;    [773] =&gt; 13ee1a79b31ed582be87ca378c0fb098&lt;br /&gt;    [774] =&gt; 13f53fad22b003c17cfab58abd6b1839&lt;br /&gt;    [775] =&gt; 13f53fad22b003c17cfab58abd6b1839&lt;br /&gt;    [776] =&gt; 13f6a3b34ea14983db25199d4561cf76&lt;br /&gt;    [777] =&gt; 13f732ce8f0322344a92dda8f6eaf371&lt;br /&gt;    [778] =&gt; 13f874c02de3da9de418fae825c94680&lt;br /&gt;    [779] =&gt; 13f874c02de3da9de418fae825c94680&lt;br /&gt;    [780] =&gt; 13f8757a77d6c71d2f9a20e7b30a4f09&lt;br /&gt;    [781] =&gt; 13fef56954f7630e8894c71d95a14339&lt;br /&gt;    [782] =&gt; 13fef56954f7630e8894c71d95a14339&lt;br /&gt;    [783] =&gt; 140875b2453a30101c90c0a98cf61a12&lt;br /&gt;    [784] =&gt; 141adcc0d2f1380508f4bbce58755b53&lt;br /&gt;    [785] =&gt; 141adcc0d2f1380508f4bbce58755b53&lt;br /&gt;    [786] =&gt; 1429fd3a8382ca91671d5a4d0219dbba&lt;br /&gt;    [787] =&gt; 143054667badc088a398cc911058cf79&lt;br /&gt;    [788] =&gt; 143054667badc088a398cc911058cf79&lt;br /&gt;    [789] =&gt; 144b1a76e8c447a79f6a38098ef9407f&lt;br /&gt;    [790] =&gt; 144cb66fbfc454ea4772f8643a09af5c&lt;br /&gt;    [791] =&gt; 14539af86d587ffcf96955eaa6be91c3&lt;br /&gt;    [792] =&gt; 14623aef48fc59c0836940feacaa69db&lt;br /&gt;    [793] =&gt; 1488f30401189dcd1e0641763e1ccc57&lt;br /&gt;    [794] =&gt; 148be61b7b735ae40d0b331f54f4886f&lt;br /&gt;    [795] =&gt; 1493f91bb0aa036fd0fdd285ed587473&lt;br /&gt;    [796] =&gt; 149475b1ffa4338352f4e17b2e9804d3&lt;br /&gt;    [797] =&gt; 149b9b25a6c43034047ee2980076b3a1&lt;br /&gt;    [798] =&gt; 14acf536df9a845e4e050e2eab18c08c&lt;br /&gt;    [799] =&gt; 14b2abe9a9a0a7e94d459f74e7ce38b8&lt;br /&gt;    [800] =&gt; 14ce42058c052fdc69a46a6c9f5aff65&lt;br /&gt;    [801] =&gt; 14e49afb9764c0eeef7df029b9ed6279&lt;br /&gt;    [802] =&gt; 14e916775e5d62d324d03fe9f84dd92a&lt;br /&gt;    [803] =&gt; 14ecd6763f7adf9ef5e01eecd9534edc&lt;br /&gt;    [804] =&gt; 14f2b20804b9b5de52f69148da49de32&lt;br /&gt;    [805] =&gt; 14f2b20804b9b5de52f69148da49de32&lt;br /&gt;    [806] =&gt; 151f6814980a0a9a4e1628f6264e2162&lt;br /&gt;    [807] =&gt; 151f6814980a0a9a4e1628f6264e2162&lt;br /&gt;    [808] =&gt; 1528ac67178639936b311f3e842fcb2b&lt;br /&gt;    [809] =&gt; 1528ac67178639936b311f3e842fcb2b&lt;br /&gt;    [810] =&gt; 152eadd933d30c03cf4bb37a25ff96b7&lt;br /&gt;    [811] =&gt; 153a8e99aa137ca2d46f83ed98a7c33b&lt;br /&gt;    [812] =&gt; 153d4b3c5a7a8ed9e0af109a0fadf020&lt;br /&gt;    [813] =&gt; 153f7141ad79fe46558e2cf820f97f86&lt;br /&gt;    [814] =&gt; 1540502206dd383ece6af63b12fa7039&lt;br /&gt;    [815] =&gt; 1566d937c297e482aff64dfcd145ff1e&lt;br /&gt;    [816] =&gt; 156cde2f154e828c6d3b754aa92c4e3d&lt;br /&gt;    [817] =&gt; 156cde2f154e828c6d3b754aa92c4e3d&lt;br /&gt;    [818] =&gt; 157802a52170ad10ad2450d5aad6168d&lt;br /&gt;    [819] =&gt; 157937b006bd4ba1d53136f73679cc15&lt;br /&gt;    [820] =&gt; 15abbe883c8721b5c65947fb4657ab15&lt;br /&gt;    [821] =&gt; 15abf2a80537def8a930b5bec64e3b95&lt;br /&gt;    [822] =&gt; 15bf1711f17f0fa7331c57e544061911&lt;br /&gt;    [823] =&gt; 15c0ae33a0dcaa304a96ca7598df262f&lt;br /&gt;    [824] =&gt; 15c0ae33a0dcaa304a96ca7598df262f&lt;br /&gt;    [825] =&gt; 15c1a1b19680ebb25859ea32234fdef0&lt;br /&gt;    [826] =&gt; 15c1a1b19680ebb25859ea32234fdef0&lt;br /&gt;    [827] =&gt; 15c1b1b3fe8b4ddd55e95f620a5d654f&lt;br /&gt;    [828] =&gt; 15c4073e17ae19f06071c63181e70033&lt;br /&gt;    [829] =&gt; 15c57f1562ef20ee1c89f75b51c133ff&lt;br /&gt;    [830] =&gt; 15c57f1562ef20ee1c89f75b51c133ff&lt;br /&gt;    [831] =&gt; 15c7fd5f7783dd6a6eaf70b7228d4ef8&lt;br /&gt;    [832] =&gt; 15c944cd5deb384ac58eed290547fa89&lt;br /&gt;    [833] =&gt; 15f09255aaf7d27928b81a5322e50766&lt;br /&gt;    [834] =&gt; 15f52b27d48841cc516f9d1d8d2bbe0b&lt;br /&gt;    [835] =&gt; 15f87da82a4315252ea6ba0721ec79e9&lt;br /&gt;    [836] =&gt; 1623d95ddde8df1a504f4c483a9be3c8&lt;br /&gt;    [837] =&gt; 1626b70a90fb0b0fdb7a8e966c39ea4a&lt;br /&gt;    [838] =&gt; 1630f6e3de31c8c1b5a66b9db58fdf12&lt;br /&gt;    [839] =&gt; 1630f6e3de31c8c1b5a66b9db58fdf12&lt;br /&gt;    [840] =&gt; 1641f8041634f1d8bf097b7c3a1e1c34&lt;br /&gt;    [841] =&gt; 1641f8041634f1d8bf097b7c3a1e1c34&lt;br /&gt;    [842] =&gt; 1656f07b5e5324bd970570a3b76bc389&lt;br /&gt;    [843] =&gt; 16606aa10a6cabe3564bc378827a87e8&lt;br /&gt;    [844] =&gt; 166fc57581b04bc94305f8430c118500&lt;br /&gt;    [845] =&gt; 1684658f28ad77c9bce029e7c43e7c7d&lt;br /&gt;    [846] =&gt; 1698a2f46e4f438f08533d33702957de&lt;br /&gt;    [847] =&gt; 16b6b8b1b34bebc0858af1ea0fd95b01&lt;br /&gt;    [848] =&gt; 16ba66dfe1c6cbfbe714ef6abce992ac&lt;br /&gt;    [849] =&gt; 16c1e3d8643154cea78d2ed1fd5b46e2&lt;br /&gt;    [850] =&gt; 16c61a92ebd4b02fd439b5d1d9d11583&lt;br /&gt;    [851] =&gt; 16c62317db73d12cb4eceafed7c38d52&lt;br /&gt;    [852] =&gt; 16c95efcab0c96f24b5329dc5b36b352&lt;br /&gt;    [853] =&gt; 16c95efcab0c96f24b5329dc5b36b352&lt;br /&gt;    [854] =&gt; 16d9b0745b8bf44e3363f955cd2b7f9d&lt;br /&gt;    [855] =&gt; 16e6614fe83145748b5458166d064925&lt;br /&gt;    [856] =&gt; 16e6614fe83145748b5458166d064925&lt;br /&gt;    [857] =&gt; 16e80a180beab01df0cd0a8c5849b39b&lt;br /&gt;    [858] =&gt; 16efe92ecb51d1372b47d8b6b1baec84&lt;br /&gt;    [859] =&gt; 1700923e81c497a52120f3adee109c3d&lt;br /&gt;    [860] =&gt; 1700923e81c497a52120f3adee109c3d&lt;br /&gt;    [861] =&gt; 170ded09f78a2b3519d9f3155e3a004a&lt;br /&gt;    [862] =&gt; 170ded09f78a2b3519d9f3155e3a004a&lt;br /&gt;    [863] =&gt; 1711b1cd91909e3716b77543ef6e68bb&lt;br /&gt;    [864] =&gt; 1711b1cd91909e3716b77543ef6e68bb&lt;br /&gt;    [865] =&gt; 171c41ce74c13f435acba6f212b531d8&lt;br /&gt;    [866] =&gt; 17286243113d9b5c38d902f29a9d21bb&lt;br /&gt;    [867] =&gt; 172eb7e217b9755063a27b6417bb3fe5&lt;br /&gt;    [868] =&gt; 172eb9d851014ca2e88937fa42b8f9a9&lt;br /&gt;    [869] =&gt; 17463e2adab15780e5c191e9dbafb545&lt;br /&gt;    [870] =&gt; 1749bf493a76d17f9ddd59ee6131a3ca&lt;br /&gt;    [871] =&gt; 1749bf493a76d17f9ddd59ee6131a3ca&lt;br /&gt;    [872] =&gt; 17685786ad04c9ce29beceeea2e15569&lt;br /&gt;    [873] =&gt; 17685786ad04c9ce29beceeea2e15569&lt;br /&gt;    [874] =&gt; 176e2e6c4c34f38e36ccfc062b4a2444&lt;br /&gt;    [875] =&gt; 17755d3772652ba5b40583220c66f51c&lt;br /&gt;    [876] =&gt; 17755d3772652ba5b40583220c66f51c&lt;br /&gt;    [877] =&gt; 177fdfda876ffcc80a443f28d066106d&lt;br /&gt;    [878] =&gt; 179c04fab09404762e341869dcfc58f9&lt;br /&gt;    [879] =&gt; 179eb1a7c53bdc0db979957de7852d37&lt;br /&gt;    [880] =&gt; 17a47385894eb3bdc9f6d7ba3095c625&lt;br /&gt;    [881] =&gt; 17a67fdeb736857903d9248175f90c61&lt;br /&gt;    [882] =&gt; 17a67fdeb736857903d9248175f90c61&lt;br /&gt;    [883] =&gt; 17a694d44a77338c9e209e4e9b3016b4&lt;br /&gt;    [884] =&gt; 17aa5f77407cd57861bed1d0b5c4af32&lt;br /&gt;    [885] =&gt; 17ad19fe94eb5584065e07f91de59250&lt;br /&gt;    [886] =&gt; 17b097c95f5aeca4f567c5f0947413e6&lt;br /&gt;    [887] =&gt; 17b097c95f5aeca4f567c5f0947413e6&lt;br /&gt;    [888] =&gt; 17c532edd514f7e553116973ea78db0d&lt;br /&gt;    [889] =&gt; 17c938ced88f0003f13856bdd88d4b2e&lt;br /&gt;    [890] =&gt; 17d39947a0a5785fbb95d01ae9f19e0d&lt;br /&gt;    [891] =&gt; 17d6dce3660201f98a878dcc53bbf962&lt;br /&gt;    [892] =&gt; 17d7734d9dcfcfa09cd811342860ec27&lt;br /&gt;    [893] =&gt; 17d77df0546e9117ed558da498c051a2&lt;br /&gt;    [894] =&gt; 17d8247b104d6ed27f01dab3ffdef688&lt;br /&gt;    [895] =&gt; 17e5bdaeaec8d9308da5868b17f89de3&lt;br /&gt;    [896] =&gt; 17e8c9d93554dc8a54336b56d1c18996&lt;br /&gt;    [897] =&gt; 17ef1b82389841fdd3d15eb262a8b446&lt;br /&gt;    [898] =&gt; 17fed1c7b74deda9b7384fbed3b06946&lt;br /&gt;    [899] =&gt; 17fed1c7b74deda9b7384fbed3b06946&lt;br /&gt;    [900] =&gt; 180061f5545e11d60a5c51254a87118d&lt;br /&gt;    [901] =&gt; 1812609c98166507ade3bf212d316270&lt;br /&gt;    [902] =&gt; 18134a8e5e6fecbb55bae6d60da47030&lt;br /&gt;    [903] =&gt; 1817e36707b8bcdaf9d0a3d016bd3717&lt;br /&gt;    [904] =&gt; 1819dc6e0cc70a91b579951f17865414&lt;br /&gt;    [905] =&gt; 181e42ee10d256482eb4c7a532acf92d&lt;br /&gt;    [906] =&gt; 18232cd6cb4c3eb89ef4807b2e4db7e4&lt;br /&gt;    [907] =&gt; 18232cd6cb4c3eb89ef4807b2e4db7e4&lt;br /&gt;    [908] =&gt; 1833c96f4c4dd3dd6d30835beb95c329&lt;br /&gt;    [909] =&gt; 1842a10f9931732da0e61ba9e6570db1&lt;br /&gt;    [910] =&gt; 1843f0c3436b6447f97aa2107d00937f&lt;br /&gt;    [911] =&gt; 1843f0c3436b6447f97aa2107d00937f&lt;br /&gt;    [912] =&gt; 184425d8c251bf40e0ccb0cc541b3cdc&lt;br /&gt;    [913] =&gt; 184c90d83d361bfa849b91239a6b3c02&lt;br /&gt;    [914] =&gt; 185fa37620c88c608031a1a8febedd7b&lt;br /&gt;    [915] =&gt; 187a1e0c135d90dd23618e5bc3866f29&lt;br /&gt;    [916] =&gt; 187a1e0c135d90dd23618e5bc3866f29&lt;br /&gt;    [917] =&gt; 187f6027cd89c8f2bac2be26845f4171&lt;br /&gt;    [918] =&gt; 18842fde82f87a808ae96e160e46bb24&lt;br /&gt;    [919] =&gt; 18908502ff0fb2dd66a6271294155f56&lt;br /&gt;    [920] =&gt; 18908502ff0fb2dd66a6271294155f56&lt;br /&gt;    [921] =&gt; 189508e2f98f3b3e75aa9d4b7afeabcb&lt;br /&gt;    [922] =&gt; 18972933c4a36889f98fa91ec3cc4f99&lt;br /&gt;    [923] =&gt; 189e1f83d477345ee08d471265bc8d8e&lt;br /&gt;    [924] =&gt; 18aa14202971cf205fe250c8b53ed248&lt;br /&gt;    [925] =&gt; 18ab81b176ffb46f1b32330e90f2e362&lt;br /&gt;    [926] =&gt; 18ab81b176ffb46f1b32330e90f2e362&lt;br /&gt;    [927] =&gt; 18b1a7be892eba377d5fac99e9fe6b6b&lt;br /&gt;    [928] =&gt; 18c1dd3fae6bd91e82c5a82075110ccd&lt;br /&gt;    [929] =&gt; 18c1dd3fae6bd91e82c5a82075110ccd&lt;br /&gt;    [930] =&gt; 18e1707eb4bb36cc55e0e5ca201824ca&lt;br /&gt;    [931] =&gt; 18e8a8492eb4c0251caa2ad44f86f395&lt;br /&gt;    [932] =&gt; 18e8a8492eb4c0251caa2ad44f86f395&lt;br /&gt;    [933] =&gt; 18ef0bcb7865d51160f981ed39994249&lt;br /&gt;    [934] =&gt; 18ef93e10ba1eecca52a04ccef3174f6&lt;br /&gt;    [935] =&gt; 18f964d4b734ae0367ed79376627daf3&lt;br /&gt;    [936] =&gt; 1921f64f19a45c6ae8c123ef349dc903&lt;br /&gt;    [937] =&gt; 1921f64f19a45c6ae8c123ef349dc903&lt;br /&gt;    [938] =&gt; 192986a50e8f2a0a35da50ef6ef0f0b6&lt;br /&gt;    [939] =&gt; 194cf6d3abf0c80294b1a8da80ed43e6&lt;br /&gt;    [940] =&gt; 194d96981cd04d4b605e4589ba7b6cc6&lt;br /&gt;    [941] =&gt; 194d96981cd04d4b605e4589ba7b6cc6&lt;br /&gt;    [942] =&gt; 195555f3feb9203c320adf4bba365cfa&lt;br /&gt;    [943] =&gt; 195851dae2fdfc833061edf37e83bdcb&lt;br /&gt;    [944] =&gt; 195caeccf2122f34de632c6064572876&lt;br /&gt;    [945] =&gt; 195ff76959e29a45e075927db6dfb5dd&lt;br /&gt;    [946] =&gt; 195ff76959e29a45e075927db6dfb5dd&lt;br /&gt;    [947] =&gt; 1961b0d47b46b19b59211e80d9bc9d7e&lt;br /&gt;    [948] =&gt; 1963a2e443b17d13816b6970b71cde2e&lt;br /&gt;    [949] =&gt; 1998c1c65d00647007da6d07364440ef&lt;br /&gt;    [950] =&gt; 19a4981055b8247431809b89c68928d0&lt;br /&gt;    [951] =&gt; 19adbe9ffb613fa7f004f7e244aa5238&lt;br /&gt;    [952] =&gt; 19adbe9ffb613fa7f004f7e244aa5238&lt;br /&gt;    [953] =&gt; 19ba23ded13a9156ab79cb81e48e9e4c&lt;br /&gt;    [954] =&gt; 19c08ba1223c74f655e1abb0d260115e&lt;br /&gt;    [955] =&gt; 19d36cc18951ed096f77f223015e99c1&lt;br /&gt;    [956] =&gt; 19f5f3532acc0a97981f8260391de4f4&lt;br /&gt;    [957] =&gt; 19f97a56e56f6bba3e72e0a1bcc17447&lt;br /&gt;    [958] =&gt; 19faa9827010e4017249c1dae384b59b&lt;br /&gt;    [959] =&gt; 19ffe7412a5dd04a5d9c590fc86389e4&lt;br /&gt;    [960] =&gt; 1a152b97311a82beb5c34381b342cb0c&lt;br /&gt;    [961] =&gt; 1a26322219179ef965972569edec6bd2&lt;br /&gt;    [962] =&gt; 1a26322219179ef965972569edec6bd2&lt;br /&gt;    [963] =&gt; 1a38f6af31cdab6bd3eb17a16b481115&lt;br /&gt;    [964] =&gt; 1a4d70c265282da304ac0e559644d3c6&lt;br /&gt;    [965] =&gt; 1a5beb5725cbffede401ff68656b2557&lt;br /&gt;    [966] =&gt; 1a60883f501759f707c82e00943867ef&lt;br /&gt;    [967] =&gt; 1a7403e56634994c23d3f6adc5370077&lt;br /&gt;    [968] =&gt; 1a88ea58ff7b8b0fdece278851f201a7&lt;br /&gt;    [969] =&gt; 1a891757bf017f6156d456e21dad5a22&lt;br /&gt;    [970] =&gt; 1a8acd1d5a06ad04ec0ea318af2bbf67&lt;br /&gt;    [971] =&gt; 1a9524da2c6682fdab527817a58a5f9f&lt;br /&gt;    [972] =&gt; 1a95a94361f252160c47b080d1313b78&lt;br /&gt;    [973] =&gt; 1aa39219092327d113461856c56f97b5&lt;br /&gt;    [974] =&gt; 1ab2f537075f0b2945c241ad937417fe&lt;br /&gt;    [975] =&gt; 1ab6d44c436ab45f81b02e72f77ee251&lt;br /&gt;    [976] =&gt; 1ac0ce39ae1b8eac3a3a8308622a9ae1&lt;br /&gt;    [977] =&gt; 1ac83fee1a70f89fd7963c42c30503ea&lt;br /&gt;    [978] =&gt; 1ad078b21e0293ef64ca374cf969354e&lt;br /&gt;    [979] =&gt; 1ad28bcad97f8004a9b0d717b9750114&lt;br /&gt;    [980] =&gt; 1ae62f4099662a34771fb2478ced9786&lt;br /&gt;    [981] =&gt; 1ae62f4099662a34771fb2478ced9786&lt;br /&gt;    [982] =&gt; 1af24d773234ad67a8d95e95b1f8a5b4&lt;br /&gt;    [983] =&gt; 1af3480248d2b2964d368aedc4c919c7&lt;br /&gt;    [984] =&gt; 1af3480248d2b2964d368aedc4c919c7&lt;br /&gt;    [985] =&gt; 1b0b0e0e2a27bc1bc4ea4f204cb9c77e&lt;br /&gt;    [986] =&gt; 1b0d285ebd5e02d8a463460a2eab138b&lt;br /&gt;    [987] =&gt; 1b0f9109b5f9a539de1288a988d68bb2&lt;br /&gt;    [988] =&gt; 1b0f9109b5f9a539de1288a988d68bb2&lt;br /&gt;    [989] =&gt; 1b23370d2e569101559e4df6851b88c9&lt;br /&gt;    [990] =&gt; 1b2b03d0f3c63d0e5bea9b1abab1df7d&lt;br /&gt;    [991] =&gt; 1b2b8f07a7b7f1289f3b4bbee52d3d5c&lt;br /&gt;    [992] =&gt; 1b2ec753aa0aa8d873727e23c0f2c20c&lt;br /&gt;    [993] =&gt; 1b3f9c98fc88e1a4e3ea35ad199f574e&lt;br /&gt;    [994] =&gt; 1b4af852e6c3656bf4608fee56aef3e3&lt;br /&gt;    [995] =&gt; 1b4af852e6c3656bf4608fee56aef3e3&lt;br /&gt;    [996] =&gt; 1b502511e35b7df62e5a44df79d176e4&lt;br /&gt;    [997] =&gt; 1b68038ab059dbc7c6a233dafc15639f&lt;br /&gt;    [998] =&gt; 1b726036c93023542bed135908019080&lt;br /&gt;    [999] =&gt; 1b8dd7f9f531a85634212bac40106e04&lt;br /&gt;    ...................&lt;br /&gt;    ...................&lt;br /&gt;    [9999] =&gt; ffffb3a7d8ee97bad136914291063465&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Не находите ли повторений? &lt;br /&gt;&lt;br /&gt;Самый главный побочный эффект: один "запомненный" юзер имеет высокие шансы залететь в аккаунт другого "запомненного" юзера.&lt;br /&gt;&lt;br /&gt;UPD: &lt;a href="http://trac.symfony-project.org/ticket/8876" target="_blank"&gt;Зарепортен баг&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-2320425244042110443?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/2320425244042110443/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/07/achtung-sfguardplugin-symfony.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2320425244042110443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2320425244042110443'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/07/achtung-sfguardplugin-symfony.html' title='Критический баг в sfGuardPlugin'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-7761642451574587848</id><published>2010-07-07T12:32:00.001+04:00</published><updated>2010-07-07T12:36:17.983+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабли: таблицу удалили (переименовали), а она все равно создается</title><content type='html'>Если вы переименовали или удалили какую-то модель (таблицу) в доктрина-схеме, а при следующем doctrine:build эта таблица все равно создается, то надо почистить старые классы моделей (они не удаляются автоматически при изменении схемы):&lt;br /&gt;&lt;pre&gt;symfony doctrine:clean-model-files&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-7761642451574587848?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/7761642451574587848/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/07/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7761642451574587848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7761642451574587848'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/07/blog-post.html' title='Грабли: таблицу удалили (переименовали), а она все равно создается'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-7150234127784922667</id><published>2010-07-04T14:25:00.004+04:00</published><updated>2010-07-04T15:13:12.362+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='form'/><category scheme='http://www.blogger.com/atom/ns#' term='CKEditor'/><title type='text'>Подключаем CKEditor в Symfony</title><content type='html'>Ничего сложного в установке этого WYSIWYG-редактора нет, но тем не менее, пара небольших грабелек заботливо спрятана составителями документации. &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Итак, устанавливаем плагин &lt;a href="http://www.symfony-project.org/plugins/sfCKEditorPlugin" target="_blank"&gt;sfCKEditorPlugin&lt;/a&gt;, как написано в документации к нему. Но учитываем следующее:&lt;br /&gt;&lt;br /&gt;1. В autoload.yml вместо "recursive: on" надо писать "recursive: true" (начиная с symfony 1.3 используется более жесткий стандарт булевых значений в YAML)&lt;br /&gt;&lt;br /&gt;2. Надо &lt;a href="http://ckeditor.com/download" target="_blank"&gt;скачать&lt;/a&gt; сам редактор и распаковать в папку /web/ckeditor/ все файлы из архива.&lt;br /&gt;&lt;br /&gt;3. В autoload.yml указываем путь к PHP-классам редактора:&lt;br /&gt;&lt;pre&gt;path:       %SF_WEB_DIR%/ckeditor&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4. В app.yml указываем URL к файлам редактора (именно так - со слешем на конце):&lt;br /&gt;&lt;pre&gt;ckeditor:&lt;br /&gt;    basePath:         "/ckeditor/"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;5. Аналогично настраиваем файловый менеджер CKFinder (&lt;a href="http://ckfinder.com/download" target="_blank"&gt;скачиваем&lt;/a&gt;, прописываем путь в autoload.yml, и не забываем, что эта штуковина &lt;a href="http://ckfinder.com/purchase" target="_blank"&gt;платная&lt;/a&gt;). В файле ckfinder/config.php есть интересная функция CheckAuthentication(), которая сейчас просто return false. Предназначение этой функции - проверить, имеет ли текущий юзер право доступа к файловому менеджеру (просмотр и аплоад файлов). В комментариях к функции прямо указано - "не надо просто заменять на return true! Пораскинь мозгами и напиши проверку на авторизацию". От себя добавлю, что пока не придумал, как в эту функцию можно передать проверку на авторизацию. Есть идеи, товарищи?&lt;br /&gt;&lt;br /&gt;6. В документации к плагину написано, что можно конфигурировать CKFinder так:&lt;br /&gt;&lt;pre&gt;$this-&amp;gt;widgetSchema[&amp;#039;my_editor&amp;#039;] = new sfWidgetFormCKEditor();&lt;br /&gt;$editor = $this-&amp;gt;widgetSchema[&amp;#039;my_editor&amp;#039;]-&amp;gt;getEditor();&lt;br /&gt;$editor-&amp;gt;config[&amp;#039;param&amp;#039;] = value;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;но что писать в value, если редактор принимает JSON? Пишем родные PHP-структуры:&lt;br /&gt;&lt;pre&gt;$this-&amp;gt;widgetSchema[&amp;#039;my_editor&amp;#039;] = new sfWidgetFormCKEditor();&lt;br /&gt;$editor = $this-&amp;gt;widgetSchema[&amp;#039;my_editor&amp;#039;]-&amp;gt;getEditor();&lt;br /&gt;$editor-&amp;gt;config[&amp;#039;toolbar_Full&amp;#039;]=array(&lt;br /&gt;   array('Source','-','Save'),&lt;br /&gt;   array('Cut','Copy'),&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-7150234127784922667?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/7150234127784922667/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/07/ckeditor-symfony.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7150234127784922667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7150234127784922667'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/07/ckeditor-symfony.html' title='Подключаем CKEditor в Symfony'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-8392541303831077150</id><published>2010-06-09T21:36:00.002+04:00</published><updated>2010-06-09T21:40:29.129+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><title type='text'>Как использовать партиал или компонент из другого application?</title><content type='html'>Иногда возникает задача использовать партиал или компонент из другого application. Самое простое (и, на мой взгляд, логичное) решение &amp;mdash; сделать плагин, сделать модуль, и в него положить этот партиал или компонент. Включаем модуль в settings.yml:&lt;br /&gt;&lt;pre&gt;enabled_modules: [....., SharedComponent]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;и спокойно используем его так, как будто он объявлен в папке самого application'a.&lt;br /&gt;&lt;br /&gt;P.S. О том, как делать ссылки из одного приложения в другое, можно почитать &lt;a href="http://www.symfony-project.org/blog/2009/02/17/cross-application-links" target="_blank"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-8392541303831077150?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/8392541303831077150/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/06/application.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8392541303831077150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8392541303831077150'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/06/application.html' title='Как использовать партиал или компонент из другого application?'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-7084008589431134610</id><published>2010-06-04T20:54:00.000+04:00</published><updated>2010-06-04T20:54:30.293+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='оптимизация'/><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><title type='text'>Обрабатываем большую коллекцию по частям</title><content type='html'>Не секрет, что гидрация в объекты большого количества записей занимает много ресурсов (времени). Поэтому если вам надо вытащить Доктриной большое количество записей, и обработать их, то первый шаг к оптимизации - вытаскивать коллекцию не всю сразу, а кусочками. Примерно вот так&lt;a name='more'&gt;&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$offset&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#008c00; background:#ffffe8; '&gt;0&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$count&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#008c00; background:#ffffe8; '&gt;10&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$q&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;Doctrine_Query&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;::&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;create&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;from&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'sfGuardUser u'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;while&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#008c00; background:#ffffe8; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$q&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;limit&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$count&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;offset&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$offset&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$users&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$q&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;execute&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;!&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$users&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;count&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;break&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;//Работаем с коллекцией $users&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;//Освобождаем память. Это важно!&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$users&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;free&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;unset&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$users&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-7084008589431134610?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/7084008589431134610/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/06/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7084008589431134610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7084008589431134610'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/06/blog-post.html' title='Обрабатываем большую коллекцию по частям'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-6608903333996555534</id><published>2010-05-24T20:45:00.000+04:00</published><updated>2010-05-24T20:45:14.520+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабли: каскадное удаление в refClass'e</title><content type='html'>Чтобы избежать mysql-ошибок CONSTRAINTS при удалении/обновлении записей, которые связаны с другими связями многие-ко-многим, не забывайте прописывать каскадное удаление в ref-классах: &lt;br /&gt;&lt;pre&gt;  relations:&lt;br /&gt;    AAA:&lt;br /&gt;      onDelete: CASCADE&lt;br /&gt;    BBB:&lt;br /&gt;      onDelete: CASCADE&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-6608903333996555534?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/6608903333996555534/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/refclasse.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/6608903333996555534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/6608903333996555534'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/refclasse.html' title='Грабли: каскадное удаление в refClass&apos;e'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-147053623147646451</id><published>2010-05-22T18:38:00.003+04:00</published><updated>2010-06-09T21:39:40.398+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><category scheme='http://www.blogger.com/atom/ns#' term='fixtures'/><title type='text'>Грабли: очередность загрузки фикстур</title><content type='html'>Если в папке с фикстурами лежат несколько файлов, то они обрабатываются все сразу, а по очереди. Это надо учитывать, когда создаются связи между записями в разных файлах!&lt;br /&gt;Легко натолкнуться на ситуацию, когда связь не будет создана только потому, что объекта, с которым она связывает, еще нет в БД, и он неизвестен Доктрине: она до него еще просто не дошла.&lt;br /&gt;&lt;br /&gt;Стоит отметить, что в пределах одного файла такой проблемы нет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-147053623147646451?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/147053623147646451/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/blog-post_22.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/147053623147646451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/147053623147646451'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/blog-post_22.html' title='Грабли: очередность загрузки фикстур'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-8305717185773502231</id><published>2010-05-12T15:33:00.000+04:00</published><updated>2010-05-12T15:33:06.223+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='админ-генератор'/><title type='text'>Как взять значение фильтра из URL?</title><content type='html'>Есть сгенерированная админка. Список. Справа форма фильтрации. Как взять значение для фильтрации списка (и формы, соответственно) из URL? Очень просто. &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Перегружаем в классе экшена сгенерированного модуля метод получения значения фильтров:&lt;br /&gt;&lt;pre&gt;  protected function getFilters()&lt;br /&gt;  {&lt;br /&gt;    $filters=$this-&gt;getUser()-&gt;getAttribute('ИМЯ_МОДУЛЯ.filters', $this-&gt;configuration-&gt;getFilterDefaults(), 'admin_module');&lt;br /&gt;    if ($ИМЯ_ПОЛЯ=$this-&gt;getRequest()-&gt;getParameter('ИМЯ_ПОЛЯ',false))&lt;br /&gt;      $filters['ИМЯ_ПОЛЯ']=$ИМЯ_ПОЛЯ;&lt;br /&gt;  &lt;br /&gt;    return $filters;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Вот и все. Теперь значения фильтров берутся из сессии, но если в переданных параметрах есть поле, по значению которого фильтруем список, то это значение добавляется (или перезатирает старое значение) в список фильтров.&lt;br /&gt;&lt;br /&gt;Безусловно, поддается рефакторингу. Но цель поста - показать направление.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-8305717185773502231?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/8305717185773502231/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/url.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8305717185773502231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8305717185773502231'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/url.html' title='Как взять значение фильтра из URL?'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-9146845955491722934</id><published>2010-05-12T00:07:00.001+04:00</published><updated>2010-05-12T01:01:08.381+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='i18n'/><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><title type='text'>Symfony: храним i18n-фразы в mysql</title><content type='html'>Как сделать так, чтобы фразы выводящиеся в шаблонах, можно было редактировать через админку? Для этого нужно сделать несколько простых, но совершенно неочевидных шагов (по большей части решения были найдены методом научного тыка и копания исходников).&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Предполагается, что i18n уже включен, и плагин &lt;a href="http://www.symfony-project.org/plugins/mgI18nPlugin" target="_blank"&gt;mgI18n&lt;/a&gt; вам по каким-то причинам не подошел (в моем случае он просто не завелся - ни с первого, ни с третьего раза).&lt;br /&gt;&lt;br /&gt;Поиск документации дал только этот &lt;a href="http://trac.symfony-project.org/wiki/HowToUse18NOverMysql" target="_blank"&gt;старенький документ&lt;/a&gt; и &lt;a href="http://bemused.org/blog/2008/02/20/symfony-and-i18n/"&gt;это&lt;/a&gt; несколько мутное описание решение проблемы. &lt;br /&gt;&lt;br /&gt;Итак, начнем.&lt;br /&gt;&lt;br /&gt;Для хранения фраз нам потребуется две таблицы (их структура дана в первом найденном документе, а также в файле symfony/lib/i18n/sfMessageSource_MySQL.class.php. Поскольку мы работаем с Doctrine, нарисуем схему для этих таблиц:&lt;br /&gt;&lt;pre&gt;Catalogue:&lt;br /&gt;  columns:&lt;br /&gt;    cat_id: { type: integer, notnull: true, autoincrement: true, primary: true }&lt;br /&gt;    name: { type: string(100), notnull: true, default: '' }&lt;br /&gt;    source_lang: { type: string(100), notnull: true, default: '' }&lt;br /&gt;    target_lang: { type: string(100), notnull: true, default: '' }&lt;br /&gt;    date_created: { type: integer, notnull: true, default: 0 }&lt;br /&gt;    date_modified: { type: integer, notnull: true, default: 0 }&lt;br /&gt;    author: { type: string(255), notnull: true, default: '' }&lt;br /&gt;    &lt;br /&gt;trans_unit:&lt;br /&gt;  columns:&lt;br /&gt;    msg_id: { type: integer, notnull: true, autoincrement: true, primary: true }&lt;br /&gt;    cat_id: { type: integer, notnull: true}&lt;br /&gt;    source: { type: clob(65532), notnull: true }&lt;br /&gt;    target: { type: clob(65532), notnull: true }&lt;br /&gt;    comments: { type: clob(65532) }&lt;br /&gt;    date_added: { type: integer, notnull: true }&lt;br /&gt;    date_modified: { type: integer, notnull: true }&lt;br /&gt;    author: { type: string(255), notnull: true, default: ''}&lt;br /&gt;    translated: { type: boolean, notnull: true, default: false }    &lt;br /&gt;  relations:&lt;br /&gt;    Catalogue:&lt;br /&gt;      local: cat_id&lt;br /&gt;      foreign: cat_id&lt;br /&gt;      foreignAlias: Units&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И немножечко фикстур&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;catalogue:&lt;br /&gt;  ru:&lt;br /&gt;    name: messages.ru_RU&lt;br /&gt;    source_lang: en_US&lt;br /&gt;    target_lang: ru_RU&lt;br /&gt;    author: ''&lt;br /&gt;    &lt;br /&gt;  en:&lt;br /&gt;    name: messages.en_US&lt;br /&gt;    source_lang: en_US&lt;br /&gt;    target_lang: en_US&lt;br /&gt;    author: ''&lt;br /&gt;    &lt;br /&gt;  jp:&lt;br /&gt;    name: messages.jp&lt;br /&gt;    source_lang: en_US&lt;br /&gt;    target_lang: jp&lt;br /&gt;    author: ''&lt;br /&gt;    &lt;br /&gt;trans_unit:&lt;br /&gt;  u1:&lt;br /&gt;    Catalogue: ru&lt;br /&gt;    source: hello&lt;br /&gt;    target: Привет&lt;br /&gt;    translated: true&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Здесь следует обратить внимание на следующие важные моменты:&lt;br /&gt;- поле name должно содержать значение вида "каталог.вариант", где каталог - это название каталога фраз (messages по умолчанию), а вариант - это вариант написания локали (ru_RU,RU,ru). В ходе поиска перевода перебираются все варианты локалей, поэтому лучше писать сразу ru_RU - он идет первым.&lt;br /&gt;- можно переводить с английского на английский. Зачем это надо? Чтобы в шаблонах вставлять "токены" фраз, а полнотекстовые переводы делать уже в админке (актуально для длинных фраз, например, для шаблонов писем).&lt;br /&gt;&lt;br /&gt;Затем небольшие настройки в factories.yml:&lt;br /&gt;&lt;pre&gt;all:&lt;br /&gt;  #...&lt;br /&gt;  i18n:&lt;br /&gt;    class: sfI18N&lt;br /&gt;    param:&lt;br /&gt;      source:               MySQL&lt;br /&gt;      database:             mysql://user:pass@localhost/your_db&lt;br /&gt;      debug:                true&lt;br /&gt;      untranslated_prefix:  "[T]"&lt;br /&gt;      untranslated_suffix:  "[/T]"&lt;br /&gt;      cache:&lt;br /&gt;        class: sfNoCache&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В общем-то, готово. Потестируем? Напишем где-нибудь в шаблоне &lt;br /&gt;&lt;pre&gt;echo __('hello')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Следующий абзац предназначен для тех, у кого выскочили ромбики или всякие кракозябры вместо русского перевода. Если это случилось, значит mysql-сервер выдает по умолчанию результат в кодировке, отличной от UTF8. Что ж, придется допиливать класс, который коннектится к БД и выбирает переводы фраз. Создаем новый файл sfMessageSource_MySQL_utf8.class.php с содержимым&lt;br /&gt;&lt;pre&gt;class sfMessageSource_MySQL_utf8 extends sfMessageSource_MySQL&lt;br /&gt;{&lt;br /&gt;  protected function connect()&lt;br /&gt;  {&lt;br /&gt;    $conn=parent::connect();&lt;br /&gt;    mysql_query('SET  NAMES \'UTF8\'',$conn);&lt;br /&gt;    return $conn;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Теперь нам следует поменять source в factories.yml на MySQL_utf8. Готово.&lt;br /&gt;&lt;br /&gt;Осталось сгенерировать админку для каталогов и фраз. Это уж сами :)&lt;br /&gt;&lt;br /&gt;И да, не пытайтесь увидеть на веб-панели mysql-запросы, которые делает подсистема i18n: она делает их не через доктрину.&lt;br /&gt;&lt;br /&gt;Еще одна полезная ссылка, на которую натолкнулся, пока искал решение - &lt;a href="http://rabaix.net/uploads/sflive10/presentation.pdf" target="_blank"&gt;презентация на тему i18n в симфонии&lt;/a&gt; (PDF)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-9146845955491722934?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/9146845955491722934/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/symfony-i18n-over-mysql.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/9146845955491722934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/9146845955491722934'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/symfony-i18n-over-mysql.html' title='Symfony: храним i18n-фразы в mysql'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-8779942483268203217</id><published>2010-05-08T00:35:00.000+04:00</published><updated>2010-05-08T00:35:39.049+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='админ-генератор'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабля: значения фильтров по умолчанию</title><content type='html'>Задача: в сгенерированной админке установить значения по умолчанию в форме фильтрации, а также использовать эти значения при фильтрации списка, когда фильтр еще не запущен.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;При генерации админки создается несколько классов, в том числе класс формы фильтрации списка: myobjectFilterForm. Так и хочется добавить в него&lt;br /&gt;&lt;pre&gt;$this-&gt;widgetSchema['is_visible']-&gt;setDefault(1);&lt;/pre&gt;Делать этого нельзя: в форме действительно будет установлено значение по умолчанию в указанном виджете. А вот список фильтроваться не будет. Поэтому есть другое решение, которое и решает нашу проблему:&lt;br /&gt;&lt;pre&gt;//apps/backend/modules/myobject/lib/myobjectGeneratorConfiguration.class.php&lt;br /&gt;&lt;br /&gt;  public function getFilterDefaults() &lt;br /&gt;  {&lt;br /&gt;    return array('is_visible'=&gt;1);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Все оказалось так просто...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-8779942483268203217?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/8779942483268203217/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8779942483268203217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8779942483268203217'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/05/blog-post.html' title='Грабля: значения фильтров по умолчанию'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-748566813807841265</id><published>2010-04-20T23:28:00.000+04:00</published><updated>2010-04-20T23:28:14.426+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unique'/><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабля: ругается, что такая запись уже есть в БД</title><content type='html'>Проблема: при редактировании объекта и отправке формы Доктрина ругается, что &lt;br /&gt;&lt;pre&gt;An object with the same "email" already exist&lt;/pre&gt;при том, что мы совешенно уверены, что такой email в базе ровно один - у редактируемого объекта. В чем дело? Если случилось так, что форма редактирования объекта содержит embedded-форму, то скорее всего проблема в следующем.&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Как работает валидатор уникальности? Проверяет, есть ли в БД запись с &lt;b&gt;таким&lt;/b&gt; значением поля, и id, &lt;b&gt;отличным&lt;/b&gt; от id сохраняемого объекта. Если находит, то выдает ошибку валидации - "already exists". А теперь посмотрим внимательно на то, как мы встраиваем одну форму в другую. И наверняка найдем строчки вида&lt;br /&gt;&lt;pre&gt;unset($this['id'],$this['user_id']);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Так-так... id удалили? Значит уник-валидатор &lt;b&gt;найдет&lt;/b&gt; запись с таким email и id!=null. &lt;br /&gt;&lt;br /&gt;Что же делать?&lt;br /&gt;&lt;br /&gt;Два варианта.&lt;br /&gt;1. Проверять уникальность только в том случае, если значение поля поменялось (имхо, гемор)&lt;br /&gt;2. Лучше так:&lt;br /&gt;&lt;pre&gt;    if ($this-&gt;isNew())&lt;br /&gt;    {&lt;br /&gt;      unset($embedded_form['id'],$embedded_form['user_id']);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;То есть мы удаляем id только в том случае, если создаем новый объект (это нужно для избежания дублирования записей в БД). Если редактируем имеющийся, то id удалять не нужно, т.к. в это поле подставляется уже сохраненное в БД значение, и связь не нарушится.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-748566813807841265?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/748566813807841265/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/blog-post_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/748566813807841265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/748566813807841265'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/blog-post_20.html' title='Грабля: ругается, что такая запись уже есть в БД'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-949913686496519848</id><published>2010-04-20T14:37:00.000+04:00</published><updated>2010-04-20T14:37:50.106+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабли: символ "-" в названии БД mysql</title><content type='html'>Не нужно использовать этот символ. Неожиданности гарантированы. Заменяйте на подчеркивание&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-949913686496519848?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/949913686496519848/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/mysql.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/949913686496519848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/949913686496519848'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/mysql.html' title='Грабли: символ &quot;-&quot; в названии БД mysql'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-4345399317730652842</id><published>2010-04-20T13:12:00.002+04:00</published><updated>2010-04-20T13:20:43.651+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабли: SQLSTATE[HY000]: General error: 1005 Can't create table</title><content type='html'>Mysql server version: 5.1.40-community&lt;br /&gt;если при составлении схемы была допущена ошибка, которая привела к General error: 1005 при установке CONSTRAINTS (например примари ключ и внешний ключ имеют разные типы), то есть вероятность, что даже после исправления схемы она не сможет создаться: та же ошибка. Это связано с тем, что предыдущие, неправильно связанные таблицы, не могут удалиться: мешает кривой CONSTRAINTS. Решение одно: дропнуть БД (ну или бинарные файлы таблиц).&lt;br /&gt;&lt;br /&gt;Лично я столкнулся с этой проблемой, когда в симфонии 1.4 случайно использовал sfDoctrineGuardPlugin из ветки 1.2. Выдалась ошибка. Заменил плагин, ошибка осталась. Удалил руками бинарники, пересобрал таблицы - все ок.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-4345399317730652842?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/4345399317730652842/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/4345399317730652842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/4345399317730652842'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/blog-post.html' title='Грабли: SQLSTATE[HY000]: General error: 1005 Can&apos;t create table'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-1936334015023112353</id><published>2010-04-06T11:57:00.004+04:00</published><updated>2010-04-20T13:22:13.221+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='авторизация'/><category scheme='http://www.blogger.com/atom/ns#' term='sfDoctrineGuardPlugin'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабли: почему теряются пермиссии?</title><content type='html'>Почему при добавлении новой пермиссии текущему пользователю (через админку, например), в списке $this-&gt;getUser()-&gt;getCredentials() она не появляется? Дело в том, что набор пермиссий сохраняется в сессии, если включен фильтр sfGuardRememberMeFilter (галочка "Запомнить меня"). Обращения к базе данных в этом случае вообще не происходит. Чтобы новая пермиссия стала доступна текущему пользователю, надо разлогиниться и снова залогиниться.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-1936334015023112353?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/1936334015023112353/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/lost-user-permissions.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/1936334015023112353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/1936334015023112353'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/lost-user-permissions.html' title='Грабли: почему теряются пермиссии?'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-687598855989892537</id><published>2010-04-06T10:07:00.003+04:00</published><updated>2010-04-06T10:11:03.818+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>General error: 1451 Cannot delete or update a parent row: a foreign key constraint fails</title><content type='html'>Почему при удалении записи возникает SQL-ошибка?&lt;br /&gt;&lt;pre&gt;General error: 1451 Cannot delete or update a parent row: a foreign key constraint fails ... &lt;/pre&gt;&lt;br /&gt;Потому что при удалении в БД объекты все еще связаны. И поэтому их надо развязать на уровне приложения перед удалением. В методе delete модели нужно добавить отвязку: &lt;br /&gt;&lt;pre&gt;  $this-&gt;unlink('Tickets',$this-&gt;Tickets-&gt;getPrimaryKeys(),true);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Это требуется только при наличии связи many-to-many. При других типах связей вполне справляется onDelete: CASCADE. Обратите внимание на третий аргумент (true). Он указывает на то, что unlink надо сделать немедленно, а не помечать связи как "подлежащие удалению".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-687598855989892537?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/687598855989892537/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/general-error-1451-cannot-delete-or.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/687598855989892537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/687598855989892537'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/04/general-error-1451-cannot-delete-or.html' title='General error: 1451 Cannot delete or update a parent row: a foreign key constraint fails'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-4308982165237602690</id><published>2010-03-21T20:27:00.005+03:00</published><updated>2010-03-21T23:22:38.152+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='form'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабля: дублирование записей при сохранении формы</title><content type='html'>Если при сохранении формы дублируются записи, то срочно проверяем: а нет ли embedded-формы, у которой нет связующего поля?&lt;br /&gt;&lt;br /&gt;Добавляем в embedded-форму связующее поле (user_id, product_id,...) и грабля остается позади.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPD&lt;/b&gt; А вот и неправда. Наоборот, надо исключить связующие поля, да еще и id впридачу. Например, вот правильный код встраивания Profile-формы:&lt;br /&gt;&lt;pre&gt;public function configure()&lt;br /&gt; {&lt;br /&gt;   parent::configure();&lt;br /&gt;  &lt;br /&gt;   $profileForm = new ProfileForm($this-&gt;object-&gt;Profile);&lt;br /&gt;   unset($profileForm['id'], $profileForm['sf_guard_user_id']);&lt;br /&gt;   $this-&gt;embedForm('Profile', $profileForm);&lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-4308982165237602690?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/4308982165237602690/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/4308982165237602690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/4308982165237602690'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/blog-post.html' title='Грабля: дублирование записей при сохранении формы'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-2381637255422553912</id><published>2010-03-21T20:23:00.001+03:00</published><updated>2010-03-21T20:24:10.682+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='авторизация'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='грабли'/><title type='text'>Грабля: setAuth в функциональном тесте</title><content type='html'>Начинаю давно задуманный цикл постов: Грабли. Комментарии, думаю, излишни. &lt;br /&gt;&lt;br /&gt;Как может показаться с первого взгляда, метод $browser-&gt;setAuth($username,$password) авторизует пользователя sfUser с заданными логином и паролем. Это не так, в чем мы убеждаемся, внимательнее прочитав описание метода: &lt;br /&gt;&lt;br /&gt;Sets username and password for simulating http authentication.&lt;br /&gt;&lt;br /&gt;То есть речь идет о HTTP-авторизации. Для того, чтобы достичь поставленной цели - авторизовать юзера - нужно (ну надо же!) заполнить форму логина и отправить ее.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-2381637255422553912?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/2381637255422553912/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/setauth.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2381637255422553912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2381637255422553912'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/setauth.html' title='Грабля: setAuth в функциональном тесте'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-8363781446384834511</id><published>2010-03-19T01:01:00.004+03:00</published><updated>2010-03-19T01:11:22.734+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='validation'/><title type='text'>Валидатор для проверки вхождения значения одного поля в значение другого</title><content type='html'>Простите, мне не удалось упростить заголовок поста. Итак, мне потребовалось проверить в форме, является ли значение поля А элементом массива, переданного в поле Б. После недолгих споров, я принял совет &lt;a href="http://blog.fxposter.org/" target="_blank"&gt;Павла&lt;/a&gt; наследовать валидатор-схему. Действительно, других способов получить доступ к двум и более полям формы, кажется, нет. Для одного поля подошел бы валидатор sfValidatorShemaFilter, но в нашем случае это решение не подходит - поля два.&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Итак, валидатор: &lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;/** Валидатор проверяет, содержится ли значение поля $needleField в значении поля $haystackField&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;*&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;*&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;*/&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;class&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfValidatorShemaContains &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;extends&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfValidatorSchema&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;public&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;__construct&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$needleField&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$haystackField&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$messages&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;addOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'neeldle_field'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$needleField&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;addOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'haystack_field'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$haystackField&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;addOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'throw_global_error'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;false&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;parent&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;::&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;__construct&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;null&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$messages&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;protected&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; doClean&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;null &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;!&lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;is_array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;throw&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;new&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; InvalidArgumentException&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'You must pass an array parameter to the clean() method'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$needleValue&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;  &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;isset&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'neeldle_field'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;?&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'neeldle_field'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; null&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$haystackValue&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;isset&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'haystack_field'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;?&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'haystack_field'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; null&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;!&lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;is_array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$haystackValue&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$haystackValue&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$haystackValue&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$valid&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;in_array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$needleValue&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$haystackValue&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;?&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;true&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;false&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;!&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$valid&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$error&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;new&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfValidatorError&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'invalid'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'neelde_field'&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;  &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$needleValue&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'haystack_field'&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$haystackValue&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'throw_global_error'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;throw&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$error&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;throw&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;new&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfValidatorErrorSchema&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'neelde_field'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$error&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;return&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Валидатор на 90% состоит из кода наиболее подходящего родного симфониевского валидатора - sfValidatorShemaCompare.&lt;br /&gt;&lt;br /&gt;Применять так: &lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;validatorSchema&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;setPostValidator&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;new&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfValidatorShemaContains&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'current_user_id'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'visible_to_users_list'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'invalid'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'Нельзя сделать ответственным того, кто не видит тикет'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-8363781446384834511?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/8363781446384834511/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/validate-contains-one-field-in-another.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8363781446384834511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8363781446384834511'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/validate-contains-one-field-in-another.html' title='Валидатор для проверки вхождения значения одного поля в значение другого'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-241096148543344329</id><published>2010-03-06T23:22:00.005+03:00</published><updated>2010-03-07T18:58:46.419+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2.0'/><title type='text'>Что новенького в Symfony 2?</title><content type='html'>Просмотрим мельком ту, пока еще небогатую, &lt;a href="http://symfony-reloaded.org/learn"&gt;документацию&lt;/a&gt; к новой версии Symfony, и отметим, что же нового готовит нам Sensio Labs.&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Наверное, уже всем известно, что Symfony 2 будет требовать PHP 5.3. &lt;br /&gt;&lt;br /&gt;Поменялось дерево каталогов. Наверное, еще рано делать глобальные выводы, но некоторые улучшения налицо: папки с приложениями теперь вынесены в корень. Удалено ненужное звено /apps/. &lt;br /&gt;&lt;br /&gt;frontend_dev.php стал называться index_dev.php. Мелочь, а приятно. (Я знаю, что можно поменять бла-бла-бла...).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Контроллер&lt;/h2&gt;Контроллер стал красивее. О Боже! Они наконец-то назвали экшены человеческими именами! executeList звучало странно. listAction звучит много лучше. В качестве параметров экшен теперь принимает не sfWebRequest, а параметры, описанные в роуте, который направил на этот экшен. Удобно, черт побери! Изменился формат описания роутов. Стало возможно подключать в основном файле описания routing.yml роут-файлы из других пакетов. Что ж, удобно! В роуте можно указать, в каком формате должен выдать результат экшен: HTML, XML, JSON, ... Объект Response по-прежнему жив, и отвечает за выдачу информации от экшена. &lt;br /&gt;&lt;br /&gt;Обработка ошибок построена на исключениях. Теперь, например, если запрашиваемый в экшене объект не найден, то не форвардим на экшен error404, а бросаем исключение NotFoundHttpException. &lt;br /&gt;&lt;br /&gt;Теперь при форварде и редиректе не забываем передавать параметры экшену, как того требует роут. Тем не менее, Request по-прежнему доступен и в целом выполняет те же функции, что и в предыдущей версии фреймворка. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Bundles&lt;/h2&gt;Bundle, bundle, bundle, bundle... Что же это? Это Symfony, друг мой. На языке Symfony bundle - это пачка взаимосвязанных файлов - PHP, HTML, CSS, картинки,... Все в Symfony 2.0 состоит из bundle. Bundle реализует какую-то одну завершенную штучку - форум, блог, новости, и т.п. Этим bundle можно легко поделиться с кем-нибудь. Вобщем, что-то вроде плагина. Но не плагин, т.к. из bundle состоит все в симфонии - ядро, сторонние разработки, собственный функционал проекта. Подключение bundles очень прозрачно - теперь легко можно решить, какой функционал должен нести фреймворк, а какой - нет. Это гениально. Нужна БД? Подключай bundle. Кэширование? Тоже bundle. Логгер? Ну конечно же, bundle. А все ненужное отрежем и выбросим. Вы уже определились с блюдами, сэр? &lt;br /&gt;&lt;br /&gt;Привычный User (тот самый, который $sf_user) - это тоже bundle... Ну как тут не вспомнить рекламу Symfony 2 - "Подходит под любой проект - от визитки до портала".&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;View&lt;/h2&gt;Шаблоны. Наконец-то нормальные имена шаблонам! listSuccess несколько обескураживало. А вот нововведение посерьезнее: шаблоны могут декорироваться другими шаблонами. ($this-&gt;extend(родительский_шаблон)). Причем цепочка наследования может состоять из нескольких звеньев. Все шаблоны имеют "путь", состоящих из трех частей, и разделяющихся двоеточием - Bundle:контроллер:имя_шаблона. &lt;br /&gt;&lt;br /&gt;Остались слоты. Фактически, все шаблоны - это теперь слоты, которые вставляются в layout. Партиалов не осталось как таковых (ну или все шаблоны стали партиалами - как вам угодно), вместо этого стало возможным подключать любые шаблоны из любых шаблонов - по тому же самому принципу, как это делалось с партиалами. А теперь внимание, фокус! Стало возможным вставлять в шаблон результат исполнения любого другого экшена! Конец эпохи sfComponent. &lt;br /&gt;&lt;br /&gt;Хелперы по-прежнему живы. Улучшена работа с подключением картинок, CSS, JS - его сделали более абстрактным для улучшения portability. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Архитектура&lt;/h2&gt;Проект состоит из нескольких частей (раскиданы по папкам):&lt;br /&gt;- my_application_name/ - хранит настройки приложения проекта&lt;br /&gt;- src/ - тут лежит весь PHP-код, который используется в проекте&lt;br /&gt;- web/ - доступная из интернета папка, где лежат картинки, СSS, JS, другие доступные файлы&lt;br /&gt;&lt;br /&gt;Наибольший интерес представляют первые две части, потому что третья уже знакома нам по 1.х. Приложение - это экземпляр класса myApplicationNameKernel, который запускается в нужном окружении (environment). Этот класс подтягивает все необходимые bundles, конфигурирует проект и регистрирует роуты. Все файлы-классы, разумеется, подтягиваются автоматически, никаких require и include. И все это под соусом namespaces из PHP 5.3. Работа в консоли теперь ведется так: &lt;br /&gt;&lt;pre&gt;$ php my_application_name/console router:debug --help&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Вот, пожалуй, и все, что мне удалось выцарапать из &lt;a href="http://symfony-reloaded.org/learn" target="_blank"&gt;Read And Learn&lt;/a&gt;. Новые выводы и размышления - после установки альфа-версии и написания своего первого приложения. Блога, разумеется.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-241096148543344329?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/241096148543344329/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/whats-new-is-symfony-2.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/241096148543344329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/241096148543344329'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/whats-new-is-symfony-2.html' title='Что новенького в Symfony 2?'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-5173963083644213261</id><published>2010-03-06T00:15:00.006+03:00</published><updated>2010-03-06T01:42:32.059+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2.0'/><title type='text'>Философия Symfony 2</title><content type='html'>Это перевод &lt;a href="http://www.symfony-project.org/blog/2010/03/04/symfony-2-0-and-the-php-ecosystem" target="_blank"&gt;поста в блоге Symfony&lt;/a&gt;.&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Только в том случае, если вы вчера спустились с гор, вы не слышали ничего о Symfony 2. Всех остальных так или иначе задела шумиха в твиттере и различных блогах. На самом деле, я сегодня не буду говорить ничего о каких-то фичах новой Symfony. Если вы хотите какой-то конкретики, посмотрите &lt;a href="http://symfony-reloaded.org/learn" target="_blank"&gt;Quick Tour&lt;/a&gt; на сайте &lt;a href="http://symfony-reloaded.org/" target="_blank"&gt;Symfony Reloaded&lt;/a&gt;. Данный пост скорее о философии, которой придерживается Symfony 2. Надеюсь, что после прочтения вам станут понятны многие наши решения относительно новой версии фреймворка. &lt;br /&gt;&lt;br /&gt;Symfony 2 - это улучшенная архитектура. Старые классы, доставшиеся по наследству от Mojavi, ушли в небытие. Их место заняло чрезвычайно гибкое ядро. Это позволяет строить с помощью Symfony как сайты-визитки, так и порталы, настолько крупные, насколько того требует задача. Решение об изменении архитектуры позволило нам учесть ошибки, допущенные в предыдущем поколении фреймворка, а также внять всем пожеланиям, собранным за 4 года. &lt;br /&gt;&lt;br /&gt;Symfony 2 останется самодостаточным фреймворком, но с несколько иной философией. Вы знаете, как мы не любим изобретать велосипеды, и уже в symfony 1 мы использовали множество разработок третьих лиц &amp;mdash; Propel, Doctrine, SwiftMailer и т.д. В Symfony 2 мы поднимаем эту мысль на новый уровень. Сосредотачиваясь на разработке низкоуровневого ядра, мы стараемся использовать сторонние продукты везде, где только возможно. &lt;br /&gt;&lt;br /&gt;Первое, что бросается в глаза - логгер и кэш-подсистема теперь используют библиотеки Zend Framework. Мы долгие годы разрабатывали и поддерживали собственные подсистемы, но сейчас мы постарались понять, что же лучше для &lt;i&gt;проекта&lt;/i&gt; в долгосрочной перспективе. Не учитывая &lt;i&gt;личные&lt;/i&gt; интересы. (курсив переводчика) &lt;br /&gt;&lt;br /&gt;Но, конечно же, мы не должны и не будем использовать какие-то библиотеки просто потому что они существуют. Пять лет назад я решил создать собственную библиотеку юнит-тестирования lime, отказавшись от использования существовавших тогда SimpleTest и PHPUnit. И у меня были на то причины: в противовес этим монстрам я хотел сделать нечто простое, что позволило бы понизить барьер для начала тестирования. Но с того времени многое поменялось. PHPUnit стал библиотекой для тестирования PHP де-факто, и разработчикам больше нравится работать с цельной концепцией тестирования. Вобщем, было решено использовать PHPUnit в качестве подсистемы тестирования в Symfony 2. &lt;br /&gt;&lt;br /&gt;Я полностью согласен с тем, что Paul Lomax &lt;a href="http://twitter.com/PaulLomax/statuses/9568112373" target="_blank"&gt;написал&lt;/a&gt; об этом в твиттере: "Используй то, что есть под рукой. Осознай, что это полный отстой. Напиши свое. Подожди, пока кто-то выпустит меньший отстой. Забрось свое. Используй чужое."&lt;br /&gt;&lt;br /&gt;Используя PHPUnit вместо lime, мы снижаем нагрузку на своих разработчиков: им придется поддерживать меньше кода. Это как бы взять себе в команду дополнительно Себастьяна Бергманна - крутого PHP-разработчика, который помогает нам сделать Symfony еще лучше. Помимо этого, использование PHPUnit дает еще несколько бонусов:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Мы сможем плотнее интегрироваться с другими разработками - Doctrine, Propel, Zend Framework,...&lt;/li&gt;&lt;li&gt;Появляется возможность плотнее интегрироваться со средой разработки: IDE, системами непрерывного тестирования и т.п.&lt;/li&gt;&lt;li&gt;Появляется куча новых фич, которых нет в lime&lt;/li&gt;&lt;li&gt;Вам нужно будет меньше учиться вещам, специфичным для Symfony&lt;/li&gt;&lt;/ul&gt;Бернард продолжит работу над Lime 2, но при этом у него будет достаточно времени для работы над основным проектом Symfony, в частности, новым суб-фреймворком форм. &lt;br /&gt;&lt;br /&gt;Использование сторонних разработок - это круто, но только в том случае, если их можно подцепить к ядру плотно (cohesive) и прозрачно (transparent). В игру вступает Dependency Injection Container. Вообще, вся Symfony 2 навешана на Dependency Injection Container. Кроме гибкости, которую эта штуковина дает разработчику, это еще и отличный инструмент подцепления сторонних разработок. Если вам интересна эта тема, посмотрите на плагин DoctrineBundle или SwiftMailer, и вы поймете, почему я так восторгаюсь. &lt;br /&gt;&lt;br /&gt;И да, не забывайте, что Symfony 2 еще не готова. Мы опубликовали релиз, чтобы получить обратную реакцию на ранних стадиях разработки. Пожалуйста, если вы не равнодушны к развитию фреймворка, попробуйте альфа-версию на вкус, и напишите нам. Чем больше, тем лучше. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;От автора перевода: Symfony 2 - это Dependency Injection Core, не более, и не менее. Удобный клей, которым вы склеиваете ORM, Mailer, кэширование, логгер, шаблонизатор, формы и т.д. Еще более продуманный, чем 1.x, еще более удобный, еще более гибкий. Но не размывается ли тем самым понятие фреймворка? Ведь фреймворк - это набор правил, набор инструментов, набор концепций, которые позволяют строить приложение быстро, дешево и качественно. Если очень сильно гиперболизировать тренд, который избрала команда Symfony, то в итоге должен получиться продукт, не содержащий ни единой строчки кода, а всего лишь лаконичный документ о том, как подружить вместе Doctrine, PHPUnit и Zend_Forms.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-5173963083644213261?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/5173963083644213261/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/symfony-20-and-php-ecosystem.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/5173963083644213261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/5173963083644213261'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/symfony-20-and-php-ecosystem.html' title='Философия Symfony 2'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-2997394372764473470</id><published>2010-03-02T18:05:00.003+03:00</published><updated>2010-03-02T18:24:20.618+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='url'/><category scheme='http://www.blogger.com/atom/ns#' term='form'/><title type='text'>Как заменить в URL search[name] на search_name?</title><content type='html'>Когда отправляется форма поиска (разумеется, методом GET), то в адресной строке появляется длинная строчка, где параметры представлены в виде PHP-массива: search[name]=a&amp;search[age]=27&amp;... На мой взгляд это не очень красиво, и хотелось бы заменить это на s_name=a&amp;s_age=27&amp;... Как это сделать?&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Шаг номер один - заменяем в классе формы Name Format:&lt;br /&gt;&lt;pre&gt;$this-&gt;setNameFormat('s_%s');&lt;br /&gt;&lt;/pre&gt;Затем - самое сложное. Когда Name Format представлен в виде PHP-массива (с квадратными скобками), то получается легко и просто сделать bind параметров для этой формы. Нам же придется предварительно разобрать $request и вытащить оттуда все поля формы, и собрать их в массив, чтобы передать в $form-&gt;bind(). Для этого напишем метод, который поместим в класс экшенов: &lt;br /&gt;&lt;pre&gt;  static private function getParametersForForm(sfWebRequest $request,$pattern)&lt;br /&gt;  {&lt;br /&gt;    $pattern='@^'.str_replace('%s','(.*?)',$pattern).'$@';&lt;br /&gt;    &lt;br /&gt;    $result=array();&lt;br /&gt;    &lt;br /&gt;    $parameters=$request-&gt;getGetParameters();&lt;br /&gt;&lt;br /&gt;    foreach ($parameters as $name=&gt;$value)&lt;br /&gt;    {&lt;br /&gt;      if (preg_match($pattern,$name,$match))&lt;br /&gt;      {&lt;br /&gt;        $result[$match[1]]=$request-&gt;getParameter($name);&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    return $result;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;$pattern в списке аргументов - это не что иное, как Name Format формы.&lt;br /&gt;&lt;br /&gt;Остается немного подправить bind:&lt;br /&gt;&lt;pre&gt;$params=self::getParametersForForm($request,$form-&gt;getWidgetSchema()-&gt;getNameFormat());&lt;br /&gt;$form-&gt;bind($params);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;И готово!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-2997394372764473470?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/2997394372764473470/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/how-to-replace-searchname-with.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2997394372764473470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2997394372764473470'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/how-to-replace-searchname-with.html' title='Как заменить в URL search[name] на search_name?'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-8342795362336024429</id><published>2010-03-02T16:03:00.002+03:00</published><updated>2010-03-02T16:17:55.378+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='installation'/><category scheme='http://www.blogger.com/atom/ns#' term='denver'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Ставим symfony под Денвером</title><content type='html'>Ставим симфонию под Денвером для Windows XP:&lt;br /&gt;&lt;br /&gt;1. Запускаем денвер&lt;br /&gt;2. Создаем папку z:\home\my_project\www\&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;3. Делаем чекаут репозитория симфонии в любое удобное место. Например, в Z:\symfony&lt;br /&gt;4. Лезем в Мой Компьютер -&gt; Свойства -&gt; Дополнительно -&gt; кнопка Переменные Среды -&gt; в списке системных переменных ищем PATH, дописываем в конце  Z:\symfony\data\bin\;&lt;br /&gt;5. Открываем z:\symfony\data\bin\symfony.bat и исправляем путь к PHP (примерно 34-я строка):&lt;br /&gt;&lt;pre&gt;set PHP_COMMAND=z:\usr\local\php5\php.exe&lt;br /&gt;&lt;/pre&gt;6. Идем в каталог z:\home\my_project\www и запускаем там cmd.exe (для этого я сделал себе кнопочку для Total Commander в тулбаре). Ну или запускаем cmd.exe откуда угодно, а потом &lt;br /&gt;&lt;pre&gt;cd z:\home\my_project\www&lt;br /&gt;&lt;/pre&gt;7. Создаем проект &lt;br /&gt;&lt;pre&gt;symfony generate:project my_project&lt;br /&gt;&lt;/pre&gt;8. Правим файл z:\home\my_project\sf\config\ProjectConfiguration.class.php, указываем путь к симфонии: &lt;br /&gt;&lt;pre&gt;require_once 'z:\symfony/lib/autoload/sfCoreAutoload.class.php';&lt;br /&gt;&lt;/pre&gt;9. Открываем z:\usr\local\apache\conf\httpd.conf и добавляем виртуальный хост:&lt;br /&gt;&lt;pre&gt;&amp;lt;virtualhost 127.0.0.1:80&amp;gt;&lt;br /&gt;  ServerName my_project&lt;br /&gt;  DocumentRoot "Z:\home\my_project\www\web"&lt;br /&gt;  DirectoryIndex index.php&lt;br /&gt;  &amp;lt;directory "Z:\home\my_project\www\web"&amp;gt;&lt;br /&gt;    AllowOverride All&lt;br /&gt;    Allow from All&lt;br /&gt;  &amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;  Alias /sf "Z:\symfony\data\web\sf"&lt;br /&gt;  &amp;lt;directory "Z:\symfony\data\web\sf"&amp;gt;&lt;br /&gt;    AllowOverride All&lt;br /&gt;    Allow from All&lt;br /&gt;  &amp;lt;/Directory&amp;gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/pre&gt;10. Перезапускаем денвер&lt;br /&gt;11. Делаем приложение&lt;br /&gt;&lt;pre&gt;symfony generate:app frontend&lt;br /&gt;&lt;/pre&gt;11. Готово! Проект доступен из браузера по http://my_project/frontend_dev.php&lt;br /&gt;&lt;br /&gt;Вариации: своя копия симфонии для каждого проекта. Делаем чекаут в папку проекта (my_project/lib/vendor/symfony) и настраиваем путь в ProjectConfiguration.class.php&lt;br /&gt;&lt;pre&gt;require_once dirname(__FILE__) . '/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-8342795362336024429?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/8342795362336024429/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/symfony-under-denver.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8342795362336024429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8342795362336024429'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/03/symfony-under-denver.html' title='Ставим symfony под Денвером'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-1114331016901798039</id><published>2010-02-21T00:32:00.010+03:00</published><updated>2010-02-21T01:06:39.572+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='form'/><category scheme='http://www.blogger.com/atom/ns#' term='widget'/><title type='text'>Отрисовываем виджет красиво!</title><content type='html'>Вас не пугают &lt;a href="http://svn.symfony-project.com/plugins/sfFormExtraPlugin/branches/1.3/lib/widget/sfWidgetFormJQueryDate.class.php" target="_blank"&gt;подобные конструкции&lt;/a&gt; в виджетах?&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;return&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'date_widget'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;render&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$value&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$attributes&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$errors&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;renderTag&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'input'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'type'&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'hidden'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'size'&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#008c00; background:#ffffe8; '&gt;10&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'id'&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$id&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'_jquery_control'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'disabled'&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'disabled'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;sprintf&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; '&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style='color:#e34adc; background:#ffffe8; '&gt;EOF&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;lt;script type="text/javascript"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;function wfd_%s_read_linked()&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;{&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;jQuery("#%s").val(jQuery("#%s").val() + "-" + jQuery("#%s").val() + "-" + jQuery("#%s").val());&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;return {};&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;}&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;function wfd_%s_update_linked(date)&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;{&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;jQuery("#%s").val(parseInt(date.substring(0, 4), 10));&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;jQuery("#%s").val(parseInt(date.substring(5, 7), 10));&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;jQuery("#%s").val(parseInt(date.substring(8), 10));&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;}&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;function wfd_%s_check_linked_days()&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;{&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;var daysInMonth = 32 - new Date(jQuery("#%s").val(), jQuery("#%s").val() - 1, 32).getDate();&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;jQuery("#%s option").attr("disabled", "");&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;jQuery("#%s option:gt(" + (%s) +")").attr("disabled", "disabled");&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;if (jQuery("#%s").val() &gt; daysInMonth)&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;{&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;jQuery("#%s").val(daysInMonth);&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;}&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;}&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;jQuery(document).ready(function() {&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;jQuery("#%s").datepicker(jQuery.extend({}, {&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;minDate:    new Date(%s, 1 - 1, 1),&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;maxDate:    new Date(%s, 12 - 1, 31),&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;beforeShow: wfd_%s_read_linked,&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;onSelect:   wfd_%s_update_linked,&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;showOn:     "button"&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;%s&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;}, jQuery.datepicker.regional["%s"], %s, {dateFormat: "yy-mm-dd"}));&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;});&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;jQuery("#%s, #%s, #%s").change(wfd_%s_check_linked_days);&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;lt;/script&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#e34adc; background:#ffffe8; '&gt;EOF&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$prefix&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$id&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[year]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[month]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[day]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$prefix&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[year]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[month]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[day]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$prefix&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[year]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[month]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[day]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[day]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'can_be_empty'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;?&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'daysInMonth'&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'daysInMonth - 1'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[day]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[day]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$id&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;min&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'date_widget'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'years'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;max&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'date_widget'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'years'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$prefix&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$prefix&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$image&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'culture'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getOption&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'config'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[day]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[month]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;generateId&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'[year]'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$prefix&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Если нет, то этот пост не для вас. Остальные читают дальше.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Меня напрягает рендеринг виджета из его метода render(), а именно &amp;mdash; вывод всех тегов через renderTag() и renderContentTag(), а также конструкции типа приведенной выше, когда весь код помещается в heredoc, и рендерится с помощью sprintf. Я не уверен в правильности своей позиции, но я полагаю, что виджет в общем, и его метод render() в частности, реализуют бизнес-логику, а не отображение. Как бы то ни было, мне удобнее работать с виджетом как с кусочком контроллера, а не View. Исходя из этого напрашивается вопрос: как выделить из виджета (точнее, из его метода render()) непосредственное отображение? То есть Шаблон. Как сделать так, чтобы виджет пользовался обычным, написанным на HTML, шаблоном? Ответ очевиден: использовать партиал. &lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;public&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; render&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$name&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$value&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; null&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$attributes&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$errors&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;return&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; get_partial&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'default/my_super_widget'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;параметры_для_виджета&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Возникает вопрос: где хранить файлы партиалов? Варианты: global, default/template, my_widgets/templates, ... Я еще не определился с оптимальным вариантом.&lt;br /&gt;&lt;br /&gt;И не забудьте подключить хелпер-библиотеку Partial, если она была отключена: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sfContext::getInstance()-&gt;getConfiguration()-&gt;loadHelpers('Partial');&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-1114331016901798039?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/1114331016901798039/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/02/nice-widget-rendering.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/1114331016901798039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/1114331016901798039'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/02/nice-widget-rendering.html' title='Отрисовываем виджет красиво!'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-2047841365772825483</id><published>2010-02-13T11:47:00.044+03:00</published><updated>2010-02-25T13:36:14.465+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sfDoctrineGuardPlugin'/><category scheme='http://www.blogger.com/atom/ns#' term='form'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='widget'/><title type='text'>Форма AJAX-авторизации</title><content type='html'>Задача: разместить форму авторизации, которая поставляется в комплекте с &lt;a href="http://symfony-project.com/plugins/sfDoctrineGuardPlugin" target="_blank"&gt;sfDoctrineGuardPlugin&lt;/a&gt;, на каждой странице сайта. А также обеспечить AJAX-авторизацию.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Пропустим установку и настройку sfDoctrineGuardPlugin, она хорошо описана в документации к плагину. Наша задача &amp;mdash; вынести форму авторизации в отдельный компонент. Для определенности будем считать, что все действия мы делаем в приложении frontend. Сделать компонент очень просто: создаем класс sfGuardAuthComponents, пишем контроллер компонента signin, и три шаблона - вспомогательный signin, который принимает решение о том, что выводить пользователю - форму авторизации, или меню авторизованного пользователя (Здравствуйте, %username%! Выход.), и два основных - собственно форма авторизации и меню авторизованного пользователя. Итак, начнем.&lt;br /&gt;&lt;br /&gt;Создадим файл apps/frontend/modules/sfGuardAuth/actions/components.class.php со следующим содержимым: &lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;class&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfGuardAuthComponents &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;extends&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfComponents&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; executeSignin&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$class&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfConfig&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;::&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;get&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'app_sf_guard_plugin_signin_form'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'sfGuardFormSignin'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;form&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;new&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$class&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Контроллер компонента готов. Теперь нужно сделать три шаблона. &lt;br /&gt;apps/frontend/modules/sfGuardAuth/templates/_signin.php&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$sf_user&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;isAuthenticated&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; include_partial&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'sfGuardAuth/signin_auth_yes'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;else&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; include_partial&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'sfGuardAuth/signin_auth_no'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;array&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'form'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;endif&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Этот шаблон всего лишь решает, что вывести пользователю, в зависимости от того, авторизован тот или нет. Теперь сделаем шаблон _signin_auth_no.php, который выводит форму авторизации:&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;script&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;  $&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;    $&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"#signinForm"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;ajaxForm&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;      url&lt;span style='color:#800080; '&gt;:&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;'&lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; url_for&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'@sf_guard_signin'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt;      type&lt;span style='color:#800080; '&gt;:&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;'post'&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt;      dataType&lt;span style='color:#800080; '&gt;:&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;'json'&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt;      beforeSubmit&lt;span style='color:#800080; '&gt;:&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        $&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"#signinSubmit"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;attr&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"disable"&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#0f4d75; '&gt;true&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        $&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"#signinLoader"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;show&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;br /&gt;      success&lt;span style='color:#800080; '&gt;:&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;data&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;        $&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"#signinSubmit"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;attr&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"disable"&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#0f4d75; '&gt;false&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        $&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"#signinLoader"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;hide&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;data&lt;span style='color:#808030; '&gt;==&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'error'&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;          &lt;span style='color:#696969; '&gt;//выводим сообщение об ошибке&lt;/span&gt;&lt;br /&gt;          alert&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'Неверное имя пользователя или пароль'&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;else&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;data&lt;span style='color:#808030; '&gt;==&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'ok'&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;          &lt;span style='color:#696969; '&gt;//Заменям форму авторизации на меню авторизованного пользователя&lt;/span&gt;&lt;br /&gt;          &lt;span style='color:#696969; '&gt;//&lt;/span&gt;&lt;br /&gt;          &lt;br /&gt;          &lt;span style='color:#696969; '&gt;//Или просто обновляем страницу&lt;/span&gt;&lt;br /&gt;          document&lt;span style='color:#808030; '&gt;.&lt;/span&gt;location&lt;span style='color:#808030; '&gt;.&lt;/span&gt;reload&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800000; font-weight:bold; '&gt;else&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;br /&gt;          alert&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'Неизвестная ошибка. Обратитесь к администрации'&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;      &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#800080; '&gt;}&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;script&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;form&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;action&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; url_for&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'@sf_guard_signin'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;method&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"post"&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;id&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"signinForm"&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;a&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;href&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; url_for&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'@sf_guard_password'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;Забыли пароль?&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;a&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;renderHiddenFields&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'username'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;renderError&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'password'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;renderError&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;span&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;Логин&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;span&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'username'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;render&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;span&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;Пароль:&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;span&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;  &lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'password'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;render&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;input&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;name&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;""&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;class&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"buton"&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;value&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;""&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;type&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"submit"&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;id&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"signinSubmit"&lt;/span&gt;&lt;span style='color:#a65700; '&gt;/&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;img&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;src&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"/images/loader.gif"&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;style&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;padding-left&lt;/span&gt;&lt;span style='color:#808030; '&gt;:&lt;/span&gt;&lt;span style='color:#008c00; '&gt;10&lt;/span&gt;&lt;span style='color:#006600; '&gt;px&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;display&lt;/span&gt;&lt;span style='color:#808030; '&gt;:&lt;/span&gt;&lt;span style='color:#074726; '&gt;none&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;id&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"signinLoader"&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;form&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Этот шаблон нуждается в подробном изучении. В шаблоне мы подготовили клиентскую часть для AJAX-авторизации: AJAX-изировали форму авторизации, написали обработчики для удачной и неудачной авторизации. Хочу обратить внимание на jQuery-плагин, который я здесь использую &amp;mdash; &lt;a href="http://malsup.com/jquery/form/" target="_blank"&gt;jQuery Form Plugin&lt;/a&gt;. Этот плагин позволяет очень просто модифицировать любые формы (в том числе, содержащие input file) таким образом, что они отправляются с помощью XmlHttpRequest, и обрабатывать результат отправки. Вкратце остановлюсь на использовании плагина. Делаем совершенно обычную форму, затем вызываем $('форма').ajaxForm(опции). Вуаля! Форма готова к AJAX-отправке. Здесь не забываем добавить подключение jQuery-плагина в файл apps/frontend/config/view.yml&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;default:&lt;br /&gt;  javascripts:    [jquery/jquery_forms.js]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь напишем обработчик AJAX-запроса (контроллер модуля sfGuardAuth, который примет AJAX-запрос, попытается авторизовать пользователя, и, либо отправит сообщение о неверной авторизации, либо о том, что авторизация прошла успешно. Javascript в шаблоне, который мы только что написали, получает ответ, и реагирует на него в зависимости от присланных данных (data). В этом примере реакция максимально примитивна - в случае успеха страница перезагружается (после перезагрузки будет показываться уже не форма авторизации, а меню авторизованного пользователя), а в случае неверного логина-пароля выскакивает alert(). Итак, контроллер, обрабатывающий AJAX-запрос на авторизацию. Придется скопировать и изменить соответствующий экшен модуля sfGuardAuth плагина sfDoctrineGuardPlugin. Создаем файл apps/frontend/modules/sfGuardAuth/actions.class.php со следующим содержимым: &lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;require_once&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;dirname&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;__FILE__&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;"/../../../../../plugins/sfDoctrineGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php"&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&amp;#xa0;*&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&amp;#xa0;* @package    symfony&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&amp;#xa0;* @subpackage plugin&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&amp;#xa0;* @author     Evgeny Babin &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#7144c4; background:#ffffe8; '&gt;psylosss@gmail.com&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&amp;#xa0;* @version    &lt;/span&gt;&lt;br /&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;&amp;#xa0;*/&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;class&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfGuardAuthActions &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;extends&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; BasesfGuardAuthActions&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;public&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;function&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; executeSignin&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$request&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$user&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getUser&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$user&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;isAuthenticated&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;return&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;redirect&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'@homepage'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$class&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfConfig&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;::&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;get&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'app_sf_guard_plugin_signin_form'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'sfGuardFormSignin'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;form&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;new&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$class&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$request&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;isMethod&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'post'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;bind&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$request&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getParameter&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'signin'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;isValid&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;form&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getValues&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getUser&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;signin&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'user'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#400000; background:#ffffe8; '&gt;array_key_exists&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'remember'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;?&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$values&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'remember'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;]&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;false&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$request&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;isXmlHttpRequest&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;return&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;renderText&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;json_encode&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'ok'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;// always redirect to a URL set in app.yml&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;// or to the referer&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;// or to the homepage&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$signinUrl&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfConfig&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;::&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;get&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'app_sf_guard_plugin_success_signin_url'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$user&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getReferer&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$request&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getReferer&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;//$signinUrl = $user-&gt;getReferer($request-&gt;getReferer());&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;return&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;redirect&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;''&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;!&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$signinUrl&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;?&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$signinUrl&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'@homepage'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;else&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$request&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;isXmlHttpRequest&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;return&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;renderText&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;json_encode&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'error'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;      &lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;else&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;// if we have been forwarded, then the referer is the current URL&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#696969; background:#ffffe8; '&gt;// if not, this is the referer of the current request&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$user&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;setReferer&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getContext&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getActionStack&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getSize&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#008c00; background:#ffffe8; '&gt;1&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;?&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$request&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getUri&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;:&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$request&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getReferer&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$module&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; sfConfig&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;::&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;get&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'sf_login_module'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;if&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getModuleName&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;!&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$module&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;{&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;return&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;redirect&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$module&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'/'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;sfConfig&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;::&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;get&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'sf_login_action'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;this&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getResponse&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;setStatusCode&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#008c00; background:#ffffe8; '&gt;401&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800080; background:#ffffe8; '&gt;}&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Мы несколько изменили логику поведения экшена. Теперь, если он вызывается методом post (отправлена форма), то экшен дополнительно проверяет, а не AJAX-ом ли запрошена авторизация? Если да, то выдает JSON-ответ: 'error', если форма невалидная, и 'ok', если форма валидная. Именно этот ответ видит и понимает javascript в шаблоне _signin_auth_no.php. &lt;br /&gt;&lt;br /&gt;Осталось совсем чуть-чуть: написать шаблон авторизованного пользователя _signin_auth_yes.php:&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;Вы вошли как &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;b&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$sf_user&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;getGuardUser&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;-&gt;&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;username&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;b&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;br&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;a&lt;/span&gt;&lt;span style='color:#274796; '&gt; &lt;/span&gt;&lt;span style='color:#074726; '&gt;href&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; url_for&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'@sf_guard_signout'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;Выход&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;a&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Вот и готово. Используем в любом шаблоне: &lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;&amp;lt;?php&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; include_component&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'sfGuardAuth'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;,&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'signin'&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;)&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#a65700; background:#ffffe8; '&gt;?&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Полезная ссылка: &lt;a href="http://www.preloaders.net/" target="_blank"&gt;генератор gif-иконок AJAX-загрузки&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-2047841365772825483?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/2047841365772825483/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2010/02/signin-form-with-ajax-authorization.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2047841365772825483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2047841365772825483'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2010/02/signin-form-with-ajax-authorization.html' title='Форма AJAX-авторизации'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-7510130174431193292</id><published>2009-12-21T10:11:00.004+03:00</published><updated>2009-12-21T10:25:43.354+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='sfDoctrineGuardPlugin'/><title type='text'>Новый плагин sfDoctrineGuardPlugin</title><content type='html'>Автор плагина sfDoctrineGuardPlugin, Jonathan Wage, &lt;a href="http://groups.google.com/group/symfony-devs/browse_thread/thread/50e19dc3066964df"&gt;пишет&lt;/a&gt;, что все, кто использует этот плагин, должны переключиться на новый депозиторий, чтобы использовать новую, стабильную, версию. Также он сообщает, что начинает работать над следующей версией sfDoctrineGuardPlugin, которая будет оснащена функциональностью восстановления пароля, регистрации и т. д. Эта версия &lt;i&gt;не будет&lt;/i&gt; совместима со старыми (текущими в настоящий момент) версиями.&lt;br /&gt;&lt;br /&gt;На вопрос "Будет ли новый плагин поддерживать расширение новыми полями, вместо текущего Profile?" автор отвечает, что в этом нет никакой необходимости, и он по-прежнему считает, что создание связи User-&gt;Profile - наилучшее решение этой задачи. Народ с ним не согласен (и в гугл-группе, и в русском симфония-чате). Он говорит, что единственное, что он сделает в этом направлении - добавит first_name, last_name и email. &lt;br /&gt;&lt;br /&gt;Также в новой версии будет интеграция LDAP.&lt;br /&gt;&lt;br /&gt;- Джон, успеешь ли ты сделать плагин до 25 декабря? Это был бы крутой подарок на Рождество!&lt;br /&gt;- Sorry, Оливер, но никак не успею.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-7510130174431193292?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/7510130174431193292/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/sfdoctrineguardplugin.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7510130174431193292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7510130174431193292'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/sfdoctrineguardplugin.html' title='Новый плагин sfDoctrineGuardPlugin'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-7789926024364353602</id><published>2009-12-19T22:04:00.008+03:00</published><updated>2009-12-19T22:11:26.477+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='helper'/><title type='text'>Товар, товара, товаров</title><content type='html'>Не смущает надпись&lt;br /&gt;&lt;div style="background-color: orange;"&gt;Товаров в каталоге: 2.&lt;br /&gt;&lt;/div&gt;?&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Если смущает, то напишем простой хелпер, который будет выводить русские существительные в согласии с числительными, к которым они относятся.&lt;br /&gt;&lt;div style="background-color: orange;"&gt;В каталоге 2 товара.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;lib/helper/DeclensionHelper.php&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;  В зависимости от $c возвращает: &lt;br /&gt;  $str1 - 1 "товар"&lt;br /&gt;  $str2 - 2 "товара"&lt;br /&gt;  $str5 - 5 "товаров"&lt;br /&gt;  &lt;br /&gt;  example: declension($count,"год","года","лет");&lt;br /&gt;*/&lt;br /&gt;function declension($c, $str1, $str2, $str5) &lt;br /&gt;{&lt;br /&gt;    $c = abs($c) % 100;&lt;br /&gt;    if ( $c &gt; 10 &amp;&amp; $c &lt; 20 ) return $str5;&lt;br /&gt;    $c %= 10;&lt;br /&gt;    if ( $c &gt; 1 &amp;&amp; $c &lt; 5 ) return $str2;&lt;br /&gt;    if ( $c == 1 ) return $str1;&lt;br /&gt;    return $str5;&lt;br /&gt;}  &lt;br /&gt;&lt;/pre&gt;Как использовать (в шаблоне):&lt;pre&gt;&amp;lt;?php use_helper('Declension') ?&amp;gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;В каталоге $count &amp;lt;?php declension($count,'товар','товара','товаров') ?&amp;gt;.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;P.S. Я знаю, что родной симфониевский i18n поддерживает эту фичу. Но надо сильно постараться, чтобы ее использовать (включить i18n, сделать языковой файл, прописать там хитрющее условие).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-7789926024364353602?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/7789926024364353602/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/blog-post_19.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7789926024364353602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7789926024364353602'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/blog-post_19.html' title='Товар, товара, товаров'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-5723803878085842006</id><published>2009-12-13T17:44:00.005+03:00</published><updated>2009-12-13T17:55:44.039+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='validation'/><title type='text'>Валидатор для проверки чет-нечет</title><content type='html'>При вводе, например, размера одежды в российском стандарте (42,44,46,...) нужно проверить, чтобы число было четным (или, в каком-то другом случае, оно должно быть нечетным). Для проверки пользуемся валидатором NumberEvenOdd, который наследуется от обычного sfValidatorNumber.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Пользоваться так:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$this-&gt;validatorSchema['clothes_size']=new sfValidatorNumberEvenOdd(array(&lt;br /&gt;  'min'=&gt;'40',&lt;br /&gt;  'max'=&gt;'70',&lt;br /&gt;  'even_odd'=&gt;'even',&lt;br /&gt;  ),&lt;br /&gt;  array(&lt;br /&gt;    'min'=&gt;'Некорректное значение',&lt;br /&gt;    'max'=&gt;'Некорректное значение',&lt;br /&gt;    'even'=&gt;'Размер одежды должен быть четным',&lt;br /&gt;  )&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;/**&lt;br /&gt; * sfValidatorBoolean validates a number is even or odd.&lt;br /&gt; *&lt;br /&gt; * @author     Evgeny Babin &amp;lt;psylosss@gmail.com&amp;gt;&lt;br /&gt; */&lt;br /&gt;class sfValidatorNumberEvenOdd extends sfValidatorNumber&lt;br /&gt;{&lt;br /&gt;  /**&lt;br /&gt;   * Configures the current validator.&lt;br /&gt;   *&lt;br /&gt;   * Available options:&lt;br /&gt;   *&lt;br /&gt;   *  * even_odd:  even|odd&lt;br /&gt;   *&lt;br /&gt;   * @param array $options    An array of options&lt;br /&gt;   * @param array $messages   An array of error messages&lt;br /&gt;   *&lt;br /&gt;   * @see sfValidatorNumber&lt;br /&gt;   */&lt;br /&gt;  protected function configure($options = array(), $messages = array())&lt;br /&gt;  {&lt;br /&gt;    parent::configure($options,$messages);&lt;br /&gt;    &lt;br /&gt;    $this-&gt;addMessage('odd', 'Only odd values accepted.');&lt;br /&gt;    $this-&gt;addMessage('even', 'Only even values accepted.');&lt;br /&gt;    $this-&gt;addMessage('invalid_option_value', 'Option even_odd accepts only "even" or "odd", %option% given.');&lt;br /&gt;    &lt;br /&gt;    $this-&gt;addRequiredOption('even_odd');&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * @see sfValidatorBase&lt;br /&gt;   */&lt;br /&gt;  protected function doClean($value)&lt;br /&gt;  {&lt;br /&gt;    $clean=parent::doClean($value);&lt;br /&gt;    &lt;br /&gt;    if (!in_array($this-&gt;getOption('even_odd'),array('even','odd')))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, 'invalid_option_value', array('option' =&gt; $this-&gt;getOption('even_odd')));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    if ($this-&gt;getOption('even_odd')=='even' and ($value % 2 == 1))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, 'even', array('value' =&gt; $value));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    if ($this-&gt;getOption('even_odd')=='odd' and ($value % 2 == 0))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, 'odd', array('value' =&gt; $value));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    return $clean;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-5723803878085842006?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/5723803878085842006/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/blog-post_13.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/5723803878085842006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/5723803878085842006'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/blog-post_13.html' title='Валидатор для проверки чет-нечет'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-493179569904651346</id><published>2009-12-13T15:03:00.003+03:00</published><updated>2009-12-13T15:07:37.964+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>Пишем под textarea ограничение по числу символов</title><content type='html'>Задача: под textarea написать "Осталось 87 символов" и динамически обновлять это поле по мере набора текста. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_-7QA8j7vpQQ/SyTY5gxoV7I/AAAAAAAAAAM/MxSLjmrYVY8/s1600-h/limitinput.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_-7QA8j7vpQQ/SyTY5gxoV7I/AAAAAAAAAAM/MxSLjmrYVY8/s320/limitinput.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Самой сложной задачей оказалось найти подходящий плагин jQuery. Многие, например, &lt;a href="http://www.javascriptkit.com/script/script2/enforceform.shtml"&gt;maxlength.js&lt;/a&gt; имеют неприятное свойство "блокирования" клавиатуры, когда лимит достигнут. То есть ни del, ни backspace, ни tab не работают, текст больше поправить нельзя. Также добрые три четверти плагинов не предоставляют должной свободы в конфигурировании строки "Осталось 10 символов". Во многих она просто захардкодена.&lt;br /&gt;&lt;br /&gt;&lt;small&gt;Привет, Beeline! На твоем сайте в форме отправки SMS та же фигня. Смени плагин ;)&lt;/small&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Наименее глючным оказался &lt;a href="http://plugins.jquery.com/project/simply-countable" target="_blank"&gt;Simply Countable&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Напишем виджет, который будет выводить текстовое поле, javascript подсчета символов, и строку, в которой будет написано сколько символов осталось.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;addOption('max_length', '255');&lt;br /&gt;  }&lt;br /&gt;   &lt;br /&gt;  &lt;br /&gt;  function getJavascripts()&lt;br /&gt;  {&lt;br /&gt;    return array_unique(array_merge(parent::getJavascripts(), array('/js/jquery/jquery.simplyCountable.js')));&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function render($name, $value = null, $attributes = array(), $errors = array())&lt;br /&gt;  {&lt;br /&gt;    $left_chars_element_id=$this-&amp;gt;generateId($name).'_left_chars';&lt;br /&gt;    &lt;br /&gt;    $counter_js=sprintf(&amp;lt;&amp;lt;&amp;lt;EOF&lt;br /&gt;&lt;script&gt;&lt;br /&gt;  $(function(){&lt;br /&gt;    $("#%s").simplyCountable({&lt;br /&gt;        counter: "#%s",&lt;br /&gt;        maxCount: %d,&lt;br /&gt;        countDirection: 'down',&lt;br /&gt;        countable: 'characters',&lt;br /&gt;        strictMax: true&lt;br /&gt;      })&lt;br /&gt;  })&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;EOF&lt;br /&gt;    ,&lt;br /&gt;    $this-&amp;gt;generateId($name),&lt;br /&gt;    $left_chars_element_id,&lt;br /&gt;    $this-&amp;gt;getOption('max_length')&lt;br /&gt;    );&lt;br /&gt;    &lt;br /&gt;    $left_chars_element='&amp;lt;br&amp;gt;Осталось &amp;lt;span id="'.$left_chars_element_id.'"&amp;gt;'.($this-&amp;gt;getOption('max_length')-strlen($value)).'&amp;lt;/span&amp;gt; символов';&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    return parent::render($name, $value, $attributes, $errors).$left_chars_element.$counter_js;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;И используем в форме: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$this-&amp;gt;widgetSchema['description']=new sfWidgetFormTextareaExtended(array(&lt;br /&gt;  'max_length'=&amp;gt;500,&lt;br /&gt;));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Используемый плагин jQuery позволяет делать еще интересные штучки: &lt;br /&gt;- считать не символы, а слова&lt;br /&gt;- писать не сколько осталось, а сколько набрано&lt;br /&gt;- может не ограничивать длину текста, а просто сообщать о том, что печатающий увлекся&lt;br /&gt;- позволяет наложить css-классы на цифру: класс на "Осталось" и отдельный класс на "Перебор".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Но нет предела совершенству. Желающие могут доработать виджет, и сделать слово "символов" склоняемым (1 символ, 2 символа, 10 символов).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-493179569904651346?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/493179569904651346/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/textarea.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/493179569904651346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/493179569904651346'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/textarea.html' title='Пишем под textarea ограничение по числу символов'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-7QA8j7vpQQ/SyTY5gxoV7I/AAAAAAAAAAM/MxSLjmrYVY8/s72-c/limitinput.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-1379736048591399498</id><published>2009-12-13T13:15:00.001+03:00</published><updated>2009-12-13T13:15:48.518+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>Устраняем эффект "прыгания" при использовании jCrop</title><content type='html'>При использовании &lt;a href="http://deepliquid.com/content/Jcrop.html"&gt;jCrop&lt;/a&gt; есть эффект "прыгания", когда при активации Crop'a и начале выделения изображение принимает фокус, и от этого страница неприятно прыгает (прокручивается). Избавляемся от этого эффекта, комментируя строку в функции watchKeys() &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$keymgr.focus();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В файле jquery.Jcrop.js&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-1379736048591399498?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/1379736048591399498/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/jcrop.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/1379736048591399498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/1379736048591399498'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/jcrop.html' title='Устраняем эффект &quot;прыгания&quot; при использовании jCrop'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-1207020573250048333</id><published>2009-12-09T20:41:00.008+03:00</published><updated>2010-01-26T18:40:00.297+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='required'/><category scheme='http://www.blogger.com/atom/ns#' term='form'/><title type='text'>Как отметить звездочкой обязательные поля в формах?</title><content type='html'>Сделаем универсальное решение - во всех доктрина-формах проекта все обязательные поля будут отмечены звездочками. &lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1. Открываем файл lib/form/doctrine/BaseFormDoctrine.class.php и добавляем туда обработчик события form.post_configure. Этот обработчик пробегается по всем Labels формы, и добавляет к ним css-класс requred.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Project form base class.&lt;br /&gt; *&lt;br /&gt; * @package    &lt;br /&gt; * @subpackage form&lt;br /&gt; * @author     Evgeny Babin &lt;psylosss@gmail.com&gt;&lt;br /&gt; * @version    SVN: $Id$&lt;br /&gt; */&lt;br /&gt;abstract class BaseFormDoctrine extends sfFormDoctrine&lt;br /&gt;{&lt;br /&gt;  public function setup()&lt;br /&gt;  {&lt;br /&gt;    $this-&gt;getEventDispatcher()-&gt;connect('form.post_configure', array($this,'listenToPostConfigure'));&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function listenToPostConfigure($event)&lt;br /&gt;  {&lt;br /&gt;    //Отмечаем все обязательные поля звездочкой (*)&lt;br /&gt;    foreach ($this-&gt;getFormFieldSchema()-&gt;getWidget()-&gt;getFields() as $key =&gt; $object)&lt;br /&gt;    {&lt;br /&gt;      $label = $this-&gt;getFormFieldSchema()-&gt;offsetGet($key)-&gt;renderLabelName();&lt;br /&gt;      if ($this-&gt;validatorSchema[$key]-&gt;getOption('required') == true and empty($this-&gt;widgetSchema[$key]-&gt;required_markered)) &lt;br /&gt;      {&lt;br /&gt;        $this-&gt;widgetSchema[$key]-&gt;required_markered=true;&lt;br /&gt;        $this-&gt;widgetSchema-&gt;setLabel($key, '&amp;lt;span class="required"&amp;gt;'.$label.'&amp;lt;/span&amp;gt;');&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. Осталось прописать сам класс requred в вашем css-файле. Обратите внимание, что звездочка в конце добавляется средствами CSS, а не прописывается в контенте: &lt;br /&gt;&lt;pre&gt;.required {&lt;br /&gt;  font-weight: bold;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.required:after {&lt;br /&gt;  content: "*";&lt;br /&gt;  color: red;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Можно сделать то же самое &lt;i&gt;вообще&lt;/i&gt; для всех форм проекта. Для этого правим файл /lib/form/BaseForm.class.php и то, что мы делали в методе setup(), запишем в конструктор. Но мне кажется, что это не очень хорошая идея.&lt;br /&gt;&lt;br /&gt;P.S. Спасибо Vit за любезно предоставленный кусок кода по обработке обязательных полей.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-1207020573250048333?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/1207020573250048333/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/1207020573250048333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/1207020573250048333'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/blog-post.html' title='Как отметить звездочкой обязательные поля в формах?'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-7998039219204700967</id><published>2009-12-09T19:51:00.005+03:00</published><updated>2009-12-09T20:03:20.580+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='widget'/><category scheme='http://www.blogger.com/atom/ns#' term='date'/><title type='text'>Виджет для jquery.datepicker</title><content type='html'>Делаем виджет для ввода даты с помощью &lt;a href="http://keith-wood.name/datepick.html" target="_blank"&gt;jQuery.datepicker&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1. Делаем новый виджет. Создаем файл lib/widget/sfWidgetFormInputDate.class.php&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;addOption('date_format', 'd.m.Y');&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function render($name, $value = null, $attributes = array(), $errors = array())&lt;br /&gt;  {&lt;br /&gt;    $datepicker=sprintf(&amp;lt;&amp;lt;&amp;lt;EOF&lt;br /&gt;&lt;script&gt;&lt;br /&gt;  $(document).ready(function(){&lt;br /&gt;    $('#%s').datepick({&lt;br /&gt;      closeAtTop: false,&lt;br /&gt;      showOn: "button"&lt;br /&gt;    });&lt;br /&gt;  })&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;EOF&lt;br /&gt;    ,&lt;br /&gt;    $this-&amp;gt;generateId($name)&lt;br /&gt;    );&lt;br /&gt;      &lt;br /&gt;    &lt;br /&gt;    $value=strlen($value) ? date($this-&amp;gt;getOption('date_format',strtotime($value))) : '';&lt;br /&gt;    &lt;br /&gt;    return $datepicker.parent::render($name, $value, $attributes, $errors);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2. Создаем новый валидатор lib/validator/sfValidatorI18n.class.php&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;addOption('input_date_format', 'Y-m-d');&lt;br /&gt;   $this-&amp;gt;addOption('output_date_format', 'Y-m-d');&lt;br /&gt;&lt;br /&gt;   parent::configure($options, $messages);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * Override sfValidatorDate doClean. Quite strange : I had to copy/paste the original&lt;br /&gt;   * code after my 'convertDateToFormat' method : a simple parent::doClean($value) would&lt;br /&gt;   * not work !&lt;br /&gt;   * @see trunk/lib/vendor/symfony/lib/validator/sfValidatorDate#doClean($value)&lt;br /&gt;   */&lt;br /&gt; protected function doClean($value)&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;   $value = $this-&amp;gt;convertDateToFormat($value);&lt;br /&gt;&lt;br /&gt;// I had to copy/paste the rest of doClean, otherwise it wouldn't work ! I don't know why...&lt;br /&gt;   if (is_array($value))&lt;br /&gt;    {&lt;br /&gt;      $clean = $this-&amp;gt;convertDateArrayToTimestamp($value);&lt;br /&gt;    }&lt;br /&gt;    else if ($regex = $this-&amp;gt;getOption('date_format'))&lt;br /&gt;    {&lt;br /&gt;      if (!preg_match($regex, $value, $match))&lt;br /&gt;      {&lt;br /&gt;        throw new sfValidatorError($this, 'bad_format', array('value' =&amp;gt; $value, 'date_format' =&amp;gt; $this-&amp;gt;getOption('date_format_error') ? $this-&amp;gt;getOption('date_format_error') : $this-&amp;gt;getOption('date_format')));&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      $clean = $this-&amp;gt;convertDateArrayToTimestamp($match);&lt;br /&gt;    }&lt;br /&gt;    else if (!ctype_digit($value))&lt;br /&gt;    {&lt;br /&gt;      $clean = strtotime($value);&lt;br /&gt;      if (false === $clean)&lt;br /&gt;      {&lt;br /&gt;        throw new sfValidatorError($this, 'invalid', array('value' =&amp;gt; $value));&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;      $clean = (integer) $value;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if ($this-&amp;gt;hasOption('max') &amp;amp;&amp;amp; $clean &amp;gt; $this-&amp;gt;getOption('max'))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, 'max', array('value' =&amp;gt; $value, 'max' =&amp;gt; date($this-&amp;gt;getOption('date_format_range_error'), $this-&amp;gt;getOption('max'))));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if ($this-&amp;gt;hasOption('min') &amp;amp;&amp;amp; $clean &amp;lt; $this-&amp;gt;getOption('min'))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, 'min', array('value' =&amp;gt; $value, 'min' =&amp;gt; date($this-&amp;gt;getOption('date_format_range_error'), $this-&amp;gt;getOption('min'))));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return $clean === $this-&amp;gt;getEmptyValue() ? $clean : date($this-&amp;gt;getOption('with_time') ? $this-&amp;gt;getOption('datetime_output') : $this-&amp;gt;getOption('date_output'), $clean);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * converts the given date&lt;br /&gt;   * $value must match the option 'input_date_format'. It will be convert to 'output_date_format'&lt;br /&gt;   * For example : $value = 19/08/2009, input_date_format = DD/MM/YYYY, output_date_format = YYYY-MM-DD&lt;br /&gt;   * Output will be 2009-08-19&lt;br /&gt;   * @param $value&lt;br /&gt;   * @return unknown_type&lt;br /&gt;   * @author  Simon Hostelet&lt;br /&gt;   */&lt;br /&gt;  protected function convertDateToFormat($value)&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;   // we check if input/output_date_format are well written,&lt;br /&gt;   // we get the date separator, and the order of year, month and day in the mask&lt;br /&gt;    $input_details = $this-&amp;gt;getDateAlrightSeparatorAndOrder($this-&amp;gt;getOption('input_date_format'));&lt;br /&gt;    foreach($input_details as $key =&amp;gt; $val)&lt;br /&gt;    {&lt;br /&gt;     $key = 'input_' . $key;&lt;br /&gt;     $$key = $val;&lt;br /&gt;    }&lt;br /&gt;    $output_details = $this-&amp;gt;getDateAlrightSeparatorAndOrder($this-&amp;gt;getOption('output_date_format'));&lt;br /&gt;&lt;br /&gt;    $input_date = explode($input_date_separator, $value);&lt;br /&gt;&lt;br /&gt;    // is this date valid ?&lt;br /&gt;    if(count($input_date)!=3 or !checkdate(intval($input_date[$input_month_order]), intval($input_date[$input_day_order]), intval($input_date[$input_year_order])))&lt;br /&gt;    {&lt;br /&gt;     throw new sfValidatorError($this, 'invalid', array('value' =&amp;gt; $value));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // let's build the output date&lt;br /&gt;    $output_date = $this-&amp;gt;getOption('output_date_format');&lt;br /&gt;    $output_date = preg_replace('/Y|y/', $input_date[$input_year_order], $output_date);&lt;br /&gt;    $output_date = preg_replace('/m/', $input_date[$input_month_order], $output_date);&lt;br /&gt;    $output_date = preg_replace('/d/', $input_date[$input_day_order], $output_date);&lt;br /&gt;&lt;br /&gt;    return $output_date;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * get a date format (like d/m/Y), check the format, and returns date separator (-/_, .)&lt;br /&gt;   * and date order&lt;br /&gt;   * @param $format&lt;br /&gt;   * @return array&lt;br /&gt;   * @author  Simon Hostelet&lt;br /&gt;   */&lt;br /&gt;  protected function getDateAlrightSeparatorAndOrder($format)&lt;br /&gt;  {&lt;br /&gt;    // does the date_format looks right ?&lt;br /&gt;    if(!preg_match('/(d|m|y|Y)([-\/_,\. ]{1})(d|m|y|Y)([-\/_,\. ]{1})(d|m|y|Y)/', $format, $matches))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, 'invalid', array('value' =&amp;gt; $value));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   // what is the date separator ?&lt;br /&gt;    preg_match('/[dmyY]{1}([\/\-,\._ ]{1})[dmyY]{1}/', $format, $matches);&lt;br /&gt;    $return_array['date_separator'] = $matches[1];&lt;br /&gt;&lt;br /&gt;    // what is the order of day, month and year in the format mask ?&lt;br /&gt;    $date_order = explode($return_array['date_separator'], $format);&lt;br /&gt;    foreach($date_order as $key =&amp;gt; $val)&lt;br /&gt;    {&lt;br /&gt;      switch($val)&lt;br /&gt;      {&lt;br /&gt;        case 'd':&lt;br /&gt;          $return_array['day_order'] = $key;&lt;br /&gt;          break;&lt;br /&gt;        case 'm':&lt;br /&gt;          $return_array['month_order'] = $key;&lt;br /&gt;          break;&lt;br /&gt;        default:&lt;br /&gt;          $return_array['year_order'] = $key;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return $return_array;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. Используем в классе формы &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$this-&amp;gt;widgetSchema['birthday']=new sfWidgetFormInputDate();&lt;br /&gt;$this-&amp;gt;validatorSchema['birthday']=new sfValidatorDateI18n(array(&lt;br /&gt;  'date_output'=&amp;gt;'Y-m-d',&lt;br /&gt;  'input_date_format'=&amp;gt;'d.m.Y',&lt;br /&gt;  'output_date_format'=&amp;gt;'Y-m-d',&lt;br /&gt;  'required'=&amp;gt;false,&lt;br /&gt;  'with_time'=&amp;gt;false,&lt;br /&gt;),&lt;br /&gt;array(&lt;br /&gt;  'bad_format'=&amp;gt;'Используйте дату в формате ДД.ММ.ГГГГ',&lt;br /&gt;));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Может быть, я когда-нибудь соберусь оформить это в плагин :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-7998039219204700967?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/7998039219204700967/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/widget-for-jquerydatepicker.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7998039219204700967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/7998039219204700967'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/widget-for-jquerydatepicker.html' title='Виджет для jquery.datepicker'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-2199178633689381630</id><published>2009-12-09T19:28:00.003+03:00</published><updated>2009-12-09T20:05:36.861+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='i18n'/><title type='text'>Как извлечь все i18n-фразы из определенной папки?</title><content type='html'>По умолчанию i18n:extract вытаскивает фразы только из папки проекта, и не трогает, например, папку с плагинами. Если надо вытащить i18n-фразы из произвольных папок, надо править&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #cccccc;"&gt;symfony/lib/i18n/extract/sfI18nApplicationExtract.class.php&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;метод extract(). Просто добавляется своя папка по аналогии с двумя имеющимися.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-2199178633689381630?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/2199178633689381630/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/how-to-extract-all-i18n-phrases.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2199178633689381630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/2199178633689381630'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/how-to-extract-all-i18n-phrases.html' title='Как извлечь все i18n-фразы из определенной папки?'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5873664775038223487.post-8961848502093570735</id><published>2009-12-09T19:23:00.005+03:00</published><updated>2009-12-09T20:06:03.690+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='swift'/><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><title type='text'>Заменяем Zend_Mail на Swift в плагине sfDoctrineApply</title><content type='html'>Мне не понравилось, что для работы с sfApply потребовалось подключать кусок Zend Framefork, а именно Zend_Mail. Авторы sfApply сообщают, что не хотят иметь дела с родным для symfony SwiftMailer, потому что он внезапно поменял API, и оно стало несовместимым с предыдущими версиями. Поскольку меня мало заботит совместимость с предыдущими версиями, я решил заменить почтовик в этом плагине.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1. Создаем папку /frontend/modules/sfApply/actions&lt;br /&gt;2. Создаем в ней файл actions.php с содержимым: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;require_once(sfConfig::get('sf_symfony_lib_dir').'/plugins/sfDoctrineApplyPlugin/modules/sfApply/lib/BasesfApplyActions.class.php');&lt;br /&gt;&lt;br /&gt;class sfApplyActions extends BasesfApplyActions&lt;br /&gt;{&lt;br /&gt;  function mail($options)&lt;br /&gt;  {&lt;br /&gt;    $required = array('subject', 'parameters', 'email', 'fullname', 'html', 'text');&lt;br /&gt;    foreach ($required as $option)&lt;br /&gt;    {&lt;br /&gt;      if (!isset($options[$option]))&lt;br /&gt;      {&lt;br /&gt;        throw new sfException("Required option $option not supplied to sfApply::mail");&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    $from = $this-&amp;gt;getFromAddress();&lt;br /&gt;    &lt;br /&gt;    $message=$this-&amp;gt;getMailer()-&amp;gt;compose(&lt;br /&gt;      array($from['email']=&amp;gt;$from['fullname']),&lt;br /&gt;      array($options['email']=&amp;gt;$options['fullname']),&lt;br /&gt;      $options['subject'],&lt;br /&gt;      $this-&amp;gt;getPartial($options['text'], $options['parameters'])&lt;br /&gt;    );&lt;br /&gt;      &lt;br /&gt;    $message-&amp;gt;addPart($this-&amp;gt;getPartial($options['html'], $options['parameters']),'text/html');&lt;br /&gt;      &lt;br /&gt;    $this-&amp;gt;getMailer()-&amp;gt;send($message);  &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. В apps/frontend/config/factories.yml в секции all добавляем &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;mailer:&lt;br /&gt;    class: sfMailer&lt;br /&gt;    param:&lt;br /&gt;      logging:           %SF_LOGGING_ENABLED%&lt;br /&gt;      charset:           %SF_CHARSET%&lt;br /&gt;      delivery_strategy: realtime&lt;br /&gt;      transport:&lt;br /&gt;        class: Swift_SmtpTransport&lt;br /&gt;        param:&lt;br /&gt;          host:       localhost&lt;br /&gt;          port:       25&lt;br /&gt;          encryption: ~&lt;br /&gt;          username:   ~&lt;br /&gt;          password:   ~&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4. В этом же файле убедиться, то закомментированы строки&lt;br /&gt;&lt;pre&gt;#    delivery_strategy: none&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5873664775038223487-8961848502093570735?l=discover-symfony.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discover-symfony.blogspot.com/feeds/8961848502093570735/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/test.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8961848502093570735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5873664775038223487/posts/default/8961848502093570735'/><link rel='alternate' type='text/html' href='http://discover-symfony.blogspot.com/2009/12/test.html' title='Заменяем Zend_Mail на Swift в плагине sfDoctrineApply'/><author><name>psylosss</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
