*/ class Mage_Adminhtml_Model_System_Config_Backend_File extends Mage_Core_Model_Config_Data { /** * Upload max file size in kilobytes * * @var int */ protected $_maxFileSize = 0; /** * Save uploaded file before saving config value * * @return Mage_Adminhtml_Model_System_Config_Backend_File */ protected function _beforeSave() { $value = $this->getValue(); if ($_FILES['groups']['tmp_name'][$this->getGroupId()]['fields'][$this->getField()]['value']) { $uploadDir = $this->_getUploadDir(); try { $file = array(); $tmpName = $_FILES['groups']['tmp_name']; $file['tmp_name'] = $tmpName[$this->getGroupId()]['fields'][$this->getField()]['value']; $name = $_FILES['groups']['name']; $file['name'] = $name[$this->getGroupId()]['fields'][$this->getField()]['value']; $uploader = new Mage_Core_Model_File_Uploader($file); $uploader->setAllowedExtensions($this->_getAllowedExtensions()); $uploader->setAllowRenameFiles(true); $this->addValidators( $uploader ); $result = $uploader->save($uploadDir); } catch (Exception $e) { Mage::throwException($e->getMessage()); return $this; } $filename = $result['file']; if ($filename) { if ($this->_addWhetherScopeInfo()) { $filename = $this->_prependScopeInfo($filename); } $this->setValue($filename); } } else { if (is_array($value) && !empty($value['delete'])) { // Delete record before it is saved $this->delete(); // Prevent record from being saved, since it was just deleted $this->_dataSaveAllowed = false; } else { $this->unsValue(); } } return $this; } /** * Validation callback for checking max file size * * @param string $filePath Path to temporary uploaded file * @throws Mage_Core_Exception */ public function validateMaxSize($filePath) { if ($this->_maxFileSize > 0 && filesize($filePath) > ($this->_maxFileSize * 1024)) { throw Mage::exception('Mage_Core', Mage::helper('adminhtml')->__('Uploaded file is larger than %.2f kilobytes allowed by server', $this->_maxFileSize)); } } /** * Makes a decision about whether to add info about the scope. * * @return boolean */ protected function _addWhetherScopeInfo() { $fieldConfig = $this->getFieldConfig(); $el = $fieldConfig->descend('upload_dir'); return (!empty($el['scope_info'])); } /** * Return path to directory for upload file * * @return string * @throw Mage_Core_Exception */ protected function _getUploadDir() { $fieldConfig = $this->getFieldConfig(); /* @var $fieldConfig Varien_Simplexml_Element */ if (empty($fieldConfig->upload_dir)) { Mage::throwException(Mage::helper('catalog')->__('The base directory to upload file is not specified.')); } $uploadDir = (string)$fieldConfig->upload_dir; $el = $fieldConfig->descend('upload_dir'); /** * Add scope info */ if (!empty($el['scope_info'])) { $uploadDir = $this->_appendScopeInfo($uploadDir); } /** * Take root from config */ if (!empty($el['config'])) { $uploadRoot = $this->_getUploadRoot((string)$el['config']); $uploadDir = $uploadRoot . '/' . $uploadDir; } return $uploadDir; } /** * Return the root part of directory path for uploading * * @var string * @return string */ protected function _getUploadRoot($token) { return Mage::getBaseDir('media'); } /** * Prepend path with scope info * * E.g. 'stores/2/path' , 'websites/3/path', 'default/path' * * @param string $path * @return string */ protected function _prependScopeInfo($path) { $scopeInfo = $this->getScope(); if ('default' != $this->getScope()) { $scopeInfo .= '/' . $this->getScopeId(); } return $scopeInfo . '/' . $path; } /** * Add scope info to path * * E.g. 'path/stores/2' , 'path/websites/3', 'path/default' * * @param string $path * @return string */ protected function _appendScopeInfo($path) { $path .= '/' . $this->getScope(); if ('default' != $this->getScope()) { $path .= '/' . $this->getScopeId(); } return $path; } /** * Getter for allowed extensions of uploaded files * * @return array */ protected function _getAllowedExtensions() { return array(); } /** * Add validators for uploading * * @param Mage_Core_Model_File_Uploader $uploader */ protected function addValidators(Mage_Core_Model_File_Uploader $uploader) { $uploader->addValidateCallback('size', $this, 'validateMaxSize'); } }