В Symfony есть одна неприятная проблемка. Если попытаться залить файлы .flv в админке, то после того как файл запишется на диск, мы получим расширение файла в виде: .exe и .obj, :(. В предыдущей версии Symfony 1.1 это решалось перекрытием методов в actions.class.php, и исправлениями других файлов. Конечно проблему это решило, но её реализация была так себе. В новой версии решил написать по другому и получилось все очень просто.
Почему так происходит? При загрузке .flv файлов они определяться как application/octet-stream, а в Symfony это как раз тип файлов .exe. Поэтому создаем свой myValidatorFile, который наследует sfValidatorFile и решает проблему.
Листинг 1: Класс myValidatorFile для замены sfValidatorFile
<?php
/**
* myValidatorFile validates an uploaded file.
*
* Fix problem with .flv file upload in Admin Generator
*
* @package symfony
* @subpackage validator
* @author Igor Brovchenko webdev [at] tigor [dot] com [dot] ua
*/
class myValidatorFile extends sfValidatorFile
{
/**
* Configures the current validator.
*
*
* @param array $options An array of options
* @param array $messages An array of error messages
*
* @see myValidatorBase
*/
protected function configure($options = array(), $messages = array())
{
parent::configure($options, $messages);
$this->addOption('validated_file_class', 'myValidatedFile');
}
}
/**
* myValidatedFile represents a validated uploaded file.
*
*
* Fix problem with flv file upload in Admin Generator
*
* @package symfony
* @subpackage validator
* @author Igor Brovchenko webdev [at] tigor [dot] com [dot] ua
*/
class myValidatedFile extends sfValidatedFile
{
/**
* Returns the extension associated with the given content type.
*
* @param string $type The content type
* @param string $default The default extension to use
*
* @return string The extension (with the dot)
*/
protected function getExtensionFromType($type, $default = '')
{
if($type == 'application/octet-stream' && '.flv' == strtolower($default))
{
return '.flv';
}
return parent::getExtensionFromType($type, $default = '');
}
}
Листинг 2: Пример использования myValidatorFile
<?php
/**
* Post form.
*
*/
class PostForm extends BasePostForm
{
public function configure()
{
parent::configure();
$mime_types = array('image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png',
'image/gif', 'video/x-flv', 'application/octet-stream'
);
$this->setWidget('file', new sfWidgetFormInputFileEditable(array(
'is_image' => true
)));
$this->validatorSchema['file'] = new myValidatorFile(array(
'required' => false,
'mime_types' => $mime_types,
'path' => sfConfig::get('sf_upload_dir') . '/video',
));
$this->validatorSchema->setOption('allow_extra_fields', true);
$this->validatorSchema->setOption('filter_extra_fields', false);
}
}
Что сделали:
• добавили новый mime_type ‘application/octet-stream’
• указали свой валидатор myValidatorFile
Ссылки по теме:
• The symfony Forms Book :: Chapter 4 – Propel Integration :: The save() method
• Symfony: 14-Generators#Administration


