DestinationPath) { $this->FullPath = FULL_PATH.$this->DestinationPath; } } /** * Processes file uploads from form * * @param mixed $value * @param string $field_name * @param kDBItem $object * @return string */ function Parse($value, $field_name, &$object) { $ret = ''; $options = $object->GetFieldOptions($field_name); if(getArrayValue($options, 'upload_dir')) { $this->DestinationPath = $options['upload_dir']; $this->FullPath = FULL_PATH.$this->DestinationPath; } // SWF Uploader if (is_array($value) && isset($value['tmp_ids'])) { if ($value['tmp_deleted']) { $deleted = explode('|', $value['tmp_deleted']); $upload = explode('|', $value['upload']); $n_upload = array(); // $n_ids = array(); foreach ($upload as $name) { if (in_array($name, $deleted)) continue; $n_upload[] = $name; // $n_ids[] = $name; } $value['upload'] = implode('|', $n_upload); // $value['tmp_ids'] = implode('|', $n_ids); } if (!$value['tmp_ids']) { return getArrayValue($value, 'upload'); } $swf_uploaded_ids = explode('|', $value['tmp_ids']); $swf_uploaded_names = explode('|', $value['tmp_names']); $existing = $value['upload'] ? explode('|', $value['upload']) : array(); if (isset($options['multiple'])) { $max_files = $options['multiple'] == false ? 1 : $options['multiple']; } else { $max_files = 1; } $fret = array(); for ($i=0; $iValidateFileName($this->FullPath, $real_name); $file_name = $this->FullPath.$real_name; $tmp_file = WRITEABLE.'/tmp/'.$swf_uploaded_ids[$i].'_'.$swf_uploaded_names[$i]; rename($tmp_file, $file_name); @chmod($file_name, 0666); $fret[] = getArrayValue($options, 'upload_dir') ? $real_name : $this->DestinationPath.$real_name; } $fret = array_merge($existing, $fret); return implode('|', $fret); } // SWF Uploader END if (getArrayValue($value, 'upload') && getArrayValue($value, 'error') == UPLOAD_ERR_NO_FILE) { // file was not uploaded this time, but was uploaded before, then use previously uploaded file (from db) return getArrayValue($value, 'upload'); } if (is_array($value) && count($value) > 1 && $value['size']) { if (is_array($value) && $value['error'] === UPLOAD_ERR_OK) { $max_filesize = isset($options['max_size']) ? $options['max_size'] : MAX_UPLOAD_SIZE; if (getArrayValue($options, 'allowed_types') && !in_array($value['type'], $options['allowed_types'])) { $object->SetError($field_name, 'bad_file_format'); } elseif ($value['size'] > $max_filesize) { $object->SetError($field_name, 'bad_file_size'); } elseif (!is_writable($this->FullPath)) { $object->SetError($field_name, 'cant_save_file'); } else { $real_name = $this->ValidateFileName($this->FullPath, $value['name']); $file_name = $this->FullPath.$real_name; if (!move_uploaded_file($value['tmp_name'], $file_name)) { $object->SetError($field_name, 'cant_save_file'); } else { @chmod($file_name, 0666); if (getArrayValue($options, 'size_field')) { $object->SetDBField($options['size_field'], $value['size']); } if (getArrayValue($options, 'orig_name_field')) { $object->SetDBField($options['orig_name_field'], $value['name']); } if (getArrayValue($options, 'content_type_field')) { $object->SetDBField($options['content_type_field'], $value['type']); } $ret = getArrayValue($options, 'upload_dir') ? $real_name : $this->DestinationPath.$real_name; // delete previous file, when new file is uploaded under same field /*$previous_file = isset($value['upload']) ? $value['upload'] : false; if ($previous_file && file_exists($this->FullPath.$previous_file)) { unlink($this->FullPath.$previous_file); }*/ } } } else { $object->SetError($field_name, 'cant_save_file'); } } else { if (getArrayValue($options, 'required')) { $object->SetError($field_name, 'required'); } } // && !$object->FieldErrors[$field_name]['pseudo'] - already implemented in kDBItem::SetError method if ((count($value) > 1) && $value['error'] && ($value['error'] != UPLOAD_ERR_NO_FILE)) { $object->SetError($field_name, 'cant_save_file'); } return $ret; } function Format($value, $field_name, &$object, $format=null) { if ( is_null($value) ) return ''; $options = $object->GetFieldOptions($field_name); if ( isset($format) ) $options['format'] = $format; if ($format == 'file_urls' || $format == 'file_names' || $format == 'file_sizes') { $upload_dir = isset($options['upload_dir']) ? $options['upload_dir'] : $this->DestinationPath; $files = explode('|', $value); $urls = array(); $names = array(); if ($value) { // if value string was not empty foreach ($files as $a_file) { if (isset($options['direct_links']) && $options['direct_links']) { $urls[] = rtrim($this->Application->BaseURL(), '/').$upload_dir.$a_file; } else { $urls[] = $this->Application->HREF('', '', array('no_amp'=>1, 'pass'=>'m,'.$object->Prefix, $object->Prefix.'_event'=>'OnViewFile', 'file'=>$a_file, 'field'=>$field_name)); } $names[] = $a_file; $sizes[] = filesize(FULL_PATH.$upload_dir.$a_file); } } switch ($format) { case 'file_urls': return implode('|', $urls); case 'file_names': return implode('|', $names); case 'file_sizes': return implode('|', $sizes); } return implode('|', $format == 'file_urls' ? $urls : $names); } $tc_value = $this->TypeCast($value, $options); if( ($tc_value === false) || ($tc_value != $value) ) return $value; // for leaving badly formatted date on the form return $this->GetFormatted($tc_value, $options); } function GetFormatted($tc_value, &$options) { if (isset($options['format'])) { switch ($options['format']) { case 'full_url': $upload_dir = isset($options['upload_dir']) ? $options['upload_dir'] : $this->DestinationPath; return rtrim($this->Application->BaseURL(), '/').$upload_dir.$tc_value; break; default: return sprintf($options['format'], $tc_value); break; } } return $tc_value; } function ValidateFileName($path, $name) { $parts = pathinfo($name); $ext = '.'.$parts['extension']; $filename = substr($parts['basename'], 0, -strlen($ext)); $new_name = $filename.$ext; while ( file_exists($path.'/'.$new_name) ) { if ( preg_match('/('.preg_quote($filename, '/').'_)([0-9]*)('.preg_quote($ext, '/').')/', $new_name, $regs) ) { $new_name = $regs[1].($regs[2]+1).$regs[3]; } else { $new_name = $filename.'_1'.$ext; } } return $new_name; } } class kPictureFormatter extends kUploadFormatter { function kPictureFormatter() { $this->NakeLookupPath = IMAGES_PATH; // used ? $this->DestinationPath = constOn('ADMIN') ? IMAGES_PENDING_PATH : IMAGES_PATH; parent::kUploadFormatter(); } function GetFormatted($tc_value, &$options) { if (isset($options['format']) && ($options['format'] == 'img_size')) { $upload_dir = isset($options['upload_dir']) ? $options['upload_dir'] : $this->DestinationPath; $img_path = FULL_PATH.'/'.$upload_dir.$tc_value; $image_info = @getimagesize($img_path); return ' width="'.$image_info[0].'" height="'.$image_info[1].'"'; } return parent::GetFormatted($tc_value, $options); } }