\ No newline at end of file
diff --git a/admin-dev/themes/default/template/controllers/stores/helpers/options/options.tpl b/admin-dev/themes/default/template/controllers/stores/helpers/options/options.tpl
index 5fc5f3b05..bac61db89 100644
--- a/admin-dev/themes/default/template/controllers/stores/helpers/options/options.tpl
+++ b/admin-dev/themes/default/template/controllers/stores/helpers/options/options.tpl
@@ -30,9 +30,9 @@
function ajaxStoreStates(id_state_selected)
{
$.ajax({
- url: "ajax.php",
+ url: "index.php",
cache: false,
- data: "ajaxStates=1&id_country="+$('#PS_SHOP_COUNTRY_ID').val() + "&id_state=" + $('#PS_SHOP_STATE_ID').val(),
+ data: "ajax=1&tab=AdminStates&token={getAdminToken tab='AdminStates'}&action=states&id_country="+$('#PS_SHOP_COUNTRY_ID').val() + "&id_state=" + $('#PS_SHOP_STATE_ID').val(),
success: function(html)
{
if (html == 'false')
diff --git a/admin-dev/themes/default/template/controllers/tax_rules/helpers/form/form.tpl b/admin-dev/themes/default/template/controllers/tax_rules/helpers/form/form.tpl
index 9d925f503..a200c2207 100644
--- a/admin-dev/themes/default/template/controllers/tax_rules/helpers/form/form.tpl
+++ b/admin-dev/themes/default/template/controllers/tax_rules/helpers/form/form.tpl
@@ -62,7 +62,7 @@
$.ajax({
url: "index.php",
cache: false,
- data: "ajax=1&tab=AdminTaxRulesGroup&token={getAdminToken tab='AdminStates'}&action=states&id_country="+id_country+"&id_state="+id_state+"&empty_value={l s='All'}",
+ data: "ajax=1&tab=AdminStates&token={getAdminToken tab='AdminStates'}&action=states&id_country="+id_country+"&id_state="+id_state+"&empty_value={l s='All'}",
success: function(html){
if (html == "false")
{
diff --git a/classes/Autoload.php b/classes/Autoload.php
index 11436fda4..585ad858e 100644
--- a/classes/Autoload.php
+++ b/classes/Autoload.php
@@ -139,7 +139,7 @@ class Autoload
$filename_tmp = tempnam(dirname($filename), basename($filename.'.'));
if($filename_tmp !== FALSE and file_put_contents($filename_tmp, $content, LOCK_EX) !== FALSE)
{
- rename($filename_tmp, $filename);
+ @rename($filename_tmp, $filename);
@chmod($filename, 0664);
}
else
diff --git a/classes/CartRule.php b/classes/CartRule.php
index 778865855..10ab17616 100644
--- a/classes/CartRule.php
+++ b/classes/CartRule.php
@@ -464,7 +464,7 @@ class CartRuleCore extends ObjectModel
// Check if the products chosen by the customer are usable with the cart rule
if ($this->product_restriction)
{
- $r = $this->checkProductRestrictions($context, false, $display_error);
+ $r = $this->checkProductRestrictions($context, false, $display_error, $alreadyInCart);
if ($r !== false && $display_error)
return $r;
elseif (!$r && !$display_error)
@@ -523,6 +523,7 @@ class CartRuleCore extends ObjectModel
return (!$display_error) ? false : Tools::displayError('This voucher is already in your cart');
if ($otherCartRule['gift_product'])
--$nb_products;
+
if ($this->cart_rule_restriction && $otherCartRule['cart_rule_restriction'] && $otherCartRule['id_cart_rule'] != $this->id)
{
$combinable = Db::getInstance()->getValue('
@@ -550,7 +551,7 @@ class CartRuleCore extends ObjectModel
return true;
}
- protected function checkProductRestrictions(Context $context, $return_products = false, $display_error = true)
+ protected function checkProductRestrictions(Context $context, $return_products = false, $display_error = true, $alreadyInCart = false)
{
$selectedProducts = array();
@@ -585,6 +586,8 @@ class CartRuleCore extends ObjectModel
if (in_array($cartAttribute['id_attribute'], $productRule['values']))
{
$countMatchingProducts += $cartAttribute['quantity'];
+ if ($alreadyInCart && $this->gift_product == $cartProduct['id_product']&& $this->gift_product_attribute == $cartProduct['id_product_attribute'])
+ --$countMatchingProducts;
$matchingProductsList[] = $cartAttribute['id_product'].'-'.$cartAttribute['id_product_attribute'];
}
if ($countMatchingProducts < $productRuleGroup['quantity'])
@@ -603,6 +606,8 @@ class CartRuleCore extends ObjectModel
if (in_array($cartProduct['id_product'], $productRule['values']))
{
$countMatchingProducts += $cartProduct['quantity'];
+ if ($alreadyInCart && $this->gift_product == $cartProduct['id_product'])
+ --$countMatchingProducts;
$matchingProductsList[] = $cartProduct['id_product'].'-0';
}
if ($countMatchingProducts < $productRuleGroup['quantity'])
diff --git a/classes/Image.php b/classes/Image.php
index f2b749bf1..a7ce28b2f 100644
--- a/classes/Image.php
+++ b/classes/Image.php
@@ -120,16 +120,22 @@ class ImageCore extends ObjectModel
*
* @param integer $id_lang Language ID
* @param integer $id_product Product ID
+ * @param integer $id_product_attribute Product Attribute ID
* @return array Images
*/
- public static function getImages($id_lang, $id_product)
+ public static function getImages($id_lang, $id_product, $id_product_attribute = NULL)
{
- return Db::getInstance()->executeS('
- SELECT *
- FROM `'._DB_PREFIX_.'image` i
- LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image`)
- WHERE i.`id_product` = '.(int)$id_product.' AND il.`id_lang` = '.(int)$id_lang.'
- ORDER BY i.`position` ASC');
+ $attribute_filter = ($id_product_attribute ? ' AND ai.`id_product_attribute` = '.(int)$id_product_attribute : '');
+ $sql = 'SELECT *
+ FROM `'._DB_PREFIX_.'image` i
+ LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image`)';
+
+ if ($id_product_attribute)
+ $sql .= ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_image` ai ON (i.`id_image` = ai.`id_image`)';
+
+ $sql .= ' WHERE i.`id_product` = '.(int)$id_product.' AND il.`id_lang` = '.(int)$id_lang . $attribute_filter.'
+ ORDER BY i.`position` ASC';
+ return Db::getInstance()->executeS($sql);
}
/**
@@ -644,7 +650,7 @@ class ImageCore extends ObjectModel
*/
public static function testFileSystem()
{
- $safe_mode = ini_get('safe_mode');
+ $safe_mode = Tools::getSafeModeStatus();
if ($safe_mode)
return false;
$folder1 = _PS_PROD_IMG_DIR_.'testfilesystem/';
diff --git a/classes/Language.php b/classes/Language.php
index 724cbbb9b..8aa65596d 100644
--- a/classes/Language.php
+++ b/classes/Language.php
@@ -111,18 +111,22 @@ class LanguageCore extends ObjectModel
$iso_code = $newIso ? $newIso : $this->iso_code;
if (!file_exists(_PS_TRANSLATIONS_DIR_.$iso_code))
- mkdir(_PS_TRANSLATIONS_DIR_.$iso_code);
+ {
+ if (@mkdir(_PS_TRANSLATIONS_DIR_.$iso_code))
+ @chmod(_PS_TRANSLATIONS_DIR_.$iso_code, 0777);
+ }
+
foreach ($this->translationsFilesAndVars as $file => $var)
{
$path_file = _PS_TRANSLATIONS_DIR_.$iso_code.'/'.$file.'.php';
if (!file_exists($path_file))
if ($file != 'tabs')
- file_put_contents($path_file, '');
else
- file_put_contents($path_file, '');
@@ -460,7 +464,8 @@ class LanguageCore extends ObjectModel
}
closedir($handle);
}
- rmdir($dir);
+ if (is_writable($dir))
+ rmdir($dir);
}
public function delete()
@@ -783,13 +788,22 @@ class LanguageCore extends ObjectModel
$lang_pack_ok = false;
$errors = array();
$file = _PS_TRANSLATIONS_DIR_.$iso.'.gzip';
+
if (!$lang_pack_link = Tools::file_get_contents('http://www.prestashop.com/download/lang_packs/get_language_pack.php?version='.$version.'&iso_lang='.Tools::strtolower($iso)))
$errors[] = Tools::displayError('Archive cannot be downloaded from prestashop.com.');
elseif (!$lang_pack = Tools::jsonDecode($lang_pack_link))
$errors[] = Tools::displayError('Error occurred when language was checked according to your Prestashop version.');
elseif ($content = Tools::file_get_contents('http://translations.prestashop.com/download/lang_packs/gzip/'.$lang_pack->version.'/'.Tools::strtolower($lang_pack->iso_code.'.gzip')))
if (!@file_put_contents($file, $content))
- $errors[] = Tools::displayError('Server does not have permissions for writing.');
+ {
+ if (is_writable(dirname($file)))
+ {
+ @unlink($file);
+ @file_put_contents($file, $content);
+ }
+ elseif (!is_writable($file))
+ $errors[] = Tools::displayError('Server does not have permissions for writing.').' ('.$file.')';
+ }
if (file_exists($file))
{
$gz = new Archive_Tar($file, true);
diff --git a/classes/Logger.php b/classes/Logger.php
index 0bc46bf16..ff7fb994d 100644
--- a/classes/Logger.php
+++ b/classes/Logger.php
@@ -149,6 +149,11 @@ class LoggerCore extends ObjectModel
return $this->hash;
}
+
+ public static function eraseAllLogs()
+ {
+ return Db::getInstance()->execute('TRUNCATE TABLE '._DB_PREFIX_.'log');
+ }
/**
* check if this log message already exists in database.
diff --git a/classes/Manufacturer.php b/classes/Manufacturer.php
index 8cc573bad..c40fa01c8 100644
--- a/classes/Manufacturer.php
+++ b/classes/Manufacturer.php
@@ -79,7 +79,7 @@ class ManufacturerCore extends ObjectModel
// Lang fields
'description' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
- 'short_description' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml', 'size' => 254),
+ 'short_description' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
'meta_title' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
'meta_description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
'meta_keywords' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName'),
diff --git a/classes/Product.php b/classes/Product.php
index 74e65ee20..188ce4a05 100644
--- a/classes/Product.php
+++ b/classes/Product.php
@@ -2914,7 +2914,7 @@ class ProductCore extends ObjectModel
* @param Shop $shop
* @return string
*/
- public static function sqlStock($product_alias, $product_attribute = 0, $inner_join = false, Shop $shop = null)
+ public static function sqlStock($product_alias, $product_attribute = null, $inner_join = false, Shop $shop = null)
{
$id_shop = ($shop !== null ? (int)$shop->id : null);
$sql = (($inner_join) ? ' INNER ' : ' LEFT ').'
diff --git a/classes/Search.php b/classes/Search.php
index f935a934d..c17d8926f 100644
--- a/classes/Search.php
+++ b/classes/Search.php
@@ -140,36 +140,33 @@ class SearchCore
$string = implode(' ', $processed_words);
}
- if ($indexation)
+ // If the language is constituted with symbol and there is no "words", then split every chars
+ if (in_array($iso_code, array('zh', 'tw', 'ja')) && function_exists('mb_strlen'))
{
- // If the language is constituted with symbol and there is no "words", then split every chars
- if (in_array($iso_code, array('zh', 'tw', 'ja')) && function_exists('mb_strlen'))
- {
- // Cut symbols from letters
- $symbols = '';
- $letters = '';
- foreach (explode(' ', $string) as $mb_word)
- if (strlen(Tools::replaceAccentedChars($mb_word)) == mb_strlen(Tools::replaceAccentedChars($mb_word)))
- $letters .= $mb_word.' ';
- else
- $symbols .= $mb_word.' ';
-
- if (preg_match_all('/./u', $symbols, $matches))
- $symbols = implode(' ', $matches[0]);
+ // Cut symbols from letters
+ $symbols = '';
+ $letters = '';
+ foreach (explode(' ', $string) as $mb_word)
+ if (strlen(Tools::replaceAccentedChars($mb_word)) == mb_strlen(Tools::replaceAccentedChars($mb_word)))
+ $letters .= $mb_word.' ';
+ else
+ $symbols .= $mb_word.' ';
+
+ if (preg_match_all('/./u', $symbols, $matches))
+ $symbols = implode(' ', $matches[0]);
- $string = $letters.$symbols;
- }
- else
+ $string = $letters.$symbols;
+ }
+ elseif ($indexation)
+ {
+ $minWordLen = (int)Configuration::get('PS_SEARCH_MINWORDLEN');
+ if ($minWordLen > 1)
{
- $minWordLen = (int)Configuration::get('PS_SEARCH_MINWORDLEN');
- if ($minWordLen > 1)
- {
- $minWordLen -= 1;
- $string = preg_replace('/(?<=\s)[^\s]{1,'.$minWordLen.'}(?=\s)/Su', ' ', $string);
- $string = preg_replace('/^[^\s]{1,'.$minWordLen.'}(?=\s)/Su', '', $string);
- $string = preg_replace('/(?<=\s)[^\s]{1,'.$minWordLen.'}$/Su', '', $string);
- $string = preg_replace('/^[^\s]{1,'.$minWordLen.'}$/Su', '', $string);
- }
+ $minWordLen -= 1;
+ $string = preg_replace('/(?<=\s)[^\s]{1,'.$minWordLen.'}(?=\s)/Su', ' ', $string);
+ $string = preg_replace('/^[^\s]{1,'.$minWordLen.'}(?=\s)/Su', '', $string);
+ $string = preg_replace('/(?<=\s)[^\s]{1,'.$minWordLen.'}$/Su', '', $string);
+ $string = preg_replace('/^[^\s]{1,'.$minWordLen.'}$/Su', '', $string);
}
}
@@ -374,13 +371,13 @@ class SearchCore
$attributes = '';
$attributesArray = $db->executeS('
- SELECT al.name, pa.ean13, pa.reference, pa.upc FROM '._DB_PREFIX_.'product_attribute pa
+ SELECT al.name FROM '._DB_PREFIX_.'product_attribute pa
INNER JOIN '._DB_PREFIX_.'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute
INNER JOIN '._DB_PREFIX_.'attribute_lang al ON (pac.id_attribute = al.id_attribute AND al.id_lang = '.(int)$id_lang.')
'.Shop::addSqlAssociation('product_attribute', 'pa').'
WHERE pa.id_product = '.(int)$id_product);
foreach ($attributesArray as $attribute)
- $attributes .= $attribute['name'].' '.$attribute['ean13'].' '.$attribute['reference'].' '.$attribute['upc'].' ';
+ $attributes .= $attribute['name'].' ';
return $attributes;
}
@@ -702,4 +699,4 @@ class SearchCore
return Product::getProductsProperties((int)$id_lang, $result);
}
-}
+}
\ No newline at end of file
diff --git a/classes/Supplier.php b/classes/Supplier.php
index 7749fb6de..3130913c1 100644
--- a/classes/Supplier.php
+++ b/classes/Supplier.php
@@ -72,7 +72,7 @@ class SupplierCore extends ObjectModel
'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
// Lang fields
- 'description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName'),
+ 'description' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
'meta_title' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
'meta_description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
'meta_keywords' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
diff --git a/classes/Tools.php b/classes/Tools.php
index 22a28c4db..d8ead1538 100644
--- a/classes/Tools.php
+++ b/classes/Tools.php
@@ -2481,89 +2481,66 @@ exit;
return preg_replace('/\\\[px]\{[a-z]\}{1,2}|(\/[a-z]*)u([a-z]*)$/i', "$1$2", $pattern);
}
+ protected static $is_addons_up = true;
public static function addonsRequest($request, $params = array())
{
- $addons_url = 'api.addons.prestashop.com';
- $postData = '';
- $postDataArray = array(
+ if (!self::$is_addons_up)
+ return false;
+
+ $postData = http_build_query(array(
'version' => isset($params['version']) ? $params['version'] : _PS_VERSION_,
'iso_lang' => Tools::strtolower(isset($params['iso_lang']) ? $params['iso_lang'] : Context::getContext()->language->iso_code),
'iso_code' => Tools::strtolower(isset($params['iso_country']) ? $params['iso_country'] : Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT'))),
- 'shop_url' => urlencode(isset($params['shop_url']) ? $params['shop_url'] : Tools::getShopDomain()),
- 'mail' => urlencode(isset($params['email']) ? $params['email'] : Configuration::get('email'))
- );
- foreach ($postDataArray as $postDataKey => $postDataValue)
- $postData .= '&'.$postDataKey.'='.$postDataValue;
- $postData = ltrim($postData, '&');
+ 'shop_url' => isset($params['shop_url']) ? $params['shop_url'] : Tools::getShopDomain(),
+ 'mail' => isset($params['email']) ? $params['email'] : Configuration::get('email')
+ ));
- // Config for each request
- if ($request == 'native')
+ $protocols = array('https');
+ switch ($request)
{
- // Define protocol accepted and post data values for this request
- $protocolsList = array('https://' => 443, 'http://' => 80);
- $postData .= '&method=listing&action=native';
- }
- if ($request == 'must-have')
- {
- // Define protocol accepted and post data values for this request
- $protocolsList = array('https://' => 443, 'http://' => 80);
- $postData .= '&method=listing&action=must-have';
- }
- if ($request == 'customer')
- {
- // Define protocol accepted and post data values for this request
- $protocolsList = array('https://' => 443);
- $postData .= '&method=listing&action=customer&username='.urlencode(trim(Context::getContext()->cookie->username_addons)).'&password='.urlencode(trim(Context::getContext()->cookie->password_addons));
- }
- if ($request == 'check_customer')
- {
- // Define protocol accepted and post data values for this request
- $protocolsList = array('https://' => 443);
- $postData .= '&method=check_customer&username='.urlencode($params['username_addons']).'&password='.urlencode($params['password_addons']);
- }
- if ($request == 'module')
- {
- // Define protocol accepted and post data values for this request
- if (isset($params['username_addons']) && isset($params['password_addons']))
- {
- $protocolsList = array('https://' => 443);
- $postData .= '&method=module&id_module='.urlencode($params['id_module']).'&username='.urlencode($params['username_addons']).'&password='.urlencode($params['password_addons']);
- }
- else
- {
- $protocolsList = array('https://' => 443, 'http://' => 80);
+ case 'native':
+ $protocols[] = 'http';
+ $postData .= '&method=listing&action=native';
+ break;
+ case 'must-have':
+ $protocols[] = 'http';
+ $postData .= '&method=listing&action=must-have';
+ break;
+ case 'customer':
+ $postData .= '&method=listing&action=customer&username='.urlencode(trim(Context::getContext()->cookie->username_addons)).'&password='.urlencode(trim(Context::getContext()->cookie->password_addons));
+ break;
+ case 'check_customer':
+ $postData .= '&method=check_customer&username='.urlencode($params['username_addons']).'&password='.urlencode($params['password_addons']);
+ break;
+ case 'module':
$postData .= '&method=module&id_module='.urlencode($params['id_module']);
- }
- }
-
- if ($request == 'install-modules')
- {
- // Define protocol accepted and post data values for this request
- $protocolsList = array('https://' => 443, 'http://' => 80);
- $postData .= '&method=listing&action=install-modules';
-
+ if (isset($params['username_addons']) && isset($params['password_addons']))
+ $postData .= '&username='.urlencode($params['username_addons']).'&password='.urlencode($params['password_addons']);
+ else
+ $protocols[] = 'http';
+
+ break;
+ case 'install-modules':
+ $protocols[] = 'http';
+ $postData .= '&method=listing&action=install-modules';
+ break;
+ default:
+ return false;
}
- // Make the request
- $opts = array(
- 'http'=>array(
+ $context = stream_context_create(array(
+ 'http' => array(
'method'=> 'POST',
'content' => $postData,
'header' => 'Content-type: application/x-www-form-urlencoded',
'timeout' => 5,
)
- );
- $context = stream_context_create($opts);
- foreach ($protocolsList as $protocol => $port)
- {
- $content = Tools::file_get_contents($protocol.$addons_url, false, $context);
-
- // If content returned, we cache it
- if ($content)
+ ));
+ foreach ($protocols as $protocol)
+ if ($content = Tools::file_get_contents($protocol.'://api.addons.prestashop.com', false, $context))
return $content;
- }
- // No content, return false
+ self::$is_addons_up = false;
return false;
}
diff --git a/classes/cache/CacheApc.php b/classes/cache/CacheApc.php
index e32c04ad6..275bc8f4b 100644
--- a/classes/cache/CacheApc.php
+++ b/classes/cache/CacheApc.php
@@ -34,9 +34,12 @@ class CacheApcCore extends Cache
public function __construct()
{
$this->keys = array();
- $cache_info = apc_cache_info('user');
+ $cache_info = apc_cache_info((extension_loaded('apcu') === true )? '' : 'user' );
foreach ($cache_info['cache_list'] as $entry)
- $this->keys[$entry['info']] = $entry['ttl'];
+ if ( extension_loaded('apcu') === true )
+ $this->keys[$entry['key']] = $entry['ttl'];
+ else
+ $this->keys[$entry['info']] = $entry['ttl'];
}
/**
diff --git a/classes/cache/CacheMemcache.php b/classes/cache/CacheMemcache.php
index 046d40529..8c4445a7f 100755
--- a/classes/cache/CacheMemcache.php
+++ b/classes/cache/CacheMemcache.php
@@ -49,7 +49,7 @@ class CacheMemcacheCore extends Cache
if(is_array($servers) && count($servers) > 0)
{
- $this->keys = $this->memcache->get(_COOKIE_IV_);
+ $this->keys = @$this->memcache->get(_COOKIE_IV_);
if (!is_array($this->keys))
$this->keys = array();
}
diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php
index 0508ecaab..82465abf0 100644
--- a/classes/controller/AdminController.php
+++ b/classes/controller/AdminController.php
@@ -726,6 +726,8 @@ class AdminControllerCore extends Controller
*/
public function processAdd()
{
+ if (!isset($this->className) || empty($this->className))
+ return false;
/* Checking fields validity */
$this->validateRules();
if (count($this->errors) <= 0)
@@ -1142,6 +1144,8 @@ class AdminControllerCore extends Controller
*/
protected function loadObject($opt = false)
{
+ if (!isset($this->className) || empty($this->className))
+ return true;
$id = (int)Tools::getValue($this->identifier);
if ($id && Validate::isUnsignedId($id))
{
@@ -1535,21 +1539,23 @@ class AdminControllerCore extends Controller
protected function addToolBarModulesListButton()
{
-
if (!$this->isFresh(Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, 86400))
file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, Tools::addonsRequest('native'));
- $country_module_list_xml = simplexml_load_file(_PS_ROOT_DIR_.Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST);
- $country_module_list = array();
+ $country_module_list = file_get_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST);
+ if (!empty($country_module_list) && $country_module_list_xml = simplexml_load_string($country_module_list))
+ {
+ $country_module_list_array = array();
foreach ($country_module_list_xml->module as $k => $m)
- $country_module_list[] = (string)$m->name;
- $this->tab_modules_list['slider_list'] = array_intersect($this->tab_modules_list['slider_list'], $country_module_list);
+ $country_module_list_array[] = (string)$m->name;
+ $this->tab_modules_list['slider_list'] = array_intersect($this->tab_modules_list['slider_list'], $country_module_list_array);
+ }
if (is_array($this->tab_modules_list['slider_list']) && count($this->tab_modules_list['slider_list']))
$this->toolbar_btn['modules-list'] = array(
- 'href' => '#',
- 'desc' => $this->l('Modules List')
- );
+ 'href' => '#',
+ 'desc' => $this->l('Modules List')
+ );
}
/**
@@ -2400,7 +2406,7 @@ class AdminControllerCore extends Controller
public function getFieldValue($obj, $key, $id_lang = null)
{
if ($id_lang)
- $default_value = ($obj->id && isset($obj->{$key}[$id_lang])) ? $obj->{$key}[$id_lang] : false;
+ $default_value = (isset($obj->id) && $obj->id && isset($obj->{$key}[$id_lang])) ? $obj->{$key}[$id_lang] : false;
else
$default_value = isset($obj->{$key}) ? $obj->{$key} : false;
@@ -2939,21 +2945,17 @@ class AdminControllerCore extends Controller
public function isFresh($file, $timeout = 604800000)
{
- if (file_exists(_PS_ROOT_DIR_.$file))
- {
- if (filesize(_PS_ROOT_DIR_.$file) < 1)
- return false;
+ if (file_exists(_PS_ROOT_DIR_.$file) && filesize(_PS_ROOT_DIR_.$file) > 0)
return ((time() - filemtime(_PS_ROOT_DIR_.$file)) < $timeout);
- }
- else
- return false;
+ return false;
}
+ protected static $is_prestashop_up = true;
public function refresh($file_to_refresh, $external_file)
{
- $content = Tools::file_get_contents($external_file);
- if ($content)
+ if (self::$is_prestashop_up && $content = Tools::file_get_contents($external_file))
return (bool)file_put_contents(_PS_ROOT_DIR_.$file_to_refresh, $content);
+ self::$is_prestashop_up = false;
return false;
}
diff --git a/classes/controller/FrontController.php b/classes/controller/FrontController.php
old mode 100755
new mode 100644
index 4d34edf32..9725e99f1
--- a/classes/controller/FrontController.php
+++ b/classes/controller/FrontController.php
@@ -512,7 +512,7 @@ class FrontControllerCore extends Controller
if (Configuration::get('PS_CSS_THEME_CACHE'))
$this->css_files = Media::cccCSS($this->css_files);
//JS compressor management
- if (Configuration::get('PS_JS_THEME_CACHE'))
+ if (Configuration::get('PS_JS_THEME_CACHE') && !$this->context->getMobileDevice())
$this->js_files = Media::cccJs($this->js_files);
}
diff --git a/classes/module/Module.php b/classes/module/Module.php
index 2e911e26d..d6a9c1142 100644
--- a/classes/module/Module.php
+++ b/classes/module/Module.php
@@ -299,7 +299,7 @@ abstract class ModuleCore
$this->_errors[] = $upgrade_detail['number_upgrade_left'].' '.$this->l('upgrade left');
}
- if ($upgrade_detail['duplicate'])
+ if (isset($upgrade_detail['duplicate']) && $upgrade_detail['duplicate'])
$this->_errors[] = sprintf(Tools::displayError('Module %s cannot be upgraded this time: please refresh this page to update it.'), $this->name);
else
$this->_errors[] = $this->l('To prevent any problem, this module has been turned off');
@@ -1726,7 +1726,15 @@ abstract class ModuleCore
'.(int)$this->need_instance.''.(isset($this->limited_countries) ? "\n\t".''.(count($this->limited_countries) == 1 ? $this->limited_countries[0] : '').'' : '').'
';
if (is_writable(_PS_MODULE_DIR_.$this->name.'/'))
- file_put_contents(_PS_MODULE_DIR_.$this->name.'/config.xml', $xml);
+ {
+ $file = _PS_MODULE_DIR_.$this->name.'/config.xml';
+ if (!@file_put_contents($file, $xml))
+ if (!is_writable($file))
+ {
+ @unlink($file);
+ @file_put_contents($file, $xml);
+ }
+ }
}
/**
diff --git a/classes/order/Order.php b/classes/order/Order.php
index a4d4db1b0..42e5b42b0 100644
--- a/classes/order/Order.php
+++ b/classes/order/Order.php
@@ -712,11 +712,10 @@ class OrderCore extends ObjectModel
}
public function getCartRules()
- {
+ {
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT *
FROM `'._DB_PREFIX_.'order_cart_rule` ocr
- LEFT JOIN `'._DB_PREFIX_.'cart_rule` cr ON cr.`id_cart_rule` = ocr.`id_cart_rule`
WHERE ocr.`id_order` = '.(int)$this->id);
}
diff --git a/classes/order/OrderCartRule.php b/classes/order/OrderCartRule.php
index 3eceb173d..dcc06203a 100644
--- a/classes/order/OrderCartRule.php
+++ b/classes/order/OrderCartRule.php
@@ -46,6 +46,9 @@ class OrderCartRuleCore extends ObjectModel
/** @var float value (tax excl.) of voucher */
public $value_tax_excl;
+
+ /** @var boolean value : voucher gives free shipping or not */
+ public $free_shipping;
/**
* @see ObjectModel::$definition
@@ -59,7 +62,8 @@ class OrderCartRuleCore extends ObjectModel
'id_order_invoice' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'name' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'required' => true),
'value' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true),
- 'value_tax_excl' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true)
+ 'value_tax_excl' => array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat', 'required' => true),
+ 'free_shipping' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool')
)
);
diff --git a/classes/order/OrderSlip.php b/classes/order/OrderSlip.php
index a9b38457d..527df4bb4 100644
--- a/classes/order/OrderSlip.php
+++ b/classes/order/OrderSlip.php
@@ -129,19 +129,6 @@ class OrderSlipCore extends ObjectModel
{
$products[$key] = $product;
$products[$key]['product_quantity'] = $slip_quantity[$product['id_order_detail']];
- if (count($cart_rules))
- {
- $order->setProductPrices($product);
- $realProductPrice = $products[$key]['product_price'];
- // Todo : must be updated to use the cart rules
- foreach ($cart_rules as $cart_rule)
- {
- if ($cart_rule['reduction_percent'])
- $products[$key]['product_price'] -= $realProductPrice * ($cart_rule['reduction_percent'] / 100);
- elseif ($cart_rule['reduction_amount'])
- $products[$key]['product_price'] -= (($cart_rule['reduction_amount'] * ($product['product_price_wt'] / $order->total_products_wt)) / (1.00 + ($product['tax_rate'] / 100)));
- }
- }
}
return $order->getProducts($products);
}
diff --git a/classes/webservice/WebserviceRequest.php b/classes/webservice/WebserviceRequest.php
index 39ca28043..546370998 100644
--- a/classes/webservice/WebserviceRequest.php
+++ b/classes/webservice/WebserviceRequest.php
@@ -1260,40 +1260,40 @@ class WebserviceRequestCore
if (!isset($this->urlFragments['display']))
$this->fieldsToDisplay = 'full';
- // Check if Object is accessible for this/those id_shop
- $assoc = Shop::getAssoTable($this->resourceConfiguration['retrieveData']['table']);
- if ($assoc !== false)
- {
- $check_shop_group = false;
-
- $sql = 'SELECT 1
- FROM `'.bqSQL(_DB_PREFIX_.$this->resourceConfiguration['retrieveData']['table']);
- if ($assoc['type'] != 'fk_shop')
- $sql .= '_'.$assoc['type'];
- else
- {
- $def = ObjectModel::getDefinition($this->resourceConfiguration['retrieveData']['className']);
- if (isset($def['fields']) && isset($def['fields']['id_shop_group']))
- $check_shop_group = true;
- }
- $sql .= '`';
-
- foreach (self::$shopIDs as $id_shop)
- $OR[] = ' (id_shop = '.(int)$id_shop.($check_shop_group ? ' OR (id_shop = 0 AND id_shop_group='.(int)Shop::getGroupFromShop((int)$id_shop).')' : '').') ';
-
- $check = ' WHERE ('.implode('OR', $OR).') AND `'.bqSQL($this->resourceConfiguration['fields']['id']['sqlId']).'` = '.(int)$this->urlSegment[1];
- if (!Db::getInstance()->getValue($sql.$check))
- $this->setError(403, 'Bad id_shop : You are not allowed to access this '.$this->resourceConfiguration['retrieveData']['className'].' ('.(int)$this->urlSegment[1].')', 131);
- }
-
//get entity details
$object = new $this->resourceConfiguration['retrieveData']['className']((int)$this->urlSegment[1]);
if ($object->id)
{
$objects[] = $object;
- return $objects;
+ // Check if Object is accessible for this/those id_shop
+ $assoc = Shop::getAssoTable($this->resourceConfiguration['retrieveData']['table']);
+ if ($assoc !== false)
+ {
+ $check_shop_group = false;
+
+ $sql = 'SELECT 1
+ FROM `'.bqSQL(_DB_PREFIX_.$this->resourceConfiguration['retrieveData']['table']);
+ if ($assoc['type'] != 'fk_shop')
+ $sql .= '_'.$assoc['type'];
+ else
+ {
+ $def = ObjectModel::getDefinition($this->resourceConfiguration['retrieveData']['className']);
+ if (isset($def['fields']) && isset($def['fields']['id_shop_group']))
+ $check_shop_group = true;
+ }
+ $sql .= '`';
+
+ foreach (self::$shopIDs as $id_shop)
+ $OR[] = ' (id_shop = '.(int)$id_shop.($check_shop_group ? ' OR (id_shop = 0 AND id_shop_group='.(int)Shop::getGroupFromShop((int)$id_shop).')' : '').') ';
+
+ $check = ' WHERE ('.implode('OR', $OR).') AND `'.bqSQL($this->resourceConfiguration['fields']['id']['sqlId']).'` = '.(int)$this->urlSegment[1];
+ if (!Db::getInstance()->getValue($sql.$check))
+ $this->setError(404, 'This '.$this->resourceConfiguration['retrieveData']['className'].' ('.(int)$this->urlSegment[1].') does not exists on this shop', 131);
+ else
+ return $objects;
+ }
}
- elseif (!count($this->errors))
+ if (!count($this->errors))
{
$this->objOutput->setStatus(404);
$this->_outputEnabled = false;
diff --git a/controllers/admin/AdminHomeController.php b/controllers/admin/AdminHomeController.php
index 45797273e..96d37e035 100644
--- a/controllers/admin/AdminHomeController.php
+++ b/controllers/admin/AdminHomeController.php
@@ -503,7 +503,7 @@ class AdminHomeControllerCore extends AdminController
// SHOW TIPS OF THE DAY
$content = Tools::file_get_contents($protocol.'api.prestashop.com/partner/tipsoftheday/?iso_country='.$isoCountry.'&iso_lang='.Tools::strtolower($isoUser), false, $stream_context);
- $content = explode('|', $content);
+ $content = explode('|', utf8_encode($content));
if ($content[0] == 'OK' && Validate::isCleanHtml($content[1]))
$result['discover_prestashop'] .= '
'.$content[1].'
';
diff --git a/controllers/admin/AdminImagesController.php b/controllers/admin/AdminImagesController.php
index fdacfe872..13b505f0f 100644
--- a/controllers/admin/AdminImagesController.php
+++ b/controllers/admin/AdminImagesController.php
@@ -641,7 +641,7 @@ class AdminImagesControllerCore extends AdminController
public function initMoveImages()
{
$this->context->smarty->assign(array(
- 'safe_mode' => ini_get('safe_mode'),
+ 'safe_mode' => Tools::getSafeModeStatus(),
'link_ppreferences' => 'index.php?tab=AdminPPreferences&token='.Tools::getAdminTokenLite('AdminPPreferences').'#PS_LEGACY_IMAGES_on',
));
}
diff --git a/controllers/admin/AdminImportController.php b/controllers/admin/AdminImportController.php
index e00153fe8..b0bef57b6 100644
--- a/controllers/admin/AdminImportController.php
+++ b/controllers/admin/AdminImportController.php
@@ -2435,17 +2435,12 @@ class AdminImportControllerCore extends AdminController
$discount_rate = (float)$info['discount_rate'];
$tax_rate = (float)$info['tax_rate'];
- // checks if one product is there only once
- if (isset($product['id_product']))
- {
- if ($product['id_product'] == $id_product_attribute)
- $this->errors[] = sprintf($this->l('Product (%d/%D) cannot be added twice (at line %d).'), $id_product,
- $id_product_attribute, $current_line + 1);
- else
- $product['id_product'] = $id_product_attribute;
- }
+ // checks if one product/attribute is there only once
+ if (isset($products[$id_product][$id_product_attribute]))
+ $this->errors[] = sprintf($this->l('Product/Attribute (%d/%d) cannot be added twice (at line %d).'), $id_product,
+ $id_product_attribute, $current_line + 1);
else
- $product['id_product'] = 0;
+ $products[$id_product][$id_product_attribute] = $quantity_expected;
// checks parameters
if (false === ($supplier_reference = ProductSupplier::getProductSupplierReference($id_product, $id_product_attribute, $supply_order->id_supplier)))
diff --git a/controllers/admin/AdminLocalizationController.php b/controllers/admin/AdminLocalizationController.php
index c5158f9fa..882ad4e5e 100644
--- a/controllers/admin/AdminLocalizationController.php
+++ b/controllers/admin/AdminLocalizationController.php
@@ -28,9 +28,6 @@ class AdminLocalizationControllerCore extends AdminController
{
public function __construct()
{
- $this->className = 'Configuration';
- $this->table = 'configuration';
-
parent::__construct();
$this->fields_options = array(
diff --git a/controllers/admin/AdminLogsController.php b/controllers/admin/AdminLogsController.php
index b1b33bdb7..5a4dc1255 100644
--- a/controllers/admin/AdminLogsController.php
+++ b/controllers/admin/AdminLogsController.php
@@ -64,10 +64,20 @@ class AdminLogsControllerCore extends AdminController
$this->_join .= ' LEFT JOIN '._DB_PREFIX_.'employee e ON (a.id_employee = e.id_employee)';
parent::__construct();
}
+
+ public function processDelete()
+ {
+ return Logger::eraseAllLogs();
+ }
public function initToolbar()
{
parent::initToolbar();
+ $this->toolbar_btn['delete'] = array(
+ 'short' => 'Erase',
+ 'desc' => $this->l('Erase all'),
+ 'js' => 'if (confirm(\''.$this->l('Are you sure?').'\')) document.location = \''.$this->context->link->getAdminLink('AdminLogs').'&token='.$this->token.'&deletelog=1\';'
+ );
unset($this->toolbar_btn['new']);
}
diff --git a/controllers/admin/AdminManufacturersController.php b/controllers/admin/AdminManufacturersController.php
index 2931ecd96..ebdb2ad1d 100644
--- a/controllers/admin/AdminManufacturersController.php
+++ b/controllers/admin/AdminManufacturersController.php
@@ -256,7 +256,7 @@ class AdminManufacturersControllerCore extends AdminController
'lang' => true,
'cols' => 60,
'rows' => 10,
- 'class' => 'rte',
+ 'autoload_rte' => 'rte', //Enable TinyMCE editor for short description
'hint' => $this->l('Invalid characters:').' <>;=#{}'
),
array(
@@ -266,7 +266,7 @@ class AdminManufacturersControllerCore extends AdminController
'lang' => true,
'cols' => 60,
'rows' => 10,
- 'class' => 'rte',
+ 'autoload_rte' => 'rte', //Enable TinyMCE editor for description
'hint' => $this->l('Invalid characters:').' <>;=#{}'
),
array(
@@ -730,4 +730,4 @@ class AdminManufacturersControllerCore extends AdminController
{
return true;
}
-}
\ No newline at end of file
+}
diff --git a/controllers/admin/AdminModulesController.php b/controllers/admin/AdminModulesController.php
index c9b6ae487..a9f19e379 100644
--- a/controllers/admin/AdminModulesController.php
+++ b/controllers/admin/AdminModulesController.php
@@ -778,7 +778,7 @@ class AdminModulesControllerCore extends AdminController
}
if (isset($_GET['update']))
- Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token.'&updated=1tab_module='.$module->tab.'&module_name='.$module->name.'&anchor=anchor'.ucfirst($module->name).(isset($modules_list_save) ? '&modules_list='.$modules_list_save : '').$params);
+ Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token.'&updated=1tab_module='.$module->tab.'&module_name='.$module->name.'&anchor=anchor'.ucfirst($module->name).(isset($modules_list_save) ? '&modules_list='.$modules_list_save : ''));
}
public function postProcess()
diff --git a/controllers/admin/AdminPaymentController.php b/controllers/admin/AdminPaymentController.php
index 8a09dda92..eba965fdd 100644
--- a/controllers/admin/AdminPaymentController.php
+++ b/controllers/admin/AdminPaymentController.php
@@ -213,6 +213,7 @@ class AdminPaymentControllerCore extends AdminController
if ($name_id == 'country'
&& isset($module->limited_countries)
&& !empty($module->limited_countries)
+ && is_array($module->limited_countries)
&& !(in_array(strtoupper($item['iso_code']), array_map('strtoupper', $module->limited_countries))))
$list['items'][$key_item]['check_list'][$key_module] = null;
}
diff --git a/controllers/admin/AdminStatsTabController.php b/controllers/admin/AdminStatsTabController.php
index 8f6895ba7..a143841a4 100644
--- a/controllers/admin/AdminStatsTabController.php
+++ b/controllers/admin/AdminStatsTabController.php
@@ -131,8 +131,13 @@ abstract class AdminStatsTabControllerCore extends AdminPreferencesControllerCor
$modules = $this->getModules();
$module_instance = array();
- foreach ($modules as $module)
+ foreach ($modules as $m => $module)
+ {
$module_instance[$module['name']] = Module::getInstanceByName($module['name']);
+ $modules[$m]['displayName'] = $module_instance[$module['name']]->displayName;
+ }
+
+ uasort($modules, array($this, 'checkModulesNames'));
$tpl->assign(array(
'current' => self::$currentIndex,
@@ -143,6 +148,11 @@ abstract class AdminStatsTabControllerCore extends AdminPreferencesControllerCor
return $tpl->fetch();
}
+
+ public function checkModulesNames($a, $b)
+ {
+ return (bool)($a['displayName'] > $b['displayName']);
+ }
protected function getModules()
{
diff --git a/controllers/admin/AdminSuppliersController.php b/controllers/admin/AdminSuppliersController.php
index 22e30efb4..bfe5618a3 100644
--- a/controllers/admin/AdminSuppliersController.php
+++ b/controllers/admin/AdminSuppliersController.php
@@ -94,7 +94,8 @@ class AdminSuppliersControllerCore extends AdminController
'rows' => 10,
'lang' => true,
'hint' => $this->l('Invalid characters:').' <>;=#{}',
- 'desc' => $this->l('Will appear in the supplier list')
+ 'desc' => $this->l('Will appear in the supplier list'),
+ 'autoload_rte' => 'rte' //Enable TinyMCE editor for short description
),
array(
'type' => 'text',
diff --git a/controllers/admin/AdminTranslationsController.php b/controllers/admin/AdminTranslationsController.php
index 3bbb11dc0..52b178edc 100644
--- a/controllers/admin/AdminTranslationsController.php
+++ b/controllers/admin/AdminTranslationsController.php
@@ -460,7 +460,9 @@ class AdminTranslationsControllerCore extends AdminController
if (!$default_language || !Validate::isLanguageIsoCode($default_language))
return false;
// 1 - Scan mails files
- $mails = scandir(_PS_MAIL_DIR_.$default_language.'/');
+ $mails = array();
+ if (Tools::file_exists_cache(_PS_MAIL_DIR_.$default_language.'/'))
+ $mails = scandir(_PS_MAIL_DIR_.$default_language.'/');
$mails_new_lang = array();
@@ -579,7 +581,9 @@ class AdminTranslationsControllerCore extends AdminController
if (preg_match('#^translations\/'.$iso_code.'\/tabs.php#Ui', $file['filename'], $matches) && Validate::isLanguageIsoCode($iso_code))
{
// Include array width new translations tabs
- $tabs = include _PS_ROOT_DIR_.DIRECTORY_SEPARATOR.$file['filename'];
+ $tabs = array();
+ if (Tools::file_exists_cache(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.$file['filename']))
+ $tabs = include_once(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.$file['filename']);
foreach ($tabs as $class_name => $translations)
{
diff --git a/controllers/front/ManufacturerController.php b/controllers/front/ManufacturerController.php
index dbc2f3b2a..4cc8d6b62 100644
--- a/controllers/front/ManufacturerController.php
+++ b/controllers/front/ManufacturerController.php
@@ -134,4 +134,12 @@ class ManufacturerControllerCore extends FrontController
else
$this->context->smarty->assign('nbManufacturers', 0);
}
-}
\ No newline at end of file
+
+ /**
+ * Get instance of current manufacturer
+ */
+ public function getManufacturer()
+ {
+ return $this->manufacturer;
+ }
+}
diff --git a/install-dev/data/db_structure.sql b/install-dev/data/db_structure.sql
index d067ea6f0..4ad6974fc 100644
--- a/install-dev/data/db_structure.sql
+++ b/install-dev/data/db_structure.sql
@@ -936,7 +936,7 @@ CREATE TABLE `PREFIX_manufacturer_lang` (
`id_manufacturer` int(10) unsigned NOT NULL,
`id_lang` int(10) unsigned NOT NULL,
`description` text,
- `short_description` varchar(254) default NULL,
+ `short_description` text,
`meta_title` varchar(128) default NULL,
`meta_keywords` varchar(255) default NULL,
`meta_description` varchar(255) default NULL,
diff --git a/install-dev/upgrade/php/block_category_1521.php b/install-dev/upgrade/php/block_category_1521.php
index c6b1846f7..4ff4d086b 100644
--- a/install-dev/upgrade/php/block_category_1521.php
+++ b/install-dev/upgrade/php/block_category_1521.php
@@ -26,11 +26,11 @@
function block_category_1521()
{
- if (!Db::getInstance()->getValue('SELECT FROM `'._DB_PREFIX_.'configuration` WHERE `name` LIKE \'BLOCK_CATEG_MAX_DEPTH\' '))
+ if (!Db::getInstance()->getValue('SELECT value FROM `'._DB_PREFIX_.'configuration` WHERE `name` LIKE \'BLOCK_CATEG_MAX_DEPTH\' '))
Db::getInstance()->Execute('INSERT INTO `'._DB_PREFIX_.'configuration`
(`id_configuration` ,`id_shop_group` ,`id_shop` ,`name` ,`value` ,`date_add` ,`date_upd`)
VALUES (NULL, NULL, NULL, \'BLOCK_CATEG_MAX_DEPTH\', 4, NOW(), NOW())');
- else if ($maxdepth = (int)Db::getInstance()->getValue('SELECT FROM `'._DB_PREFIX_.'configuration` WHERE `value` IS NOT NULL AND `value` <> 0'))
- Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'configuration` SET `value` = '.($maxdepth + 1).' WHERE `name` LIKE\'BLOCK_CATEG_MAX_DEPTH\'');
+ else if ($maxdepth = (int)Db::getInstance()->getValue('SELECT value FROM `'._DB_PREFIX_.'configuration` WHERE `value` IS NOT NULL AND `value` <> 0 AND `name` LIKE \'BLOCK_CATEG_MAX_DEPTH\''))
+ Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'configuration` SET `value` = '.($maxdepth + 1).' WHERE `name` LIKE \'BLOCK_CATEG_MAX_DEPTH\'');
}
\ No newline at end of file
diff --git a/install-dev/upgrade/php/fix_download_product_feature_active.php b/install-dev/upgrade/php/fix_download_product_feature_active.php
index 354b3e5f5..c8ffc103f 100644
--- a/install-dev/upgrade/php/fix_download_product_feature_active.php
+++ b/install-dev/upgrade/php/fix_download_product_feature_active.php
@@ -27,5 +27,5 @@
function fix_download_product_feature_active()
{
if (Db::getInstance()->getValue('SELECT COUNT(id_product_download) FROM `'._DB_PREFIX_.'product_download` WHERE `active` = 1 ;') > 0)
- Configuration::updateGlobaleValue('PS_VIRTUAL_PROD_FEATURE_ACTIVE');
+ Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'configuration` SET `value` = 1 WHERE `name` LIKE \'PS_VIRTUAL_PROD_FEATURE_ACTIVE\'');
}
\ No newline at end of file
diff --git a/install-dev/upgrade/php/generate_ntree.php b/install-dev/upgrade/php/generate_ntree.php
index 102d10e2c..a9c12ca4a 100644
--- a/install-dev/upgrade/php/generate_ntree.php
+++ b/install-dev/upgrade/php/generate_ntree.php
@@ -28,8 +28,9 @@ function generate_ntree()
{
$categories = Db::getInstance()->executeS('SELECT id_category, id_parent FROM '._DB_PREFIX_.'category ORDER BY id_parent ASC, position ASC');
$categoriesArray = array();
- foreach ($categories AS $category)
- $categoriesArray[(int)$category['id_parent']]['subcategories'][(int)$category['id_category']] = 1;
+ if (is_array($categories))
+ foreach ($categories AS $category)
+ $categoriesArray[(int)$category['id_parent']]['subcategories'][(int)$category['id_category']] = 1;
$n = 1;
generate_ntree_subTree($categoriesArray, 1, $n);
}
diff --git a/install-dev/upgrade/php/migrate_orders.php b/install-dev/upgrade/php/migrate_orders.php
index 6929bd07d..3a716b47a 100644
--- a/install-dev/upgrade/php/migrate_orders.php
+++ b/install-dev/upgrade/php/migrate_orders.php
@@ -95,7 +95,8 @@ function migrate_orders()
$reduction_amount_tax_incl = (float)$products['reduction_amount'];
// cart::getTaxesAverageUsed equivalent
- $sum_total_products += $products['total_wt'];
+ $sum_total_products += $products['total_price'];
+
$sum_tax_amount += $products['total_wt'] - $products['total_price'];
$order_details['reduction_amount_tax_incl'] = $reduction_amount_tax_incl;
@@ -119,12 +120,13 @@ function migrate_orders()
$average_tax_used = 1;
if ($sum_total_products > 0)
- $average_tax_used += ($sum_tax_amount / $sum_total_products) * 0.01;
-
- $carrier_tax_rate = 1 + ((float)$order['carrier_tax_rate'] / 100);
+ $average_tax_used += $sum_tax_amount / $sum_total_products;
+ $average_tax_used = round($average_tax_used, 4);
+ $carrier_tax_rate = 1;
+ if (isset($order['carrier_tax_rate']))
+ $carrier_tax_rate + ((float)$order['carrier_tax_rate'] / 100);
$total_discount_tax_excl = $order['total_discounts'] / $average_tax_used;
-
$order['total_discounts_tax_incl'] = (float)$order['total_discounts'];
$order['total_discounts_tax_excl'] = (float)$total_discount_tax_excl;
@@ -321,5 +323,4 @@ function mo_setProductPrices($row, $tax_calculation_method)
$row['total_price'] = $row['product_quantity'] * $row['product_price'];
return $row;
-}
-
+}
\ No newline at end of file
diff --git a/install-dev/upgrade/php/move_translations_module_file.php b/install-dev/upgrade/php/move_translations_module_file.php
index 0fcf7e49f..441ed22db 100644
--- a/install-dev/upgrade/php/move_translations_module_file.php
+++ b/install-dev/upgrade/php/move_translations_module_file.php
@@ -44,14 +44,14 @@ function move_translations_module_file()
foreach ($modules as $module_name)
{
// Check if is a good module
- if (in_array($module_name, array('.', '..', '.svn', '.htaccess', 'index.php', 'autoupgrade')))
+ if (in_array($module_name, array('.', '..', '.svn', '.htaccess', 'index.php', 'autoupgrade')) || !is_dir(_PS_MODULE_DIR_.'/'.$module_name))
continue;
foreach ($languages as $lang)
{
// Name for the old file and the new file
$old_file = _PS_MODULE_DIR_.$module_name.'/'.$lang['iso_code'].'.php';
- if (!file_exists($old_file))
+ if (!@file_exists($old_file))
continue;
$dir_translations = _PS_MODULE_DIR_.$module_name.'/translations/';
@@ -61,7 +61,7 @@ function move_translations_module_file()
if (!is_dir($dir_translations))
$res &= mkdir($dir_translations, 0777);
- if (!rename($old_file, $new_file))
+ if (!@rename($old_file, $new_file))
{
$error_list[] = $module_name.' - '.$lang['iso_code']." \r\n";
$res &= false;
diff --git a/install-dev/upgrade/php/p15015_blockadvertising_extension.php b/install-dev/upgrade/php/p15015_blockadvertising_extension.php
index d7795f6b6..2847cb6ef 100644
--- a/install-dev/upgrade/php/p15015_blockadvertising_extension.php
+++ b/install-dev/upgrade/php/p15015_blockadvertising_extension.php
@@ -30,8 +30,8 @@ function p15015_blockadvertising_extension()
define('_PS_ROOT_DIR_', realpath(INSTALL_PATH.'/../'));
// Try to update with the extension of the image that exists in the module directory
- if (file_exists(_PS_ROOT_DIR_.'modules/blockadvertising'))
- foreach (scandir(_PS_ROOT_DIR_.'modules/blockadvertising') as $file)
+ if (@file_exists(_PS_ROOT_DIR_.'/modules/blockadvertising'))
+ foreach (@scandir(_PS_ROOT_DIR_.'/modules/blockadvertising') as $file)
if (in_array($file, array('advertising.jpg', 'advertising.gif', 'advertising.png')))
Db::getInstance()->execute('
REPLACE INTO `'._DB_PREFIX_.'configuration` (name, value)
diff --git a/install-dev/upgrade/php/p15018_change_image_types.php b/install-dev/upgrade/php/p15018_change_image_types.php
index 37cc9c5d8..9e695a6fb 100644
--- a/install-dev/upgrade/php/p15018_change_image_types.php
+++ b/install-dev/upgrade/php/p15018_change_image_types.php
@@ -41,7 +41,7 @@ function p15018_change_image_types()
)
);
- $option = (bool)Db::getInstance()->getValue('SELECT id_theme FROM `'._DB_PREFIX_.'theme` WHERE directory != "default"');
+ $option = (bool)Db::getInstance()->getValue('SELECT id_theme FROM `'._DB_PREFIX_.'theme` WHERE directory != "default" AND directory != "prestashop"');
// If there is another theme than the default one, duplicate
if ($option)
diff --git a/install-dev/upgrade/php/update_genders_images.php b/install-dev/upgrade/php/update_genders_images.php
index 20b060356..cee0ae6cd 100644
--- a/install-dev/upgrade/php/update_genders_images.php
+++ b/install-dev/upgrade/php/update_genders_images.php
@@ -26,12 +26,12 @@
function update_genders_images()
{
- if (file_exists(_PS_ROOT_DIR_.'/img/genders/Mr.jpg'))
+ if (@file_exists(_PS_ROOT_DIR_.'/img/genders/Mr.jpg'))
@rename(_PS_ROOT_DIR_.'/img/genders/Mr.jpg', _PS_ROOT_DIR_.'/img/genders/1.jpg');
- if (file_exists(_PS_ROOT_DIR_.'/img/genders/Ms.jpg'))
+ if (@file_exists(_PS_ROOT_DIR_.'/img/genders/Ms.jpg'))
@rename(_PS_ROOT_DIR_.'/img/genders/Ms.jpg', _PS_ROOT_DIR_.'/img/genders/2.jpg');
- if (file_exists(_PS_ROOT_DIR_.'/img/genders/Miss.jpg'))
+ if (@file_exists(_PS_ROOT_DIR_.'/img/genders/Miss.jpg'))
@rename(_PS_ROOT_DIR_.'/img/genders/Miss.jpg', _PS_ROOT_DIR_.'/img/genders/3.jpg');
- if (file_exists(_PS_ROOT_DIR_.'genders/unknown.jpg'))
+ if (@file_exists(_PS_ROOT_DIR_.'/img/genders/unknown.jpg'))
@rename(_PS_ROOT_DIR_.'/img/genders/unknown.jpg', _PS_ROOT_DIR_.'/img/genders/Unknown.jpg');
}
\ No newline at end of file
diff --git a/install-dev/upgrade/php/update_order_canada.php b/install-dev/upgrade/php/update_order_canada.php
index 79413b8fe..1c23fa8b6 100644
--- a/install-dev/upgrade/php/update_order_canada.php
+++ b/install-dev/upgrade/php/update_order_canada.php
@@ -57,6 +57,7 @@ function update_order_canada()
$default_price_display_method = Db::getInstance()->getValue('SELECT price_display_method
FROM `'._DB_PREFIX_.'group` WHERE id_group=1');
$values = '';
+ if (is_array($id_order_list))
foreach ($id_order_list as $order)
{
$amount = array();
diff --git a/install-dev/upgrade/php/update_order_messages.php b/install-dev/upgrade/php/update_order_messages.php
index 369b753d5..29d4cc07e 100644
--- a/install-dev/upgrade/php/update_order_messages.php
+++ b/install-dev/upgrade/php/update_order_messages.php
@@ -29,17 +29,18 @@ function update_order_messages()
$step = 3000;
$count_messages = Db::getInstance()->getValue('SELECT count(id_message) FROM '._DB_PREFIX_.'message');
$nb_loop = $start = 0;
+ $pattern = ' 0)
$nb_loop = ceil($count_messages / $step);
for($i = 0; $i < $nb_loop; $i++)
{
- $sql = 'SELECT id_message, message FROM `'._DB_PREFIX_.'message` WHERE message REGEXP \' query($sql))
while ($message = Db::getInstance()->nextRow($messages))
{
if(is_array($message))
{
- $sql = 'UPDATE `'._DB_PREFIX_.'message` SET message = \''.pSQL(Tools::htmlentitiesDecodeUTF8(br2nl($message['message']))).'\'
+ $sql = 'UPDATE `'._DB_PREFIX_.'message` SET message = \''.pSQL(preg_replace('/'.$pattern.'/', '', Tools::htmlentitiesDecodeUTF8(br2nl($message['message'])))).'\'
WHERE id_message = '.(int)$message['id_message'];
$result = Db::getInstance()->execute($sql);
}
@@ -50,13 +51,13 @@ function update_order_messages()
$nb_loop = ceil($count_messages / $step);
for($i = 0; $i < $nb_loop; $i++)
{
- $sql = 'SELECT id_customer_message, message FROM `'._DB_PREFIX_.'customer_message` WHERE message REGEXP \' query($sql))
while ($message = Db::getInstance()->nextRow($messages))
{
if(is_array($message))
{
- $sql = 'UPDATE `'._DB_PREFIX_.'customer_message` SET message = \''.pSQL(Tools::htmlentitiesDecodeUTF8(str_replace('&', '&', $message['message']))).'\'
+ $sql = 'UPDATE `'._DB_PREFIX_.'customer_message` SET message = \''.pSQL(preg_replace('/'.$pattern.'/', '', Tools::htmlentitiesDecodeUTF8(str_replace('&', '&', $message['message'])))).'\'
WHERE id_customer_message = '.(int)$message['id_customer_message'];
Db::getInstance()->execute($sql);
}
diff --git a/install-dev/upgrade/sql/1.5.0.0.sql b/install-dev/upgrade/sql/1.5.0.0.sql
index 94a1e36d6..12392446b 100755
--- a/install-dev/upgrade/sql/1.5.0.0.sql
+++ b/install-dev/upgrade/sql/1.5.0.0.sql
@@ -1,4 +1,7 @@
SET NAMES 'utf8';
+
+DROP TABLE IF EXISTS `PREFIX_group_shop`;
+
CREATE TABLE IF NOT EXISTS `PREFIX_group_shop` (
`id_group_shop` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET utf8 NOT NULL,
diff --git a/install-dev/upgrade/sql/1.5.0.10.sql b/install-dev/upgrade/sql/1.5.0.10.sql
index 99860f0f5..82899d281 100644
--- a/install-dev/upgrade/sql/1.5.0.10.sql
+++ b/install-dev/upgrade/sql/1.5.0.10.sql
@@ -4,6 +4,8 @@
UPDATE `PREFIX_meta` SET `page` = 'contact' WHERE `page` = 'contact-form';
+DROP TABLE IF EXISTS `PREFIX_shop_group`;
+
RENAME TABLE `PREFIX_group_shop` TO `PREFIX_shop_group`;
ALTER TABLE `PREFIX_shop_group` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE `PREFIX_shop` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
diff --git a/install-dev/upgrade/sql/1.5.5.0.sql b/install-dev/upgrade/sql/1.5.5.0.sql
index 04d4af493..c93e293ac 100644
--- a/install-dev/upgrade/sql/1.5.5.0.sql
+++ b/install-dev/upgrade/sql/1.5.5.0.sql
@@ -34,6 +34,6 @@ ALTER TABLE `PREFIX_product_shop` DROP INDEX `date_add`, ADD INDEX `date_add` (`
UPDATE `PREFIX_hook` SET `live_edit` = '1' WHERE `name` LIKE 'leftcolumn';
-UPDATE `PREFIX_configuration` SET `name` = '0' WHERE `name` LIKE 'PS_LEGACY_IMAGES' AND `value` LIKE '1';
+UPDATE `PREFIX_configuration` SET `value` = '0' WHERE `name` LIKE 'PS_LEGACY_IMAGES' AND `value` = 1;
INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES('PS_SMARTY_CONSOLE_KEY', 'SMARTY_DEBUG', NOW(), NOW());
diff --git a/install-dev/upgrade/sql/1.5.6.0.sql b/install-dev/upgrade/sql/1.5.6.0.sql
new file mode 100644
index 000000000..5f5521cff
--- /dev/null
+++ b/install-dev/upgrade/sql/1.5.6.0.sql
@@ -0,0 +1 @@
+ALTER TABLE `PREFIX_manufacturer_lang` CHANGE `short_description` `short_description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
\ No newline at end of file
diff --git a/js/tools.js b/js/tools.js
index cc84ad854..4da024b8c 100644
--- a/js/tools.js
+++ b/js/tools.js
@@ -294,6 +294,44 @@ function removeQuotes(value)
return value;
}
+/**
+ * Display a MessageBox
+ * @param {string} msg
+ * @param {string} title (optional)
+ */
+function fancyMsgBox(msg, title)
+{
+ if (title) msg = "
" + title + "
" + msg + "
";
+ msg += " ";
+ $.fancybox( msg, {'autoDimensions': false, 'width': 500, 'height': 'auto', 'transitionIn': 'none', 'transitionOut': 'none'} );
+}
+
+/**
+ * Display a messageDialog with different buttons including a callback for each one
+ * @param {string} question
+ * @param {mixed} title Optional title for the dialog box. Send false if you don't want any title
+ * @param {object} buttons Associative array containg a list of {buttonCaption: callbackFunctionName, ...}. Use an empty space instead of function name for no callback
+ * @param {mixed} otherParams Optional data sent to the callback function
+ */
+function fancyChooseBox(question, title, buttons, otherParams)
+{
+ var msg, funcName, action;
+ if (title) msg = "
" + title + "
" + question + "
";
+ msg += "
";
+ var i = 0;
+ for (var caption in buttons) {
+ if (!buttons.hasOwnProperty(caption)) continue;
+ funcName = buttons[caption];
+ if (typeof otherParams == 'undefined') otherParams = 0;
+ otherParams = escape(JSON.stringify(otherParams));
+ action = funcName ? "$.fancybox.close();window['" + funcName + "'](JSON.parse(unescape('" + otherParams + "')), " + i + ")" : "$.fancybox.close()";
+ msg += '';
+ i++;
+ }
+ msg += "
";
+ $.fancybox( msg, {'autoDimensions': false, 'width': 500, 'height': 'auto', 'transitionIn': 'none', 'transitionOut': 'none'} );
+}
+
//On dom ready
$().ready(function()
{
diff --git a/modules/blockcart/ajax-cart.js b/modules/blockcart/ajax-cart.js
index b0de33fd0..97448ffef 100644
--- a/modules/blockcart/ajax-cart.js
+++ b/modules/blockcart/ajax-cart.js
@@ -214,26 +214,46 @@ var ajaxCart = {
$element = $('#bigpic');
var $picture = $element.clone();
var pictureOffsetOriginal = $element.offset();
+ pictureOffsetOriginal.right = $(window).innerWidth() - pictureOffsetOriginal.left - $element.width();
- if ($picture.size())
- $picture.css({'position': 'absolute', 'top': pictureOffsetOriginal.top, 'left': pictureOffsetOriginal.left});
+ if ($picture.length)
+ {
+ $picture.css({
+ position: 'absolute',
+ top: pictureOffsetOriginal.top,
+ right: pictureOffsetOriginal.right
+ });
+ }
var pictureOffset = $picture.offset();
- if ($('#cart_block')[0] && $('#cart_block').offset().top && $('#cart_block').offset().left)
- var cartBlockOffset = $('#cart_block').offset();
- else
- var cartBlockOffset = $('#shopping_cart').offset();
+ var cartBlock = $('#cart_block');
+ if (!$('#cart_block')[0] || !$('#cart_block').offset().top || !$('#cart_block').offset().left)
+ cartBlock = $('#shopping_cart');
+ var cartBlockOffset = cartBlock.offset();
+ cartBlockOffset.right = $(window).innerWidth() - cartBlockOffset.left - cartBlock.width();
// Check if the block cart is activated for the animation
- if (cartBlockOffset != undefined && $picture.size())
+ if (cartBlockOffset != undefined && $picture.length)
{
$picture.appendTo('body');
- $picture.css({ 'position': 'absolute', 'top': $picture.css('top'), 'left': $picture.css('left'), 'z-index': 4242 })
- .animate({ 'width': $element.attr('width')*0.66, 'height': $element.attr('height')*0.66, 'opacity': 0.2, 'top': cartBlockOffset.top + 30, 'left': cartBlockOffset.left + 15 }, 1000)
- .fadeOut(100, function() {
- ajaxCart.updateCartInformation(jsonData, addedFromProductPage);
- $(this).remove();
- });
+ $picture
+ .css({
+ position: 'absolute',
+ top: pictureOffsetOriginal.top,
+ right: pictureOffsetOriginal.right,
+ zIndex: 4242
+ })
+ .animate({
+ width: $element.attr('width')*0.66,
+ height: $element.attr('height')*0.66,
+ opacity: 0.2,
+ top: cartBlockOffset.top + 30,
+ right: cartBlockOffset.right + 15
+ }, 1000)
+ .fadeOut(100, function() {
+ ajaxCart.updateCartInformation(jsonData, addedFromProductPage);
+ $(this).remove();
+ });
}
else
ajaxCart.updateCartInformation(jsonData, addedFromProductPage);
diff --git a/modules/blocklayered/blocklayered.php b/modules/blocklayered/blocklayered.php
index 76c0aacaa..91ebe0cd2 100644
--- a/modules/blocklayered/blocklayered.php
+++ b/modules/blocklayered/blocklayered.php
@@ -445,10 +445,7 @@ class BlockLayered extends Module
static $_MODULES = array();
global $_MODULE;
- if (version_compare(_PS_VERSION_,'1.5','>'))
$file = _PS_MODULE_DIR_.$this->name.'/translations/'.Language::getIsoById($id_lang).'.php';
- else
- $file = _PS_MODULE_DIR_.$this->name.'/'.Language::getIsoById($id_lang).'.php';
if (!array_key_exists($id_lang, $_MODULES))
{
@@ -2393,11 +2390,13 @@ class BlockLayered extends Module
MAX(image_shop.`id_image`) id_image,
il.legend,
m.name manufacturer_name,
- DATEDIFF('.$alias_where.'.`date_add`, DATE_SUB(NOW(), INTERVAL '.(int)$nb_day_new_product.' DAY)) > 0 AS new
+ DATEDIFF('.$alias_where.'.`date_add`, DATE_SUB(NOW(), INTERVAL '.(int)$nb_day_new_product.' DAY)) > 0 AS new,
+ stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity
FROM `'._DB_PREFIX_.'category_product` cp
LEFT JOIN '._DB_PREFIX_.'category c ON (c.id_category = cp.id_category)
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
'.Shop::addSqlAssociation('product', 'p').'
+ '.Product::sqlStock('p', null, false, Context::getContext()->shop).'
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product'.Shop::addSqlRestrictionOnLang('pl').' AND pl.id_lang = '.(int)$cookie->id_lang.')
LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'.
Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
diff --git a/modules/blocknewproducts/blocknewproducts.php b/modules/blocknewproducts/blocknewproducts.php
index d5ca90eda..ae04a77ee 100644
--- a/modules/blocknewproducts/blocknewproducts.php
+++ b/modules/blocknewproducts/blocknewproducts.php
@@ -111,7 +111,10 @@ class BlockNewProducts extends Module
{
if (!$this->isCached('blocknewproducts.tpl', $this->getCacheId()))
{
- if (!Configuration::get('PS_BLOCK_NEWPRODUCTS_DISPLAY') && !($newProducts = Product::getNewProducts((int)$params['cookie']->id_lang, 0, (int)Configuration::get('NEW_PRODUCTS_NBR'))))
+ if (!Configuration::get('PS_BLOCK_NEWPRODUCTS_DISPLAY'))
+ return;
+ $newProducts = Product::getNewProducts((int) $params['cookie']->id_lang, 0, (int) Configuration::get('NEW_PRODUCTS_NBR'));
+ if (!$newProducts)
return;
$this->smarty->assign(array(
@@ -151,4 +154,4 @@ class BlockNewProducts extends Module
{
$this->_clearCache('blocknewproducts.tpl');
}
-}
\ No newline at end of file
+}
diff --git a/modules/blocktopmenu/blocktopmenu.php b/modules/blocktopmenu/blocktopmenu.php
index 724ea4da3..a5eb3b3c5 100644
--- a/modules/blocktopmenu/blocktopmenu.php
+++ b/modules/blocktopmenu/blocktopmenu.php
@@ -221,6 +221,8 @@ class Blocktopmenu extends Module
// BEGIN SUPPLIER
$this->_html .= '