diff --git a/admin-dev/themes/default/template/controllers/products/combinations.tpl b/admin-dev/themes/default/template/controllers/products/combinations.tpl index 551a127ae..7689161e4 100644 --- a/admin-dev/themes/default/template/controllers/products/combinations.tpl +++ b/admin-dev/themes/default/template/controllers/products/combinations.tpl @@ -267,7 +267,7 @@ -  {l s='Make this combination the default combination for this product'}

+  

diff --git a/classes/Product.php b/classes/Product.php index dd408d7f9..d4db0e7d6 100644 --- a/classes/Product.php +++ b/classes/Product.php @@ -653,11 +653,14 @@ class ProductCore extends ObjectModel return $result; } - public static function updateDefaultAttribute($id_product) + public function setAvailableDate($available_date = '0000-00-00') { - Db::getInstance()->update('product_shop', array( - 'cache_default_attribute' => (int)Product::getDefaultAttribute($id_product), - ), 'id_product = '.(int)$id_product); + if (Validate::isDateFormat($available_date) && $this->available_date != $available_date) + { + $this->available_date = $available_date; + return $this->update(); + } + return false; } public static function updateIsVirtual($id_product) @@ -1252,7 +1255,19 @@ class ProductCore extends ObjectModel $result &= ObjectModel::updateMultishopTable('product', array( 'cache_default_attribute' => (int)$id_product_attribute, ), 'a.`id_product` = '.(int)$this->id); + $this->cache_default_attribute = (int)$id_product_attribute; + return $result; + } + public static function updateDefaultAttribute($id_product) + { + $id_default_attribute = (int)Product::getDefaultAttribute($id_product); + $result = Db::getInstance()->update('product_shop', array( + 'cache_default_attribute' => $id_default_attribute, + ), 'id_product = '.(int)$id_product); + $result &= Db::getInstance()->update('product', array( + 'cache_default_attribute' => $id_default_attribute, + ), 'id_product = '.(int)$id_product); return $result; } @@ -2962,7 +2977,7 @@ class ProductCore extends ObjectModel } /** - * Check if there is not a default attribute and create it not + * Check if there is no default attribute and create it if not */ public function checkDefaultAttributes() { diff --git a/controllers/admin/AdminProductsController.php b/controllers/admin/AdminProductsController.php index 8284e3da9..8a26749cb 100644 --- a/controllers/admin/AdminProductsController.php +++ b/controllers/admin/AdminProductsController.php @@ -680,6 +680,7 @@ class AdminProductsControllerCore extends AdminController if (!isset($_POST['attribute_ecotax'])) $_POST['attribute_ecotax'] = 0; if (Tools::getValue('attribute_default')) $product->deleteDefaultAttributes(); + // Change existing one if (($id_product_attribute = (int)Tools::getValue('id_product_attribute')) || ($id_product_attribute = $product->productAttributeExists(Tools::getValue('attribute_combination_list'), false, null, true, true))) { @@ -703,11 +704,10 @@ class AdminProductsControllerCore extends AdminController Tools::getValue('attribute_location'), Tools::getValue('attribute_upc'), $this->isProductFieldUpdated('attribute_minimal_quantity') ? Tools::getValue('attribute_minimal_quantity') : null, - $this->isProductFieldUpdated('available_date_attribute') ? Tools::getValue('available_date_attribute') : null, - false); + $this->isProductFieldUpdated('available_date_attribute') ? Tools::getValue('available_date_attribute') : null, false); StockAvailable::setProductDependsOnStock((int)$product->id, $product->depends_on_stock, null, (int)$id_product_attribute); StockAvailable::setProductOutOfStock((int)$product->id, $product->out_of_stock, null, (int)$id_product_attribute); - } + } } else $this->errors[] = Tools::displayError('You do not have permission to add here.'); @@ -749,11 +749,14 @@ class AdminProductsControllerCore extends AdminController $combination = new Combination((int)$id_product_attribute); $combination->setAttributes(Tools::getValue('attribute_combination_list')); $product->checkDefaultAttributes(); - } - if (!count($this->errors)) - { - if (!$product->cache_default_attribute) - Product::updateDefaultAttribute($product->id); + if (Tools::getValue('attribute_default')) + { + Product::updateDefaultAttribute((int)$product->id); + if(isset($id_product_attribute)) + $product->cache_default_attribute = (int)$id_product_attribute; + if ($available_date = Tools::getValue('available_date_attribute')) + $product->setAvailableDate($available_date); + } } } } @@ -1958,10 +1961,10 @@ class AdminProductsControllerCore extends AdminController public function updateDownloadProduct($product, $edit = 0) { $is_virtual_file = (int)Tools::getValue('is_virtual_file'); - $product->setDefaultAttribute(0);//reset cache_default_attribute // add or update a virtual product if (Tools::getValue('is_virtual_good') == 'true') { + $product->setDefaultAttribute(0);//reset cache_default_attribute if (Tools::getValue('virtual_product_expiration_date') && !Validate::isDate(Tools::getValue('virtual_product_expiration_date') && !empty($is_virtual_file))) { if (!Tools::getValue('virtual_product_expiration_date')) @@ -3547,7 +3550,7 @@ class AdminProductsControllerCore extends AdminController $data->assign('reasons', $reasons = StockMvtReason::getStockMvtReasons($this->context->language->id)); $data->assign('ps_stock_mvt_reason_default', $ps_stock_mvt_reason_default = Configuration::get('PS_STOCK_MVT_REASON_DEFAULT')); $data->assign('minimal_quantity', $this->getFieldValue($product, 'minimal_quantity') ? $this->getFieldValue($product, 'minimal_quantity') : 1); - $data->assign('available_date', ($this->getFieldValue($product, 'available_date') != 0) ? stripslashes(htmlentities(Tools::displayDate($this->getFieldValue($product, 'available_date'), $this->context->language->id))) : '0000-00-00'); + $data->assign('available_date', ($this->getFieldValue($product, 'available_date') != 0) ? stripslashes(htmlentities($this->getFieldValue($product, 'available_date'), $this->context->language->id)) : '0000-00-00'); $i = 0; $data->assign('imageType', ImageType::getByNameNType('small_default', 'products')); @@ -4126,10 +4129,10 @@ class AdminProductsControllerCore extends AdminController public function updatePackItems($product) { Pack::deleteItems($product->id); - $product->setDefaultAttribute(0);//reset cache_default_attribute // lines format: QTY x ID-QTY x ID if (Tools::getValue('type_product') == Product::PTYPE_PACK) { + $product->setDefaultAttribute(0);//reset cache_default_attribute $items = Tools::getValue('inputPackItems'); $lines = array_unique(explode('-', $items)); // lines is an array of string with format : QTYxID diff --git a/controllers/front/ProductController.php b/controllers/front/ProductController.php index 0226d93f0..f5d9db5fd 100644 --- a/controllers/front/ProductController.php +++ b/controllers/front/ProductController.php @@ -407,10 +407,6 @@ class ProductControllerCore extends FrontController $groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] = 0; $groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] += (int)$row['quantity']; - if ($row['available_date'] != '0000-00-00 00:00:00' && $row['available_date'] != '0000-00-00') - $available_date = Tools::displayDate($row['available_date'], $this->context->language->id); - else - $available_date = $row['available_date']; $combinations[$row['id_product_attribute']]['attributes_values'][$row['id_attribute_group']] = $row['attribute_name']; $combinations[$row['id_product_attribute']]['attributes'][] = (int)$row['id_attribute']; @@ -429,7 +425,10 @@ class ProductControllerCore extends FrontController $combinations[$row['id_product_attribute']]['reference'] = $row['reference']; $combinations[$row['id_product_attribute']]['unit_impact'] = $row['unit_price_impact']; $combinations[$row['id_product_attribute']]['minimal_quantity'] = $row['minimal_quantity']; - $combinations[$row['id_product_attribute']]['available_date'] = $available_date; + if ($row['available_date'] != '0000-00-00') + $combinations[$row['id_product_attribute']]['available_date'] = $row['available_date']; + else + $combinations[$row['id_product_attribute']]['available_date'] = ''; if (isset($combination_images[$row['id_product_attribute']][0]['id_image'])) $combinations[$row['id_product_attribute']]['id_image'] = $combination_images[$row['id_product_attribute']][0]['id_image']; diff --git a/themes/default/css/product.css b/themes/default/css/product.css index f32a136b0..b02f2f6ea 100644 --- a/themes/default/css/product.css +++ b/themes/default/css/product.css @@ -240,7 +240,7 @@ span.view_scroll_spacer { } #availability_statut span#availability_label, -#availability_statut span#availability_date_label { +#availability_date_label { display:inline-block; width:125px; font-weight:700; diff --git a/themes/default/js/product.js b/themes/default/js/product.js index 8cef9446a..09b254fb1 100644 --- a/themes/default/js/product.js +++ b/themes/default/js/product.js @@ -44,7 +44,7 @@ function oosHookJsCode() for (var i = 0; i < oosHookJsCodeFunctions.length; i++) { if (function_exists(oosHookJsCodeFunctions[i])) - setTimeout(oosHookJsCodeFunctions[i]+'()', 0); + setTimeout(oosHookJsCodeFunctions[i] + '()', 0); } } @@ -63,6 +63,7 @@ function addCombination(idCombination, arrayOfIdAttributes, quantity, price, eco combination['reference'] = reference; combination['unit_price'] = unit_price; combination['minimal_quantity'] = minimal_quantity; + combination['available_date'] = []; combination['available_date'] = available_date; combination['specific_price'] = []; combination['specific_price'] = combination_specific_price; @@ -88,9 +89,7 @@ function findCombination(firstTime) $.each(combinations[combination]['idsAttributes'], function(key, value) { if (!in_array(value, choice)) - { combinationMatchForm = false; - } }); if (combinationMatchForm) @@ -119,7 +118,7 @@ function findCombination(firstTime) //show the large image in relation to the selected combination if (combinations[combination]['image'] && combinations[combination]['image'] != -1) - displayImage( $('#thumb_'+combinations[combination]['image']).parent() ); + displayImage( $('#thumb_' + combinations[combination]['image']).parent() ); //show discounts values according to the selected combination if (combinations[combination]['idCombination'] && combinations[combination]['idCombination'] > 0) @@ -141,6 +140,8 @@ function findCombination(firstTime) } //this combination doesn't exist (not created in back office) selectedCombination['unavailable'] = true; + if (typeof(selectedCombination['available_date']) != 'undefined') + delete selectedCombination['available_date']; updateDisplay(); } @@ -158,9 +159,7 @@ function updateDisplay() //hide the hook out of stock $('#oosHook').hide(); - //hide availability date - $('#availability_date_label').hide(); - $('#availability_date_value').hide(); + $('#availability_date').fadeOut(); //availability value management if (availableNowValue != '') @@ -172,16 +171,13 @@ function updateDisplay() $('#availability_statut:hidden').show(); } else - { - //hide the availability value $('#availability_statut:visible').hide(); - } //'last quantities' message management if (!allowBuyWhenOutOfStock) { if (quantityAvailable <= maxQuantityToAllowDisplayOfLastQuantityMessage) - $('#last_quantities').show('slow'); + $('#last_quantities').show('slow'); else $('#last_quantities').hide('slow'); } @@ -233,28 +229,27 @@ function updateDisplay() } if(stock_management == 1) $('#availability_statut:hidden').show(); - - //display availability date - if (selectedCombination.length) + + if (typeof(selectedCombination['available_date']) != 'undefined' && selectedCombination['available_date']['date'].length != 0) { - var available_date = selectedCombination['available_date']; - tab_date = available_date.split('-'); - var time_available = new Date(tab_date[2], tab_date[1], tab_date[0]); + var available_date = selectedCombination['available_date']['date']; + var tab_date = available_date.split('-'); + var time_available = new Date(tab_date[0], tab_date[1], tab_date[2]); time_available.setMonth(time_available.getMonth()-1); var now = new Date(); - // date displayed only if time_available - if (now.getTime() < time_available.getTime()) + if (now.getTime() < time_available.getTime() && $('#availability_date_value').text() != selectedCombination['available_date']['date_formatted']) { - $('#availability_date_value').text(selectedCombination['available_date']); - $('#availability_date_label').show(); - $('#availability_date_value').show(); - } - else - { - $('#availability_date_label').hide(); - $('#availability_date_value').hide(); + $('#availability_date').fadeOut('normal', function(){ + $('#availability_date_value').text(selectedCombination['available_date']['date_formatted']); + $(this).fadeIn(); + }); } + else if(now.getTime() < time_available.getTime()) + $('#availability_date').fadeIn(); } + else + $('#availability_date').fadeOut(); + //show the 'add to cart' button ONLY IF it's possible to buy when out of stock AND if it was previously invisible if (allowBuyWhenOutOfStock && !selectedCombination['unavailable'] && productAvailableForOrder == 1) { @@ -451,15 +446,17 @@ function displayDiscounts(combination) { $('#quantityDiscount tbody tr').each(function() { if (($(this).attr('id') != 'quantityDiscount_0') && - ($(this).attr('id') != 'quantityDiscount_'+combination) && + ($(this).attr('id') != 'quantityDiscount_' + combination) && ($(this).attr('id') != 'noQuantityDiscount')) $(this).fadeOut('slow'); }); - if ($('#quantityDiscount_'+combination).length != 0) { - $('#quantityDiscount_'+combination).show(); + if ($('#quantityDiscount_' + combination).length != 0) + { + $('#quantityDiscount_' + combination).show(); $('#noQuantityDiscount').hide(); - } else + } + else $('#noQuantityDiscount').show(); } @@ -491,13 +488,13 @@ function refreshProductImages(id_product_attribute) } if (i > 0) { - var thumb_width = $('#thumbs_list_frame >li').width()+parseInt($('#thumbs_list_frame >li').css('marginRight')); + var thumb_width = $('#thumbs_list_frame >li').width() + parseInt($('#thumbs_list_frame >li').css('marginRight')); $('#thumbs_list_frame').width((parseInt((thumb_width)* i) + 3) + 'px'); // Bug IE6, needs 3 pixels more ? } else { $('#thumbnail_' + idDefaultImage).show(); - displayImage($('#thumbnail_'+ idDefaultImage +' a')); + displayImage($('#thumbnail_' + idDefaultImage + ' a')); } $('#thumbs_list').trigger('goto', 0); serialScrollFixLock('', '', '', '', 0);// SerialScroll Bug on goto 0 ? @@ -576,8 +573,7 @@ $(document).ready(function() 'transitionIn' : 'elastic', 'transitionOut' : 'elastic' }); - - original_url = window.location+''; + original_url = window.location + ''; first_url_check = true; checkUrl(); initLocationChange(); @@ -589,7 +585,7 @@ function saveCustomization() $('#quantityBackup').val($('#quantity_wanted').val()); customAction = $('#customizationForm').attr('action'); $('body select[id^="group_"]').each(function() { - customAction = customAction.replace(new RegExp(this.id + '=\\d+'), this.id +'='+this.value); + customAction = customAction.replace(new RegExp(this.id + '=\\d+'), this.id +'=' + this.value); }); $('#customizationForm').attr('action', customAction); $('#customizationForm').submit(); @@ -600,7 +596,7 @@ function submitPublishProduct(url, redirect, token) var id_product = $('#admin-action-product-id').val(); $.ajaxSetup({async: false}); - $.post(url+'/index.php', { + $.post(url + '/index.php', { action:'publishProduct', id_product: id_product, status: 1, @@ -615,7 +611,6 @@ function submitPublishProduct(url, redirect, token) document.location.href = data; } ); - return true; } @@ -667,17 +662,17 @@ function getProductAttribute() for (var i in attributesCombinations) for (var a in tab_attributes) if (attributesCombinations[i]['id_attribute'] === tab_attributes[a]) - request += '/'+attributesCombinations[i]['group']+'-'+attributesCombinations[i]['attribute']; + request += '/'+attributesCombinations[i]['group'] + '-' + attributesCombinations[i]['attribute']; request = request.replace(request.substring(0, 1), '#/'); - url = window.location+''; + url = window.location + ''; // redirection if (url.indexOf('#') != -1) url = url.substring(0, url.indexOf('#')); // set ipa to the customization form - $('#customizationForm').attr('action', $('#customizationForm').attr('action')+request) - window.location = url+request; + $('#customizationForm').attr('action', $('#customizationForm').attr('action') + request) + window.location = url + request; } function initLocationChange(time) @@ -691,7 +686,7 @@ function checkUrl() if (original_url != window.url || first_url_check) { first_url_check = false; - url = window.location+''; + url = window.location + ''; // if we need to load a specific combination if (url.indexOf('#/') != -1) { @@ -715,17 +710,17 @@ function checkUrl() { count++; // add class 'selected' to the selected color - $('#color_'+attributesCombinations[a]['id_attribute']).addClass('selected'); - $('#color_'+attributesCombinations[a]['id_attribute']).parent().addClass('selected'); - $('input:radio[value='+attributesCombinations[a]['id_attribute']+']').attr('checked', true); - $('input:hidden[name=group_'+attributesCombinations[a]['id_attribute_group']+']').val(attributesCombinations[a]['id_attribute']); - $('select[name=group_'+attributesCombinations[a]['id_attribute_group']+']').val(attributesCombinations[a]['id_attribute']); + $('#color_' + attributesCombinations[a]['id_attribute']).addClass('selected'); + $('#color_' + attributesCombinations[a]['id_attribute']).parent().addClass('selected'); + $('input:radio[value=' + attributesCombinations[a]['id_attribute'] + ']').attr('checked', true); + $('input:hidden[name=group_' + attributesCombinations[a]['id_attribute_group'] + ']').val(attributesCombinations[a]['id_attribute']); + $('select[name=group_' + attributesCombinations[a]['id_attribute_group'] + ']').val(attributesCombinations[a]['id_attribute']); } // find combination if (count >= 0) { findCombination(false); - original_url = window.location+''; + original_url = window.location + ''; } // no combination found = removing attributes from url else diff --git a/themes/default/product.tpl b/themes/default/product.tpl index 604c2dc2f..b87c7bbd2 100644 --- a/themes/default/product.tpl +++ b/themes/default/product.tpl @@ -121,15 +121,19 @@ var doesntExistNoMore = '{l s='This product is no longer in stock' js=1}'; var doesntExistNoMoreBut = '{l s='with those attributes but is available with others.' js=1}'; var uploading_in_progress = '{l s='Uploading in progress, please be patient.' js=1}'; var fieldRequired = '{l s='Please fill in all the required fields before saving your customization.' js=1}'; + {if isset($groups)} // Combinations {foreach from=$combinations key=idCombination item=combination} var specific_price_combination = new Array(); + var available_date = new Array(); specific_price_combination['reduction_percent'] = {if $combination.specific_price AND $combination.specific_price.reduction AND $combination.specific_price.reduction_type == 'percentage'}{$combination.specific_price.reduction*100}{else}0{/if}; specific_price_combination['reduction_price'] = {if $combination.specific_price AND $combination.specific_price.reduction AND $combination.specific_price.reduction_type == 'amount'}{$combination.specific_price.reduction}{else}0{/if}; specific_price_combination['price'] = {if $combination.specific_price AND $combination.specific_price.price}{$combination.specific_price.price}{else}0{/if}; specific_price_combination['reduction_type'] = '{if $combination.specific_price}{$combination.specific_price.reduction_type}{/if}'; - addCombination({$idCombination|intval}, new Array({$combination.list}), {$combination.quantity}, {$combination.price}, {$combination.ecotax}, {$combination.id_image}, '{$combination.reference|addslashes}', {$combination.unit_impact}, {$combination.minimal_quantity}, '{$combination.available_date}', specific_price_combination); + available_date['date'] = '{$combination.available_date}'; + available_date['date_formatted'] = '{dateFormat date=$combination.available_date full=false}'; + addCombination({$idCombination|intval}, new Array({$combination.list}), {$combination.quantity}, {$combination.price}, {$combination.ecotax}, {$combination.id_image}, '{$combination.reference|addslashes}', {$combination.unit_impact}, {$combination.minimal_quantity}, available_date, specific_price_combination); {/foreach} {/if} @@ -337,13 +341,12 @@ var fieldRequired = '{l s='Please fill in all the required fields before saving

quantity <= 0 && !$product->available_later && $allow_oosp) OR ($product->quantity > 0 && !$product->available_now) OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display: none;"{/if}> {l s='Availability:'} - quantity <= 0} class="warning_inline"{/if}>{if $product->quantity <= 0}{if $allow_oosp}{$product->available_later}{else}{l s='This product is no longer in stock'}{/if}{else}{$product->available_now}{/if} - {if $product->quantity <= 0 && isset($product->available_date) && $product->available_date >= $smarty.now|date_format:'%Y-%m-%d'} -
{l s='Availability date:'} - {$product->available_date} - {/if} + quantity <= 0} class="warning_inline"{/if}>{if $product->quantity <= 0}{if $allow_oosp}{$product->available_later}{else}{l s='This product is no longer in stock'}{/if}{else}{$product->available_now}{/if} +

+

quantity > 0) OR !$product->available_for_order OR $PS_CATALOG_MODE OR !isset($product->available_date) OR $product->available_date < $smarty.now|date_format:'%Y-%m-%d'} style="display: none;"{/if}> + {l s='Availability date:'} + {dateFormat date=$product->available_date full=false}

- {if ($display_qties == 1 && !$PS_CATALOG_MODE && $product->available_for_order)}

quantity <= 0} style="display: none;"{/if}>