/** * Replace physical file. * * @param AssetFileModel $oldFile The assetFileModel representing the original file. * @param AssetFileModel $replaceWith The assetFileModel representing the new file. * @param string $filenameToUse The filename to use for the replaced file. If left * empty, will use the name of the new file. * * @return null */ public function replaceFile(AssetFileModel $oldFile, AssetFileModel $replaceWith, $filenameToUse = "") { if ($oldFile->kind == 'image') { craft()->assetTransforms->deleteAllTransformData($oldFile); $this->deleteSourceFile($oldFile->getFolder()->path . $oldFile->filename); $this->purgeCachedSourceFile($oldFile->getFolder(), $oldFile->filename); // For remote sources, fetch the source image and move it in the old ones place if (!$this->isSourceLocal()) { if ($replaceWith->kind == 'image') { $localCopy = $replaceWith->getTransformSource(); IOHelper::copyFile($localCopy, craft()->path->getAssetsImageSourcePath() . $oldFile->id . '.' . IOHelper::getExtension($oldFile->filename)); } } } $newFileName = !empty($filenameToUse) ? $filenameToUse : $oldFile->filename; $folder = craft()->assets->getFolderById($oldFile->folderId); $filenameChanges = StringHelper::toLowerCase($newFileName) != StringHelper::toLowerCase($replaceWith->filename); // If the filename does not change, this can trigger errors in some source types. if ($filenameChanges) { $this->moveSourceFile($replaceWith, $folder, $newFileName, true); } // Update file info $oldFile->width = $replaceWith->width; $oldFile->height = $replaceWith->height; $oldFile->size = $replaceWith->size; $oldFile->kind = $replaceWith->kind; $oldFile->dateModified = $replaceWith->dateModified; $oldFile->filename = $newFileName; if (empty($filenameToUse)) { $replaceWith->filename = $this->getNameReplacement($folder, $replaceWith->filename); craft()->assets->storeFile($replaceWith); } else { // If the file name has not changed, we're reusing the source file, // so we have to prevent deletion of source file here. craft()->assets->deleteFiles($replaceWith->id, $filenameChanges); } craft()->assets->storeFile($oldFile); }