воскресенье, 19 декабря 2010 г.

Грабли: andWhere( id != ?, null)

Простой код

$id=null;

    $q=Doctrine_Query::create()
      ->from('sfGuardUser u')
      ->andWhere('u.id != ?',$id);
      
    print_r($q->fetchArray());

Дает совершенно неожиданные результаты:

1. SQL-запрос составляется правильный (в этом можно убедиться в дебаг-панели и в логах)

2. Результат (массив или коллекция) всегда будут пустыми.

Решение:
->andWhere('u.id != ?',(int)$id);

Вот уж не думал, что надо приводить типы в prepare_sql Доктрины!

суббота, 11 декабря 2010 г.

Как убрать поле "День" из виджета даты?

Предположим, нужно сделать виджет для выбора ГОДА+МЕСЯЦА. Проще всего для этих целей подойдет стандартный sfWidgetFormDate. Убираем у него поле для выбора дня:
$this->widgetSchema['month']->setOption('format','%month% %year%');

Но теперь сохранение формы дает ошибку Invalid на этом поле. Конечно: валидатор-то ожидает все три поля. Хорошо, не будем обманывать его ожиданий :) Дописываем в классе формы:

  function doBind(array $values)
  {
    $values['your_month_field_name']['day']=1;
    parent::doBind($values);
  }

вот и все

четверг, 9 декабря 2010 г.

Смена email пользователем

Часто в целях безопасности при регистрации пользователей их просят подтвердить свой email. Средства для генерации письма с подтверждением и экшены проверки кода подтверждения предоставляет, например, плагин sfApply. Однако, тот же плагин довольно топорно решает проблему смены email пользователем:
unset($this['email'])

Иначе говоря, все, кто хочет изменить email, идут лесом: это не разрешается. Как быть тем, кто хочет сделать более дружелюбный интерфейс?