views:

540

answers:

0

I am going through an issue to setup a file upload validator on callback.

I want to achieve this:

I have a form, where user choose the type of the file they are uploading and upload the file. So I want to set the validator to handle images in case they chose "img" as type, and pdf if they chose "pdf".

Moreover I want to specify the mime type and path and validatedFileClass according to the type.

I tried this.. but i can't get it to work

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

the function:

  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;

}

the problem i am facing is that , this function receives the url value as array, and even if I update the validators schema, it's not validating the url and keeps on sending it as array to the object saving method. So how to make something like

url.validateFile() from inside this function