Index: branches/5.2.x/core/units/images/image_event_handler.php =================================================================== diff -u -N -r14628 -r14868 --- branches/5.2.x/core/units/images/image_event_handler.php (.../image_event_handler.php) (revision 14628) +++ branches/5.2.x/core/units/images/image_event_handler.php (.../image_event_handler.php) (revision 14868) @@ -1,6 +1,6 @@ getEventParam('id'); - $object =& $this->Application->recallObject($event->Prefix.'.-item', $event->Prefix, Array ('skip_autoload' => true)); + $object =& $this->Application->recallObject($event->Prefix . '.-item', $event->Prefix, Array ('skip_autoload' => true)); /* @var $object kDBItem */ - if (in_array($event->Name, Array('OnBeforeDeleteFromLive','OnAfterClone')) ) { + if ( in_array($event->Name, Array ('OnBeforeDeleteFromLive', 'OnAfterClone')) ) { $object->SwitchToLive(); } - elseif ($event->Name == 'OnBeforeItemDelete') { + elseif ( $event->Name == 'OnBeforeItemDelete' ) { // keep current table } else { @@ -152,78 +152,80 @@ $object->Load($id); - $fields = Array('LocalPath' => 'LocalImage', 'ThumbPath' => 'LocalThumb'); + $file_helper =& $this->Application->recallObject('FileHelper'); + /* @var $file_helper FileHelper */ + + $fields = Array ('LocalPath' => 'LocalImage', 'ThumbPath' => 'LocalThumb'); + foreach ($fields as $a_field => $mode_field) { - $file = $object->GetField($a_field); - if (!$file) continue; - $source_file = FULL_PATH.$file; + $file = $object->GetDBField($a_field); + if ( !$file ) { + continue; + } + + $source_file = FULL_PATH . $file; + switch ($event->Name) { // Copy image files to pending dir and update corresponding fields in temp record - // Checking for existing files and renaming if nessessary - two users may upload same pending files at the same time! + // Checking for existing files and renaming if necessary - two users may upload same pending files at the same time! case 'OnAfterCopyToTemp': - $new_file = IMAGES_PENDING_PATH . $this->ValidateFileName(FULL_PATH.IMAGES_PENDING_PATH, basename($file)); - $dest_file = FULL_PATH.$new_file; - copy($source_file, $dest_file); + $file = preg_replace('/^' . preg_quote(IMAGES_PATH, '/') . '/', IMAGES_PENDING_PATH, $file, 1); + $new_file = $file_helper->ensureUniqueFilename(FULL_PATH, $file); + + $dst_file = FULL_PATH . $new_file; + copy($source_file, $dst_file); + $object->SetFieldOption($a_field, 'skip_empty', false); $object->SetDBField($a_field, $new_file); break; - // Copy image files to live dir (checking if fileexists and renameing if nessessary) + // Copy image files to live dir (checking if file exists and renaming if necessary) // and update corresponding fields in temp record (which gets copied to live automatically) case 'OnBeforeCopyToLive': - if ( $object->GetDBField($mode_field) ) { // if image is local - // rename file if it exists in live folder - $new_file = IMAGES_PATH . $this->ValidateFileName(FULL_PATH.IMAGES_PATH, basename($file)); - $dest_file = FULL_PATH.$new_file; - rename($source_file, $dest_file); + if ( $object->GetDBField($mode_field) ) { + // if image is local -> rename file if it exists in live folder + $file = preg_replace('/^' . preg_quote(IMAGES_PENDING_PATH, '/') . '/', IMAGES_PATH, $file, 1); + $new_file = $file_helper->ensureUniqueFilename(FULL_PATH, $file); + + $dst_file = FULL_PATH . $new_file; + rename($source_file, $dst_file); } - else { // if image is remote url - remove local file (if any), update local file field with empty value - if (file_exists($source_file)) @unlink($source_file); + else { + // if image is remote url - remove local file (if any), update local file field with empty value + if ( file_exists($source_file) ) { + @unlink($source_file); + } + $new_file = ''; } + $object->SetFieldOption($a_field, 'skip_empty', false); $object->SetDBField($a_field, $new_file); break; case 'OnBeforeDeleteFromLive': // Delete image files from live folder before copying over from temp - case 'OnBeforeItemDelete': // Delete image files when deleteing Image object - @unlink(FULL_PATH.$file); + case 'OnBeforeItemDelete': // Delete image files when deleting Image object + @unlink(FULL_PATH . $file); break; - case 'OnAfterClone': // Copy files when cloning objects, renaming it on the fly - $path_info = pathinfo($file); - $new_file = $path_info['dirname'].'/'.$this->ValidateFileName(FULL_PATH.$path_info['dirname'], $path_info['basename']); - $dest_file = FULL_PATH . $new_file; - copy($source_file, $dest_file); + case 'OnAfterClone': + // Copy files when cloning objects, renaming it on the fly + $new_file = $file_helper->ensureUniqueFilename(FULL_PATH, $file); + $dst_file = FULL_PATH . $new_file; + copy($source_file, $dst_file); + $object->SetFieldOption($a_field, 'skip_empty', false); $object->SetDBField($a_field, $new_file); break; } } - if ( in_array($event->Name, Array('OnAfterClone', 'OnBeforeCopyToLive', 'OnAfterCopyToTemp')) ) { + + if ( in_array($event->Name, Array ('OnAfterClone', 'OnBeforeCopyToLive', 'OnAfterCopyToTemp')) ) { $object->Update(null, true); } } - function ValidateFileName($path, $name) - { - $parts = pathinfo($name); - $ext = '.'.$parts['extension']; - $filename = mb_substr($parts['basename'], 0, -mb_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; - } - /** * Sets primary image of user/category/category item *