diff --git a/admin-dev/tabs/AdminAttachments.php b/admin-dev/tabs/AdminAttachments.php deleted file mode 100644 index 3c42e13af..000000000 --- a/admin-dev/tabs/AdminAttachments.php +++ /dev/null @@ -1,173 +0,0 @@ - -* @copyright 2007-2011 PrestaShop SA -* @version Release: $Revision: 6844 $ -* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ - -include_once(_PS_ADMIN_DIR_.'/../classes/AdminTab.php'); - -class AdminAttachments extends AdminTab -{ - - private $_productAttachements = array(); - - public function __construct() - { - $this->table = 'attachment'; - $this->className = 'Attachment'; - $this->lang = true; - $this->edit = true; - $this->delete = true; - - $this->fieldsDisplay = array( - 'id_attachment' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25), - 'name' => array('title' => $this->l('Name')), - 'file' => array('title' => $this->l('File'))); - - parent::__construct(); - } - - public function postProcess() - { - /* PrestaShop demo mode */ - if (_PS_MODE_DEMO_) - { - $this->_errors[] = Tools::displayError('This functionnality has been disabled.'); - return; - } - /* PrestaShop demo mode*/ - if (Tools::isSubmit('submitAdd'.$this->table)) - { - if ($id = (int)(Tools::getValue('id_attachment')) AND $a = new Attachment($id)) - { - $_POST['file'] = $a->file; - $_POST['mime'] = $a->mime; - } - if (!sizeof($this->_errors)) - { - if (isset($_FILES['file']) AND is_uploaded_file($_FILES['file']['tmp_name'])) - { - if ($_FILES['file']['size'] > (Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024 * 1024)) - $this->_errors[] = $this->l('File too large, maximum size allowed:').' '.(Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024).' '.$this->l('kb').'. '.$this->l('File size you\'re trying to upload is:').number_format(($_FILES['file']['size']/1024), 2, '.', '').$this->l('kb'); - else - { - do $uniqid = sha1(microtime()); while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid)); - if (!copy($_FILES['file']['tmp_name'], _PS_DOWNLOAD_DIR_.$uniqid)) - $this->_errors[] = $this->l('File copy failed'); - $_POST['file_name'] = $_FILES['file']['name']; - @unlink($_FILES['file']['tmp_name']); - $_POST['file'] = $uniqid; - $_POST['mime'] = $_FILES['file']['type']; - } - } - else if (array_key_exists('file', $_FILES) && (int)$_FILES['file']['error'] === 1) - { - $max_upload = (int)(ini_get('upload_max_filesize')); - $max_post = (int)(ini_get('post_max_size')); - $upload_mb = min($max_upload, $max_post); - $this->_errors[] = $this->l('the File').' '.$_FILES['file']['name'].' '.$this->l('exceeds the size allowed by the server. This limit is set to').' '.$upload_mb.$this->l('Mb').''; - } - else if (!empty($_FILES['file']['tmp_name'])) - $this->_errors[] = $this->l('No file or your file isn\'t uploadable, check your server configuration about the upload maximum size.'); - } - $this->validateRules(); - } - return parent::postProcess(); - } - - public function displayForm($isMainTab = true) - { - parent::displayForm(); - - if (!($obj = $this->loadObject(true))) - return; - - echo ' -
- '.($obj->id ? '' : '').' -
'.$this->l('Attachment').' - -
'; - foreach ($this->_languages as $language) - echo '
- * -
'; - $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'cname¤cdescription', 'cname'); - echo '
-
 
- -
'; - foreach ($this->_languages as $language) - echo '
- -
'; - $this->displayFlags($this->_languages, $this->_defaultFormLanguage, 'cname¤cdescription', 'cdescription'); - echo '
-
 
- -
-

-

'.$this->l('Upload file from your computer').'

-
-
 
-
- -
-
* '.$this->l('Required field').'
-
-
'; - } - - public function getList($id_lang, $orderBy = NULL, $orderWay = NULL, $start = 0, $limit = NULL) - { - parent::getList((int)$id_lang, $orderBy, $orderWay, $start, $limit); - if(sizeof($this->_list)) - $this->_productAttachements = Attachment::getProductAttached((int)$id_lang, $this->_list); - } - - protected function _displayDeleteLink($token = NULL, $id) - { - $_cacheLang['Delete'] = $this->l('Delete'); - $_cacheLang['DeleteItem'] = $this->l('Delete item #', __CLASS__, TRUE, FALSE); - - if (isset($this->_productAttachements[$id])) - { - $productList = ''; - foreach($this->_productAttachements[$id] as $product) - $productList .= $product.', '; - } - echo ' - - - '.$_cacheLang['Delete'].''; - } -} diff --git a/admin-dev/themes/template/attachments/list_action_delete.tpl b/admin-dev/themes/template/attachments/list_action_delete.tpl new file mode 100644 index 000000000..22aa1348f --- /dev/null +++ b/admin-dev/themes/template/attachments/list_action_delete.tpl @@ -0,0 +1,38 @@ +{* +* 2007-2011 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 9197 $ +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + + + + {$action} + + diff --git a/admin-dev/themes/template/helper/form/form.tpl b/admin-dev/themes/template/helper/form/form.tpl index e6b53d81b..dc1e62ae2 100644 --- a/admin-dev/themes/template/helper/form/form.tpl +++ b/admin-dev/themes/template/helper/form/form.tpl @@ -215,7 +215,7 @@
{foreach $languages as $language}
- +
{/foreach}
diff --git a/classes/AdminController.php b/classes/AdminController.php index c75627572..016a94214 100644 --- a/classes/AdminController.php +++ b/classes/AdminController.php @@ -75,6 +75,7 @@ class AdminControllerCore extends Controller public $tpl_form_vars = array(); public $tpl_list_vars = array(); + public $tpl_delete_link_vars = array(); public $tpl_option_vars = array(); public $tpl_view_vars = array(); @@ -1284,6 +1285,7 @@ class AdminControllerCore extends Controller } $helper->tpl_vars = $this->tpl_list_vars; + $helper->tpl_delete_link_vars = $this->tpl_delete_link_vars; $this->setHelperDisplay($helper); $list = $helper->generateList($this->_list, $this->fieldsDisplay); $this->toolbar_fix = false; diff --git a/classes/Attachment.php b/classes/Attachment.php index a75cc68d8..e37a0401f 100644 --- a/classes/Attachment.php +++ b/classes/Attachment.php @@ -27,25 +27,25 @@ class AttachmentCore extends ObjectModel { - public $file; - public $file_name; - public $name; - public $mime; - public $description; + public $file; + public $file_name; + public $name; + public $mime; + public $description; /** @var integer position */ - public $position; + public $position; - protected $fieldsRequired = array('file', 'mime'); - protected $fieldsSize = array('file' => 40, 'mime' => 128, 'file_name' => 128); - protected $fieldsValidate = array('file' => 'isGenericName', 'mime' => 'isCleanHtml', 'file_name' => 'isGenericName'); + protected $fieldsRequired = array('file', 'mime'); + protected $fieldsSize = array('file' => 40, 'mime' => 128, 'file_name' => 128); + protected $fieldsValidate = array('file' => 'isGenericName', 'mime' => 'isCleanHtml', 'file_name' => 'isGenericName'); - protected $fieldsRequiredLang = array('name'); - protected $fieldsSizeLang = array('name' => 32); - protected $fieldsValidateLang = array('name' => 'isGenericName', 'description' => 'isCleanHtml'); + protected $fieldsRequiredLang = array('name'); + protected $fieldsSizeLang = array('name' => 32); + protected $fieldsValidateLang = array('name' => 'isGenericName', 'description' => 'isCleanHtml'); - protected $table = 'attachment'; - protected $identifier = 'id_attachment'; + protected $table = 'attachment'; + protected $identifier = 'id_attachment'; public function getFields() { @@ -61,66 +61,80 @@ class AttachmentCore extends ObjectModel $this->validateFieldsLang(); return $this->getTranslationsFields(array('name', 'description')); } - + public function delete() { @unlink(_PS_DOWNLOAD_DIR_.$this->file); - Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'product_attachment WHERE id_attachment = '.(int)($this->id)); + Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'product_attachment WHERE id_attachment = '.(int)$this->id); return parent::delete(); } - + public function deleteSelection($attachments) { $return = 1; - foreach ($attachments AS $id_attachment) + foreach ($attachments as $id_attachment) { - $attachment = new Attachment((int)($id_attachment)); + $attachment = new Attachment((int)$id_attachment); $return &= $attachment->delete(); } return $return; } - + public static function getAttachments($id_lang, $id_product, $include = true) { return Db::getInstance()->executeS(' - SELECT * - FROM '._DB_PREFIX_.'attachment a - LEFT JOIN '._DB_PREFIX_.'attachment_lang al ON (a.id_attachment = al.id_attachment AND al.id_lang = '.(int)($id_lang).') - WHERE a.id_attachment '.($include ? 'IN' : 'NOT IN').' (SELECT pa.id_attachment FROM '._DB_PREFIX_.'product_attachment pa WHERE id_product = '.(int)($id_product).')'); + SELECT * + FROM '._DB_PREFIX_.'attachment a + LEFT JOIN '._DB_PREFIX_.'attachment_lang al + ON (a.id_attachment = al.id_attachment AND al.id_lang = '.(int)$id_lang.') + WHERE a.id_attachment '.($include ? 'IN' : 'NOT IN').' ( + SELECT pa.id_attachment + FROM '._DB_PREFIX_.'product_attachment pa + WHERE id_product = '.(int)$id_product.' + )' + ); } - + public static function attachToProduct($id_product, $array) { - $result1 = Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'product_attachment WHERE id_product = '.(int)($id_product)); + $result1 = Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'product_attachment WHERE id_product = '.(int)$id_product); if (is_array($array)) { $ids = array(); foreach ($array as $id_attachment) - $ids[] = '('.(int)($id_product).','.(int)($id_attachment).')'; - Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'product SET cache_has_attachments = '.(count($ids) ? '1' : '0').' WHERE id_product = '.(int)($id_product).' LIMIT 1'); - return ($result1 && Db::getInstance()->execute('INSERT INTO '._DB_PREFIX_.'product_attachment (id_product, id_attachment) VALUES '.implode(',',$ids))); + $ids[] = '('.(int)$id_product.','.(int)$id_attachment.')'; + Db::getInstance()->execute(' + UPDATE '._DB_PREFIX_.'product + SET cache_has_attachments = '.(count($ids) ? '1' : '0').' + WHERE id_product = '.(int)$id_product.' + LIMIT 1 + '); + return ($result1 && Db::getInstance()->execute(' + INSERT INTO '._DB_PREFIX_.'product_attachment (id_product, id_attachment) + VALUES '.implode(',', $ids)) + ); } return $result1; } - + public static function getProductAttached($id_lang, $list) { $ids_attachements = array(); if (is_array($list)) { - foreach($list as $attachement) + foreach ($list as $attachement) $ids_attachements[] = $attachement['id_attachment']; - + $sql = 'SELECT * FROM `'._DB_PREFIX_.'product_attachment` pa LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pa.`id_product` = pl.`id_product`'.Context::getContext()->shop->addSqlRestrictionOnLang('pl').') WHERE `id_attachment` IN ('.implode(',', array_map('intval', $ids_attachements)).') AND pl.`id_lang` = '.(int)$id_lang; $tmp = Db::getInstance()->executeS($sql); - $productAttachements = array(); - foreach($tmp as $t) - $productAttachements[$t['id_attachment']][] = $t['name']; - return $productAttachements; -} + $product_attachements = array(); + foreach ($tmp as $t) + $product_attachements[$t['id_attachment']][] = $t['name']; + return $product_attachements; + } else return false; } diff --git a/classes/HelperList.php b/classes/HelperList.php index e05349252..2214949ce 100644 --- a/classes/HelperList.php +++ b/classes/HelperList.php @@ -449,14 +449,14 @@ class HelperListCore extends Helper if (!array_key_exists('DeleteItem', self::$cache_lang)) self::$cache_lang['DeleteItem'] = $this->l('Delete item #', __CLASS__, true, false); - $tpl->assign(array( + $tpl->assign(array_merge($this->tpl_delete_link_vars, array( 'href' => $this->currentIndex.'&'.$this->identifier.'='.$id.'&delete'.$this->table.'&token='.($token != null ? $token : $this->token), 'confirm' => (!is_null($this->specificConfirmDelete) ? '\r'.$this->specificConfirmDelete : self::$cache_lang['DeleteItem'].$id.' ? '), 'action' => self::$cache_lang['Delete'], - )); + 'id' => $id, + ))); return $tpl->fetch(); - } /** diff --git a/controllers/admin/AdminAttachmentsController.php b/controllers/admin/AdminAttachmentsController.php new file mode 100644 index 000000000..c5bd0ea7b --- /dev/null +++ b/controllers/admin/AdminAttachmentsController.php @@ -0,0 +1,179 @@ + +* @copyright 2007-2011 PrestaShop SA +* @version Release: $Revision: 6844 $ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +class AdminAttachmentsControllerCore extends AdminController +{ + + private $product_attachements = array(); + + public function __construct() + { + $this->table = 'attachment'; + $this->className = 'Attachment'; + $this->lang = true; + + $this->addRowAction('edit'); + $this->addRowAction('delete'); + + $this->fieldsDisplay = array( + 'id_attachment' => array( + 'title' => $this->l('ID'), + 'align' => 'center', + 'width' => 25 + ), + 'name' => array( + 'title' => $this->l('Name') + ), + 'file' => array( + 'title' => $this->l('File') + ) + ); + + parent::__construct(); + } + + public function initForm() + { + $this->fields_form = array( + 'legend' => array( + 'title' => $this->l('Attachment'), + 'image' => '../img/t/AdminAttachments.gif' + ), + 'input' => array( + array( + 'type' => 'text', + 'label' => $this->l('Filename:'), + 'name' => 'name', + 'size' => 33, + 'required' => true, + 'lang' => true, + ), + array( + 'type' => 'textarea', + 'label' => $this->l('Description:'), + 'name' => 'description', + 'cols' => 40, + 'rows' => 10, + 'lang' => true, + ), + array( + 'type' => 'file', + 'label' => $this->l('File:'), + 'name' => 'file', + 'p' => $this->l('Upload file from your computer') + ), + ), + 'submit' => array( + 'title' => $this->l(' Save '), + 'class' => 'button' + ) + ); + + return parent::initForm(); + } + + public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) + { + parent::getList((int)$id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop); + + if (count($this->_list)) + { + $this->product_attachements = Attachment::getProductAttached((int)$id_lang, $this->_list); + + $list_product_list = array(); + foreach ($this->_list as $list) + { + $product_list = ''; + if (isset($this->product_attachements[$list['id_attachment']])) + { + foreach ($this->product_attachements[$list['id_attachment']] as $product) + $product_list .= $product.', '; + } + $list_product_list[$list['id_attachment']] = $product_list; + } + + // Assign array in list_action_delete.tpl + $this->tpl_delete_link_vars = array( + 'product_list' => $list_product_list, + 'product_attachements' => $this->product_attachements + ); + } + } + + public function postProcess() + { + /* PrestaShop demo mode */ + if (_PS_MODE_DEMO_) + { + $this->_errors[] = Tools::displayError('This functionnality has been disabled.'); + return; + } + /* PrestaShop demo mode*/ + if (Tools::isSubmit('submitAdd'.$this->table)) + { + $id = (int)Tools::getValue('id_attachment'); + if ($id && $a = new Attachment($id)) + { + $_POST['file'] = $a->file; + $_POST['mime'] = $a->mime; + } + if (!count($this->_errors)) + { + if (isset($_FILES['file']) && is_uploaded_file($_FILES['file']['tmp_name'])) + { + if ($_FILES['file']['size'] > (Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024 * 1024)) + $this->_errors[] = $this->l('File too large, maximum size allowed:').' '. + (Configuration::get('PS_ATTACHMENT_MAXIMUM_SIZE') * 1024).' '.$this->l('kb').'. '. + $this->l('File size you\'re trying to upload is:').number_format(($_FILES['file']['size'] / 1024), 2, '.', '').$this->l('kb'); + else + { + do $uniqid = sha1(microtime()); + while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid)); + if (!copy($_FILES['file']['tmp_name'], _PS_DOWNLOAD_DIR_.$uniqid)) + $this->_errors[] = $this->l('File copy failed'); + $_POST['file_name'] = $_FILES['file']['name']; + @unlink($_FILES['file']['tmp_name']); + $_POST['file'] = $uniqid; + $_POST['mime'] = $_FILES['file']['type']; + } + } + else if (array_key_exists('file', $_FILES) && (int)$_FILES['file']['error'] === 1) + { + $max_upload = (int)ini_get('upload_max_filesize'); + $max_post = (int)ini_get('post_max_size'); + $upload_mb = min($max_upload, $max_post); + $this->_errors[] = $this->l('the File').' '.$_FILES['file']['name'].' '. + $this->l('exceeds the size allowed by the server. This limit is set to').' '.$upload_mb.$this->l('Mb').''; + } + else if (!empty($_FILES['file']['tmp_name'])) + $this->_errors[] = $this->l('No file or your file isn\'t uploadable, check your server configuration about the upload maximum size.'); + } + $this->validateRules(); + } + return parent::postProcess(); + } +}