понедельник, 24 августа 2009 г.

Symfony: date selector (выбор даты рождения)

Нас не устраивает стандартный выбор даты в виде 3х листбоксов в формате месяц/день/год, да еще и месяцы указаны цифрами, что вызывает массу затруднений.
Мы хотим такой вид:


Решение:
  public function setup()
{
$years = range(1950, 2000); //Creates array of years between 1950-2000
$years_list = array_combine($years, $years); //Creates new array where key and value are both values from $years list

$this->setWidgets(array(
'id' => new sfWidgetFormInputHidden(),
'city' => new sfWidgetFormInput(),
'birthday' => new sfWidgetFormI18nDate(
array(
'culture' => 'ru',
'format' => '%day%.%month%.%year%',
'years' => $years_list,
),
array()
),

Symfony: sfWidgetFormInputFileEditable IE broken image

Положим, что мы хотим позволить пользователю прикреплять картинку к своему профилю.
Обратившись к JOBEET находим решение - виджет sfWidgetFormInputFileEditable
Используем его в своей форме:
    
$this->setWidgets(array(
'id' => new sfWidgetFormInputHidden(),
...
'avatar' => new sfWidgetFormInputFileEditable(array(
'label' => 'Ваш аватар',
'file_src' => '/uploads/avatars/'.$this->getObject()->getAvatar(),
'is_image' => true,
'edit_mode' => !$this->isNew(),
)),

Однако вскоре мы обнаруживаем, что когда пользователь не создает. а редактирует свой профиль, и при этом аватар у него не загружен, в форме появляется битый рисунок и предложение удалить несуществующую картинку:


Решение проблемы:
   'avatar'       => new sfWidgetFormInputFileEditable(array(
'label' => 'Avatar for forum, blog, comments, etc...',
'file_src' => '/uploads/avatars/'.$this->getObject()->getAvatar(),
'is_image' => true,
'edit_mode' => ($this->getObject()->getAvatar() OR $this->isNew() ? true: false),
)),

Ну и заинтересовавшимся для комплекта валидатор:
    $this->validatorSchema['avatar'] = new sfValidatorFile(array(
'required' => false,
'path' => sfConfig::get('sf_upload_dir').'/avatars',
'mime_types' => 'web_images',
'max_size' => '40960', //(40KB in bytes)
));