Symfony setPostValidator с sfValidatorFile - PullRequest
       21

Symfony setPostValidator с sfValidatorFile

2 голосов
/ 19 января 2010

У меня проблема с настройкой валидатора загрузки файлов при обратном вызове.

Я хочу добиться этого:

У меня есть форма, в которой пользователь выбирает тип загружаемого файла и загружает файл. Поэтому я хочу установить валидатор для обработки изображений в случае, если они выбрали «img» в качестве типа, и pdf, если они выбрали «pdf».

Кроме того, я хочу указать тип MIME и путь и validatedFileClass в соответствии с типом.

Я попробовал это .. но я не могу заставить его работать

$this->validatorSchema->setPostValidator( new sfValidatorCallback(array('callback' => array($this, 'validateUploadedFiles'))) );

функция:

      public function validateUploadedFiles($form_validator, $values){

    $this_year = date("Y");
    $this_month = date("m");

    $basic_validator = array(
    'required' => true,
    'path' => sfConfig::get('sf_upload_dir').'restaurant/media/'.$this_year.'/'.$this_month.'/'
    );

    $doc_validator = $video_validator = $img_validator = $pdf_validator = $basic_validator;
    $pdf_validator['mime_types'] = array ('application/pdf');
    $doc_validator['mime_types'] = array ('application/msword', 'application/vnd.openxmlformats');
    $img_validator['mime_types'] = 'web_images';
    //$img_validator['validated_file_class'] = 'imgHandling';
    $video_validator['mime_types'] = array('video/mpeg', 'video/3gpp', 'video/mp4', 'video/quicktime');

    switch( $values['type'] ):
       case 'pdf' : $validator = $pdf_validator; break;
       case 'img' : $validator = $img_validator; break;
       case 'word' : $validator = $doc_validator; break;
       case 'video' : $validator = $video_validator; break;
    endswitch; 


    //$form->getValidatorSchema()->offsetUnset('url') ;
    //print_r($validator_fields);
    $validator = new sfValidatorFile( $validator );
    $validator_schema = new sfValidatorSchema();
    $validator_schema->offsetSet('url', $validator);
   //$validator_fields = $form->getValidatorSchema()->getFields();    


    $schema = parent::getValidatorSchema();
    $schema->offsetUnset('url') ;
    $schema->offsetSet('url', $validator);


   // $path = sfConfig::get('sf_upload_dir').'restaurant/media/'.$this_year.'/'.$this_month.'/';
   // $values['url'] = new sfValidatedFile( $values['url']['name'], $values['url']['type'], $values['url']['tmp_name'], $values['url']['size'] , $path);

     //TODO get this url value run through the new added validator
    //$values['url'] = $validator_schema->clean(array( 'url' => $values['url'] ));

    return $values;

  }

Проблема, с которой я сталкиваюсь, заключается в том, что эта функция получает значение URL в виде массива, и даже если я обновляю схему валидаторов, она не проверяет URL и продолжает отправлять его в виде массива в метод сохранения объекта. Итак, как сделать что-то вроде

url.validateFile () внутри этой функции

1 Ответ

2 голосов
/ 17 января 2011

Не уверен насчет лучшего решения, но я бы предпочел разделить процесс проверки на 2 части:

  1. Подтвердить тип пантомимы
  2. Если mime в порядке, проверьте URL

Или наоборот, ваш выбор.

Клей будет sfValidatorAnd .

Я правильно вас понял?

...