В 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
Апрель 7th, 2009 at 13:53
I don’t read russian, but I managed, thank you so much !