diff --git a/admin-dev/themes/default/template/controllers/products/quantities.tpl b/admin-dev/themes/default/template/controllers/products/quantities.tpl index 1fce35216..852c15a66 100644 --- a/admin-dev/themes/default/template/controllers/products/quantities.tpl +++ b/admin-dev/themes/default/template/controllers/products/quantities.tpl @@ -26,6 +26,7 @@ {if isset($product->id)}

{l s='Available quantities for sale'}

+ {include file="controllers/products/multishop/check_fields.tpl" product_tab="Quantities"}

{l s='This interface allows you to manage the available quantities for sale of the current product and its combinations on the current shop.'}

@@ -206,8 +207,11 @@ {/if} - - + + {include file="controllers/products/multishop/checkbox.tpl" field="available_now" type="default" multilang="true"} + + + {include file="controllers/products/input_text_lang.tpl" languages=$languages input_value=$product->available_now @@ -216,8 +220,11 @@ - - + + {include file="controllers/products/multishop/checkbox.tpl" field="available_later" type="default" multilang="true"} + + + {include file="controllers/products/input_text_lang.tpl" languages=$languages input_value=$product->available_later diff --git a/classes/Address.php b/classes/Address.php index bd2daea0e..616b44dac 100644 --- a/classes/Address.php +++ b/classes/Address.php @@ -337,12 +337,6 @@ class AddressCore extends ObjectModel */ public static function initialize($id_address = null) { - // set the default address - $address = new Address(); - $address->id_country = (int)Context::getContext()->country->id; - $address->id_state = 0; - $address->postcode = 0; - // if an id_address has been specified retrieve the address if ($id_address) { @@ -351,6 +345,14 @@ class AddressCore extends ObjectModel if (!Validate::isLoadedObject($address)) throw new PrestaShopException('Invalid address'); } + else + { + // set the default address + $address = new Address(); + $address->id_country = (int)Context::getContext()->country->id; + $address->id_state = 0; + $address->postcode = 0; + } return $address; } diff --git a/classes/Cart.php b/classes/Cart.php index 11641a80f..c821ffe58 100644 --- a/classes/Cart.php +++ b/classes/Cart.php @@ -1509,9 +1509,8 @@ class CartCore extends ObjectModel // If the cart rule offers a reduction, the amount is prorated (with the products in the package) if ($cart_rule['obj']->reduction_percent > 0 || $cart_rule['obj']->reduction_amount > 0) - { $order_total_discount += Tools::ps_round($cart_rule['obj']->getContextualValue($with_taxes, $virtual_context, CartRule::FILTER_ACTION_REDUCTION, $package, $use_cache), 2); - } + } $order_total_discount = min(Tools::ps_round($order_total_discount, 2), $wrapping_fees + $order_total_products + $shipping_fees); @@ -2600,7 +2599,10 @@ class CartCore extends ObjectModel // Select carrier tax if ($use_tax && !Tax::excludeTaxeOption()) - $carrier_tax = $carrier->getTaxesRate(new Address((int)$address_id)); + { + $address = Address::initialize((int)$address_id); + $carrier_tax = $carrier->getTaxesRate($address); + } $configuration = Configuration::getMultiple(array( 'PS_SHIPPING_FREE_PRICE', diff --git a/classes/Hook.php b/classes/Hook.php index eb5e76f21..54892a996 100644 --- a/classes/Hook.php +++ b/classes/Hook.php @@ -418,7 +418,7 @@ class HookCore extends ObjectModel else if ($hook_retro_callable) $display = $moduleInstance->{'hook'.$retro_hook_name}($hook_args); // Live edit - if ($array_return && $array['live_edit'] && Tools::isSubmit('live_edit') && Tools::getValue('ad') && Tools::getValue('liveToken') == Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee'))) + if (!$array_return && $array['live_edit'] && Tools::isSubmit('live_edit') && Tools::getValue('ad') && Tools::getValue('liveToken') == Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee'))) { $live_edit = true; $output .= self::wrapLiveEdit($display, $moduleInstance, $array['id_hook']); diff --git a/classes/PaymentModule.php b/classes/PaymentModule.php index 95cefa218..86b505d69 100644 --- a/classes/PaymentModule.php +++ b/classes/PaymentModule.php @@ -186,7 +186,7 @@ abstract class PaymentModuleCore extends Module foreach ($data['package_list'] as $id_package) { // Rewrite the id_warehouse - $package_list[$id_address][$id_package]['id_warehouse'] = $this->context->cart->getPackageIdWarehouse($package_list[$id_address][$id_package], (int)$id_carrier); + $package_list[$id_address][$id_package]['id_warehouse'] = (int)$this->context->cart->getPackageIdWarehouse($package_list[$id_address][$id_package], (int)$id_carrier); $package_list[$id_address][$id_package]['id_carrier'] = $id_carrier; } // Make sure CarRule caches are empty diff --git a/classes/controller/FrontController.php b/classes/controller/FrontController.php index bd1d3feab..61959314e 100755 --- a/classes/controller/FrontController.php +++ b/classes/controller/FrontController.php @@ -252,12 +252,6 @@ class FrontControllerCore extends Controller CartRule::autoAddToCart($this->context); } - $locale = strtolower(Configuration::get('PS_LOCALE_LANGUAGE')).'_'.strtoupper(Configuration::get('PS_LOCALE_COUNTRY').'.UTF-8'); - setlocale(LC_COLLATE, $locale); - setlocale(LC_CTYPE, $locale); - setlocale(LC_TIME, $locale); - setlocale(LC_NUMERIC, 'en_US.UTF-8'); - /* get page name to display it in body id */ // Are we in a payment module @@ -402,10 +396,8 @@ class FrontControllerCore extends Controller if ($this->restrictedCountry) $this->displayRestrictedCountryPage(); - //live edit - if (Tools::isSubmit('live_edit') && ($ad = Tools::getValue('ad')) && Tools::getValue('liveToken') == Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee'))) - if (!is_dir(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.$ad)) - die(Tools::displayError()); + if (Tools::isSubmit('live_edit') && !$this->checkLiveEditAccess()) + die(Tools::displayError()); $this->iso = $iso; $this->setMedia(); @@ -413,7 +405,7 @@ class FrontControllerCore extends Controller $this->context->cart = $cart; $this->context->currency = $currency; } - + public function postProcess() { /*// For retrocompatibility with versions before 1.5, preProcess support will be removed on next release @@ -549,23 +541,24 @@ class FrontControllerCore extends Controller 'display_header' => $this->display_header, 'display_footer' => $this->display_footer, )); - + + $live_edit_content = ''; // Don't use live edit if on mobile device - if ($this->context->getMobileDevice() == false && Tools::isSubmit('live_edit')) - $this->context->smarty->assign('live_edit', $this->getLiveEditFooter()); - + if (!$this->context->getMobileDevice() && $this->checkLiveEditAccess()) + $live_edit_content = $this->getLiveEditFooter(); + $layout = $this->getLayout(); if ($layout) { if ($this->template) - $this->context->smarty->assign('template', $this->context->smarty->fetch($this->template)); + $this->context->smarty->assign('template', $this->context->smarty->fetch($this->template).$live_edit_content); else // For retrocompatibility with 1.4 controller { ob_start(); $this->displayContent(); $template = ob_get_contents(); ob_clean(); - $this->context->smarty->assign('template', $template); + $this->context->smarty->assign('template', $template.$live_edit_content); } $this->smartyOutputContent($layout); } @@ -583,16 +576,9 @@ class FrontControllerCore extends Controller if ($this->display_footer) $this->smartyOutputContent(_PS_THEME_DIR_.'footer.tpl'); - - // live edit - if (Tools::isSubmit('live_edit') && ($ad = Tools::getValue('ad')) && Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee'))) - { - $this->context->smarty->assign(array('ad' => $ad, 'live_edit' => true)); - $this->smartyOutputContent(_PS_ALL_THEMES_DIR_.'live_edit.tpl'); - } // END - 1.4 retrocompatibility - will be removed in 1.6 } - + return true; } @@ -799,16 +785,21 @@ class FrontControllerCore extends Controller )); } - + + public function checkLiveEditAccess() + { + $live_token = Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee')); + $ad = Tools::getValue('ad'); + return Tools::isSubmit('live_edit') && $ad && Tools::getValue('liveToken') == $live_token && is_dir(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.$ad); + } + public function getLiveEditFooter() { - if (Tools::isSubmit('live_edit') - && ($ad = Tools::getValue('ad')) - && Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee'))) + if ($this->checkLiveEditAccess()) { $data = $this->context->smarty->createData(); $data->assign(array( - 'ad' => $ad, + 'ad' => Tools::getValue('ad'), 'live_edit' => true, 'hook_list' => Hook::$executed_hooks, 'id_shop' => $this->context->shop->id @@ -1144,12 +1135,12 @@ class FrontControllerCore extends Controller * @return array */ public function initLogoAndFavicon() - { - return array( - 'favicon_url' => _PS_IMG_.Configuration::get('PS_FAVICON'), + { + return array( + 'favicon_url' => _PS_IMG_.Configuration::get('PS_FAVICON'), 'logo_image_width' => ($this->context->getMobileDevice() == false ? Configuration::get('SHOP_LOGO_WIDTH') : Configuration::get('SHOP_LOGO_MOBILE_WIDTH')), 'logo_image_height' => ($this->context->getMobileDevice() == false ? Configuration::get('SHOP_LOGO_HEIGHT') : Configuration::get('SHOP_LOGO_MOBILE_HEIGHT')), 'logo_url' => ($this->context->getMobileDevice() == false ? _PS_IMG_.Configuration::get('PS_LOGO').'?'.Configuration::get('PS_IMG_UPDATE_TIME') : _PS_IMG_.Configuration::get('PS_LOGO_MOBILE').'?'.Configuration::get('PS_IMG_UPDATE_TIME')) ); - } + } } diff --git a/classes/webservice/WebserviceSpecificManagementImages.php b/classes/webservice/WebserviceSpecificManagementImages.php index 7901617bc..96a9bc63d 100755 --- a/classes/webservice/WebserviceSpecificManagementImages.php +++ b/classes/webservice/WebserviceSpecificManagementImages.php @@ -323,7 +323,7 @@ class WebserviceSpecificManagementImagesCore implements WebserviceSpecificManage // Set the image path on display in relation to the header image case 'header': if (in_array($this->wsObject->method, array('GET','HEAD','PUT'))) - $path = _PS_IMG_DIR_.'logo.jpg'; + $path = _PS_IMG_DIR_.Configuration::get('PS_LOGO'); else throw new WebserviceException('This method is not allowed with general image resources.', array(49, 405)); break; @@ -387,7 +387,7 @@ class WebserviceSpecificManagementImagesCore implements WebserviceSpecificManage { case 'GET': case 'HEAD': - $this->imgToDisplay = ($path != '' && file_exists($path)) ? $path : $alternative_path; + $this->imgToDisplay = ($path != '' && file_exists($path) && is_file($path)) ? $path : $alternative_path; return true; break; case 'PUT': diff --git a/config/config.inc.php b/config/config.inc.php index 568a8f90a..fb9e98a74 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -107,6 +107,13 @@ Context::getContext()->country = $defaultCountry; /* It is not safe to rely on the system's timezone settings, and this would generate a PHP Strict Standards notice. */ @date_default_timezone_set(Configuration::get('PS_TIMEZONE')); +/* Set locales */ +$locale = strtolower(Configuration::get('PS_LOCALE_LANGUAGE')).'_'.strtoupper(Configuration::get('PS_LOCALE_COUNTRY').'.UTF-8'); +setlocale(LC_COLLATE, $locale); +setlocale(LC_CTYPE, $locale); +setlocale(LC_TIME, $locale); +setlocale(LC_NUMERIC, 'en_US.UTF-8'); + /* Instantiate cookie */ @@ -122,7 +129,7 @@ else else { $domains = null; - if(Context::getContext()->shop->domain != Context::getContext()->shop->domain_ssl) + if (Context::getContext()->shop->domain != Context::getContext()->shop->domain_ssl) $domains = array(Context::getContext()->shop->domain_ssl, Context::getContext()->shop->domain); $cookie = new Cookie('ps-s'.Context::getContext()->shop->id, '', $cookie_lifetime, $domains); @@ -153,7 +160,7 @@ else { $customer = new Customer(); - // Change the default group + // Change the default group if (Group::isFeatureActive()) $customer->id_default_group = Configuration::get('PS_UNIDENTIFIED_GROUP'); } diff --git a/controllers/admin/AdminEmailsController.php b/controllers/admin/AdminEmailsController.php index 8fcbbaddf..20b5affd3 100644 --- a/controllers/admin/AdminEmailsController.php +++ b/controllers/admin/AdminEmailsController.php @@ -202,7 +202,7 @@ class AdminEmailsControllerCore extends AdminController if (isset($_POST['PS_SHOP_EMAIL'])) $_POST['PS_SHOP_EMAIL'] = Configuration::get('PS_SHOP_EMAIL'); - if ($_POST['PS_MAIL_METHOD'] == 2 && (empty($_POST['PS_MAIL_SERVER']) || empty($_POST['PS_MAIL_SMTP_PORT']))) + if (isset($_POST['PS_MAIL_METHOD']) && $_POST['PS_MAIL_METHOD'] == 2 && (empty($_POST['PS_MAIL_SERVER']) || empty($_POST['PS_MAIL_SMTP_PORT']))) $this->errors[] = Tools::displayError('You must define an SMTP server and an SMTP port. If you do not know, use the PHP mail() function instead.'); } diff --git a/controllers/admin/AdminHomeController.php b/controllers/admin/AdminHomeController.php index dee062dfb..dc38db107 100644 --- a/controllers/admin/AdminHomeController.php +++ b/controllers/admin/AdminHomeController.php @@ -95,7 +95,6 @@ class AdminHomeControllerCore extends AdminController $opti_list = array(); if ($rewrite + $htaccessOptimized + $smartyOptimized + $cccOptimized + $shopEnabled + $htaccessAfterUpdate + $indexRebuiltAfterUpdate != 14) { - $this->context->smarty->assign('hide_tips', Configuration::get('PS_HIDE_OPTIMIZATION_TIPS')); $opti_list[] = array( 'title' => $this->l('URL rewriting'), 'href' => $link->getAdminLink('AdminMeta'), @@ -145,8 +144,12 @@ class AdminHomeControllerCore extends AdminController 'image' => $lights[$htaccessAfterUpdate]['image'], ); } - $this->context->smarty->assign('opti_list', $opti_list); - $this->context->smarty->assign('content', $content); + $this->context->smarty->assign(array( + 'opti_list' => $opti_list, + 'content' => $content, + 'hide_tips' => Configuration::get('PS_HIDE_OPTIMIZATION_TIPS')) + ); + $template = $this->createTemplate('optimizationTips.tpl'); return $template->fetch(); } diff --git a/controllers/admin/AdminModulesController.php b/controllers/admin/AdminModulesController.php index 400c5176c..354d01a04 100644 --- a/controllers/admin/AdminModulesController.php +++ b/controllers/admin/AdminModulesController.php @@ -462,6 +462,7 @@ class AdminModulesControllerCore extends AdminController } else $this->errors[] = Tools::displayError('Cannot load module object'); + $this->errors = array_merge($this->errors, $module->getErrors()); } else $this->errors[] = Tools::displayError('You do not have permission to add here.'); @@ -688,6 +689,7 @@ class AdminModulesControllerCore extends AdminController } elseif ($echo === false) $module_errors[] = array('name' => $name, 'message' => $module->getErrors()); + if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_ALL && isset(Context::getContext()->tmpOldShop)) { Context::getContext()->shop = clone(Context::getContext()->tmpOldShop); diff --git a/controllers/admin/AdminProductsController.php b/controllers/admin/AdminProductsController.php index 651987711..f826f226d 100644 --- a/controllers/admin/AdminProductsController.php +++ b/controllers/admin/AdminProductsController.php @@ -536,13 +536,17 @@ class AdminProductsControllerCore extends AdminController $this->errors[] = Tools::displayError('You cannot delete the product because there is physical stock left or supply orders in progress.'); } - if ($object->delete()) + if (!count($this->errors)) { - $id_category = (int)Tools::getValue('id_category'); - $category_url = empty($id_category) ? '' : '&id_category='.(int)$id_category; - $this->redirect_after = self::$currentIndex.'&conf=1&token='.$this->token.$category_url; + if ($object->delete()) + { + $id_category = (int)Tools::getValue('id_category'); + $category_url = empty($id_category) ? '' : '&id_category='.(int)$id_category; + $this->redirect_after = self::$currentIndex.'&conf=1&token='.$this->token.$category_url; + } + else + $this->errors[] = Tools::displayError('An error occurred during deletion.'); } - $this->errors[] = Tools::displayError('An error occurred during deletion.'); } } else @@ -632,10 +636,8 @@ class AdminProductsControllerCore extends AdminController $real_quantity = $stock_manager->getProductRealQuantities($product->id, 0); if ($physical_quantity > 0 || $real_quantity > $physical_quantity) $this->errors[] = sprintf(Tools::displayError('You cannot delete the product #%d because there is physical stock left or supply orders in progress.'), $product->id); - else - $success &= $product->delete(); } - else + if (!count($this->errors)) $success &= $product->delete(); } } diff --git a/controllers/front/AddressController.php b/controllers/front/AddressController.php index d3abd9ddb..67c73f54d 100644 --- a/controllers/front/AddressController.php +++ b/controllers/front/AddressController.php @@ -256,7 +256,7 @@ class AddressControllerCore extends FrontController // Assign common vars $this->context->smarty->assign(array( - 'onr_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), + 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), 'ajaxurl' => _MODULE_DIR_, 'errors' => $this->errors, 'token' => Tools::getToken(false), diff --git a/controllers/front/AuthController.php b/controllers/front/AuthController.php index 92859d12c..5776a4f01 100644 --- a/controllers/front/AuthController.php +++ b/controllers/front/AuthController.php @@ -166,7 +166,7 @@ class AuthControllerCore extends FrontController $days = Tools::dateDays(); $this->context->smarty->assign(array( - 'onr_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), + 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), 'years' => $years, 'sl_year' => (isset($selectedYears) ? $selectedYears : 0), 'months' => $months, diff --git a/js/admin-products.js b/js/admin-products.js index 01af4d0a5..997e8c776 100644 --- a/js/admin-products.js +++ b/js/admin-products.js @@ -1226,6 +1226,8 @@ product_tabs['Quantities'] = new function(){ self.refreshQtyAvailabilityForm(); self.ajaxCall({actionQty: 'out_of_stock', value: $(this).val()}); }); + if (display_multishop_checkboxes) + ProductMultishop.checkAllQuantities(); self.refreshQtyAvailabilityForm(); }; @@ -1574,6 +1576,15 @@ var ProductMultishop = new function() ProductMultishop.checkField($('input[name=\'multishop_check[link_rewrite]['+v.id_lang+']\']').prop('checked'), 'link_rewrite_'+v.id_lang); }); }; + + this.checkAllQuantities = function() + { + $.each(languages, function(k, v) + { + ProductMultishop.checkField($('input[name=\'multishop_check[available_later]['+v.id_lang+']\']').prop('checked'), 'available_later_'+v.id_lang); + ProductMultishop.checkField($('input[name=\'multishop_check[available_now]['+v.id_lang+']\']').prop('checked'), 'available_now_'+v.id_lang); + }); + }; this.checkAllAssociations = function() { diff --git a/modules/blockcms/blockcms.tpl b/modules/blockcms/blockcms.tpl index 9bfad83b3..67f652903 100755 --- a/modules/blockcms/blockcms.tpl +++ b/modules/blockcms/blockcms.tpl @@ -57,7 +57,7 @@
  • {$cmslink.meta_title|escape:'htmlall':'UTF-8'}
  • {/if} {/foreach} - +
  • {l s='Sitemap' mod='blockcms'}
  • {if $display_poweredby}
  • {l s='Powered by' mod='blockcms'} PrestaShop
  • {/if} {$footer_text} diff --git a/modules/homefeatured/homefeatured.css b/modules/homefeatured/homefeatured.css index 7615787f6..e694feefa 100644 --- a/modules/homefeatured/homefeatured.css +++ b/modules/homefeatured/homefeatured.css @@ -41,9 +41,7 @@ } .ie9 #featured-products_block_center .product_image span.new{top:-18px;right:-38px} -.ie8 #featured-products_block_center .product_image span.new{top:-18px;right:-38px} -.ie8 #featured-products_block_center .product_image span.new {top:-17px;} -.ie7 #featured-products_block_center .product_image span.new {top:-30px;right:-25px} +.ie8 #featured-products_block_center .product_image span.new{top:-21px;right:-38px} .lt-ie6 #featured-products_block_center .product_image span.new {top:-30px;right:-25px} #featured-products_block_center .product_desc {height:45px;} diff --git a/themes/default/address.tpl b/themes/default/address.tpl index 122518bbd..7618fa369 100644 --- a/themes/default/address.tpl +++ b/themes/default/address.tpl @@ -214,7 +214,7 @@ $(function(){ldelim}

    - {if $onr_phone_at_least} + {if $one_phone_at_least}

    {l s='You must register at least one phone number'} *

    {/if}

    diff --git a/themes/default/authentication.tpl b/themes/default/authentication.tpl index 5b2f6a7fc..e87591bbd 100644 --- a/themes/default/authentication.tpl +++ b/themes/default/authentication.tpl @@ -548,7 +548,7 @@ $(function(){ldelim}

    - {if $onr_phone_at_least} + {if $one_phone_at_least}

    {l s='You must register at least one phone number'}

    {/if}

    @@ -556,7 +556,7 @@ $(function(){ldelim}

    - +

    diff --git a/themes/default/css/global.css b/themes/default/css/global.css index e7c5be222..4af41cbfb 100644 --- a/themes/default/css/global.css +++ b/themes/default/css/global.css @@ -2079,3 +2079,5 @@ tr.subitem > td:first-child + td { padding:0; text-align:center } + +.ie7 #featured-products_block_center .product_image span.new {top:-20px;right:-19px} diff --git a/themes/default/header.tpl b/themes/default/header.tpl index 8886c55c9..202e9f615 100644 --- a/themes/default/header.tpl +++ b/themes/default/header.tpl @@ -25,7 +25,7 @@ - + diff --git a/themes/default/mobile/product.tpl b/themes/default/mobile/product.tpl index 47fd5f021..ec1536694 100644 --- a/themes/default/mobile/product.tpl +++ b/themes/default/mobile/product.tpl @@ -72,7 +72,7 @@

    reference}style="display: none;"{/if}>
    - + {$product->reference|escape:'htmlall':'UTF-8'}