diff --git a/admin-dev/get-file-admin.php b/admin-dev/get-file-admin.php index 61c06b289..1962155ca 100644 --- a/admin-dev/get-file-admin.php +++ b/admin-dev/get-file-admin.php @@ -27,4 +27,4 @@ define('_PS_ADMIN_DIR_', getcwd()); require(dirname(dirname(__FILE__)).'/config/config.inc.php'); -Controller::getController('getFileController')->run(); \ No newline at end of file +Controller::getController('GetFileController')->run(); \ No newline at end of file diff --git a/admin-dev/tabs/AdminProducts.php b/admin-dev/tabs/AdminProducts.php index 1f8825f67..cabaaae96 100644 --- a/admin-dev/tabs/AdminProducts.php +++ b/admin-dev/tabs/AdminProducts.php @@ -1,9 +1,9 @@ table = 'product'; $this->className = 'Product'; $this->lang = true; @@ -129,8 +128,6 @@ class AdminProducts extends AdminTab $nb = count($this->_list); if ($this->_list) { - - /* update product final price */ for ($i = 0; $i < $nb; $i++) $this->_list[$i]['price_tmp'] = Product::getPriceStatic($this->_list[$i]['id_product'], true, null, 6, null, false, true, 1, true); @@ -158,6 +155,14 @@ class AdminProducts extends AdminTab return $productDownload->deleteFile(); } + public function deleteVirtualProductAttribute() + { + if (!($id_product_download = ProductDownload::getIdFromIdAttibute((int) Tools::getValue('id_product_attribute')))) + return false; + $productDownload = new ProductDownload((int)($id_product_download)); + return $productDownload->deleteFile(); + } + /** * postProcess handle every checks before saving products information * @@ -182,6 +187,15 @@ class AdminProducts extends AdminTab $this->deleteVirtualProduct(); else $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); + } + + /* Delete a product in the download folder */ + if (Tools::getValue('deleteVirtualProductAttribute')) + { + if ($this->tabAccess['delete'] === '1') + $this->deleteVirtualProductAttribute(); + else + $this->_errors[] = Tools::displayError('You do not have permission to delete here.'); } /* Update attachments */ @@ -509,6 +523,7 @@ class AdminProducts extends AdminTab $this->_errors[] = Tools::displayError('An error occurred while updating qty.'); } Hook::updateProductAttribute((int)$id_product_attribute); + $this->updateDownloadProduct($product, 1, $id_product_attribute); } else { @@ -541,6 +556,7 @@ class AdminProducts extends AdminTab Tools::getValue('attribute_default'), Tools::getValue('attribute_location'), Tools::getValue('attribute_upc')); + $this->updateDownloadProduct($product, 0, $id_product_attribute); } else $this->_errors[] = Tools::displayError('You do not have permission to').'
'.Tools::displayError('Edit here.'); @@ -555,7 +571,7 @@ class AdminProducts extends AdminTab if (!$product->cache_default_attribute) Product::updateDefaultAttribute($product->id); Tools::redirectAdmin(self::$currentIndex.'&id_product='.$product->id.'&id_category='.(!empty($_REQUEST['id_category'])?$_REQUEST['id_category']:'1').'&add'.$this->table.'&tabs=3&token='.($token ? $token : $this->token)); - } + } } } } @@ -568,6 +584,14 @@ class AdminProducts extends AdminTab if (($id_product = (int)(Tools::getValue('id_product'))) && Validate::isUnsignedId($id_product) && Validate::isLoadedObject($product = new Product($id_product))) { $product->deleteAttributeCombinaison(Tools::getValue('id_product_attribute')); + + $id_product_download = ProductDownload::getIdFromIdAttibute((int) Tools::getValue('id_product_attribute')); + if ($id_product_download) + { + $productDownload = new ProductDownload((int) $id_product_download); + $this->deleteDownloadProduct((int) $id_product_download); + $productDownload->deleteFile(); + } $product->checkDefaultAttributes(); $product->updateQuantityProductWithAttributeQuantity(); if (!$product->hasAttributes()) @@ -1107,7 +1131,7 @@ class AdminProducts extends AdminTab $this->_errors[] = Tools::displayError('An error occurred while updating qty.'); } $this->updateAccessories($object); - $this->updateDownloadProduct($object); + $this->updateDownloadProduct($object, 1); $this->updateAssoShop((int)$object->id); if (!$this->updatePackItems($object)) @@ -1234,48 +1258,159 @@ class AdminProducts extends AdminTab * @param object $product Product * @return bool */ - public function updateDownloadProduct($product) + public function updateDownloadProduct($product, $edit = 0, $id_product_attribute = null) { + $filename = ''; + $is_virtual_file = 0; + $id_product_download = 0; + + $is_shareable = 0; + $virtual_product_name = ''; + $virtual_product_nb_days = 0; + $virtual_product_filename = ''; + $virtual_product_nb_downloable = 0; + $virtual_product_expiration_date = ''; + + $is_shareable_attribute = 0; + $virtual_product_name_attribute = ''; + $virtual_product_nb_days_attribute = 0; + $virtual_product_filename_attribute = ''; + $virtual_product_nb_downloable_attribute = 0; + $virtual_product_expiration_date_attribute = ''; + + $is_virtual_file = (int) Tools::getValue('is_virtual_file'); + /* add or update a virtual product */ if (Tools::getValue('is_virtual_good') == 'true') { - if (!Tools::getValue('virtual_product_name')) + if (!Tools::getValue('virtual_product_id') && !Tools::getValue('virtual_product_name_attribute') && !empty($is_virtual_file)) { - $this->_errors[] = $this->l('the field').' '.$this->l('display filename').' '.$this->l('is required'); - return false; + if (!Tools::getValue('virtual_product_name')) + { + if (!Tools::getValue('virtual_product_name_attribute') && !empty($id_product_attribute)) + { + $this->_errors[] = $this->l('the field').' '.$this->l('display filename attribute').' '.$this->l('is required'); + return false; + } + else if (!empty($id_product_attribute)) + { + $this->_errors[] = $this->l('the field').' '.$this->l('display filename').' '.$this->l('is required'); + return false; + } + } } - if (Tools::getValue('virtual_product_nb_days') === false) + + if (Tools::getValue('virtual_product_nb_days') === false && Tools::getValue('virtual_product_nb_days_attribute') === false && !empty($is_virtual_file)) { - $this->_errors[] = $this->l('the field').' '.$this->l('number of days').' '.$this->l('is required'); - return false; - } - if (Tools::getValue('virtual_product_expiration_date') && !Validate::isDate(Tools::getValue('virtual_product_expiration_date'))) + if (!Tools::getValue('virtual_product_name')) + { + if (!Tools::getValue('virtual_product_name_attribute')) + { + $this->_errors[] = $this->l('the field').' '.$this->l('number of days attribute').' '.$this->l('is required'); + return false; + } + else + { + $this->_errors[] = $this->l('the field').' '.$this->l('number of days').' '.$this->l('is required'); + return false; + } + } + } + if (Tools::getValue('virtual_product_expiration_date') AND !Validate::isDate(Tools::getValue('virtual_product_expiration_date') && !empty($is_virtual_file)) + && Tools::getValue('virtual_product_expiration_date_attribute') AND !Validate::isDate(Tools::getValue('virtual_product_expiration_date_attribute'))) { - $this->_errors[] = $this->l('the field').' '.$this->l('expiration date').' '.$this->l('is not valid'); - return false; + if (!Tools::getValue('virtual_product_expiration_date')) + { + if (!Tools::getValue('virtual_product_expiration_date_attribute')) + { + $this->_errors[] = $this->l('the field').' '.$this->l('expiration date attribute').' '.$this->l('is required'); + return false; + } + else + { + $this->_errors[] = $this->l('the field').' '.$this->l('expiration date').' '.$this->l('is not valid'); + return false; + } + } } + // The oos behavior MUST be "Deny orders" for virtual products if (Tools::getValue('out_of_stock') != 0) { $this->_errors[] = $this->l('The "when out of stock" behavior selection must be "deny order" for virtual products'); return false; } + + // Trick's + if ($edit == 1) + { + $id_product_download_attibute = ProductDownload::getIdFromIdAttibute($id_product_attribute); + $id_product_download = ($id_product_download_attibute) ? (int) $id_product_download_attibute : (int) Tools::getValue('virtual_product_id'); + } + + $is_shareable = Tools::getValue('virtual_product_is_shareable'); + $virtual_product_name = Tools::getValue('virtual_product_name'); + $virtual_product_filename = Tools::getValue('virtual_product_filename'); + $virtual_product_nb_days = Tools::getValue('virtual_product_nb_days'); + $virtual_product_nb_downloable = Tools::getValue('virtual_product_nb_downloable'); + $virtual_product_expiration_date = Tools::getValue('virtual_product_expiration_date'); + + $is_shareable_attribute = Tools::getValue('virtual_product_is_shareable_attribute'); + $virtual_product_name_attribute = Tools::getValue('virtual_product_name_attribute'); + $virtual_product_filename_attribute = Tools::getValue('virtual_product_filename_attribute'); + $virtual_product_nb_days_attribute = Tools::getValue('virtual_product_nb_days_attribute'); + $virtual_product_nb_downloable_attribute = Tools::getValue('virtual_product_nb_downloable_attribute'); + $virtual_product_expiration_date_attribute = Tools::getValue('virtual_product_expiration_date_attribute'); + + if (!empty($is_shareable_attribute)) + $is_shareable = $is_shareable_attribute; + + if (!empty($virtual_product_name_attribute)) + $virtual_product_name = $virtual_product_name_attribute; + + if (!empty($virtual_product_nb_days_attribute)) + $virtual_product_nb_days = $virtual_product_nb_days_attribute; + + if (!empty($virtual_product_nb_downloable_attribute)) + $virtual_product_nb_downloable = $virtual_product_nb_downloable_attribute; + + if (!empty($virtual_product_expiration_date_attribute)) + $virtual_product_expiration_date = $virtual_product_expiration_date_attribute; - $productDownload = new ProductDownload(Tools::getValue('virtual_product_id')); - $productDownload->id_product = $product->id; - $productDownload->display_filename = Tools::getValue('virtual_product_name'); - $productDownload->physically_filename = Tools::getValue('virtual_product_filename') ? Tools::getValue('virtual_product_filename') : ProductDownload::getNewFilename(); - $productDownload->date_deposit = date('Y-m-d H:i:s'); - $productDownload->date_expiration = Tools::getValue('virtual_product_expiration_date') ? Tools::getValue('virtual_product_expiration_date').' 23:59:59' : ''; - $productDownload->nb_days_accessible = Tools::getValue('virtual_product_nb_days'); - $productDownload->nb_downloadable = Tools::getValue('virtual_product_nb_downloable'); - $productDownload->active = 1; - return $productDownload->save(); + if (!empty($virtual_product_filename_attribute)) + $filename = $virtual_product_filename_attribute; + else if ($virtual_product_filename) + $filename = $virtual_product_filename; + else + $filename = ProductDownload::getNewFilename(); + + $download = new ProductDownload($id_product_download); + $download->id_product = (int) $product->id; + $download->id_product_attribute = (int) $id_product_attribute; + $download->display_filename = $virtual_product_name; + $download->filename = $filename; + $download->date_add = date('Y-m-d H:i:s'); + $download->date_expiration = $virtual_product_expiration_date ? $virtual_product_expiration_date.' 23:59:59' : ''; + $download->nb_days_accessible = (int) $virtual_product_nb_days; + $download->nb_downloadable = (int) $virtual_product_nb_downloable; + $download->active = 1; + $download->is_shareable = (int) $is_shareable; + + if ($download->save()) + return true; } else { /* unactive download product if checkbox not checked */ - if ($id_product_download = ProductDownload::getIdFromIdProduct($product->id)) + if ($edit == 1) + { + $id_product_download_attibute = ProductDownload::getIdFromIdAttibute($id_product_attribute); + $id_product_download = ($id_product_download_attibute) ? (int) $id_product_download_attibute : (int) Tools::getValue('virtual_product_id'); + } + else + $id_product_download = ProductDownload::getIdFromIdProduct($product->id); + + if (!empty($id_product_download)) { $productDownload = new ProductDownload($id_product_download); $productDownload->date_expiration = date('Y-m-d H:i:s', time()-1); @@ -1285,7 +1420,19 @@ class AdminProducts extends AdminTab } return false; } - + + public function deleteDownloadProduct($id_product_attribute = NULL) + { + if (!empty($id_product_attribute)) + { + $productDownload = new ProductDownload($id_product_attribute); + $productDownload->date_expiration = date('Y-m-d H:i:s', time()-1); + $productDownload->active = 0; + return $productDownload->save(); + } + return false; + } + /** * Update product accessories * @@ -1822,7 +1969,6 @@ class AdminProducts extends AdminTab
'; - include_once('functions.php'); includeDatepicker(array('sp_from', 'sp_to'), true); } @@ -2029,7 +2175,143 @@ class AdminProducts extends AdminTab $cover = Product::getCover($obj->id); $this->_applyTaxToEcotax($obj); - echo ' + /* + * Form for add a virtual product like software, mp3, etc... + */ + $productDownload = new ProductDownload(); + if ($id_product_download = $productDownload->getIdFromIdProduct($this->getFieldValue($obj, 'id'))) + $productDownload = new ProductDownload($id_product_download); + + $hidden = $display_filename = $check = ''; + ?> + + + + + + + + id OR Tools::getValue('is_virtual_good')=='true') AND $productDownload->active) + $check = 'checked="checked"'; + + if(!$productDownload->id OR !$productDownload->active) + $hidden = 'style="display:none;"'; + + $cache_default_attribute = $this->getFieldValue($obj, 'cache_default_attribute'); + + echo '

1. '.$this->l('Info.').'

'; - ?> + -

id || Tools::getValue('is_virtual_good')=='true') && $productDownload->active) echo 'checked="checked"' ?> /> -

-
id || !$productDownload->active) echo 'style="display:none;"' ?> > - -

- l('Your download repository is not writable.'); ?>
- -

- - id) echo '' ?> -

- checkFile()): ?> -

- id): ?> -

- l('This product is missing') ?>:
- physically_filename ?> +

+

+
+ +
'.$this->l('Does this product has an associated file ?').'
'; + + $exists_file = realpath(_PS_DOWNLOAD_DIR_).'/'.$productDownload->filename; + + if ($productDownload->id && file_exists($exists_file) || !empty($productDownload->display_filename)) + { + echo ''. $this->l('Yes').' + '.$this->l('No').'

'; + } + else + { + echo ''. $this->l('Yes').' + '.$this->l('No').'

'; + } + + if (!file_exists($exists_file) && !empty($productDownload->display_filename) && empty($cache_default_attribute)) + { + $msg = sprintf(Tools::displayError('This file "%s" is missing'), $productDownload->display_filename); + echo '

+ '.$msg.' :
+ '.realpath(_PS_DOWNLOAD_DIR_) .'/'. $productDownload->filename.'
+

'; + } + + if (!ProductDownload::checkWritableDir()) + { + echo '

+ '.$this->l('Your download repository is not writable.').'
+ '.realpath(_PS_DOWNLOAD_DIR_).' +

'; + } + + echo '
- -
- + '; + + includeDatepicker('virtual_product_expiration_date'); + + echo ' +
+ + '.$this->l('Pre-tax wholesale price:').' @@ -2482,7 +2858,6 @@ class AdminProducts extends AdminTab echo ''; } - echo ' '; @@ -2505,9 +2880,10 @@ class AdminProducts extends AdminTab '.($currency->format % 2 != 0 ? ' '.$currency->sign : '').' '.($currency->format % 2 == 0 ? ' '.$currency->sign : '').' '; - } else { + } + else echo ''; - } + echo ' '.$this->l('Unit price without tax:').' @@ -2669,7 +3045,6 @@ class AdminProducts extends AdminTab '; // date picker include - include_once('functions.php'); includeDatepicker('available_date'); } @@ -3222,8 +3597,6 @@ class AdminProducts extends AdminTab foreach ($images as $k => $image) echo $this->getLineTableImage($image, $imagesTotal, $token, $shops); - - echo ' @@ -3321,7 +3694,12 @@ class AdminProducts extends AdminTab $currency = $this->context->currency; $attributes_groups = AttributeGroup::getAttributesGroups($this->context->language->id); $default_country = new Country((int)Configuration::get('PS_COUNTRY_DEFAULT')); - + + $productDownload = new ProductDownload(); + $id_product_download = (int) $productDownload->getIdFromIdProduct($this->getFieldValue($obj, 'id')); + if (!empty($id_product_download)) + $productDownload = new ProductDownload($id_product_download); + $images = Image::getImages($this->context->language->id, $obj->id); if ($obj->id) { @@ -3332,7 +3710,31 @@ class AdminProducts extends AdminTab updateMvtStatus($(this).val()); }); updateMvtStatus($(this).val()); - }); + + if ( $("input[name=is_virtual_file]:checked").val() == 1) + { + $("#virtual_good_attributes").show(); + $("#is_virtual_file_product").show(); + } + else + { + $("#virtual_good_attributes").hide(); + $("#is_virtual_file_product").hide(); + } + + $("input[name=is_virtual_file]").live("change", function() { + if($(this).val() == "1") + { + $("#virtual_good_attributes").show(); + $("#is_virtual_file_product").show(); + } + else + { + $("#virtual_good_attributes").hide(); + $("#is_virtual_file_product").hide(); + } + }); + }); @@ -3371,6 +3773,7 @@ class AdminProducts extends AdminTab + @@ -3389,7 +3792,59 @@ class AdminProducts extends AdminTab '.$this->l('Special characters allowed:').' .-_#  - + +

'.$this->l('Reference:').'


+ + + + + + @@ -3480,7 +3935,6 @@ class AdminProducts extends AdminTab '; // date picker include - include_once('functions.php'); includeDatepicker('available_date'); echo ' @@ -3529,8 +3983,18 @@ class AdminProducts extends AdminTab - - + '; + + if ($id_product_download && !empty($productDownload->display_filename)) + { + echo ' + + + + '; + } + + echo ''; if ($obj->id) { @@ -3582,6 +4046,22 @@ class AdminProducts extends AdminTab $jsList = rtrim($jsList, ', '); $attrImage = $product_attribute['id_image'] ? new Image($product_attribute['id_image']) : false; $available_date = ($product_attribute['available_date'] != 0) ? date('Y-m-d', strtotime($product_attribute['available_date'])) : '0000-00-00'; + + $id_product_download = $productDownload->getIdFromIdAttibute((int) $id_product_attribute); + + if ($id_product_download) + $productDownload = new ProductDownload($id_product_download); + + $available_date_attribute = substr($productDownload->date_expiration, 0, -9); + + if ($available_date_attribute == '0000-00-00') + $available_date_attribute = ''; + + if ($productDownload->is_shareable == 1) + $is_shareable = $this->l('Yes'); + else + $is_shareable = $this->l('No'); + echo ' @@ -3590,12 +4070,29 @@ class AdminProducts extends AdminTab - - '; + + if ($id_product_download && !empty($productDownload->display_filename)) + { + echo ' + + + '; + } + + $exists_file = realpath(_PS_DOWNLOAD_DIR_).'/'.$productDownload->filename; + + if ($productDownload->id && file_exists($exists_file)) + $filename = $productDownload->filename; + else + $filename = ''; + + echo '
'.$this->l('Wholesale price:').' '.($currency->format % 2 != 0 ? $currency->sign.' ' : '').''.($currency->format % 2 == 0 ? ' '.$currency->sign : '').' ('.$this->l('overrides Wholesale price on Information tab').')

'.$this->l('Reference').' '.$this->l('EAN13').' '.$this->l('UPC').''.$this->l('Quantity').''.$this->l('Actions').''.$this->l('Quantity').''.$this->l('Filename').''.$this->l('Number of downloads').''.$this->l('Number of days').''.$this->l('Share').''.$this->l('Actions').'
'.stripslashes($list).''.$product_attribute['reference'].' '.$product_attribute['ean13'].' '.$product_attribute['upc'].''.$product_attribute['quantity'].' + '.$product_attribute['quantity'].''.$productDownload->getHtmlLink(false, true).''.$productDownload->nb_downloadable.''.$productDownload->nb_downloadable.''.$is_shareable.' '.$this->l('Modify this combination').'  + \''.$product_attribute['quantity'].'\', \''.($attrImage ? $attrImage->id : 0).'\', Array('.$jsList.'), \''.$id_product_attribute.'\', \''.$product_attribute['default_on'].'\', \''.$product_attribute['ecotax'].'\', \''.$product_attribute['location'].'\', \''.$product_attribute['upc'].'\', \''.$product_attribute['minimal_quantity'].'\', \''.$available_date.'\', + \''.$productDownload->display_filename.'\', \''.$filename.'\', \''.$productDownload->nb_downloadable.'\', \''.$available_date_attribute.'\', \''.$productDownload->nb_days_accessible.'\', \''.$productDownload->is_shareable.'\'); calcImpactPriceTI();" />  '.(!$product_attribute['default_on'] ? ' '.$this->l('Make this the default combination').'' : '').' @@ -3991,5 +4488,4 @@ class AdminProducts extends AdminTab $this->displayErrors(); } -} - +} \ No newline at end of file diff --git a/admin-dev/uploadProductFileAttribute.php b/admin-dev/uploadProductFileAttribute.php new file mode 100644 index 000000000..051e52dae --- /dev/null +++ b/admin-dev/uploadProductFileAttribute.php @@ -0,0 +1,57 @@ + +* @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 +*/ + +define('_PS_ADMIN_DIR_', getcwd()); + +include(_PS_ADMIN_DIR_.'/../config/config.inc.php'); + +if (!isset(Context::getContext()->employee) || !Context::getContext()->employee->isLoggedBack()) + die; + +if (isset($_FILES['virtual_product_file_attribute']) && is_uploaded_file($_FILES['virtual_product_file_attribute']['tmp_name']) && +(isset($_FILES['virtual_product_file_attribute']['error']) && !$_FILES['virtual_product_file_attribute']['error']) || +(!empty($_FILES['virtual_product_file_attribute']['tmp_name']) && $_FILES['virtual_product_file_attribute']['tmp_name'] != 'none')) +{ + $filename = $_FILES['virtual_product_file_attribute']['name']; + $file = $_FILES['virtual_product_file_attribute']['tmp_name']; + $newfilename = ProductDownload::getNewFilename(); + + if (!copy($file, _PS_DOWNLOAD_DIR_.$newfilename)) + { + header('HTTP/1.1 500 Error'); + echo ''; + } + @unlink($file); + + header('HTTP/1.1 200 OK'); + echo ''; +} +else +{ + header('HTTP/1.1 500 Error'); + echo ''; +} \ No newline at end of file diff --git a/classes/Cart.php b/classes/Cart.php index 0f03bed3c..43936e5a2 100644 --- a/classes/Cart.php +++ b/classes/Cart.php @@ -1530,28 +1530,39 @@ class CartCore extends ObjectModel */ public function isVirtualCart() { + $prod = array(); if (!ProductDownload::isFeatureActive()) return false; - + if (!isset(self::$_isVirtualCart[$this->id])) { $products = $this->getProducts(); - if (!sizeof($products)) return false; - $list = ''; foreach ($products AS $product) - $list .= (int)($product['id_product']).','; + { + $prod[] = (int) $product['id_product']; + } + + $unique_product = array_unique($prod); + + $list = ''; + foreach ($unique_product AS $product) + { + $list .= (int)($product).','; + } $list = rtrim($list, ','); - + $n = (int)Db::getInstance()->getValue(' SELECT COUNT(`id_product_download`) n FROM `'._DB_PREFIX_.'product_download` - WHERE `id_product` IN ('.pSQL($list).') AND `active` = 1'); + WHERE `id_product` IN ('.pSQL($list).') + AND `active` = 1'); self::$_isVirtualCart[$this->id] = ($n == sizeof($products)); } + return self::$_isVirtualCart[$this->id]; } diff --git a/classes/Product.php b/classes/Product.php index 3d7f765d5..a6e9899e5 100644 --- a/classes/Product.php +++ b/classes/Product.php @@ -1107,10 +1107,10 @@ class ProductCore extends ObjectModel $result = Db::getInstance()->Execute(' DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` WHERE `id_product_attribute` IN (SELECT `id_product_attribute` FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product` = '.(int)($this->id).')'); - $result2 = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_attribute` WHERE `id_product` = '.(int)($this->id)); + $result3 = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'product_download` WHERE `id_product` = '.(int)($this->id)); - return ($result & $result2); + return ($result & $result2 & $result3); } /** @@ -2658,12 +2658,12 @@ class ProductCore extends ObjectModel public static function duplicateDownload($id_product_old, $id_product_new) { - $resource = Db::getInstance()->ExecuteS('SELECT `display_filename`, `physically_filename`, `date_deposit`, `date_expiration`, `nb_days_accessible`, `nb_downloadable`, `active` FROM `'._DB_PREFIX_.'product_download` WHERE `id_product` = '.(int)($id_product_old)); + $resource = Db::getInstance()->ExecuteS('SELECT `display_filename`, `filename`, `date_add`, `date_expiration`, `nb_days_accessible`, `nb_downloadable`, `active`, `is_shareable` FROM `'._DB_PREFIX_.'product_download` WHERE `id_product` = '.(int)($id_product_old)); if (!Db::getInstance()->NumRows()) return true; - $query = 'INSERT INTO `'._DB_PREFIX_.'product_download` (`id_product`, `display_filename`, `physically_filename`, `date_deposit`, `date_expiration`, `nb_days_accessible`, `nb_downloadable`, `active`) VALUES'; + $query = 'INSERT INTO `'._DB_PREFIX_.'product_download` (`id_product`, `display_filename`, `filename`, `date_add`, `date_expiration`, `nb_days_accessible`, `nb_downloadable`, `active`, `is_shareable`) VALUES'; while ($row = Db::getInstance()->nextRow($resource)) - $query .= ' ('.(int)($id_product_new).', \''.pSQL($row['display_filename']).'\', \''.pSQL($row['physically_filename']).'\', \''.pSQL($row['date_deposit']).'\', \''.pSQL($row['date_expiration']).'\', '.(int)($row['nb_days_accessible']).', '.(int)($row['nb_downloadable']).', '.(int)($row['active']).'),'; + $query .= ' ('.(int)($id_product_new).', \''.pSQL($row['display_filename']).'\', \''.pSQL($row['filename']).'\', \''.pSQL($row['date_add']).'\', \''.pSQL($row['date_expiration']).'\', '.(int)($row['nb_days_accessible']).', '.(int)($row['nb_downloadable']).', '.(int)($row['active']).'), '.(int)($row['is_shareable']).'),'; $query = rtrim($query, ','); return Db::getInstance()->Execute($query); } diff --git a/classes/ProductDownload.php b/classes/ProductDownload.php index 6d187809a..0fdecb81f 100644 --- a/classes/ProductDownload.php +++ b/classes/ProductDownload.php @@ -29,19 +29,22 @@ class ProductDownloadCore extends ObjectModel { /** @var integer Product id which download belongs */ public $id_product; + + /** @var integer Attribute Product id which download belongs */ + public $id_product_attribute; /** @var string DisplayFilename the name which appear */ public $display_filename; /** @var string PhysicallyFilename the name of the file on hard disk */ - public $physically_filename; - + public $filename; + /** @var string DateDeposit when the file is upload */ - public $date_deposit; + public $date_add; /** @var string DateExpiration deadline of the file */ public $date_expiration; - + /** @var string NbDaysAccessible how many days the customer can access to file */ public $nb_days_accessible; @@ -50,31 +53,37 @@ class ProductDownloadCore extends ObjectModel /** @var boolean Active if file is accessible or not */ public $active = 1; + + /** @var boolean is_shareable indicates whether the product can be shared */ + public $is_shareable = 0; protected static $_productIds = array(); protected $fieldsRequired = array( - 'id_product', - 'display_filename' + 'id_product' ); + protected $fieldsSize = array( 'display_filename' => 255, - 'physically_filename' => 255, - 'date_deposit' => 20, + 'filename' => 255, + 'date_add' => 20, 'date_expiration' => 20, 'nb_days_accessible' => 10, 'nb_downloadable' => 10, - 'active' => 1 + 'active' => 1, + 'is_shareable' => 1 ); protected $fieldsValidate = array( 'id_product' => 'isUnsignedId', + 'id_product_attribute ' => 'isUnsignedId', 'display_filename' => 'isGenericName', - 'physically_filename' => 'isSha1', - 'date_deposit' => 'isDate', + 'filename' => 'isSha1', + 'date_add' => 'isDate', 'date_expiration' => 'isDate', 'nb_days_accessible' => 'isUnsignedInt', 'nb_downloadable' => 'isUnsignedInt', - 'active' => 'isUnsignedInt' + 'active' => 'isUnsignedInt', + 'is_shareable' => 'isUnsignedInt' ); protected $table = 'product_download'; @@ -129,13 +138,15 @@ class ProductDownloadCore extends ObjectModel $this->date_expiration = '0000-00-00 00:00:00'; $fields['id_product'] = (int)($this->id_product); + $fields['id_product_attribute'] = pSQL($this->id_product_attribute); $fields['display_filename'] = pSQL($this->display_filename); - $fields['physically_filename'] = pSQL($this->physically_filename); - $fields['date_deposit'] = pSQL($this->date_deposit); + $fields['filename'] = pSQL($this->filename); + $fields['date_add'] = pSQL($this->date_add); $fields['date_expiration'] = pSQL($this->date_expiration); $fields['nb_days_accessible'] = (int)($this->nb_days_accessible); $fields['nb_downloadable'] = (int)($this->nb_downloadable); $fields['active'] = (int)($this->active); + $fields['is_shareable'] = (int)($this->is_shareable); return $fields; } @@ -148,7 +159,7 @@ class ProductDownloadCore extends ObjectModel { if (!$this->checkFile()) return false; - return unlink(_PS_DOWNLOAD_DIR_.$this->physically_filename); + return unlink(_PS_DOWNLOAD_DIR_.$this->filename); } /** @@ -158,8 +169,8 @@ class ProductDownloadCore extends ObjectModel */ public function checkFile() { - if (!$this->physically_filename) return false; - return file_exists(_PS_DOWNLOAD_DIR_.$this->physically_filename); + if (!$this->filename) return false; + return file_exists(_PS_DOWNLOAD_DIR_.$this->filename); } /** @@ -182,18 +193,68 @@ class ProductDownloadCore extends ObjectModel { if (!self::isFeatureActive()) return false; - if (array_key_exists($id_product, self::$_productIds)) return self::$_productIds[$id_product]; - self::$_productIds[$id_product] = (int)Db::getInstance()->getValue(' SELECT `id_product_download` FROM `'._DB_PREFIX_.'product_download` WHERE `id_product` = '.(int)$id_product.' AND `active` = 1'); - return self::$_productIds[$id_product]; } + /** + * Return the id_product_download from an id_product + * @since 1.5.0.1 + * @param int $id_product Product the id + * @return integer Product the id for this virtual product + */ + public static function getIdFromIdAttibute($id_product_attribute) + { + if (!self::isFeatureActive()) + return false; + if (array_key_exists($id_product_attribute, self::$_productIds)) + return self::$_productIds[$id_product]; + self::$_productIds[$id_product_attribute] = (int)Db::getInstance()->getValue(' + SELECT `id_product_download` + FROM `'._DB_PREFIX_.'product_download` + WHERE `id_product_attribute` = '.(int)$id_product_attribute.' AND `active` = 1'); + return self::$_productIds[$id_product_attribute]; + } + + /** + * Return the display filename from a physical filename + * + * @since 1.5.0.1 + * + * @param string $filename Filename physically + * @return integer Product the id for this virtual product + * + */ + public static function getAttributeFromIdProduct($id_product) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT `id_product_download` + FROM `'._DB_PREFIX_.'product_download` + WHERE `id_product` = '.(int)$id_product.' AND `active` = 1'); + } + + /** + * Return the display filename from a physical filename + * + * @since 1.5.0.1 + * + * @param string $filename Filename physically + * @return integer Product the id for this virtual product + * + */ + public static function getIdFromFilename($filename) + { + return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' + SELECT `id_product_download` + FROM `'._DB_PREFIX_.'product_download` + WHERE `filename` = \''.pSQL($filename).'\''); + } + /** * Return the filename from an id_product * @@ -203,7 +264,7 @@ class ProductDownloadCore extends ObjectModel public static function getFilenameFromIdProduct($id_product) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' - SELECT `physically_filename` + SELECT `filename` FROM `'._DB_PREFIX_.'product_download` WHERE `id_product` = '.(int)$id_product.' AND `active` = 1'); @@ -212,15 +273,15 @@ class ProductDownloadCore extends ObjectModel /** * Return the display filename from a physical filename * - * @param string $physically_filename Filename physically + * @param string $filename Filename physically * @return string Filename the display filename for this virtual product */ - public static function getFilenameFromFilename($physically_filename) + public static function getFilenameFromFilename($filename) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT `display_filename` FROM `'._DB_PREFIX_.'product_download` - WHERE `physically_filename` = \''.pSQL($physically_filename).'\''); + WHERE `filename` = \''.pSQL($filename).'\''); } /** @@ -233,9 +294,9 @@ class ProductDownloadCore extends ObjectModel */ public function getTextLink($admin = true, $hash = false) { - $key = $this->physically_filename . '-' . ($hash ? $hash : 'orderdetail'); + $key = $this->filename . '-' . ($hash ? $hash : 'orderdetail'); $link = ($admin) ? 'get-file-admin.php?' : Tools::getHttpHost(true, true).'index.php?controller=get-file&'; - $link .= ($admin) ? 'file='.$this->physically_filename : 'key='.$key; + $link .= ($admin) ? 'file='.$this->filename : 'key='.$key; return $link; } @@ -302,6 +363,4 @@ class ProductDownloadCore extends ObjectModel { return Configuration::get('PS_VIRTUAL_PROD_FEATURE_ACTIVE'); } -} - - +} \ No newline at end of file diff --git a/controllers/front/GetFileController.php b/controllers/front/GetFileController.php index a46dece88..a473e8b37 100644 --- a/controllers/front/GetFileController.php +++ b/controllers/front/GetFileController.php @@ -107,7 +107,7 @@ class GetFileControllerCore extends FrontController /* Access is authorized -> increment download value for the customer */ OrderDetail::incrementDownload($info['id_order_detail']); - $file = _PS_DOWNLOAD_DIR_.$info['physically_filename']; + $file = _PS_DOWNLOAD_DIR_.$info['filename']; $filename = $info['display_filename']; } diff --git a/css/admin.css b/css/admin.css index 95ce744bd..66df89b0e 100644 --- a/css/admin.css +++ b/css/admin.css @@ -412,7 +412,7 @@ select optgroup option { } #content .alert { - width: 500px; + width: auto; margin: 0 0 15px 0; padding: 10px 15px; border-top: 1px solid #DF7B7B; diff --git a/install-dev/php/utf8.php b/install-dev/php/utf8.php index b31b99fbb..01f0111e7 100644 --- a/install-dev/php/utf8.php +++ b/install-dev/php/utf8.php @@ -70,7 +70,7 @@ function latin1_database_to_utf8() array('name' => 'order_state_lang', 'id' => 'id_order_state', 'lang' => true, 'fields' => array('name', 'template')), array('name' => 'product', 'id' => 'id_product', 'fields' => array('ean13', 'reference')), array('name' => 'product_attribute', 'id' => 'id_product_attribute', 'fields' => array('reference', 'ean13')), - array('name' => 'product_download', 'id' => 'id_product_download', 'fields' => array('display_filename', 'physically_filename')), + array('name' => 'product_download', 'id' => 'id_product_download', 'fields' => array('display_filename', 'filename')), array('name' => 'product_lang', 'id' => 'id_product', 'lang' => true, 'fields' => array('description', 'description_short', 'link_rewrite', 'meta_description', 'meta_keywords', 'meta_title', 'name', 'availability')), array('name' => 'profile_lang', 'id' => 'id_profile', 'lang' => true, 'fields' => array('name')), array('name' => 'quick_access', 'id' => 'id_quick_access', 'fields' => array('link')), diff --git a/js/admin.js b/js/admin.js index a0af2ad8c..e78e5d9a8 100644 --- a/js/admin.js +++ b/js/admin.js @@ -403,7 +403,10 @@ if (helpboxes) if ($('input')) { //Display by rollover - $('input').mouseover(function() { $(this).parent().find('.hint:first').css('display', 'block'); }); + $('input').mouseover(function() { + console.log($(this).parent()); + $(this).parent().find('.hint:first').css('display', 'block'); + }); $('input').mouseout(function() { $(this).parent().find('.hint:first').css('display', 'none'); }); //display when you press the tab key diff --git a/js/attributesBack.js b/js/attributesBack.js index e34d2a1c9..56e850dab 100644 --- a/js/attributesBack.js +++ b/js/attributesBack.js @@ -26,9 +26,14 @@ var storeUsedGroups = {}; -function fillCombinaison(wholesale_price, price_impact, weight_impact, unit_impact, reference, supplier_reference, ean, quantity, image, old_attr, id_product_attribute, default_attribute, eco_tax, location, upc, minimal_quantity, available_date) +function fillCombinaison(wholesale_price, price_impact, weight_impact, unit_impact, reference, supplier_reference, +ean, quantity, image, old_attr, id_product_attribute, default_attribute, eco_tax, location, upc, minimal_quantity, available_date, +virtual_product_name_attribute, virtual_product_filename_attribute, virtual_product_nb_downloable, virtual_product_expiration_date_attribute, +virtual_product_nb_days, is_shareable) { + var link = ''; init_elems(); + $("#virtual_good_attributes").show(); $('#stock_mvt_attribute').show(); $('#initial_stock_attribute').hide(); $('#attribute_quantity').html(quantity); @@ -40,6 +45,13 @@ function fillCombinaison(wholesale_price, price_impact, weight_impact, unit_impa getE('available_date').value = '0000-00-00'; getE('minimal_quantity').value = minimal_quantity; getE('attribute_reference').value = reference; + + getE('virtual_product_name_attribute').value = virtual_product_name_attribute; + getE('virtual_product_nb_downloable_attribute').value = virtual_product_nb_downloable; + getE('virtual_product_expiration_date_attribute').value = virtual_product_nb_downloable; + getE('virtual_product_expiration_date_attribute').value = virtual_product_expiration_date_attribute; + getE('virtual_product_nb_days_attribute').value = virtual_product_nb_days; + getE('attribute_supplier_reference').value = supplier_reference; getE('attribute_ean13').value = ean; getE('attribute_upc').value = upc; @@ -102,6 +114,14 @@ function fillCombinaison(wholesale_price, price_impact, weight_impact, unit_impa getE('attribute_unit_impact').selectedIndex = 1; } + if (is_shareable > 0) + $("#virtual_product_is_shareable_attribute").attr("checked", "checked"); + + if (id_product_attribute != '' && virtual_product_filename_attribute != '') + $("#gethtmlink").show(); + link = $("#make_downloadable_product_attribute").attr('href'); + $("#make_downloadable_product_attribute").attr('href', link+"&id_product_attribute="+id_product_attribute); + /* Reset all combination images */ combinationImages = $('#id_image_attr').find("input[id^=id_image_attr_]"); combinationImages.each(function() { diff --git a/js/jquery/ajaxfileupload.js b/js/jquery/ajaxfileupload.js index edff89456..96e3009ca 100644 --- a/js/jquery/ajaxfileupload.js +++ b/js/jquery/ajaxfileupload.js @@ -1,53 +1,194 @@ -/* - * this file come from: - * http://www.phpletter.com/Demo/AjaxFileUpload-Demo/ - * v 1.0 - */ +jQuery.extend({ + createUploadIframe: function(id, uri) + { + //create frame + var frameId = 'jUploadFrame' + id; + var iframeHtml = '