diff --git a/admin-dev/themes/default/template/controllers/products/attachments.tpl b/admin-dev/themes/default/template/controllers/products/attachments.tpl index d7d279c89..1bda72673 100644 --- a/admin-dev/themes/default/template/controllers/products/attachments.tpl +++ b/admin-dev/themes/default/template/controllers/products/attachments.tpl @@ -47,12 +47,14 @@
+
{include file="controllers/products/textarea_lang.tpl" languages=$languages input_name="attachment_description" input_value=$attachment_description } +
@@ -63,39 +65,92 @@ {l s='File:'} -
-
- -
- - - - - -
-
-
- -
+
+ + + +
-
+ +
diff --git a/controllers/admin/AdminProductsController.php b/controllers/admin/AdminProductsController.php index da1761cce..c65f0ce85 100644 --- a/controllers/admin/AdminProductsController.php +++ b/controllers/admin/AdminProductsController.php @@ -444,6 +444,120 @@ class AdminProductsControllerCore extends AdminController } } + public function ajaxProcessAddAttachment() + { + if (isset($_FILES['attachment_file'])) + { + if ((int)$_FILES['attachment_file']['error'] === 1) + { + $_FILES['attachment_file']['error'] = array(); + + $max_upload = (int)ini_get('upload_max_filesize'); + $max_post = (int)ini_get('post_max_size'); + $upload_mb = min($max_upload, $max_post); + $_FILES['attachment_file']['error'][] = sprintf( + $this->l('The file %1$s exceeds the size allowed by the server. The limit is set to %2$d MB.'), + ''.$_FILES['attachment_file']['name'].' ', + ''.$upload_mb.'' + ); + } + + $_FILES['attachment_file']['error'] = array(); + + $is_attachment_name_valid = false; + $attachment_names = Tools::getValue('attachment_name'); + $attachment_descriptions = Tools::getValue('attachment_description'); + + if (!isset($attachment_names) || !$attachment_names) + $attachment_names = array(); + + if (!isset($attachment_descriptions) || !$attachment_descriptions) + $attachment_descriptions = array(); + + foreach ($attachment_names as $lang => $name) + { + if (Tools::strlen($name) > 0) + $is_attachment_name_valid = true; + + if (!Validate::isGenericName($name)) + $_FILES['attachment_file']['error'][] = sprintf(Tools::displayError('Invalid name for %s language'), Language::getLanguage((int)$lang)['name']); + elseif (Tools::strlen($name) > 32) + $_FILES['attachment_file']['error'][] = sprintf(Tools::displayError('The name for %1s language is too long (%2d chars max).'), Language::getLanguage((int)$lang)['name'], 32); + } + + foreach ($attachment_descriptions as $lang => $description) + if (!Validate::isCleanHtml($description)) + $_FILES['attachment_file']['error'][] = sprintf(Tools::displayError('Invalid description for %s language'), Language::getLanguage((int)$lang)['name']); + + if (!$is_attachment_name_valid) + $_FILES['attachment_file']['error'][] = Tools::displayError('An attachment name is required.'); + + if (empty($_FILES['attachment_file']['error'])) + { + if (is_uploaded_file($_FILES['attachment_file']['tmp_name'])) + { + if ($_FILES['attachment_file']['size'] > (Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024 * 1024)) + $_FILES['attachment_file']['error'][] = sprintf( + $this->l('The file is too large. Maximum size allowed is: %1$d kB. The file you\'re trying to upload is: %2$d kB.'), + (Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024), + number_format(($_FILES['attachment_file']['size'] / 1024), 2, '.', '') + ); + else + { + do $uniqid = sha1(microtime()); + while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid)); + if (!copy($_FILES['attachment_file']['tmp_name'], _PS_DOWNLOAD_DIR_.$uniqid)) + $_FILES['attachment_file']['error'][] = $this->l('File copy failed'); + @unlink($_FILES['attachment_file']['tmp_name']); + } + } + else + $_FILES['attachment_file']['error'][] = Tools::displayError('The file is missing.'); + + if (empty($_FILES['attachment_file']['error']) && isset($uniqid)) + { + $attachment = new Attachment(); + + foreach ($attachment_names as $lang => $name) + $attachment->name[(int)$lang] = $name; + + foreach ($attachment_descriptions as $lang => $description) + $attachment->description[(int)$lang] = $description; + + $attachment->file = $uniqid; + $attachment->mime = $_FILES['attachment_file']['type']; + $attachment->file_name = $_FILES['attachment_file']['name']; + + if (empty($attachment->mime) || Tools::strlen($attachment->mime) > 128) + $_FILES['attachment_file']['error'][] = Tools::displayError('Invalid file extension'); + if (!Validate::isGenericName($attachment->file_name)) + $_FILES['attachment_file']['error'][] = Tools::displayError('Invalid file name'); + if (Tools::strlen($attachment->file_name) > 128) + $_FILES['attachment_file']['error'][] = Tools::displayError('The file name is too long.'); + if (empty($this->errors)) + { + $res = $attachment->add(); + if (!$res) + $_FILES['attachment_file']['error'][] = Tools::displayError('This attachment was unable to be loaded into the database.'); + else + { + $_FILES['attachment_file']['id_attachment'] = $attachment->id; + $_FILES['attachment_file']['filename'] = $attachment->name[$this->context->employee->id_lang]; + $id_product = (int)Tools::getValue($this->identifier); + $res = $attachment->attachProduct($id_product); + if (!$res) + $_FILES['attachment_file']['error'][] = Tools::displayError('We were unable to associate this attachment to a product.'); + } + } + else + $_FILES['attachment_file']['error'][] = Tools::displayError('Invalid file'); + } + } + + die(Tools::jsonEncode($_FILES)); + } + } + /** * Upload new attachment * @@ -3472,7 +3586,8 @@ class AdminProductsControllerCore extends AdminController 'default_form_language' => (int)Configuration::get('PS_LANG_DEFAULT'), 'attachment_name' => $attachment_name, 'attachment_description' => $attachment_description, - 'PS_ATTACHMENT_MAXIMUM_SIZE' => Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') + 'PS_ATTACHMENT_MAXIMUM_SIZE' => Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE'), + 'post_max_size' => (Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024 * 1024) )); } else @@ -3481,7 +3596,27 @@ class AdminProductsControllerCore extends AdminController else $this->displayWarning($this->l('You must save this product before adding attachements.')); - $this->tpl_form_vars['custom_form'] = $data->fetch(); + $admin_webpath = str_ireplace(_PS_ROOT_DIR_, '', _PS_ADMIN_DIR_); + $admin_webpath = preg_replace('/^'.preg_quote(DIRECTORY_SEPARATOR, '/').'/', '', $admin_webpath); + $bo_theme = ((Validate::isLoadedObject($this->context->employee) + && $this->context->employee->bo_theme) ? $this->context->employee->bo_theme : 'default'); + + if (!file_exists(_PS_BO_ALL_THEMES_DIR_.$bo_theme.DIRECTORY_SEPARATOR + .'template')) + $bo_theme = 'default'; + + $html = ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + + $this->tpl_form_vars['custom_form'] = $html.$data->fetch(); } public function initFormInformations($product)