diff --git a/admin-dev/themes/default/template/helpers/uploader/ajax.tpl b/admin-dev/themes/default/template/helpers/uploader/ajax.tpl index 1e177fc33..68a240124 100644 --- a/admin-dev/themes/default/template/helpers/uploader/ajax.tpl +++ b/admin-dev/themes/default/template/helpers/uploader/ajax.tpl @@ -22,17 +22,17 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA *} -{if isset($images) && $images} -
-
- {foreach $images as $image} - {if isset($image.image)} + -{/if}
@@ -65,16 +65,97 @@
\ No newline at end of file diff --git a/admin-dev/themes/default/template/helpers/uploader/simple.tpl b/admin-dev/themes/default/template/helpers/uploader/simple.tpl index cfcc657a3..81f40aa73 100644 --- a/admin-dev/themes/default/template/helpers/uploader/simple.tpl +++ b/admin-dev/themes/default/template/helpers/uploader/simple.tpl @@ -22,17 +22,17 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA *} -{if isset($images) && $images} +{if isset($files) && $files|count > 0}
-
- {foreach $images as $image} - {if isset($image.image)} +
+ {foreach $files as $file} + {if isset($file.image) && $file.type == 'image'}
-

{$image.image}

- {if isset($image.size)}

{l s='File size'} {$image.size}kb

{/if} - {if isset($image.delete_url)} +

{$file.image}

+ {if isset($file.size)}

{l s='File size'} {$file.size}kb

{/if} + {if isset($file.delete_url)}

- + {l s='Delete'}

@@ -60,7 +60,7 @@ - {if isset($file)} + {if (!isset($multiple) || !$multiple) && isset($file)}
\ No newline at end of file diff --git a/classes/Uploader.php b/classes/Uploader.php index 683482043..8152dab70 100644 --- a/classes/Uploader.php +++ b/classes/Uploader.php @@ -37,6 +37,7 @@ class UploaderCore public function __construct($name = null) { $this->setName($name); + $this->files = array(); } public function setAcceptTypes($value) @@ -53,6 +54,14 @@ class UploaderCore return $this->_accept_types; } + public function getFilePath($file_name = null) + { + if (!isset($file_name)) + return tempnam($this->getSavePath(), $this->getUniqueFileName()); + + return $this->getSavePath().$file_name; + } + public function getFiles() { if (!isset($this->_files)) @@ -100,50 +109,45 @@ class UploaderCore return $this->_normalizeDirectory($this->_save_path); } - public function getUniqueFileName() + public function getUniqueFileName($prefix = 'PS') { - return uniqid('', true); + return uniqid($prefix, true); } public function process() { - $this->files = array(); $upload = isset($_FILES[$this->getName()]) ? $_FILES[$this->getName()] : null; if ($upload && is_array($upload['tmp_name'])) + { + $tmp = array(); + foreach ($upload['tmp_name'] as $index => $value) - $this->files[] = $this->upload( - $upload['tmp_name'][$index], - $upload['name'][$index], - $upload['size'][$index], - $upload['type'][$index], - $upload['error'][$index] + { $tmp[$index] = array( + 'tmp_name' => $upload['tmp_name'][$index], + 'name' => $upload['name'][$index], + 'size' => $upload['size'][$index], + 'type' => $upload['type'][$index], + 'error' => $upload['error'][$index] ); + + $this->files[] = $this->upload($tmp[$index]); + } + } else - $this->files[] = $this->upload( - $upload['tmp_name'], - $upload['name'], - isset($upload['size']) ? $upload['size'] : $this->_getServerVars('CONTENT_LENGTH'), - isset($upload['type']) ? $upload['type'] : $this->_getServerVars('CONTENT_TYPE'), - isset($upload['error']) ? $upload['error'] : null - ); + $this->files[] = $this->upload($upload); return $this->files; } - public function upload($tmp_name, $name, $size, $type, $error) + public function upload($file) { - $file = new stdClass(); - $file->name = $name; //TODO: add unique file name if name is null - $file->size = intval($size); - $file->type = $type; - - if ($this->validate($tmp_name, $file, $error)) + if ($this->validate($file)) { - $file_path = $this->getSavePath().$file->name; + $file_path = $this->getFilePath($file['name']); - if ($tmp_name && is_uploaded_file($tmp_name)) { - move_uploaded_file($tmp_name, $file_path); + if ($file['tmp_name'] && is_uploaded_file($file['tmp_name'] )) { + move_uploaded_file($file['tmp_name'] , $file_path); } else { // Non-multipart uploads (PUT method support) file_put_contents($file_path, fopen('php://input', 'r')); @@ -151,60 +155,55 @@ class UploaderCore $file_size = $this->_getFileSize($file_path); - if ($file_size === $file->size) + if ($file_size === $file['size']) { + $file['save_path'] = $file_path; //TODO do image processing } else { - $file->size = $file_size; + $file['size'] = $file_size; unlink($file_path); - $file->error = 'abort'; + $file['error'] = 'abort'; } } return $file; } - protected function validate($tmp_name, $file, $error) + protected function validate($file) { - if ($error) - { - $file->error = Tools::displayError($error); - return false; - } - $post_max_size = $this->_getPostMaxSizeBytes(); if ($post_max_size && ($this->_getServerVars('CONTENT_LENGTH') > $post_max_size)) { - $file->error = Tools::displayError('The uploaded file exceeds the post_max_size directive in php.ini'); + $file['error'] = Tools::displayError('The uploaded file exceeds the post_max_size directive in php.ini'); return false; } - if (!preg_match($this->getAcceptTypes(), $file->name)) + if (!preg_match($this->getAcceptTypes(), $file['name'])) { - $file->error = Tools::displayError('Filetype not allowed'); + $file['error'] = Tools::displayError('Filetype not allowed'); return false; } - if ($file->size > $this->getMaxSize()) + if ($file['size'] > $this->getMaxSize()) { - $file->error = Tools::displayError('File is too big'); + $file['error'] = Tools::displayError('File is too big'); return false; } return true; } - private function _getFileSize($file_path, $clear_stat_cache = false) { + protected function _getFileSize($file_path, $clear_stat_cache = false) { if ($clear_stat_cache) clearstatcache(true, $file_path); return filesize($file_path); } - private function _getPostMaxSizeBytes() { + protected function _getPostMaxSizeBytes() { $post_max_size = ini_get('post_max_size'); $bytes = trim($post_max_size); $last = strtolower($post_max_size[strlen($post_max_size) - 1]); @@ -219,7 +218,7 @@ class UploaderCore return $bytes; } - private function _getServerVars($var) + protected function _getServerVars($var) { return (isset($_SERVER[$var]) ? $_SERVER[$var] : ''); } diff --git a/classes/helper/HelperForm.php b/classes/helper/HelperForm.php index 14cd889be..7fc0f2530 100644 --- a/classes/helper/HelperForm.php +++ b/classes/helper/HelperForm.php @@ -119,11 +119,12 @@ class HelperFormCore extends Helper $uploader->setMultiple(isset($params['multiple'])?$params['multiple']:false); $uploader->setUseAjax(isset($params['ajax'])?$params['ajax']:false); - if (isset($params['images'])) - $uploader->setImages($params['images']); - elseif (isset($params['image'])) // Use for retrocompatibility - $uploader->setImages(array( + if (isset($params['files']) && $params['files']) + $uploader->setFiles($params['files']); + elseif (isset($params['image']) && $params['image']) // Use for retrocompatibility + $uploader->setFiles(array( 0 => array( + 'type' => HelperUploader::TYPE_IMAGE, 'image' => isset($params['image'])?$params['image']:null, 'size' => isset($params['size'])?$params['size']:null, 'delete_url' => isset($params['delete_url'])?$params['delete_url']:null diff --git a/classes/helper/HelperImageUploader.php b/classes/helper/HelperImageUploader.php new file mode 100644 index 000000000..830a6b92d --- /dev/null +++ b/classes/helper/HelperImageUploader.php @@ -0,0 +1,82 @@ + +* @copyright 2007-2013 PrestaShop SA +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class HelperImageUploaderCore extends HelperUploader +{ + private $_temporary_path; + + public function getMaxSize() + { + return (int)Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE'); + } + + public function setTemporaryPath($value) + { + $this->_temporary_path = $value; + } + + public function getTemporaryPath() + { + if (!isset($this->_temporary_path)) + $this->_temporary_path = _PS_TMP_IMG_DIR_; + + return $this->_normalizeDirectory($this->_temporary_path); + } + + public function getFilePath($file_name = null) + { + //Force file path + return tempnam($this->getTemporaryPath(), $this->getUniqueFileName()); + } + + protected function validate($file) + { + $post_max_size = $this->_getPostMaxSizeBytes(); + + if ($post_max_size && ($this->_getServerVars('CONTENT_LENGTH') > $post_max_size)) + { + $file['error'] = Tools::displayError('The uploaded file exceeds the post_max_size directive in php.ini'); + return false; + } + + if (!preg_match($this->getAcceptTypes(), $file['name'])) + { + $file['error'] = Tools::displayError('Filetype not allowed'); + return false; + } + + if ($error = ImageManager::validateUpload($file, Tools::getMaxUploadSize($this->getMaxSize()))) + $file['error'] = $error; + + if ($file['size'] > $this->getMaxSize()) + { + $file['error'] = Tools::displayError('File is too big'); + return false; + } + + return true; + } +} \ No newline at end of file diff --git a/classes/helper/HelperOptions.php b/classes/helper/HelperOptions.php index ee77f9b0a..859cebb8c 100644 --- a/classes/helper/HelperOptions.php +++ b/classes/helper/HelperOptions.php @@ -105,11 +105,12 @@ class HelperOptionsCore extends Helper $uploader->setMultiple(isset($field['multiple'])?$field['multiple']:false); $uploader->setUseAjax(isset($field['ajax'])?$field['ajax']:false); - if (isset($field['images'])) - $uploader->setImages($field['images']); - elseif (isset($field['image'])) // Use for retrocompatibility - $uploader->setImages(array( + if (isset($field['files']) && $field['files']) + $uploader->setFiles($field['files']); + elseif (isset($field['image']) && $field['image']) // Use for retrocompatibility + $uploader->setFiles(array( 0 => array( + 'type' => HelperUploader::TYPE_IMAGE, 'image' => isset($field['image'])?$field['image']:null, 'size' => isset($field['size'])?$field['size']:null, 'delete_url' => isset($field['delete_url'])?$field['delete_url']:null diff --git a/classes/helper/HelperUploader.php b/classes/helper/HelperUploader.php index 70689fa50..8e9f1bac7 100644 --- a/classes/helper/HelperUploader.php +++ b/classes/helper/HelperUploader.php @@ -30,10 +30,13 @@ class HelperUploaderCore extends Uploader const DEFAULT_TEMPLATE = 'simple.tpl'; const DEFAULT_AJAX_TEMPLATE = 'ajax.tpl'; + const TYPE_IMAGE = 'image'; + private $_context; private $_id; - private $_images; + private $_files; private $_name; + private $_max_files; private $_multiple; private $_file; protected $_template; @@ -71,29 +74,29 @@ class HelperUploaderCore extends Uploader return $this->_id; } - public function setImages($value) + public function setFiles($value) { - $this->_images = $value; + $this->_files = $value; return $this; } - public function getImages() + public function getFiles() { - if (!isset($this->_images)) - $this->_images = array(); + if (!isset($this->_files)) + $this->_files = array(); - return $this->_images; + return $this->_files; } - public function setName($value) + public function setMaxFiles($value) { - $this->_name = (string)$value; + $this->_max_files = intval($value); return $this; } - public function getName() + public function getMaxFiles() { - return $this->_name; + return $this->_max_files; } public function setMultiple($value) @@ -108,6 +111,17 @@ class HelperUploaderCore extends Uploader return $this; } + public function setName($value) + { + $this->_name = (string)$value; + return $this; + } + + public function getName() + { + return $this->_name; + } + public function getTemplate() { if (!isset($this->_template)) @@ -223,12 +237,6 @@ class HelperUploaderCore extends Uploader return (isset($this->_multiple) && $this->_multiple); } - public function process() - { - $files = parent::process(); - die(Tools::jsonEncode(array($this->getName() => $files))); - } - public function render() { $admin_webpath = str_ireplace(_PS_ROOT_DIR_, '', _PS_ADMIN_DIR_); @@ -273,15 +281,18 @@ class HelperUploaderCore extends Uploader $this->getTemplateFile($this->getTemplate()), $this->getContext()->smarty ); + $max_files = $this->getMaxFiles(); + $template->assign(array( 'id' => $this->getId(), 'name' => $this->getName(), 'url' => $this->getUrl(), 'multiple' => $this->isMultiple(), - 'images' => $this->getImages(), + 'files' => $this->getFiles(), 'thumb' => $this->getThumb(), 'file' => $this->getFile(), - 'title' => $this->getTitle() + 'title' => $this->getTitle(), + 'max_files' => (isset($max_files) && $max_files > 0) ? ($max_files-count($this->getFiles())) : $max_files )); $html .= $template->fetch();