Merge branch 'development' of https://github.com/PrestaShop/PrestaShop into development

This commit is contained in:
djfm
2013-09-18 16:08:44 +00:00
69 changed files with 578 additions and 2390 deletions
+20 -19
View File
@@ -2,44 +2,45 @@ README
====== ======
![PrestaShop](http://www.prestashop.com/images/banners/general/prestashop_728x90.png "PrestaShop") ![PrestaShop](http://www.prestashop.com/images/banners/general/prestashop_728x90.png "PrestaShop")
PREPARATION ABOUT
-------- --------
To install PrestaShop, you need a remote web server or on your computer (MAMP), with access to a database like MySQL. PrestaShop is a free and open-source e-commerce web application, committed to providing the best shopping cart experience for both merchants and consumers.
You'll need access to phpMyAdmin to create a database and to indicate the information in the database in the installer.
SERVER CONFIGURATION
--------
To install PrestaShop, you need a web server running PHP5 and any flavor of MySQL5 (MySQL, MariaDB, Percona Server...).
You will also need a database administration tool, such as phpMyAdmin, in order to create a database for PrestaShop.
We recommend the Apache or Nginx web servers.
If your host does not offer PHP5 by default, here are a few [explanations][2] about PHP5 or the .htaccess file for certain hosting services (1&1, Free, Lycos, OVH, Infomaniak, Amen, GoDaddy, etc).
If you want your online store ready to go, visit [http://www.prestabox.com][1]: it lets you create your online store in less than 10 minutes without any technical knowledge.
If you do not host and unable to create your store, we offer a turnkey store, which lets you create your online store in less than 10 minutes without any technical knowledge.
We invite you to visit: [http://www.prestabox.com][1]
INSTALLATION INSTALLATION
-------- --------
Simply go to your PrestaShop web directory and use installer :-) With your web browser, go to the root of your PrestaShop directory, and the installer will start. Follow the instructions until PrestaShop is installed.
If you have any PHP error, perhaps you don't have PHP5 or you need to activate it on your web host. If you have any PHP error, perhaps you don't have PHP5 or you need to activate it on your web host. See the page linked above.
Please go to our forum to find pre-installation settings (PHP 5, htaccess) for certain hosting services (1&1, Free, Lycos, OVH, Infomaniak, Amen, GoDaddy, etc). If you don't find any solution to start the installer, please post on [the PrestaShop forums][3].
English webhost [specifics settings][2]
If you don't find any solution to launch installer, please post on [our forum][3]
There are always solutions for your issues ;-)
DOCUMENTATION DOCUMENTATION
-------- --------
For any extra documentation (how-to), please read our [Online documentation][4] The official PrestaShop documentation is available online [on its own website][4].
FORUMS FORUMS
-------- --------
You can also discuss, help and contribute with PrestaShop community on [our forums][5] You can discuss, help and contribute with PrestaShop community on [the PrestaShop forums][5].
Thank you for downloading and using PrestaShop e-commerce Open-source solution!
Thanks for downloading and using PrestaShop e-commerce Open-source solution!
[1]: http://www.prestabox.com [1]: http://www.prestabox.com
[2]: http://www.prestashop.com/forums/topic/2946-pre-installation-settings-php-5-htaccess-for-certain-hosting-services/ [2]: http://www.prestashop.com/forums/topic/2946-pre-installation-settings-php-5-htaccess-for-certain-hosting-services/
@@ -58,6 +58,7 @@
</ul> </ul>
</fieldset> </fieldset>
<h2>{l s='Members of this customer group'}</h2> <h2>{l s='Members of this customer group'}</h2>
<p>{l s='Limited to the 100th first customers.'} {l s='Please use filters to narrow your search.'}</p>
{$customerList} {$customerList}
{/block} {/block}
@@ -112,7 +112,6 @@
<fieldset style="float: left; margin: 0pt 20px 0pt 0pt; width: 70%;"> <fieldset style="float: left; margin: 0pt 20px 0pt 0pt; width: 70%;">
<legend><img src="../img/admin/import.gif" />{l s='Import '}</legend> <legend><img src="../img/admin/import.gif" />{l s='Import '}</legend>
<label class="clear">{if count($files_to_import) > 1}{l s='Your CSV file (%d files):' sprintf=count($files_to_import)}{else}{l s='Your CSV file (%d file):' sprintf=count($files_to_import)}{/if}</label> <label class="clear">{if count($files_to_import) > 1}{l s='Your CSV file (%d files):' sprintf=count($files_to_import)}{else}{l s='Your CSV file (%d file):' sprintf=count($files_to_import)}{/if}</label>
<div class="margin-form"> <div class="margin-form">
{if count($files_to_import)} {if count($files_to_import)}
@@ -146,7 +145,7 @@
<div class="margin-form"> <div class="margin-form">
<select name="entity" id="entity"> <select name="entity" id="entity">
{foreach $entities AS $entity => $i} {foreach $entities AS $entity => $i}
<option value="{$i}" {if $entity == $i}selected="selected"{/if}> <option value="{$i}"{if $entity_selected == $i} selected="selected"{/if}>
{$entity} {$entity}
</option> </option>
{/foreach} {/foreach}
@@ -117,7 +117,7 @@
$('#vouchers_err').hide(); $('#vouchers_err').hide();
var mytab = new Array(); var mytab = new Array();
for (var i = 0; i < data.vouchers.length; i++) for (var i = 0; i < data.vouchers.length; i++)
mytab[mytab.length] = { data: data.vouchers[i], value: data.vouchers[i].name+' - '+data.vouchers[i].description }; mytab[mytab.length] = { data: data.vouchers[i], value: data.vouchers[i].name + (data.vouchers[i].code.length > 0 ? ' - ' + data.vouchers[i].code : '')};
return mytab; return mytab;
}, },
extraParams: { extraParams: {
@@ -694,17 +694,15 @@
function updateCartVouchers(vouchers) function updateCartVouchers(vouchers)
{ {
var vouchers_html = ''; var vouchers_html = '';
if (vouchers.length > 0) if (typeof(vouchers) == 'object')
{ $.each(vouchers, function(){
$.each(vouchers, function() {
vouchers_html += '<tr><td>'+this.name+'</td><td>'+this.description+'</td><td>'+this.value_real+'</td><td><a href="#" class="delete_discount" rel="'+this.id_discount+'"><img src="../img/admin/delete.gif" /></a></td></tr>'; vouchers_html += '<tr><td>'+this.name+'</td><td>'+this.description+'</td><td>'+this.value_real+'</td><td><a href="#" class="delete_discount" rel="'+this.id_discount+'"><img src="../img/admin/delete.gif" /></a></td></tr>';
}); });
$('#voucher_list').show(); $('#voucher_list tbody').html($.trim(vouchers_html));
} if ($('#voucher_list tbody').html().length == 0)
else
$('#voucher_list').hide(); $('#voucher_list').hide();
else
$('#voucher_list tbody').html(vouchers_html); $('#voucher_list').show();
} }
function updateCartPaymentList(payment_list) function updateCartPaymentList(payment_list)
@@ -153,7 +153,7 @@
<br /> <br />
<fieldset> <fieldset>
<legend><img src="../img/admin/tab-customers.gif" /> {l s='Customer information'}</legend> <legend><img src="../img/admin/tab-customers.gif" /> {l s='Customer information'}</legend>
<span style="font-weight: bold; font-size: 14px;"><a href="?tab=AdminCustomers&id_customer={$customer->id}&viewcustomer&token={getAdminToken tab='AdminCustomers'}"> {$customer->firstname} {$customer->lastname}</a></span> ({l s='#'}{$customer->id})<br /> <span style="font-weight: bold; font-size: 14px;"><a href="?tab=AdminCustomers&id_customer={$customer->id}&viewcustomer&token={getAdminToken tab='AdminCustomers'}"> {$gender->name|escape:'htmlall':'UTF-8'} {$customer->firstname} {$customer->lastname}</a></span> ({l s='#'}{$customer->id})<br />
(<a href="mailto:{$customer->email}">{$customer->email}</a>)<br /><br /> (<a href="mailto:{$customer->email}">{$customer->email}</a>)<br /><br />
{if ($customer->isGuest())} {if ($customer->isGuest())}
{l s='This order has been placed by a guest.'} {l s='This order has been placed by a guest.'}
@@ -41,7 +41,7 @@
{/if} {/if}
{$smarty.block.parent} {$smarty.block.parent}
{if $input.type == 'radio' && $input.name == 'smarty_cache'} {if $input.type == 'radio' && $input.name == 'smarty_cache'}
<a href="{$current}&token={$token}&empty_smarty_cache=1" class="clear button" href="">{l s='Clear Smarty cache'}</a> <a href="{$current}&token={$token}&empty_smarty_cache=1" class="clear button" href="">{l s='Clear Smarty cache & Autoload cache'}</a>
{/if} {/if}
{/block} {/block}
@@ -33,22 +33,22 @@
{/if} {/if}
<form method="post" action="{$currentIndex}&{$identifier}&token={$token}&id_tax_rules_group={$id_tax_rules_group}&updatetax_rules_group#{$table}" class="form"> <form method="post" action="{$currentIndex}&{$identifier}&token={$token}&id_tax_rules_group={$id_tax_rules_group}&updatetax_rules_group#{$table}" class="form">
<input type="hidden" id="submitFilter{$table}" name="submitFilter{$table}" value="0"/> <input type="hidden" id="submitFilter{$list_id}" name="submitFilter{$list_id}" value="0"/>
<table class="table_grid"> <table class="table_grid">
<tr> <tr>
<td style="vertical-align: bottom;"> <td style="vertical-align: bottom;">
<span style="float: left;"> <span style="float: left;">
{if $page > 1} {if $page > 1}
<input type="image" src="../img/admin/list-prev2.gif" onclick="getE('submitFilter{$table}').value=1"/>&nbsp; <input type="image" src="../img/admin/list-prev2.gif" onclick="getE('submitFilter{$list_id}').value=1"/>&nbsp;
<input type="image" src="../img/admin/list-prev.gif" onclick="getE('submitFilter{$table}').value={$page - 1}"/> <input type="image" src="../img/admin/list-prev.gif" onclick="getE('submitFilter{$list_id}').value={$page - 1}"/>
{/if} {/if}
{l s='Page'} <b>{$page}</b> / {$total_pages} {l s='Page'} <b>{$page}</b> / {$total_pages}
{if $page < $total_pages} {if $page < $total_pages}
<input type="image" src="../img/admin/list-next.gif" onclick="getE('submitFilter{$table}').value={$page + 1};"/>&nbsp; <input type="image" src="../img/admin/list-next.gif" onclick="getE('submitFilter{$list_id}').value={$page + 1};"/>&nbsp;
<input type="image" src="../img/admin/list-next2.gif" onclick="getE('submitFilter{$table}').value={$total_pages}"/> <input type="image" src="../img/admin/list-next2.gif" onclick="getE('submitFilter{$list_id}').value={$total_pages}"/>
{/if} {/if}
| {l s='Display'} | {l s='Display'}
<select name="pagination" onchange="submit()"> <select name="{$list_id}_pagination" onchange="submit()">
{* Choose number of results per page *} {* Choose number of results per page *}
{foreach $pagination AS $value} {foreach $pagination AS $value}
<option value="{$value|intval}"{if $selected_pagination == $value} selected="selected" {elseif $selected_pagination == NULL && $value == $pagination[1]} selected="selected2"{/if}>{$value|intval}</option> <option value="{$value|intval}"{if $selected_pagination == $value} selected="selected" {elseif $selected_pagination == NULL && $value == $pagination[1]} selected="selected2"{/if}>{$value|intval}</option>
@@ -57,7 +57,7 @@
/ {$list_total} {l s='result(s)'} / {$list_total} {l s='result(s)'}
</span> </span>
<span style="float: right;"> <span style="float: right;">
<input type="submit" name="submitReset{$table}" value="{l s='Reset'}" class="button" /> <input type="submit" name="submitReset{$list_id}" value="{l s='Reset'}" class="button" />
</span> </span>
<span class="clear"></span> <span class="clear"></span>
</td> </td>
@@ -66,7 +66,7 @@
<td> <td>
<table <table
{if $table_id} id={$table_id}{/if} {if $table_id} id={$table_id}{/if}
class="table {if $table_dnd}tableDnD{/if} {$table}" class="table {if $table_dnd}tableDnD{/if} {$list_id}"
cellpadding="0" cellspacing="0" cellpadding="0" cellspacing="0"
style="width: 100%; margin-bottom:10px;" style="width: 100%; margin-bottom:10px;"
> >
@@ -84,7 +84,7 @@
<tr class="nodrag nodrop"> <tr class="nodrag nodrop">
<th class="center"> <th class="center">
{if $has_bulk_actions} {if $has_bulk_actions}
<input type="checkbox" name="checkme" class="noborder" onclick="checkDelBoxes(this.form, '{$table}Box[]', this.checked)" /> <input type="checkbox" name="checkme" class="noborder" onclick="checkDelBoxes(this.form, '{$list_id}Box[]', this.checked)" />
{/if} {/if}
</th> </th>
{foreach $fields_display AS $key => $params} {foreach $fields_display AS $key => $params}
@@ -30,7 +30,7 @@
{if isset($fields.title)}<h2>{$fields.title}</h2>{/if} {if isset($fields.title)}<h2>{$fields.title}</h2>{/if}
{block name="defaultForm"} {block name="defaultForm"}
<form id="{if isset($fields.form.form.id_form)}{$fields.form.form.id_form|escape:'htmlall':'UTF-8'}{else}{$table}_form{/if}" class="defaultForm {$name_controller}" action="{$current}&{if !empty($submit_action)}{$submit_action}=1{/if}&token={$token}" method="post" enctype="multipart/form-data" {if isset($style)}style="{$style}"{/if}> <form id="{if isset($fields.form.form.id_form)}{$fields.form.form.id_form|escape:'htmlall':'UTF-8'}{else}{if $table == null}configuration_form{else}{$table}_form{/if}{/if}" class="defaultForm {$name_controller}" action="{$current}&{if !empty($submit_action)}{$submit_action}=1{/if}&token={$token}" method="post" enctype="multipart/form-data" {if isset($style)}style="{$style}"{/if}>
{if $form_id} {if $form_id}
<input type="hidden" name="{$identifier}" id="{$identifier}" value="{$form_id}" /> <input type="hidden" name="{$identifier}" id="{$identifier}" value="{$form_id}" />
{/if} {/if}
@@ -34,7 +34,7 @@
{block name="defaultOptions"} {block name="defaultOptions"}
<form action="{$current}&token={$token}" <form action="{$current}&token={$token}"
id="{$table}_form" id="{if $table == null}configuration_form{else}{$table}_form{/if}"
{if isset($categoryData['name'])} name={$categoryData['name']}{/if} {if isset($categoryData['name'])} name={$categoryData['name']}{/if}
{if isset($categoryData['id'])} id={$categoryData['id']} {/if} {if isset($categoryData['id'])} id={$categoryData['id']} {/if}
method="post" method="post"
@@ -36,7 +36,7 @@
{if $k == 'modules-list'} {if $k == 'modules-list'}
<div id="modules_list_container" style="display:none"> <div id="modules_list_container" style="display:none">
<div style="float:right;margin:5px"> <div style="float:right;margin:5px">
<a href="#" onclick="$('#modules_list_container').slideUp();return false;"><img alt="X" src="../img/admin/close.png"></a> <a href="#" onclick="$('#modules_list_container').slideUp();return false;"><img alt="X" src="../img/admin/close.png" /></a>
</div> </div>
<div id="modules_list_loader"><img src="../img/loader.gif" alt="" border="0" /></div> <div id="modules_list_loader"><img src="../img/loader.gif" alt="" border="0" /></div>
<div id="modules_list_container_tab" style="display:none;"></div> <div id="modules_list_container_tab" style="display:none;"></div>
+8 -12
View File
@@ -54,6 +54,8 @@ class Autoload
$this->root_dir = dirname(dirname(__FILE__)).'/'; $this->root_dir = dirname(dirname(__FILE__)).'/';
if (file_exists($this->root_dir.Autoload::INDEX_FILE)) if (file_exists($this->root_dir.Autoload::INDEX_FILE))
$this->index = include($this->root_dir.Autoload::INDEX_FILE); $this->index = include($this->root_dir.Autoload::INDEX_FILE);
else
$this->generateIndex();
} }
/** /**
@@ -80,9 +82,8 @@ class Autoload
if (strpos(strtolower($classname), 'smarty_') === 0) if (strpos(strtolower($classname), 'smarty_') === 0)
return; return;
// regenerate the class index if the requested class is not found in the index or if the requested file doesn't exists // regenerate the class index if the requested file doesn't exists
if (!isset($this->index[$classname]) if ((isset($this->index[$classname]) && $this->index[$classname] && !is_file($this->root_dir.$this->index[$classname]))
|| ($this->index[$classname] && !is_file($this->root_dir.$this->index[$classname]))
|| (isset($this->index[$classname.'Core']) && $this->index[$classname.'Core'] && !is_file($this->root_dir.$this->index[$classname.'Core']))) || (isset($this->index[$classname.'Core']) && $this->index[$classname.'Core'] && !is_file($this->root_dir.$this->index[$classname.'Core'])))
$this->generateIndex(); $this->generateIndex();
@@ -138,18 +139,14 @@ class Autoload
{ {
$filename_tmp = tempnam(dirname($filename), basename($filename.'.')); $filename_tmp = tempnam(dirname($filename), basename($filename.'.'));
if($filename_tmp !== FALSE and file_put_contents($filename_tmp, $content, LOCK_EX) !== FALSE) 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); @chmod($filename, 0666);
} }
else else
{ // $filename_tmp couldn't be written. $filename should be there anyway (even if outdated), no need to die.
// $filename_tmp couldn't be written. $filename should be there anyway (even if outdated),
// no need to die.
error_log('Cannot write temporary file '.$filename_tmp); error_log('Cannot write temporary file '.$filename_tmp);
}
} }
$this->index = $classes; $this->index = $classes;
} }
@@ -192,4 +189,3 @@ class Autoload
return isset($this->index[$classname]) ? $this->index[$classname] : null; return isset($this->index[$classname]) ? $this->index[$classname] : null;
} }
} }
+15 -5
View File
@@ -762,10 +762,11 @@ class CartCore extends ObjectModel
{ {
// You can't add a cart rule that does not exist // You can't add a cart rule that does not exist
$cartRule = new CartRule($id_cart_rule, Context::getContext()->language->id); $cartRule = new CartRule($id_cart_rule, Context::getContext()->language->id);
if (!Validate::isLoadedObject($cartRule)) if (!Validate::isLoadedObject($cartRule))
return false; return false;
if (Db::getInstance()->getValue('SELECT id_cart_rule FROM '._DB_PREFIX_.'cart_cart_rule WHERE id_cart = '.(int)$this->id)) if (Db::getInstance()->getValue('SELECT id_cart_rule FROM '._DB_PREFIX_.'cart_cart_rule WHERE id_cart_rule = '.(int)$id_cart_rule.' AND id_cart = '.(int)$this->id))
return false; return false;
// Add the cart rule to the cart // Add the cart rule to the cart
@@ -3415,6 +3416,7 @@ class CartCore extends ObjectModel
*/ */
public function setNoMultishipping() public function setNoMultishipping()
{ {
$emptyCache = $result = false;
if (Configuration::get('PS_ALLOW_MULTISHIPPING')) if (Configuration::get('PS_ALLOW_MULTISHIPPING'))
{ {
// Upgrading quantities // Upgrading quantities
@@ -3433,7 +3435,9 @@ class CartCore extends ObjectModel
AND `id_shop` = '.(int)$this->id_shop.' AND `id_shop` = '.(int)$this->id_shop.'
AND id_product = '.$product['id_product'].' AND id_product = '.$product['id_product'].'
AND id_product_attribute = '.$product['id_product_attribute']; AND id_product_attribute = '.$product['id_product_attribute'];
Db::getInstance()->execute($sql); $result = Db::getInstance()->execute($sql);
if ($result)
$emptyCache = true;
} }
// Merging multiple lines // Merging multiple lines
@@ -3451,14 +3455,17 @@ class CartCore extends ObjectModel
} }
// Update delivery address for each product line // Update delivery address for each product line
Db::getInstance()->execute(' $sql = 'UPDATE `'._DB_PREFIX_.'cart_product`
UPDATE `'._DB_PREFIX_.'cart_product`
SET `id_address_delivery` = ( SET `id_address_delivery` = (
SELECT `id_address_delivery` FROM `'._DB_PREFIX_.'cart` SELECT `id_address_delivery` FROM `'._DB_PREFIX_.'cart`
WHERE `id_cart` = '.(int)$this->id.' AND `id_shop` = '.(int)$this->id_shop.' WHERE `id_cart` = '.(int)$this->id.' AND `id_shop` = '.(int)$this->id_shop.'
) )
WHERE `id_cart` = '.(int)$this->id.' WHERE `id_cart` = '.(int)$this->id.'
'.(Configuration::get('PS_ALLOW_MULTISHIPPING') ? ' AND `id_shop` = '.(int)$this->id_shop : '')); '.(Configuration::get('PS_ALLOW_MULTISHIPPING') ? ' AND `id_shop` = '.(int)$this->id_shop : '');
$result = Db::getInstance()->execute($sql);
if ($result)
$emptyCache = true;
if (Customization::isFeatureActive()) if (Customization::isFeatureActive())
Db::getInstance()->execute(' Db::getInstance()->execute('
@@ -3468,6 +3475,9 @@ class CartCore extends ObjectModel
WHERE `id_cart` = '.(int)$this->id.' WHERE `id_cart` = '.(int)$this->id.'
) )
WHERE `id_cart` = '.(int)$this->id); WHERE `id_cart` = '.(int)$this->id);
if ($emptyCache)
$this->_products = null;
} }
/** /**
+1 -1
View File
@@ -1190,7 +1190,7 @@ class CartRuleCore extends ObjectModel
SELECT cr.*, crl.* SELECT cr.*, crl.*
FROM '._DB_PREFIX_.'cart_rule cr FROM '._DB_PREFIX_.'cart_rule cr
LEFT JOIN '._DB_PREFIX_.'cart_rule_lang crl ON (cr.id_cart_rule = crl.id_cart_rule AND crl.id_lang = '.(int)$id_lang.') LEFT JOIN '._DB_PREFIX_.'cart_rule_lang crl ON (cr.id_cart_rule = crl.id_cart_rule AND crl.id_lang = '.(int)$id_lang.')
WHERE code LIKE \'%'.pSQL($name).'%\' WHERE code LIKE \'%'.pSQL($name).'%\' OR name LIKE \'%'.pSQL($name).'%\'
'); ');
} }
} }
+3 -3
View File
@@ -97,7 +97,7 @@ class ConnectionCore extends ObjectModel
'id_connections' => (int)$cookie->id_connections, 'id_connections' => (int)$cookie->id_connections,
'id_page' => (int)$id_page, 'id_page' => (int)$id_page,
'time_start' => $time_start 'time_start' => $time_start
)); ), false, true, Db::INSERT_IGNORE);
// This array is serialized and used by the ajax request to identify the page // This array is serialized and used by the ajax request to identify the page
return array( return array(
@@ -114,7 +114,7 @@ class ConnectionCore extends ObjectModel
// This is a bot and we have to retrieve its connection ID // This is a bot and we have to retrieve its connection ID
$sql = 'SELECT `id_connections` FROM `'._DB_PREFIX_.'connections` $sql = 'SELECT `id_connections` FROM `'._DB_PREFIX_.'connections`
WHERE ip_address = '.ip2long(Tools::getRemoteAddr()).' WHERE ip_address = '.ip2long(Tools::getRemoteAddr()).'
AND DATE_ADD(`date_add`, INTERVAL 30 MINUTE) > \''.pSQL(date('Y-m-d H:i:00')).'\' AND `date_add` > \''.pSQL(date('Y-m-d H:i:00', time() - 1800)).'\'
'.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER).' '.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER).'
ORDER BY `date_add` DESC'; ORDER BY `date_add` DESC';
if ($id_connections = Db::getInstance()->getValue($sql)) if ($id_connections = Db::getInstance()->getValue($sql))
@@ -128,7 +128,7 @@ class ConnectionCore extends ObjectModel
$sql = 'SELECT `id_guest` $sql = 'SELECT `id_guest`
FROM `'._DB_PREFIX_.'connections` FROM `'._DB_PREFIX_.'connections`
WHERE `id_guest` = '.(int)$cookie->id_guest.' WHERE `id_guest` = '.(int)$cookie->id_guest.'
AND DATE_ADD(`date_add`, INTERVAL 30 MINUTE) > \''.pSQL(date('Y-m-d H:i:00')).'\' AND `date_add` > \''.pSQL(date('Y-m-d H:i:00', time() - 1800)).'\'
'.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER).' '.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER).'
ORDER BY `date_add` DESC'; ORDER BY `date_add` DESC';
$result = Db::getInstance()->getRow($sql); $result = Db::getInstance()->getRow($sql);
+3 -3
View File
@@ -369,7 +369,7 @@ class DispatcherCore
// If there are several languages, get language from uri // If there are several languages, get language from uri
if ($this->use_routes && Language::isMultiLanguageActivated()) if ($this->use_routes && Language::isMultiLanguageActivated())
if (preg_match('#^/([a-z]{2})/#', $this->request_uri, $m)) if (preg_match('#^/([a-z]{2})/?#', $this->request_uri, $m))
{ {
$_GET['isolang'] = $m[1]; $_GET['isolang'] = $m[1];
$this->request_uri = substr($this->request_uri, 3); $this->request_uri = substr($this->request_uri, 3);
@@ -549,7 +549,7 @@ class DispatcherCore
if ($id_shop === null) if ($id_shop === null)
$id_shop = (int)Context::getContext()->shop->id; $id_shop = (int)Context::getContext()->shop->id;
if ($this->use_routes && !isset($this->routes[$id_shop])) if (!isset($this->routes[$id_shop]))
$this->loadRoutes($id_shop); $this->loadRoutes($id_shop);
if (!isset($this->routes[$id_shop]) || !isset($this->routes[$id_shop][$id_lang]) || !isset($this->routes[$id_shop][$id_lang][$route_id])) if (!isset($this->routes[$id_shop]) || !isset($this->routes[$id_shop][$id_lang]) || !isset($this->routes[$id_shop][$id_lang][$route_id]))
@@ -594,7 +594,7 @@ class DispatcherCore
if ($id_shop === null) if ($id_shop === null)
$id_shop = (int)Context::getContext()->shop->id; $id_shop = (int)Context::getContext()->shop->id;
if ($this->use_routes && !isset($this->routes[$id_shop])) if (!isset($this->routes[$id_shop]))
$this->loadRoutes($id_shop); $this->loadRoutes($id_shop);
if (!isset($this->routes[$id_shop][$id_lang][$route_id])) if (!isset($this->routes[$id_shop][$id_lang][$route_id]))
+33 -52
View File
@@ -91,12 +91,8 @@ class LinkCore
if (!$id_lang) if (!$id_lang)
$id_lang = Context::getContext()->language->id; $id_lang = Context::getContext()->language->id;
if (Configuration::get('PS_MULTISHOP_FEATURE_ACTIVE') && $id_shop !== null)
$shop = new Shop($id_shop);
else
$shop = Context::getContext()->shop;
$url = 'http://'.$shop->domain.$shop->getBaseURI().$this->getLangLink($id_lang, null, $id_shop); $url = $this->getBaseLink($id_shop).$this->getLangLink($id_lang, null, $id_shop);
if (!is_object($product)) if (!is_object($product))
{ {
@@ -163,11 +159,7 @@ class LinkCore
if (!$id_lang) if (!$id_lang)
$id_lang = Context::getContext()->language->id; $id_lang = Context::getContext()->language->id;
if ($id_shop === null) $url = $this->getBaseLink($id_shop).$this->getLangLink($id_lang, null, $id_shop);
$shop = Context::getContext()->shop;
else
$shop = new Shop($id_shop);
$url = 'http://'.$shop->domain.$shop->getBaseURI().$this->getLangLink($id_lang, null, $id_shop);
if (!is_object($category)) if (!is_object($category))
$category = new Category($category, $id_lang); $category = new Category($category, $id_lang);
@@ -206,11 +198,7 @@ class LinkCore
if (!$id_lang) if (!$id_lang)
$id_lang = Context::getContext()->language->id; $id_lang = Context::getContext()->language->id;
if ($id_shop === null) $url = $this->getBaseLink($id_shop).$this->getLangLink($id_lang, null, $id_shop);
$shop = Context::getContext()->shop;
else
$shop = new Shop($id_shop);
$url = 'http://'.$shop->domain.$shop->getBaseURI().$this->getLangLink($id_lang, null, $id_shop);
$dispatcher = Dispatcher::getInstance(); $dispatcher = Dispatcher::getInstance();
if (!is_object($cms_category)) if (!is_object($cms_category))
@@ -239,19 +227,12 @@ class LinkCore
* @param int $id_lang * @param int $id_lang
* @return string * @return string
*/ */
public function getCMSLink($cms, $alias = null, $ssl = false, $id_lang = null, $id_shop = null) public function getCMSLink($cms, $alias = null, $ssl = null, $id_lang = null, $id_shop = null)
{ {
$base = (($ssl && $this->ssl_enable) ? 'https://' : 'http://');
if (!$id_lang) if (!$id_lang)
$id_lang = Context::getContext()->language->id; $id_lang = Context::getContext()->language->id;
if ($id_shop === null) $url = $this->getBaseLink($id_shop, $ssl).$this->getLangLink($id_lang, null, $id_shop);
$shop = Context::getContext()->shop;
else
$shop = new Shop($id_shop);
$url = $base.$shop->domain.$shop->getBaseURI().$this->getLangLink($id_lang, null, $id_shop);
$dispatcher = Dispatcher::getInstance(); $dispatcher = Dispatcher::getInstance();
if (!is_object($cms)) if (!is_object($cms))
@@ -290,11 +271,8 @@ class LinkCore
if (!$id_lang) if (!$id_lang)
$id_lang = Context::getContext()->language->id; $id_lang = Context::getContext()->language->id;
if ($id_shop === null)
$shop = Context::getContext()->shop; $url = $this->getBaseLink($id_shop).$this->getLangLink($id_lang, null, $id_shop);
else
$shop = new Shop($id_shop);
$url = 'http://'.$shop->domain.$shop->getBaseURI().$this->getLangLink($id_lang, null, $id_shop);
$dispatcher = Dispatcher::getInstance(); $dispatcher = Dispatcher::getInstance();
if (!is_object($supplier)) if (!is_object($supplier))
@@ -327,11 +305,7 @@ class LinkCore
if (!$id_lang) if (!$id_lang)
$id_lang = Context::getContext()->language->id; $id_lang = Context::getContext()->language->id;
if ($id_shop === null) $url = $this->getBaseLink($id_shop).$this->getLangLink($id_lang, null, $id_shop);
$shop = Context::getContext()->shop;
else
$shop = new Shop($id_shop);
$url = 'http://'.$shop->domain.$shop->getBaseURI().$this->getLangLink($id_lang, null, $id_shop);
$dispatcher = Dispatcher::getInstance(); $dispatcher = Dispatcher::getInstance();
if (!is_object($manufacturer)) if (!is_object($manufacturer))
@@ -360,18 +334,12 @@ class LinkCore
* @param int $id_lang * @param int $id_lang
* @return string * @return string
*/ */
public function getModuleLink($module, $controller = 'default', array $params = array(), $ssl = false, $id_lang = null, $id_shop = null) public function getModuleLink($module, $controller = 'default', array $params = array(), $ssl = null, $id_lang = null, $id_shop = null)
{ {
$base = (($ssl && $this->ssl_enable) ? 'https://' : 'http://');
if (!$id_lang) if (!$id_lang)
$id_lang = Context::getContext()->language->id; $id_lang = Context::getContext()->language->id;
if ($id_shop === null) $url = $this->getBaseLink($id_shop, $ssl).$this->getLangLink($id_lang, null, $id_shop);
$shop = Context::getContext()->shop;
else
$shop = new Shop($id_shop);
$url = $base.$shop->domain.$shop->getBaseURI().$this->getLangLink($id_lang, null, $id_shop);
// If the module has its own route ... just use it ! // If the module has its own route ... just use it !
if (Dispatcher::getInstance()->hasRoute('module-'.$module.'-'.$controller, $id_lang, $id_shop)) if (Dispatcher::getInstance()->hasRoute('module-'.$module.'-'.$controller, $id_lang, $id_shop))
@@ -453,10 +421,9 @@ class LinkCore
* *
* @return string Page link * @return string Page link
*/ */
public function getPageLink($controller, $ssl = false, $id_lang = null, $request = null, $request_url_encode = false, $id_shop = null) public function getPageLink($controller, $ssl = null, $id_lang = null, $request = null, $request_url_encode = false, $id_shop = null)
{ {
$controller = Tools::strReplaceFirst('.php', '', $controller); $controller = Tools::strReplaceFirst('.php', '', $controller);
if (!$id_lang) if (!$id_lang)
$id_lang = (int)Context::getContext()->language->id; $id_lang = (int)Context::getContext()->language->id;
@@ -469,16 +436,9 @@ class LinkCore
parse_str($request, $request); parse_str($request, $request);
} }
if ($id_shop === null)
$shop = Context::getContext()->shop;
else
$shop = new Shop($id_shop);
$uri_path = Dispatcher::getInstance()->createUrl($controller, $id_lang, $request, false, '', $id_shop); $uri_path = Dispatcher::getInstance()->createUrl($controller, $id_lang, $request, false, '', $id_shop);
$url = ($ssl && $this->ssl_enable) ? 'https://' : 'http://';
$url .= $shop->domain.$shop->getBaseURI().$this->getLangLink($id_lang, null, $id_shop).ltrim($uri_path, '/');
return $url; return $this->getBaseLink($id_shop, $ssl).$this->getLangLink($id_lang, null, $id_shop).ltrim($uri_path, '/');
} }
public function getCatImageLink($name, $id_category, $type = null) public function getCatImageLink($name, $id_category, $type = null)
@@ -642,5 +602,26 @@ class LinkCore
return Language::getIsoById($id_lang).'/'; return Language::getIsoById($id_lang).'/';
} }
protected function getBaseLink($id_shop = null, $ssl = null)
{
static $force_ssl = null;
if ($ssl === null)
{
if ($force_ssl === null)
$force_ssl = (Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE'));
$ssl = $force_ssl;
}
if (Configuration::get('PS_MULTISHOP_FEATURE_ACTIVE') && $id_shop !== null)
$shop = new Shop($id_shop);
else
$shop = Context::getContext()->shop;
$base = (($ssl && $this->ssl_enable) ? 'https://'.$shop->domain_ssl : 'http://'.$shop->domain);
return $base.$shop->getBaseURI();
}
} }
+9 -5
View File
@@ -50,10 +50,11 @@ class MailCore
* @param bool $modeSMTP * @param bool $modeSMTP
* @param string $template_path * @param string $template_path
* @param bool $die * @param bool $die
* @param string $bcc Bcc recipient
*/ */
public static function Send($id_lang, $template, $subject, $template_vars, $to, public static function Send($id_lang, $template, $subject, $template_vars, $to,
$to_name = null, $from = null, $from_name = null, $file_attachment = null, $mode_smtp = null, $to_name = null, $from = null, $from_name = null, $file_attachment = null, $mode_smtp = null,
$template_path = _PS_MAIL_DIR_, $die = false, $id_shop = null) $template_path = _PS_MAIL_DIR_, $die = false, $id_shop = null, $bcc = null)
{ {
$configuration = Configuration::getMultiple(array( $configuration = Configuration::getMultiple(array(
'PS_SHOP_EMAIL', 'PS_SHOP_EMAIL',
@@ -127,9 +128,9 @@ class MailCore
} }
/* Construct multiple recipients list if needed */ /* Construct multiple recipients list if needed */
$to_list = new Swift_RecipientList();
if (is_array($to) && isset($to)) if (is_array($to) && isset($to))
{ {
$to_list = new Swift_RecipientList();
foreach ($to as $key => $addr) foreach ($to as $key => $addr)
{ {
$to_name = null; $to_name = null;
@@ -153,17 +154,20 @@ class MailCore
$to_list->addTo($addr, self::mimeEncode($to_name)); $to_list->addTo($addr, self::mimeEncode($to_name));
} }
$to_plugin = $to[0]; $to_plugin = $to[0];
$to = $to_list;
} else { } else {
/* Simple recipient, one address */ /* Simple recipient, one address */
$to_plugin = $to; $to_plugin = $to;
if ($to_name == null) if ($to_name == null)
$to_name = $to; $to_name = $to;
if (function_exists('mb_encode_mimeheader')) if (function_exists('mb_encode_mimeheader'))
$to = new Swift_Address($to, mb_encode_mimeheader($to_name, 'utf-8')); $to_list->addTo($to, mb_encode_mimeheader($to_name, 'utf-8'));
else else
$to = new Swift_Address($to, self::mimeEncode($to_name)); $to_list->addTo($to, self::mimeEncode($to_name));
} }
if(isset($bcc)) {
$to_list->addBcc($bcc);
}
$to = $to_list;
try { try {
/* Connect with the appropriate configuration */ /* Connect with the appropriate configuration */
if ($configuration['PS_MAIL_METHOD'] == 2) if ($configuration['PS_MAIL_METHOD'] == 2)
+1 -1
View File
@@ -39,7 +39,7 @@ class MediaCore
'ui.accordion' => array('fileName' => 'jquery.ui.accordion.min.js', 'dependencies' => array('ui.core', 'ui.widget'), 'theme' => true), 'ui.accordion' => array('fileName' => 'jquery.ui.accordion.min.js', 'dependencies' => array('ui.core', 'ui.widget'), 'theme' => true),
'ui.autocomplete' => array('fileName' => 'jquery.ui.autocomplete.min.js', 'dependencies' => array('ui.core', 'ui.widget', 'ui.position'), 'theme' => true), 'ui.autocomplete' => array('fileName' => 'jquery.ui.autocomplete.min.js', 'dependencies' => array('ui.core', 'ui.widget', 'ui.position'), 'theme' => true),
'ui.button' => array('fileName' => 'jquery.ui.button.min.js', 'dependencies' => array('ui.core', 'ui.widget'), 'theme' => true), 'ui.button' => array('fileName' => 'jquery.ui.button.min.js', 'dependencies' => array('ui.core', 'ui.widget'), 'theme' => true),
'ui.dialog' => array('fileName' => 'jquery.ui.dialog.min.js', 'dependencies' => array('ui.core', 'ui.widget', 'ui.position'), 'theme' => true), 'ui.dialog' => array('fileName' => 'jquery.ui.dialog.min.js', 'dependencies' => array('ui.core', 'ui.widget', 'ui.position','ui.button'), 'theme' => true),
'ui.slider' => array('fileName' => 'jquery.ui.slider.min.js', 'dependencies' => array('ui.core', 'ui.widget', 'ui.mouse'), 'theme' => true), 'ui.slider' => array('fileName' => 'jquery.ui.slider.min.js', 'dependencies' => array('ui.core', 'ui.widget', 'ui.mouse'), 'theme' => true),
'ui.tabs' => array('fileName' => 'jquery.ui.tabs.min.js', 'dependencies' => array('ui.core', 'ui.widget'), 'theme' => true), 'ui.tabs' => array('fileName' => 'jquery.ui.tabs.min.js', 'dependencies' => array('ui.core', 'ui.widget'), 'theme' => true),
'ui.datepicker' => array('fileName' => 'jquery.ui.datepicker.min.js', 'dependencies' => array('ui.core'), 'theme' => true), 'ui.datepicker' => array('fileName' => 'jquery.ui.datepicker.min.js', 'dependencies' => array('ui.core'), 'theme' => true),
+5 -2
View File
@@ -68,8 +68,11 @@ class MetaCore extends ObjectModel
{ {
if ($file != 'index.php' && !in_array(strtolower(str_replace('Controller.php', '', $file)), $exlude_pages)) if ($file != 'index.php' && !in_array(strtolower(str_replace('Controller.php', '', $file)), $exlude_pages))
{ {
$reflection = new ReflectionClass(str_replace('.php', '', $file)); $class_name = str_replace('.php', '', $file);
$properties = $reflection->getDefaultProperties(); if (class_exists($class_name))
$reflection = new ReflectionClass(str_replace('.php', '', $file));
if (isset($reflection) && $reflection)
$properties = $reflection->getDefaultProperties();
if (isset($properties['php_self'])) if (isset($properties['php_self']))
$selected_pages[$properties['php_self']] = $properties['php_self']; $selected_pages[$properties['php_self']] = $properties['php_self'];
else if (preg_match('/^[a-z0-9_.-]*\.php$/i', $file)) else if (preg_match('/^[a-z0-9_.-]*\.php$/i', $file))
+8 -8
View File
@@ -3055,18 +3055,18 @@ class ProductCore extends ObjectModel
if (!Combination::isFeatureActive()) if (!Combination::isFeatureActive())
return array(); return array();
$sql = 'SELECT ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, agl.`public_name` AS public_group_name, $sql = 'SELECT ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, agl.`public_name` AS public_group_name,
a.`id_attribute`, al.`name` AS attribute_name, a.`color` AS attribute_color, pa.`id_product_attribute`, a.`id_attribute`, al.`name` AS attribute_name, a.`color` AS attribute_color, product_attribute_shop.`id_product_attribute`,
IFNULL(stock.quantity, 0) as quantity, product_attribute_shop.`price`, product_attribute_shop.`ecotax`, pa.`weight`, IFNULL(stock.quantity, 0) as quantity, product_attribute_shop.`price`, product_attribute_shop.`ecotax`, product_attribute_shop.`weight`,
product_attribute_shop.`default_on`, pa.`reference`, product_attribute_shop.`unit_price_impact`, product_attribute_shop.`default_on`, pa.`reference`, product_attribute_shop.`unit_price_impact`,
pa.`minimal_quantity`, pa.`available_date`, ag.`group_type` product_attribute_shop.`minimal_quantity`, product_attribute_shop.`available_date`, ag.`group_type`
FROM `'._DB_PREFIX_.'product_attribute` pa FROM `'._DB_PREFIX_.'product_attribute` pa
'.Shop::addSqlAssociation('product_attribute', 'pa').' '.Shop::addSqlAssociation('product_attribute', 'pa').'
'.Product::sqlStock('pa', 'pa').' '.Product::sqlStock('pa', 'pa').'
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute` LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON (pac.`id_product_attribute` = pa.`id_product_attribute`)
LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute` LEFT JOIN `'._DB_PREFIX_.'attribute` a ON (a.`id_attribute` = pac.`id_attribute`)
LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group` LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON (ag.`id_attribute_group` = a.`id_attribute_group`)
LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON a.`id_attribute` = al.`id_attribute` LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute`)
LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON ag.`id_attribute_group` = agl.`id_attribute_group` LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group`)
'.Shop::addSqlAssociation('attribute', 'a').' '.Shop::addSqlAssociation('attribute', 'a').'
WHERE pa.`id_product` = '.(int)$this->id.' WHERE pa.`id_product` = '.(int)$this->id.'
AND al.`id_lang` = '.(int)$id_lang.' AND al.`id_lang` = '.(int)$id_lang.'
+12 -21
View File
@@ -1260,6 +1260,13 @@ class ToolsCore
return Tools::strtoupper(Tools::substr($str, 0, 1)).Tools::substr($str, 1); return Tools::strtoupper(Tools::substr($str, 0, 1)).Tools::substr($str, 1);
} }
public static function ucwords($str)
{
if (function_exists('mb_convert_case'))
return mb_convert_case($str, MB_CASE_TITLE);
return ucwords(strtolower($str));
}
public static function orderbyPrice(&$array, $order_way) public static function orderbyPrice(&$array, $order_way)
{ {
foreach ($array as &$row) foreach ($array as &$row)
@@ -1401,26 +1408,9 @@ class ToolsCore
public static function copy($source, $destination, $stream_context = null) public static function copy($source, $destination, $stream_context = null)
{ {
if ($stream_context == null && preg_match('/^https?:\/\//', $source)) if (is_null($stream_context) && !preg_match('/^https?:\/\//', $source))
$stream_context = @stream_context_create(array('http' => array('timeout' => 10))); return @copy($source, $destination);
return @file_put_contents($destination, Tools::file_get_contents($source, false, $stream_context));
if (in_array(@ini_get('allow_url_fopen'), array('On', 'on', '1')) || !preg_match('/^https?:\/\//', $source))
return @copy($source, $destination, $stream_context);
elseif (function_exists('curl_init'))
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL, $source);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
$opts = stream_context_get_options($stream_context);
$content = curl_exec($curl);
curl_close($curl);
return file_put_contents($destination, $content);
}
else
return false;
} }
/** /**
@@ -1596,7 +1586,8 @@ class ToolsCore
if (self::$_cache_nb_media_servers && ($id_media_server = (abs(crc32($filename)) % self::$_cache_nb_media_servers + 1))) if (self::$_cache_nb_media_servers && ($id_media_server = (abs(crc32($filename)) % self::$_cache_nb_media_servers + 1)))
return constant('_MEDIA_SERVER_'.$id_media_server.'_'); return constant('_MEDIA_SERVER_'.$id_media_server.'_');
return Tools::getShopDomain();
return Tools::usingSecureMode() ? Tools::getShopDomainSSL() : Tools::getShopDomain();
} }
public static function generateHtaccess($path = null, $rewrite_settings = null, $cache_control = null, $specific = '', $disable_multiviews = null, $medias = false, $disable_modsec = null) public static function generateHtaccess($path = null, $rewrite_settings = null, $cache_control = null, $specific = '', $disable_multiviews = null, $medias = false, $disable_modsec = null)
+6 -3
View File
@@ -45,7 +45,7 @@ class AdminControllerCore extends Controller
public $template = 'content.tpl'; public $template = 'content.tpl';
/** @var string Associated table name */ /** @var string Associated table name */
public $table; public $table = 'configuration';
public $list_id; public $list_id;
@@ -2159,8 +2159,11 @@ class AdminControllerCore extends Controller
|| !Validate::isUnsignedId($id_lang)) || !Validate::isUnsignedId($id_lang))
throw new PrestaShopException('get list params is not valid'); throw new PrestaShopException('get list params is not valid');
if (isset($this->fields_list[$order_by]) && isset($this->fields_list[$order_by]['filter_key'])) if (!isset($this->fields_list[$order_by]['order_key']) && isset($this->fields_list[$order_by]['filter_key']))
$order_by = $this->fields_list[$order_by]['filter_key']; $this->fields_list[$order_by]['order_key'] = $this->fields_list[$order_by]['filter_key'];
if (isset($this->fields_list[$order_by]) && isset($this->fields_list[$order_by]['order_key']))
$order_by = $this->fields_list[$order_by]['order_key'];
/* Determine offset from current page */ /* Determine offset from current page */
if ((isset($_POST['submitFilter'.$this->list_id]) || if ((isset($_POST['submitFilter'.$this->list_id]) ||
+7 -3
View File
@@ -65,6 +65,9 @@ class FrontControllerCore extends Controller
parent::__construct(); parent::__construct();
if (Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE'))
$this->ssl = true;
if (isset($useSSL)) if (isset($useSSL))
$this->ssl = $useSSL; $this->ssl = $useSSL;
else else
@@ -145,8 +148,6 @@ class FrontControllerCore extends Controller
// @TODO This method must be moved into switchLanguage // @TODO This method must be moved into switchLanguage
Tools::setCookieLanguage($this->context->cookie); Tools::setCookieLanguage($this->context->cookie);
$currency = Tools::setCurrency($this->context->cookie);
$protocol_link = (Configuration::get('PS_SSL_ENABLED') || Tools::usingSecureMode()) ? 'https://' : 'http://'; $protocol_link = (Configuration::get('PS_SSL_ENABLED') || Tools::usingSecureMode()) ? 'https://' : 'http://';
$useSSL = ((isset($this->ssl) && $this->ssl && Configuration::get('PS_SSL_ENABLED')) || Tools::usingSecureMode()) ? true : false; $useSSL = ((isset($this->ssl) && $this->ssl && Configuration::get('PS_SSL_ENABLED')) || Tools::usingSecureMode()) ? true : false;
$protocol_content = ($useSSL) ? 'https://' : 'http://'; $protocol_content = ($useSSL) ? 'https://' : 'http://';
@@ -167,6 +168,8 @@ class FrontControllerCore extends Controller
if (($newDefault = $this->geolocationManagement($this->context->country)) && Validate::isLoadedObject($newDefault)) if (($newDefault = $this->geolocationManagement($this->context->country)) && Validate::isLoadedObject($newDefault))
$this->context->country = $newDefault; $this->context->country = $newDefault;
$currency = Tools::setCurrency($this->context->cookie);
if (isset($_GET['logout']) || ($this->context->customer->logged && Customer::isBanned($this->context->customer->id))) if (isset($_GET['logout']) || ($this->context->customer->logged && Customer::isBanned($this->context->customer->id)))
{ {
$this->context->customer->logout(); $this->context->customer->logout();
@@ -597,7 +600,7 @@ class FrontControllerCore extends Controller
if (!$canonical_url || !Configuration::get('PS_CANONICAL_REDIRECT') || strtoupper($_SERVER['REQUEST_METHOD']) != 'GET' || Tools::getValue('live_edit')) if (!$canonical_url || !Configuration::get('PS_CANONICAL_REDIRECT') || strtoupper($_SERVER['REQUEST_METHOD']) != 'GET' || Tools::getValue('live_edit'))
return; return;
$match_url = (($this->ssl && Configuration::get('PS_SSL_ENABLED')) ? 'https://' : 'http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $match_url = (($this->ssl) ? 'https://' : 'http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$match_url = rawurldecode($match_url); $match_url = rawurldecode($match_url);
if (!preg_match('/^'.Tools::pRegexp(rawurldecode($canonical_url), '/').'([&?].*)?$/', $match_url)) if (!preg_match('/^'.Tools::pRegexp(rawurldecode($canonical_url), '/').'([&?].*)?$/', $match_url))
{ {
@@ -667,6 +670,7 @@ class FrontControllerCore extends Controller
} }
} }
} }
if (isset($this->context->cookie->iso_code_country) && $this->context->cookie->iso_code_country && !Validate::isLanguageIsoCode($this->context->cookie->iso_code_country)) if (isset($this->context->cookie->iso_code_country) && $this->context->cookie->iso_code_country && !Validate::isLanguageIsoCode($this->context->cookie->iso_code_country))
$this->context->cookie->iso_code_country = Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT')); $this->context->cookie->iso_code_country = Country::getIsoById(Configuration::get('PS_COUNTRY_DEFAULT'));
if (isset($this->context->cookie->iso_code_country) && ($id_country = Country::getByIso(strtoupper($this->context->cookie->iso_code_country)))) if (isset($this->context->cookie->iso_code_country) && ($id_country = Country::getByIso(strtoupper($this->context->cookie->iso_code_country))))
+2 -2
View File
@@ -35,10 +35,10 @@ class HelperFormCore extends Helper
/** @var array of forms fields */ /** @var array of forms fields */
protected $fields_form = array(); protected $fields_form = array();
/** @var array values ​​of form fields */ /** @var array values of form fields */
public $fields_value = array(); public $fields_value = array();
public $table; public $table = 'configuration';
public $name_controller = ''; public $name_controller = '';
/** @var string if not null, a title will be added on that list */ /** @var string if not null, a title will be added on that list */
+4 -4
View File
@@ -136,6 +136,9 @@ class HelperListCore extends Helper
$this->_list = $list; $this->_list = $list;
$this->fields_list = $fields_display; $this->fields_list = $fields_display;
$this->orderBy = preg_replace('/^([a-z _]*!)/Ui', '', $this->orderBy);
$this->orderWay = preg_replace('/^([a-z _]*!)/Ui', '', $this->orderWay);
// Display list header (filtering, pagination and column names) // Display list header (filtering, pagination and column names)
$tpl_vars['header'] = $this->displayListHeader(); $tpl_vars['header'] = $this->displayListHeader();
@@ -456,7 +459,7 @@ class HelperListCore extends Helper
); );
if ($this->specificConfirmDelete !== false) if ($this->specificConfirmDelete !== false)
$data['confirm'] = !is_null($this->specificConfirmDelete) ? '\r'.$this->specificConfirmDelete : addcslashes(Tools::htmlentitiesDecodeUTF8(self::$cache_lang['DeleteItem'].$name), '\''); $data['confirm'] = !is_null($this->specificConfirmDelete) ? '\r'.$this->specificConfirmDelete : Tools::safeOutput(addcslashes(self::$cache_lang['DeleteItem'].$name, '\''));
$tpl->assign(array_merge($this->tpl_delete_link_vars, $data)); $tpl->assign(array_merge($this->tpl_delete_link_vars, $data));
@@ -522,9 +525,6 @@ class HelperListCore extends Helper
isset($this->context->cookie->{$this->list_id.'_pagination'}) ? $this->context->cookie->{$this->list_id.'_pagination'} : null isset($this->context->cookie->{$this->list_id.'_pagination'}) ? $this->context->cookie->{$this->list_id.'_pagination'} : null
); );
// Cleaning links
if (Tools::getValue($this->table.'Orderby') && Tools::getValue($this->table.'Orderway'))
$this->currentIndex = preg_replace('/&'.$this->table.'Orderby=([a-z _]*)&'.$this->table.'Orderway=([a-z]*)/i', '', $this->currentIndex);
if ($this->position_identifier && (int)Tools::getValue($this->position_identifier, 1)) if ($this->position_identifier && (int)Tools::getValue($this->position_identifier, 1))
$table_id = substr($this->identifier, 3, strlen($this->identifier)); $table_id = substr($this->identifier, 3, strlen($this->identifier));
+26 -10
View File
@@ -119,6 +119,9 @@ abstract class ModuleCore
/** @var Smarty_Data */ /** @var Smarty_Data */
protected $smarty; protected $smarty;
/** @var currentSmartySubTemplate */
protected $current_subtemplate = null;
const CACHE_FILE_MODULES_LIST = '/config/xml/modules_list.xml'; const CACHE_FILE_MODULES_LIST = '/config/xml/modules_list.xml';
@@ -1653,21 +1656,36 @@ abstract class ModuleCore
if ($cacheId !== null) if ($cacheId !== null)
Tools::enableCache(); Tools::enableCache();
$smarty_subtemplate = $this->context->smarty->createTemplate( $result = $this->getCurrentSubTemplate($template, $cacheId, $compileId)->fetch();
$this->getTemplatePath($template),
$cacheId,
$compileId,
$this->smarty
);
$result = $smarty_subtemplate->fetch();
if ($cacheId !== null) if ($cacheId !== null)
Tools::restoreCacheSettings(); Tools::restoreCacheSettings();
$this->resetCurrentSubTemplate($template, $cacheId, $compileId);
return $result; return $result;
} }
} }
protected function getCurrentSubTemplate($template, $cache_id = null, $compile_id = null)
{
if (!isset($this->current_subtemplate[$template.'_'.$cache_id.'_'.$compile_id]))
{
$this->current_subtemplate[$template.'_'.$cache_id.'_'.$compile_id] = $this->context->smarty->createTemplate(
$this->getTemplatePath($template),
$cache_id,
$compile_id,
$this->smarty
);
}
return $this->current_subtemplate[$template.'_'.$cache_id.'_'.$compile_id];
}
protected function resetCurrentSubTemplate($template, $cache_id, $compile_id)
{
$this->current_subtemplate[$template.'_'.$cache_id.'_'.$compile_id] = null;
}
/** /**
* Get realpath of a template of current module (check if template is overriden too) * Get realpath of a template of current module (check if template is overriden too)
* *
@@ -1696,10 +1714,8 @@ abstract class ModuleCore
public function isCached($template, $cacheId = null, $compileId = null) public function isCached($template, $cacheId = null, $compileId = null)
{ {
$context = Context::getContext();
Tools::enableCache(); Tools::enableCache();
$is_cached = $context->smarty->isCached($this->getTemplatePath($template), $cacheId, $compileId); $is_cached = $this->getCurrentSubTemplate($this->getTemplatePath($template), $cacheId, $compileId)->isCached($this->getTemplatePath($template), $cacheId, $compileId);
Tools::restoreCacheSettings(); Tools::restoreCacheSettings();
return $is_cached; return $is_cached;
+4 -2
View File
@@ -363,10 +363,12 @@ class ShopCore extends ObjectModel
// Define some $_SERVER variables like HTTP_HOST if PHP is launched with php-cli // Define some $_SERVER variables like HTTP_HOST if PHP is launched with php-cli
if (Tools::isPHPCLI()) if (Tools::isPHPCLI())
{ {
if(!isset($_SERVER['HTTP_HOST']) || empty($_SERVER['HTTP_HOST'])) if (!isset($_SERVER['HTTP_HOST']) || empty($_SERVER['HTTP_HOST']))
$_SERVER['HTTP_HOST'] = $shop->domain; $_SERVER['HTTP_HOST'] = $shop->domain;
if(!isset($_SERVER['SERVER_NAME']) || empty($_SERVER['SERVER_NAME'])) if (!isset($_SERVER['SERVER_NAME']) || empty($_SERVER['SERVER_NAME']))
$_SERVER['SERVER_NAME'] = $shop->domain; $_SERVER['SERVER_NAME'] = $shop->domain;
if (!isset($_SERVER['REMOTE_ADDR']) || empty($_SERVER['REMOTE_ADDR']))
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
} }
} }
else else
-4
View File
@@ -305,11 +305,7 @@ class StockAvailableCore extends ObjectModel
if (!Validate::isUnsignedId($id_product)) if (!Validate::isUnsignedId($id_product))
return false; return false;
if ($id_shop === null)
$id_shop = Context::getContext()->shop->id;
$existing_id = StockAvailable::getStockAvailableIdByProductId((int)$id_product, (int)$id_product_attribute, (int)$id_shop); $existing_id = StockAvailable::getStockAvailableIdByProductId((int)$id_product, (int)$id_product_attribute, (int)$id_shop);
if ($existing_id > 0) if ($existing_id > 0)
{ {
Db::getInstance()->update( Db::getInstance()->update(
+1 -1
View File
@@ -80,7 +80,7 @@ class TaxRulesTaxManagerCore implements TaxManagerInterface
if (!empty($this->address->postcode)) if (!empty($this->address->postcode))
$postcode = $this->address->postcode; $postcode = $this->address->postcode;
if (!isset(self::$cache_tax_calculator[$postcode.'-'.$this->type])) if (!isset(self::$cache_tax_calculator[(int)$this->address->id_country.'-'.$postcode.'-'.$this->type]))
{ {
$rows = Db::getInstance()->executeS(' $rows = Db::getInstance()->executeS('
SELECT * SELECT *
+1 -2
View File
@@ -1289,9 +1289,8 @@ class WebserviceRequestCore
$check = ' WHERE ('.implode('OR', $OR).') AND `'.bqSQL($this->resourceConfiguration['fields']['id']['sqlId']).'` = '.(int)$this->urlSegment[1]; $check = ' WHERE ('.implode('OR', $OR).') AND `'.bqSQL($this->resourceConfiguration['fields']['id']['sqlId']).'` = '.(int)$this->urlSegment[1];
if (!Db::getInstance()->getValue($sql.$check)) 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); $this->setError(404, 'This '.$this->resourceConfiguration['retrieveData']['className'].' ('.(int)$this->urlSegment[1].') does not exists on this shop', 131);
else
return $objects;
} }
return $objects;
} }
if (!count($this->errors)) if (!count($this->errors))
{ {
@@ -77,7 +77,7 @@ class AdminAddressesControllerCore extends AdminController
parent::initToolbar(); parent::initToolbar();
if (!$this->display) if (!$this->display)
$this->toolbar_btn['import'] = array( $this->toolbar_btn['import'] = array(
'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type='.$this->table, 'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type=addresses',
'desc' => $this->l('Import') 'desc' => $this->l('Import')
); );
} }
@@ -246,7 +246,7 @@ class AdminCategoriesControllerCore extends AdminController
'desc' => $this->l('Add New') 'desc' => $this->l('Add New')
); );
$this->toolbar_btn['import'] = array( $this->toolbar_btn['import'] = array(
'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type='.$this->table, 'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type=categories',
'desc' => $this->l('Import') 'desc' => $this->l('Import')
); );
} }
+2 -2
View File
@@ -110,10 +110,10 @@ class AdminCmsControllerCore extends AdminController
'type' => 'text', 'type' => 'text',
'label' => $this->l('Meta title:'), 'label' => $this->l('Meta title:'),
'name' => 'meta_title', 'name' => 'meta_title',
'id' => 'name', // for copy2friendlyUrl compatibility 'id' => 'name', // for copyMeta2friendlyURL compatibility
'lang' => true, 'lang' => true,
'required' => true, 'required' => true,
'class' => 'copy2friendlyUrl', 'class' => 'copyMeta2friendlyURL',
'hint' => $this->l('Invalid characters:').' <>;=#{}', 'hint' => $this->l('Invalid characters:').' <>;=#{}',
'size' => 50 'size' => 50
), ),
@@ -380,7 +380,7 @@ class AdminCustomerThreadsControllerCore extends AdminController
$cm->id_employee = (int)$this->context->employee->id; $cm->id_employee = (int)$this->context->employee->id;
$cm->id_customer_thread = $ct->id; $cm->id_customer_thread = $ct->id;
$cm->message = Tools::htmlentitiesutf8(Tools::getValue('reply_message')); $cm->message = Tools::getValue('reply_message');
$cm->ip_address = ip2long($_SERVER['REMOTE_ADDR']); $cm->ip_address = ip2long($_SERVER['REMOTE_ADDR']);
if (isset($_FILES) && !empty($_FILES['joinFile']['name']) && $_FILES['joinFile']['error'] != 0) if (isset($_FILES) && !empty($_FILES['joinFile']['name']) && $_FILES['joinFile']['error'] != 0)
$this->errors[] = Tools::displayError('An error occurred during the file upload process.'); $this->errors[] = Tools::displayError('An error occurred during the file upload process.');
@@ -597,11 +597,12 @@ class AdminCustomerThreadsControllerCore extends AdminController
} }
$message['date_add'] = Tools::displayDate($message['date_add'], null, true); $message['date_add'] = Tools::displayDate($message['date_add'], null, true);
$message['user_agent'] = strip_tags($message['user_agent']); $message['user_agent'] = strip_tags($message['user_agent']);
$message['message'] = preg_replace( $message['message'] = preg_replace(
'/(https?:\/\/[a-z0-9#%&_=\(\)\.\? \+\-@\/]{6,1000})([\s\n<])/Uui', '/(https?:\/\/[a-z0-9#%&_=\(\)\.\? \+\-@\/]{6,1000})([\s\n<])/Uui',
'<a href="\1">\1</a>\2', '<a href="\1">\1</a>\2',
html_entity_decode($message['message'], html_entity_decode($message['message'],
ENT_NOQUOTES, 'UTF-8') ENT_QUOTES, 'UTF-8')
); );
$tpl->assign(array( $tpl->assign(array(
@@ -190,7 +190,7 @@ class AdminCustomersControllerCore extends AdminController
else if (!$this->display) //display import button only on listing else if (!$this->display) //display import button only on listing
{ {
$this->toolbar_btn['import'] = array( $this->toolbar_btn['import'] = array(
'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type='.$this->table, 'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type=customers',
'desc' => $this->l('Import') 'desc' => $this->l('Import')
); );
} }
+1 -1
View File
@@ -193,7 +193,7 @@ class AdminGroupsControllerCore extends AdminController
'active' => array('title' => $this->l('Enabled'),'align' => 'center','width' => 20, 'active' => 'status','type' => 'bool') 'active' => array('title' => $this->l('Enabled'),'align' => 'center','width' => 20, 'active' => 'status','type' => 'bool')
)); ));
$customer_list = $group->getCustomers(false, 0, 0, true); $customer_list = $group->getCustomers(false, 0, 100, true);
$helper = new HelperList(); $helper = new HelperList();
$helper->currentIndex = Context::getContext()->link->getAdminLink('AdminCustomers', false); $helper->currentIndex = Context::getContext()->link->getAdminLink('AdminCustomers', false);
+1 -1
View File
@@ -503,7 +503,7 @@ class AdminHomeControllerCore extends AdminController
// SHOW TIPS OF THE DAY // 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 = Tools::file_get_contents($protocol.'api.prestashop.com/partner/tipsoftheday/?iso_country='.$isoCountry.'&iso_lang='.Tools::strtolower($isoUser), false, $stream_context);
$content = explode('|', utf8_encode($content)); $content = explode('|', $content);
if ($content[0] == 'OK' && Validate::isCleanHtml($content[1])) if ($content[0] == 'OK' && Validate::isCleanHtml($content[1]))
$result['discover_prestashop'] .= '<div id="block_partner_tips">'.$content[1].'</div></div>'; $result['discover_prestashop'] .= '<div id="block_partner_tips">'.$content[1].'</div></div>';
+11 -2
View File
@@ -52,8 +52,17 @@ class AdminImagesControllerCore extends AdminController
'stores' => array('title' => $this->l('Stores'), 'width' => 50, 'align' => 'center', 'type' => 'bool', 'callback' => 'printEntityActiveIcon', 'orderby' => false) 'stores' => array('title' => $this->l('Stores'), 'width' => 50, 'align' => 'center', 'type' => 'bool', 'callback' => 'printEntityActiveIcon', 'orderby' => false)
); );
// No need to display the old image system if the install has been made later than 2013-03-26 // No need to display the old image system migration tool except if product images are in _PS_PROD_IMG_DIR_
$this->display_move = (!Configuration::get('PS_LEGACY_IMAGES') && defined('_PS_CREATION_DATE_') && strtotime(_PS_CREATION_DATE_) > strtotime('2013-03-26')) ? false : true; $this->display_move = false;
$dir = _PS_PROD_IMG_DIR_;
if (is_dir($dir))
if ($dh = opendir($dir))
{
while (($file = readdir($dh)) !== false && $this->display_move == false)
if (!is_dir($dir.DIRECTORY_SEPARATOR.$file) && $file[0] != '.' && is_numeric($file[0]))
$this->display_move = true;
closedir($dh);
}
$this->fields_options = array( $this->fields_options = array(
'images' => array( 'images' => array(
File diff suppressed because it is too large Load Diff
@@ -140,7 +140,7 @@ class AdminManufacturersControllerCore extends AdminController
'lastname' => array( 'lastname' => array(
'title' => $this->l('Last name'), 'title' => $this->l('Last name'),
'width' => 100, 'width' => 100,
'filter_key' => 'a!name' 'filter_key' => 'a!lastname'
), ),
'postcode' => array( 'postcode' => array(
'title' => $this->l('Zip Code/Postal Code'), 'title' => $this->l('Zip Code/Postal Code'),
@@ -570,7 +570,7 @@ class AdminManufacturersControllerCore extends AdminController
default: default:
parent::initToolbar(); parent::initToolbar();
$this->toolbar_btn['import'] = array( $this->toolbar_btn['import'] = array(
'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type='.$this->table, 'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type=manufacturers',
'desc' => $this->l('Import') 'desc' => $this->l('Import')
); );
} }
+7 -3
View File
@@ -110,7 +110,8 @@ class AdminOrdersControllerCore extends AdminController
'type' => 'select', 'type' => 'select',
'list' => $statuses_array, 'list' => $statuses_array,
'filter_key' => 'os!id_order_state', 'filter_key' => 'os!id_order_state',
'filter_type' => 'int' 'filter_type' => 'int',
'order_key' => 'osname'
), ),
'date_add' => array( 'date_add' => array(
'title' => $this->l('Date'), 'title' => $this->l('Date'),
@@ -506,7 +507,7 @@ class AdminOrdersControllerCore extends AdminController
if (Tools::isSubmit('generateDiscountRefund') && !count($this->errors)) if (Tools::isSubmit('generateDiscountRefund') && !count($this->errors))
{ {
$cart_rule = new CartRule(); $cart_rule = new CartRule();
$cart_rule->description = sprintf($this->l('Credit card slip for order #%d'), $order->id); $cart_rule->description = sprintf($this->l('Credit slip for order #%d'), $order->id);
$languages = Language::getLanguages(false); $languages = Language::getLanguages(false);
foreach ($languages as $language) foreach ($languages as $language)
// Define a temporary name // Define a temporary name
@@ -804,7 +805,7 @@ class AdminOrdersControllerCore extends AdminController
if (!Validate::isLoadedObject($order)) if (!Validate::isLoadedObject($order))
$this->errors[] = Tools::displayError('The order cannot be found'); $this->errors[] = Tools::displayError('The order cannot be found');
elseif (!Validate::isNegativePrice($amount)) elseif (!Validate::isNegativePrice($amount) || !(float)$amount)
$this->errors[] = Tools::displayError('The amount is invalid.'); $this->errors[] = Tools::displayError('The amount is invalid.');
elseif (!Validate::isString(Tools::getValue('payment_method'))) elseif (!Validate::isString(Tools::getValue('payment_method')))
$this->errors[] = Tools::displayError('The selected payment method is invalid.'); $this->errors[] = Tools::displayError('The selected payment method is invalid.');
@@ -1341,11 +1342,14 @@ class AdminOrdersControllerCore extends AdminController
$product['warehouse_name'] = '--'; $product['warehouse_name'] = '--';
} }
$gender = new Gender((int)$customer->id_gender, $this->context->language->id);
// Smarty assign // Smarty assign
$this->tpl_view_vars = array( $this->tpl_view_vars = array(
'order' => $order, 'order' => $order,
'cart' => new Cart($order->id_cart), 'cart' => new Cart($order->id_cart),
'customer' => $customer, 'customer' => $customer,
'gender' => $gender,
'customer_addresses' => $customer->getAddresses($this->context->language->id), 'customer_addresses' => $customer->getAddresses($this->context->language->id),
'addresses' => array( 'addresses' => array(
'delivery' => $addressDelivery, 'delivery' => $addressDelivery,
@@ -796,6 +796,7 @@ class AdminPerformanceControllerCore extends AdminController
{ {
$redirectAdmin = true; $redirectAdmin = true;
Tools::clearSmartyCache(); Tools::clearSmartyCache();
Autoload::getInstance()->generateIndex();
} }
if ($redirectAdmin && (!isset($this->errors) || !count($this->errors))) if ($redirectAdmin && (!isset($this->errors) || !count($this->errors)))
@@ -86,6 +86,19 @@ class AdminPreferencesControllerCore extends AdminController
'type' => 'bool', 'type' => 'bool',
'default' => '0' 'default' => '0'
), ),
);
if (Configuration::get('PS_SSL_ENABLED'))
$fields['PS_SSL_ENABLED_EVERYWHERE'] = array(
'title' => $this->l('Force the SSL on all the pages'),
'desc' => $this->l('Force all your store to use SSL'),
'validation' => 'isBool',
'cast' => 'intval',
'type' => 'bool',
'default' => '0'
);
$fields = array_merge($fields, array(
'PS_TOKEN_ENABLE' => array( 'PS_TOKEN_ENABLE' => array(
'title' => $this->l('Increase Front Office security'), 'title' => $this->l('Increase Front Office security'),
'desc' => $this->l('Enable or disable token in the Front Office to improve PrestaShop\'s security.'), 'desc' => $this->l('Enable or disable token in the Front Office to improve PrestaShop\'s security.'),
@@ -135,7 +148,7 @@ class AdminPreferencesControllerCore extends AdminController
'list' => $activities2, 'list' => $activities2,
'identifier' => 'value' 'identifier' => 'value'
), ),
); ));
// No HTTPS activation if you haven't already. // No HTTPS activation if you haven't already.
if (!Tools::usingSecureMode() && !Configuration::get('PS_SSL_ENABLED')) if (!Tools::usingSecureMode() && !Configuration::get('PS_SSL_ENABLED'))
+5 -59
View File
@@ -1736,27 +1736,7 @@ class AdminProductsControllerCore extends AdminController
// Save and preview // Save and preview
if (Tools::isSubmit('submitAddProductAndPreview')) if (Tools::isSubmit('submitAddProductAndPreview'))
{ $this->redirect_after = $this->getPreviewUrl($this->object);
$preview_url = $this->context->link->getProductLink(
$this->getFieldValue($this->object, 'id'),
$this->getFieldValue($this->object, 'link_rewrite', $this->context->language->id),
Category::getLinkRewrite($this->getFieldValue($this->object, 'id_category_default'), $this->context->language->id),
null,
null,
Context::getContext()->shop->id,
0,
(bool)Configuration::get('PS_REWRITING_SETTINGS')
);
if (!$this->object->active)
{
$admin_dir = dirname($_SERVER['PHP_SELF']);
$admin_dir = substr($admin_dir, strrpos($admin_dir, '/') + 1);
$preview_url .= '&adtoken='.$this->token.'&ad='.$admin_dir.'&id_employee='.(int)$this->context->employee->id;
}
$this->redirect_after = $preview_url;
}
// Save and stay on same form // Save and stay on same form
if ($this->display == 'edit') if ($this->display == 'edit')
@@ -1901,30 +1881,7 @@ class AdminProductsControllerCore extends AdminController
// Save and preview // Save and preview
if (Tools::isSubmit('submitAddProductAndPreview')) if (Tools::isSubmit('submitAddProductAndPreview'))
{ $this->redirect_after = $this->getPreviewUrl($object);
$preview_url = $this->context->link->getProductLink(
$this->getFieldValue($object, 'id'),
$this->getFieldValue($object, 'link_rewrite', $this->context->language->id),
Category::getLinkRewrite($this->getFieldValue($object, 'id_category_default'), $this->context->language->id),
null,
null,
Context::getContext()->shop->id,
0,
(bool)Configuration::get('PS_REWRITING_SETTINGS')
);
if (!$object->active)
{
$admin_dir = dirname($_SERVER['PHP_SELF']);
$admin_dir = substr($admin_dir, strrpos($admin_dir, '/') + 1);
if (strpos($preview_url, '?') === false)
$preview_url .= '?';
else
$preview_url .= '&';
$preview_url .= 'adtoken='.$this->token.'&ad='.$admin_dir.'&id_employee='.(int)$this->context->employee->id;
}
$this->redirect_after = $preview_url;
}
else else
{ {
// Save and stay on same form // Save and stay on same form
@@ -2480,7 +2437,7 @@ class AdminProductsControllerCore extends AdminController
} }
else else
$this->toolbar_btn['import'] = array( $this->toolbar_btn['import'] = array(
'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type='.$this->table, 'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type=products',
'desc' => $this->l('Import') 'desc' => $this->l('Import')
); );
@@ -2625,30 +2582,19 @@ class AdminProductsControllerCore extends AdminController
$preview_url = $this->context->link->getProductLink( $preview_url = $this->context->link->getProductLink(
$product, $product,
$this->getFieldValue($product, 'link_rewrite', $this->context->language->id), $this->getFieldValue($product, 'link_rewrite', $this->context->language->id),
Category::getLinkRewrite($product->id_category_default, $this->context->language->id), Category::getLinkRewrite($this->getFieldValue($product, 'id_category_default'), $this->context->language->id),
null, null,
$id_lang, $id_lang,
Context::getContext()->shop->id, (int)Context::getContext()->shop->id,
0, 0,
$is_rewrite_active $is_rewrite_active
); );
if (!$product->active) if (!$product->active)
{ {
$preview_url = $this->context->link->getProductLink(
$product,
$this->getFieldValue($product, 'link_rewrite', $this->default_form_language),
Category::getLinkRewrite($this->getFieldValue($product, 'id_category_default'), $this->context->language->id),
null,
$id_lang,
Context::getContext()->shop->id,
0,
$is_rewrite_active
);
$admin_dir = dirname($_SERVER['PHP_SELF']); $admin_dir = dirname($_SERVER['PHP_SELF']);
$admin_dir = substr($admin_dir, strrpos($admin_dir, '/') + 1); $admin_dir = substr($admin_dir, strrpos($admin_dir, '/') + 1);
$preview_url .= ((strpos($preview_url, '?') === false) ? '?' : '&').'adtoken='.$this->token.'&ad='.$admin_dir.'&id_employee='.(int)$this->context->employee->id; $preview_url .= ((strpos($preview_url, '?') === false) ? '?' : '&').'adtoken='.$this->token.'&ad='.$admin_dir.'&id_employee='.(int)$this->context->employee->id;
} }
return $preview_url; return $preview_url;
@@ -136,6 +136,7 @@ class AdminStatusesControllerCore extends AdminController
{ {
$this->table = 'order_return_state'; $this->table = 'order_return_state';
$this->_defaultOrderBy = $this->identifier = 'id_order_return_state'; $this->_defaultOrderBy = $this->identifier = 'id_order_return_state';
$this->list_id = 'order_return_state';
$this->deleted = false; $this->deleted = false;
$this->_orderBy = null; $this->_orderBy = null;
@@ -262,6 +262,24 @@ class AdminSuppliersControllerCore extends AdminController
return parent::renderForm(); return parent::renderForm();
} }
/**
* AdminController::initToolbar() override
* @see AdminController::initToolbar()
*
*/
public function initToolbar()
{
switch ($this->display)
{
default:
parent::initToolbar();
$this->toolbar_btn['import'] = array(
'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type=suppliers',
'desc' => $this->l('Import')
);
}
}
public function renderView() public function renderView()
{ {
$products = $this->object->getProductsLite($this->context->language->id); $products = $this->object->getProductsLite($this->context->language->id);
@@ -78,6 +78,7 @@ class AdminTaxRulesGroupControllerCore extends AdminController
public function initRulesList($id_group) public function initRulesList($id_group)
{ {
$this->table = 'tax_rule'; $this->table = 'tax_rule';
$this->list_id = 'tax_rule';
$this->identifier = 'id_tax_rule'; $this->identifier = 'id_tax_rule';
$this->className = 'TaxRule'; $this->className = 'TaxRule';
$this->lang = false; $this->lang = false;
+1
View File
@@ -425,6 +425,7 @@ class AuthControllerCore extends FrontController
if (Tools::isSubmit('newsletter')) if (Tools::isSubmit('newsletter'))
$this->processCustomerNewsletter($customer); $this->processCustomerNewsletter($customer);
$customer->firstname = Tools::ucwords($customer->firstname);
$customer->birthday = (empty($_POST['years']) ? '' : (int)$_POST['years'].'-'.(int)$_POST['months'].'-'.(int)$_POST['days']); $customer->birthday = (empty($_POST['years']) ? '' : (int)$_POST['years'].'-'.(int)$_POST['months'].'-'.(int)$_POST['days']);
if (!Validate::isBirthDate($customer->birthday)) if (!Validate::isBirthDate($customer->birthday))
$this->errors[] = Tools::displayError('Invalid date of birth.'); $this->errors[] = Tools::displayError('Invalid date of birth.');
+1 -1
View File
@@ -144,7 +144,7 @@ class ContactControllerCore extends FrontController
{ {
$cm = new CustomerMessage(); $cm = new CustomerMessage();
$cm->id_customer_thread = $ct->id; $cm->id_customer_thread = $ct->id;
$cm->message = Tools::htmlentitiesUTF8($message); $cm->message = $message;
if (isset($fileAttachment['rename']) && !empty($fileAttachment['rename']) && rename($fileAttachment['tmp_name'], _PS_MODULE_DIR_.'../upload/'.basename($fileAttachment['rename']))) if (isset($fileAttachment['rename']) && !empty($fileAttachment['rename']) && rename($fileAttachment['tmp_name'], _PS_MODULE_DIR_.'../upload/'.basename($fileAttachment['rename'])))
$cm->file_name = $fileAttachment['rename']; $cm->file_name = $fileAttachment['rename'];
$cm->ip_address = ip2long($_SERVER['REMOTE_ADDR']); $cm->ip_address = ip2long($_SERVER['REMOTE_ADDR']);
+1 -1
View File
@@ -79,7 +79,7 @@ class IdentityControllerCore extends FrontController
if (!count($this->errors)) if (!count($this->errors))
{ {
$this->customer->id_default_group = (int)$prev_id_default_group; $this->customer->id_default_group = (int)$prev_id_default_group;
$this->customer->firstname = Tools::ucfirst(Tools::strtolower($this->customer->firstname)); $this->customer->firstname = Tools::ucwords($this->customer->firstname);
if (!isset($_POST['newsletter'])) if (!isset($_POST['newsletter']))
$this->customer->newsletter = 0; $this->customer->newsletter = 0;
@@ -35,9 +35,14 @@ function add_module_to_hook($module_name, $hook_name)
if ((int)$id_module > 0) if ((int)$id_module > 0)
{ {
$id_hook = Db::getInstance()->getValue(' $id_hook = Db::getInstance()->getValue('SELECT `id_hook` FROM `'._DB_PREFIX_.'hook` WHERE `name` = "'.$hook_name.'"');
SELECT `id_hook` FROM `'._DB_PREFIX_.'hook` WHERE `name` = "'.$hook_name.'" if(!$id_hook)
'); {
$res &= Db::getInstance()->execute('
INSERT IGNORE INTO `'._DB_PREFIX_.'hook` (`name`, `title`)
VALUES ("'.pSQL($hook_name).'", "'.pSQL($hook_name).'")');
$id_hook = Db::getInstance()->Insert_ID();
}
if ((int)$id_hook > 0) if ((int)$id_hook > 0)
{ {
@@ -51,7 +56,5 @@ function add_module_to_hook($module_name, $hook_name)
)'); )');
} }
} }
return $res; return $res;
} }
@@ -29,7 +29,8 @@ require_once(_PS_INSTALLER_PHP_UPGRADE_DIR_.'add_new_tab.php');
function create_multistore() function create_multistore()
{ {
$res = true; $res = true;
if (!defined('_THEME_NAME_'))
define('_THEME_NAME_', 'default');
// @todo : use _PS_ROOT_DIR_ // @todo : use _PS_ROOT_DIR_
if (defined('__PS_BASE_URI__')) if (defined('__PS_BASE_URI__'))
$INSTALLER__PS_BASE_URI = __PS_BASE_URI__; $INSTALLER__PS_BASE_URI = __PS_BASE_URI__;
+1 -1
View File
@@ -29,6 +29,6 @@ function remove_tab($tabname)
Db::getInstance()->execute(' Db::getInstance()->execute('
DELETE t, l DELETE t, l
FROM `'._DB_PREFIX_.'tab` t LEFT JOIN `'._DB_PREFIX_.'tab_lang` l ON (t.id_tab = l.id_tab) FROM `'._DB_PREFIX_.'tab` t LEFT JOIN `'._DB_PREFIX_.'tab_lang` l ON (t.id_tab = l.id_tab)
WHERE t.`class_name` = '.pSQL($tabname)); WHERE t.`class_name` = "'.pSQL($tabname).'"');
} }
+14
View File
@@ -1 +1,15 @@
ALTER TABLE `PREFIX_manufacturer_lang` CHANGE `short_description` `short_description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL; ALTER TABLE `PREFIX_manufacturer_lang` CHANGE `short_description` `short_description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
/* PHP:add_module_to_hook(blockcart, actionCartListOverride); */;
/* PHP:add_module_to_hook(blockmanufacturer, actionObjectManufacturerDeleteAfter); */;
/* PHP:add_module_to_hook(blockmanufacturer, actionObjectManufacturerAddAfter); */;
/* PHP:add_module_to_hook(blockmanufacturer, actionObjectManufacturerUpdateAfter); */;
/* PHP:add_module_to_hook(blocksupplier, actionObjectSupplierDeleteAfter); */;
/* PHP:add_module_to_hook(blocksupplier, actionObjectSupplierAddAfter); */;
/* PHP:add_module_to_hook(blocksupplier, actionObjectSupplierUpdateAfter); */;
/* PHP:add_module_to_hook(blockmyaccount, actionModuleRegisterHookAfter); */;
/* PHP:add_module_to_hook(blockmyaccountfooter, actionModuleRegisterHookAfter); */;
/* PHP:add_module_to_hook(blockmyaccount, actionModuleUnRegisterHookAfter); */;
/* PHP:add_module_to_hook(blockmyaccountfooter, actionModuleUnRegisterHookAfter); */;
/* PHP:remove_tab(AdminRangePrice); */;
/* PHP:remove_tab(AdminRangeWeight); */;
+4 -2
View File
@@ -119,7 +119,8 @@ function copy2friendlyURL()
function copyMeta2friendlyURL() function copyMeta2friendlyURL()
{ {
$('#input_link_rewrite_' + id_language).val(str2url($('#name_' + id_language).val().replace(/^[0-9]+\./, ''), 'UTF-8')); if (!$('input[name="id_cms"]').length)
$('#link_rewrite_' + id_language).val(str2url($('#name_' + id_language).val().replace(/^[0-9]+\./, ''), 'UTF-8'));
} }
function updateCurrentText() function updateCurrentText()
@@ -480,7 +481,7 @@ function askFeatureName(selected, selector)
{ {
var elem; var elem;
if (selected.value == 'feature') if (selected.value == 'features')
{ {
$('#features_' + selector).show(); $('#features_' + selector).show();
$('#feature_name_' + selector).attr('name', selected.name); $('#feature_name_' + selector).attr('name', selected.name);
@@ -750,6 +751,7 @@ function doAdminAjax(data, success_func, error_func)
{ {
url : 'index.php', url : 'index.php',
data : data, data : data,
type : 'POST',
success : function(data){ success : function(data){
if (success_func) if (success_func)
return success_func(data); return success_func(data);
+4 -4
View File
@@ -153,12 +153,13 @@ function displaySummary()
$('tr.range_inf td input').each( function() $('tr.range_inf td input').each( function()
{ {
if (!isNaN(parseFloat($(this).val())) && (range_inf == summary_translation_undefined || range_inf > $(this).val())) if (!isNaN(parseFloat($(this).val())) && (range_inf == summary_translation_undefined || parseFloat(range_inf) > parseFloat($(this).val())))
range_inf = $(this).val(); range_inf = $(this).val();
}); });
$('tr.range_sup td input').each( function(){ $('tr.range_sup td input').each( function(){
if (!isNaN(parseFloat($(this).val())) && (range_sup == summary_translation_undefined || range_sup < $(this).val()))
if (!isNaN(parseFloat($(this).val())) && (range_sup == summary_translation_undefined || parseFloat(range_sup) < parseFloat($(this).val())))
range_sup = $(this).val(); range_sup = $(this).val();
}); });
@@ -272,7 +273,6 @@ function bind_inputs()
}); });
$('tr.fees td input:checkbox').off('change').on('change', function () { $('tr.fees td input:checkbox').off('change').on('change', function () {
if($(this).is(':checked')) if($(this).is(':checked'))
{ {
$(this).closest('tr').children('td').each( function () { $(this).closest('tr').children('td').each( function () {
@@ -389,7 +389,7 @@ function hideFees()
function showFees() function showFees()
{ {
$('tr.range_inf td, tr.range_sup td, tr.fees_all td, tr.fees td').each( function () { $('tr.range_inf td, tr.range_sup td, tr.fees_all td, tr.fees td').each( function () {
if ($(this).index() >= 2) if ($(this).index() > 2)
{ {
//enable only if zone is active //enable only if zone is active
tr = $(this).parent('tr'); tr = $(this).parent('tr');
+2 -2
View File
@@ -94,7 +94,7 @@ param_product_url = '';
{if $value.nbr || !$hide_0_values} {if $value.nbr || !$hide_0_values}
<li class="nomargin {if $smarty.foreach.fe.index >= $filter.filter_show_limit}hiddable{/if}"> <li class="nomargin {if $smarty.foreach.fe.index >= $filter.filter_show_limit}hiddable{/if}">
{if isset($filter.is_color_group) && $filter.is_color_group} {if isset($filter.is_color_group) && $filter.is_color_group}
<input class="color-option {if isset($value.checked) && $value.checked}on{/if} {if !$value.nbr}disable{/if}" type="button" name="layered_{$filter.type_lite}_{$id_value}" rel="{$id_value}_{$filter.id_key}" id="layered_id_attribute_group_{$id_value}" {if !$value.nbr}disabled="disabled"{/if} style="background: {if isset($value.color)}{if file_exists($smarty.const._PS_ROOT_DIR_|cat:"/img/co/$id_value.jpg")}url(img/co/{$id_value}.jpg){else}{$value.color}{/if}{else}#CCC{/if};" /> <input class="color-option {if isset($value.checked) && $value.checked}on{/if} {if !$value.nbr}disable{/if}" type="button" name="layered_{$filter.type_lite}_{$id_value}" rel="{$id_value}_{$filter.id_key}" id="layered_id_attribute_group_{$id_value}" {if !$value.nbr}disabled="disabled"{/if} style="background: {if isset($value.color)}{if file_exists($col_img_dir|cat:$id_value|cat:'.jpg')}url({$img_col_dir}{$id_value}.jpg){else}{$value.color}{/if}{else}#CCC{/if};" />
{if isset($value.checked) && $value.checked}<input type="hidden" name="layered_{$filter.type_lite}_{$id_value}" value="{$id_value}" />{/if} {if isset($value.checked) && $value.checked}<input type="hidden" name="layered_{$filter.type_lite}_{$id_value}" value="{$id_value}" />{/if}
{else} {else}
<input type="checkbox" class="checkbox" name="layered_{$filter.type_lite}_{$id_value}" id="layered_{$filter.type_lite}{if $id_value || $filter.type == 'quantity'}_{$id_value}{/if}" value="{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}"{if isset($value.checked)} checked="checked"{/if}{if !$value.nbr} disabled="disabled"{/if} /> <input type="checkbox" class="checkbox" name="layered_{$filter.type_lite}_{$id_value}" id="layered_{$filter.type_lite}{if $id_value || $filter.type == 'quantity'}_{$id_value}{/if}" value="{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}"{if isset($value.checked)} checked="checked"{/if}{if !$value.nbr} disabled="disabled"{/if} />
@@ -115,7 +115,7 @@ param_product_url = '';
{if $value.nbr || !$hide_0_values} {if $value.nbr || !$hide_0_values}
<li class="nomargin {if $smarty.foreach.fe.index >= $filter.filter_show_limit}hiddable{/if}"> <li class="nomargin {if $smarty.foreach.fe.index >= $filter.filter_show_limit}hiddable{/if}">
{if isset($filter.is_color_group) && $filter.is_color_group} {if isset($filter.is_color_group) && $filter.is_color_group}
<input class="radio color-option {if isset($value.checked) && $value.checked}on{/if} {if !$value.nbr}disable{/if}" type="button" name="layered_{$filter.type_lite}_{$id_value}" rel="{$id_value}_{$filter.id_key}" id="layered_id_attribute_group_{$id_value}" {if !$value.nbr}disabled="disabled"{/if} style="background: {if isset($value.color)}{if file_exists($smarty.const._PS_ROOT_DIR_|cat:"/img/co/$id_value.jpg")}url(img/co/{$id_value}.jpg){else}{$value.color}{/if}{else}#CCC{/if};"/> <input class="radio color-option {if isset($value.checked) && $value.checked}on{/if} {if !$value.nbr}disable{/if}" type="button" name="layered_{$filter.type_lite}_{$id_value}" rel="{$id_value}_{$filter.id_key}" id="layered_id_attribute_group_{$id_value}" {if !$value.nbr}disabled="disabled"{/if} style="background: {if isset($value.color)}{if file_exists($col_img_dir|cat:$id_value|cat:'.jpg')}url({$img_col_dir}{$id_value}.jpg){else}{$value.color}{/if}{else}#CCC{/if};"/>
{if isset($value.checked) && $value.checked}<input type="hidden" name="layered_{$filter.type_lite}_{$id_value}" value="{$id_value}" />{/if} {if isset($value.checked) && $value.checked}<input type="hidden" name="layered_{$filter.type_lite}_{$id_value}" value="{$id_value}" />{/if}
{else} {else}
<input type="radio" class="radio layered_{$filter.type_lite}_{$id_value}" name="layered_{$filter.type_lite}{if $filter.id_key}_{$filter.id_key}{else}_1{/if}" id="layered_{$filter.type_lite}{if $id_value || $filter.type == 'quantity'}_{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}{/if}" value="{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}"{if isset($value.checked)} checked="checked"{/if}{if !$value.nbr} disabled="disabled"{/if} /> <input type="radio" class="radio layered_{$filter.type_lite}_{$id_value}" name="layered_{$filter.type_lite}{if $filter.id_key}_{$filter.id_key}{else}_1{/if}" id="layered_{$filter.type_lite}{if $id_value || $filter.type == 'quantity'}_{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}{/if}" value="{$id_value}{if $filter.id_key}_{$filter.id_key}{/if}"{if isset($value.checked)} checked="checked"{/if}{if !$value.nbr} disabled="disabled"{/if} />
@@ -135,6 +135,11 @@ class BlockNewProducts extends Module
return $this->hookRightColumn($params); return $this->hookRightColumn($params);
} }
public function hookHome($params)
{
return $this->hookRightColumn($params);
}
public function hookHeader($params) public function hookHeader($params)
{ {
$this->context->controller->addCSS(($this->_path).'blocknewproducts.css', 'all'); $this->context->controller->addCSS(($this->_path).'blocknewproducts.css', 'all');
+2 -2
View File
@@ -72,7 +72,7 @@ class CarrierCompare extends Module
$this->postProcess(); $this->postProcess();
$this->smarty->assign('refresh_method', Configuration::get('SE_RERESH_METHOD')); $this->smarty->assign('refresh_method', Configuration::get('SE_RERESH_METHOD'));
return $this->smarty->fetch($this->template_directory .'configuration.tpl'); return $this->display(__FILE__, 'template/configuration.tpl');
} }
public function postProcess() public function postProcess()
@@ -155,7 +155,7 @@ class CarrierCompare extends Module
'refresh_method' => ($refresh_method === false) ? 0 : $refresh_method 'refresh_method' => ($refresh_method === false) ? 0 : $refresh_method
)); ));
return $this->smarty->fetch($this->template_directory.'carriercompare.tpl'); return $this->display(__FILE__, 'template/carriercompare.tpl');
} }
/* /*
+3 -3
View File
@@ -218,9 +218,9 @@ class Editorial extends Module
if ($input['name'] != 'body_homepage_logo') if ($input['name'] != 'body_homepage_logo')
$helper->fields_value[$input['name']] = $editorial->{$input['name']}; $helper->fields_value[$input['name']] = $editorial->{$input['name']};
$helper->fields_value['image'] = (file_exists(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg') ? '<img src="'.$this->_path.'homepage_logo_'.(int)$id_shop.'.jpg">' : ''); $helper->fields_value['body_homepage_logo']['image'] = (file_exists(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg') ? '<img src="'.$this->_path.'homepage_logo_'.(int)$id_shop.'.jpg">' : '');
if ($helper->fields_value['image']) if ($helper->fields_value['body_homepage_logo'])
$helper->fields_value['size'] = filesize(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg') / 1000; $helper->fields_value['body_homepage_logo']['size'] = filesize(dirname(__FILE__).'/homepage_logo_'.(int)$id_shop.'.jpg') / 1000;
$this->_html .= $helper->generateForm($this->fields_form); $this->_html .= $helper->generateForm($this->fields_form);
return $this->_html; return $this->_html;
+45 -16
View File
@@ -36,6 +36,8 @@ class MailAlert extends ObjectModel
public $id_shop; public $id_shop;
public $id_lang;
/** /**
* @see ObjectModel::$definition * @see ObjectModel::$definition
*/ */
@@ -47,15 +49,19 @@ class MailAlert extends ObjectModel
'customer_email' => array('type' => self::TYPE_STRING, 'validate' => 'isEmail', 'required' => true), 'customer_email' => array('type' => self::TYPE_STRING, 'validate' => 'isEmail', 'required' => true),
'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true),
'id_product_attribute' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), 'id_product_attribute' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true),
'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true) 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true),
'id_lang' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true)
), ),
); );
public static function customerHasNotification($id_customer, $id_product, $id_product_attribute, $id_shop = null) public static function customerHasNotification($id_customer, $id_product, $id_product_attribute, $id_shop = null, $id_lang = null)
{ {
if ($id_shop == null) if ($id_shop == null)
$id_shop = Context::getContext()->shop->id; $id_shop = Context::getContext()->shop->id;
if ($id_lang == null)
$id_lang = Context::getContext()->language->id;
$customer = new Customer($id_customer); $customer = new Customer($id_customer);
$customer_email = $customer->email; $customer_email = $customer->email;
@@ -70,14 +76,15 @@ class MailAlert extends ObjectModel
return count(Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql)); return count(Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql));
} }
public static function deleteAlert($id_customer, $customer_email, $id_product, $id_product_attribute) public static function deleteAlert($id_customer, $customer_email, $id_product, $id_product_attribute, $id_shop)
{ {
$sql = ' $sql = '
DELETE FROM `'._DB_PREFIX_.self::$definition['table'].'` DELETE FROM `'._DB_PREFIX_.self::$definition['table'].'`
WHERE '.(($id_customer > 0) ? '(`customer_email` = \''.pSQL($customer_email).'\' OR `id_customer` = '.(int)$id_customer.')' : WHERE '.(($id_customer > 0) ? '(`customer_email` = \''.pSQL($customer_email).'\' OR `id_customer` = '.(int)$id_customer.')' :
'`customer_email` = \''.pSQL($customer_email).'\''). '`customer_email` = \''.pSQL($customer_email).'\'').
' AND `id_product` = '.(int)$id_product.' ' AND `id_product` = '.(int)$id_product.'
AND `id_product_attribute` = '.(int)$id_product_attribute; AND `id_product_attribute` = '.(int)$id_product_attribute.'
AND `id_shop` = '.(int)$id_shop;
return Db::getInstance()->execute($sql); return Db::getInstance()->execute($sql);
} }
@@ -160,17 +167,23 @@ class MailAlert extends ObjectModel
public static function sendCustomerAlert($id_product, $id_product_attribute) public static function sendCustomerAlert($id_product, $id_product_attribute)
{ {
$link = new Link(); $link = new Link();
$context = Context::getContext()->cloneContext();
$id_lang = (int)Context::getContext()->language->id;
$product = new Product((int)$id_product, false, $id_lang);
$templateVars = array(
'{product}' => (is_array($product->name) ? $product->name[$id_lang] : $product->name),
'{product_link}' => $link->getProductLink($product)
);
$customers = self::getCustomers($id_product, $id_product_attribute); $customers = self::getCustomers($id_product, $id_product_attribute);
foreach ($customers as $customer) foreach ($customers as $customer)
{ {
$id_shop = (int)$customer['id_shop'];
$id_lang = (int)$customer['id_lang'];
$context->shop->id = $id_shop;
$context->language->id = $id_lang;
$product = new Product((int)$id_product, false, $id_lang, $id_shop);
$product_link = $link->getProductLink($product, $product->link_rewrite, null, null, $id_lang, $id_shop);
$templateVars = array(
'{product}' => (is_array($product->name) ? $product->name[$id_lang] : $product->name),
'{product_link}' => $product_link
);
if ($customer['id_customer']) if ($customer['id_customer'])
{ {
$customer = new Customer((int)$customer['id_customer']); $customer = new Customer((int)$customer['id_customer']);
@@ -182,14 +195,30 @@ class MailAlert extends ObjectModel
$customer_id = 0; $customer_id = 0;
$customer_email = $customer['customer_email']; $customer_email = $customer['customer_email'];
} }
$iso = Language::getIsoById($id_lang); $iso = Language::getIsoById($id_lang);
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.txt') && if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.txt') &&
file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.html')) file_exists(dirname(__FILE__).'/mails/'.$iso.'/customer_qty.html'))
Mail::Send((int)Configuration::get('PS_LANG_DEFAULT'), 'customer_qty', Mail::l('Product available', $id_lang), $templateVars, strval($customer_email), NULL, strval(Configuration::get('PS_SHOP_EMAIL')), strval(Configuration::get('PS_SHOP_NAME')), NULL, NULL, dirname(__FILE__).'/mails/'); Mail::Send(
$id_lang,
'customer_qty',
Mail::l('Product available', $id_lang),
$templateVars,
strval($customer_email),
NULL,
strval(Configuration::get('PS_SHOP_EMAIL', null, null, $id_shop)),
strval(Configuration::get('PS_SHOP_NAME', null, null, $id_shop)),
NULL,
NULL,
dirname(__FILE__).'/mails/',
false,
$id_shop
);
Hook::exec('actionModuleMailAlertSendCustomer', array('product' => (is_array($product->name) ? $product->name[$id_lang] : $product->name), 'link' => $link->getProductLink($product), 'customer' => $customer, 'product_obj' => $product)); Hook::exec('actionModuleMailAlertSendCustomer', array('product' => (is_array($product->name) ? $product->name[$id_lang] : $product->name), 'link' => $product_link, 'customer' => $customer, 'product_obj' => $product));
self::deleteAlert((int)$customer_id, strval($customer_email), (int)$id_product, (int)$id_product_attribute);
self::deleteAlert((int)$customer_id, strval($customer_email), (int)$id_product, (int)$id_product_attribute, $id_shop);
} }
} }
@@ -244,7 +273,7 @@ class MailAlert extends ObjectModel
public static function getCustomers($id_product, $id_product_attribute) public static function getCustomers($id_product, $id_product_attribute)
{ {
$sql = ' $sql = '
SELECT id_customer, customer_email SELECT id_customer, customer_email, id_shop, id_lang
FROM `'._DB_PREFIX_.self::$definition['table'].'` FROM `'._DB_PREFIX_.self::$definition['table'].'`
WHERE `id_product` = '.(int)$id_product.' AND `id_product_attribute` = '.(int)$id_product_attribute; WHERE `id_product` = '.(int)$id_product.' AND `id_product_attribute` = '.(int)$id_product_attribute;
@@ -64,8 +64,10 @@ class MailalertsActionsModuleFrontController extends ModuleFrontController
if (!Validate::isLoadedObject($product)) if (!Validate::isLoadedObject($product))
die('0'); die('0');
if (MailAlert::deleteAlert((int)Context::getContext()->customer->id, (int)Context::getContext()->customer->email, (int)$product->id, (int)$this->id_product_attribute)) $context = Context::getContext();
if (MailAlert::deleteAlert((int)$context->customer->id, (int)$context->customer->email, (int)$product->id, (int)$this->id_product_attribute))
die('0'); die('0');
die(1); die(1);
} }
@@ -74,29 +76,32 @@ class MailalertsActionsModuleFrontController extends ModuleFrontController
*/ */
public function processAdd() public function processAdd()
{ {
if (Context::getContext()->customer->isLogged()) $context = Context::getContext();
if ($context->customer->isLogged())
{ {
$id_customer = (int)Context::getContext()->customer->id; $id_customer = (int)$context->customer->id;
$customer = new Customer($id_customer); $customer = new Customer($id_customer);
$customer_email = strval($customer->email); $customer_email = strval($customer->email);
} }
else else
{ {
$customer_email = strval(Tools::getValue('customer_email')); $customer_email = strval(Tools::getValue('customer_email'));
$customer = Context::getContext()->customer->getByEmail($customer_email); $customer = $context->customer->getByEmail($customer_email);
$id_customer = (isset($customer->id) && ($customer->id != null)) ? (int)$customer->id : null; $id_customer = (isset($customer->id) && ($customer->id != null)) ? (int)$customer->id : null;
} }
$id_product = (int)Tools::getValue('id_product'); $id_product = (int)Tools::getValue('id_product');
$id_product_attribute = (int)Tools::getValue('id_product_attribute'); $id_product_attribute = (int)Tools::getValue('id_product_attribute');
$id_shop = (int)Context::getContext()->shop->id; $id_shop = (int)$context->shop->id;
$product = new Product($id_product, null, null, $id_shop, Context::getContext()); $id_lang = (int)$context->language->id;
$product = new Product($id_product, false, $id_lang, $id_shop, $context);
$mailAlert = MailAlert::customerHasNotification($id_customer, $id_product, $id_product_attribute, $id_shop); $mailAlert = MailAlert::customerHasNotification($id_customer, $id_product, $id_product_attribute, $id_shop);
if ($mailAlert) if ($mailAlert)
die('2'); die('2');
else if (!Validate::isLoadedObject($product)) elseif (!Validate::isLoadedObject($product))
die('0'); die('0');
$mailAlert = new MailAlert(); $mailAlert = new MailAlert();
@@ -106,6 +111,7 @@ class MailalertsActionsModuleFrontController extends ModuleFrontController
$mailAlert->id_product = (int)$id_product; $mailAlert->id_product = (int)$id_product;
$mailAlert->id_product_attribute = (int)$id_product_attribute; $mailAlert->id_product_attribute = (int)$id_product_attribute;
$mailAlert->id_shop = (int)$id_shop; $mailAlert->id_shop = (int)$id_shop;
$mailAlert->id_lang = (int)$id_lang;
if ($mailAlert->add() !== false) if ($mailAlert->add() !== false)
die('1'); die('1');
@@ -124,12 +130,12 @@ class MailalertsActionsModuleFrontController extends ModuleFrontController
$id_customer = (int)$this->context->customer->id; $id_customer = (int)$this->context->customer->id;
if (!$id_product = (int)(Tools::getValue('id_product'))) if (!$id_product = (int)(Tools::getValue('id_product')))
die ('0'); die('0');
$id_product_attribute = (int)(Tools::getValue('id_product_attribute'));
$id_shop = (int)Context::getContext()->shop->id;
if (MailAlert::customerHasNotification((int)$id_customer, (int)$id_product, (int)$id_product_attribute, (int)$id_shop)) $id_product_attribute = (int)(Tools::getValue('id_product_attribute'));
die ('1');
if (MailAlert::customerHasNotification((int)$id_customer, (int)$id_product, (int)$id_product_attribute, (int)$this->context->shop->id))
die('1');
die('0'); die('0');
} }
+115 -80
View File
@@ -40,13 +40,13 @@ class MailAlerts extends Module
private $_merchant_coverage; private $_merchant_coverage;
private $_product_coverage; private $_product_coverage;
const __MA_MAIL_DELIMITOR__ = ','; const __MA_MAIL_DELIMITOR__ = "\n";
public function __construct() public function __construct()
{ {
$this->name = 'mailalerts'; $this->name = 'mailalerts';
$this->tab = 'administration'; $this->tab = 'administration';
$this->version = '2.4'; $this->version = '2.5';
$this->author = 'PrestaShop'; $this->author = 'PrestaShop';
$this->need_instance = 0; $this->need_instance = 0;
@@ -100,7 +100,8 @@ class MailAlerts extends Module
`id_product` int(10) unsigned NOT NULL, `id_product` int(10) unsigned NOT NULL,
`id_product_attribute` int(10) unsigned NOT NULL, `id_product_attribute` int(10) unsigned NOT NULL,
`id_shop` int(10) unsigned NOT NULL, `id_shop` int(10) unsigned NOT NULL,
PRIMARY KEY (`id_customer`,`customer_email`,`id_product`,`id_product_attribute`) `id_lang` int(10) unsigned NOT NULL,
PRIMARY KEY (`id_customer`,`customer_email`,`id_product`,`id_product_attribute`,`id_shop`)
) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci'; ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci';
if (!Db::getInstance()->execute($sql)) if (!Db::getInstance()->execute($sql))
@@ -161,7 +162,7 @@ class MailAlerts extends Module
$errors[] = $this->l('Invalid e-mail:').' '.Tools::safeOutput($email); $errors[] = $this->l('Invalid e-mail:').' '.Tools::safeOutput($email);
break; break;
} }
else if (!empty($email) && count($email) > 0) elseif (!empty($email) && count($email) > 0)
$emails[$k] = $email; $emails[$k] = $email;
else else
unset($emails[$k]); unset($emails[$k]);
@@ -171,15 +172,15 @@ class MailAlerts extends Module
if (!Configuration::updateValue('MA_MERCHANT_MAILS', strval($emails))) if (!Configuration::updateValue('MA_MERCHANT_MAILS', strval($emails)))
$errors[] = $this->l('Cannot update settings'); $errors[] = $this->l('Cannot update settings');
else if (!Configuration::updateValue('MA_MERCHANT_ORDER', (int)Tools::getValue('mA_merchand_order'))) elseif (!Configuration::updateValue('MA_MERCHANT_ORDER', (int)Tools::getValue('mA_merchand_order')))
$errors[] = $this->l('Cannot update settings'); $errors[] = $this->l('Cannot update settings');
else if (!Configuration::updateValue('MA_MERCHANT_OOS', (int)Tools::getValue('mA_merchand_oos'))) elseif (!Configuration::updateValue('MA_MERCHANT_OOS', (int)Tools::getValue('mA_merchand_oos')))
$errors[] = $this->l('Cannot update settings'); $errors[] = $this->l('Cannot update settings');
else if (!Configuration::updateValue('MA_LAST_QTIES', (int)Tools::getValue('MA_LAST_QTIES'))) elseif (!Configuration::updateValue('MA_LAST_QTIES', (int)Tools::getValue('MA_LAST_QTIES')))
$errors[] = $this->l('Cannot update settings'); $errors[] = $this->l('Cannot update settings');
else if (!Configuration::updateGlobalValue('MA_MERCHANT_COVERAGE', (int)Tools::getValue('mA_merchant_coverage'))) elseif (!Configuration::updateGlobalValue('MA_MERCHANT_COVERAGE', (int)Tools::getValue('mA_merchant_coverage')))
$errors[] = $this->l('Cannot update settings'); $errors[] = $this->l('Cannot update settings');
else if (!Configuration::updateGlobalValue('MA_PRODUCT_COVERAGE', (int)Tools::getValue('MA_PRODUCT_COVERAGE'))) elseif (!Configuration::updateGlobalValue('MA_PRODUCT_COVERAGE', (int)Tools::getValue('MA_PRODUCT_COVERAGE')))
$errors[] = $this->l('Cannot update settings'); $errors[] = $this->l('Cannot update settings');
} }
} }
@@ -262,14 +263,16 @@ class MailAlerts extends Module
return; return;
// Getting differents vars // Getting differents vars
$id_lang = (int)Context::getContext()->language->id; $context = Context::getContext();
$id_lang = (int)$context->language->id;
$id_shop = (int)$context->shop->id;
$currency = $params['currency']; $currency = $params['currency'];
$configuration = Configuration::getMultiple(array('PS_SHOP_EMAIL', 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_SHOP_NAME'));
$order = $params['order']; $order = $params['order'];
$customer = $params['customer']; $customer = $params['customer'];
$configuration = Configuration::getMultiple(array('PS_SHOP_EMAIL', 'PS_MAIL_METHOD', 'PS_MAIL_SERVER', 'PS_MAIL_USER', 'PS_MAIL_PASSWD', 'PS_SHOP_NAME', 'PS_MAIL_COLOR'), $id_lang, null, $id_shop);
$delivery = new Address((int)$order->id_address_delivery); $delivery = new Address((int)$order->id_address_delivery);
$invoice = new Address((int)$order->id_address_invoice); $invoice = new Address((int)$order->id_address_invoice);
$order_date_text = Tools::displayDate($order->date_add); $order_date_text = Tools::displayDate($order->date_add, (int)$id_lang);
$carrier = new Carrier((int)$order->id_carrier); $carrier = new Carrier((int)$order->id_carrier);
$message = $order->getFirstMessage(); $message = $order->getFirstMessage();
@@ -288,8 +291,7 @@ class MailAlerts extends Module
$customization_text = ''; $customization_text = '';
if (isset($customized_datas[$product['product_id']][$product['product_attribute_id']])) if (isset($customized_datas[$product['product_id']][$product['product_attribute_id']]))
{ {
foreach ($customized_datas[$product['product_id']][$product['product_attribute_id']][$order->id_address_delivery] as $customization)
foreach ($customized_datas[$product['product_id']][$product['product_attribute_id']] as $customization)
{ {
if (isset($customization['datas'][_CUSTOMIZE_TEXTFIELD_])) if (isset($customization['datas'][_CUSTOMIZE_TEXTFIELD_]))
foreach ($customization['datas'][_CUSTOMIZE_TEXTFIELD_] as $text) foreach ($customization['datas'][_CUSTOMIZE_TEXTFIELD_] as $text)
@@ -339,11 +341,11 @@ class MailAlerts extends Module
'{delivery_block_txt}' => MailAlert::getFormatedAddress($delivery, "\n"), '{delivery_block_txt}' => MailAlert::getFormatedAddress($delivery, "\n"),
'{invoice_block_txt}' => MailAlert::getFormatedAddress($invoice, "\n"), '{invoice_block_txt}' => MailAlert::getFormatedAddress($invoice, "\n"),
'{delivery_block_html}' => MailAlert::getFormatedAddress($delivery, '<br />', array( '{delivery_block_html}' => MailAlert::getFormatedAddress($delivery, '<br />', array(
'firstname' => '<span style="color:'.Configuration::get('PS_MAIL_COLOR').'; font-weight:bold;">%s</span>', 'firstname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>',
'lastname' => '<span style="color:'.Configuration::get('PS_MAIL_COLOR').'; font-weight:bold;">%s</span>')), 'lastname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>')),
'{invoice_block_html}' => MailAlert::getFormatedAddress($invoice, '<br />', array( '{invoice_block_html}' => MailAlert::getFormatedAddress($invoice, '<br />', array(
'firstname' => '<span style="color:'.Configuration::get('PS_MAIL_COLOR').' font-weight:bold;">%s</span>', 'firstname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].' font-weight:bold;">%s</span>',
'lastname' => '<span style="color:'.Configuration::get('PS_MAIL_COLOR').'; font-weight:bold;">%s</span>')), 'lastname' => '<span style="color:'.$configuration['PS_MAIL_COLOR'].'; font-weight:bold;">%s</span>')),
'{delivery_company}' => $delivery->company, '{delivery_company}' => $delivery->company,
'{delivery_firstname}' => $delivery->firstname, '{delivery_firstname}' => $delivery->firstname,
'{delivery_lastname}' => $delivery->lastname, '{delivery_lastname}' => $delivery->lastname,
@@ -353,9 +355,7 @@ class MailAlerts extends Module
'{delivery_postal_code}' => $delivery->postcode, '{delivery_postal_code}' => $delivery->postcode,
'{delivery_country}' => $delivery->country, '{delivery_country}' => $delivery->country,
'{delivery_state}' => $delivery->id_state ? $delivery_state->name : '', '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '',
'{delivery_phone}' => $delivery->phone, '{delivery_phone}' => $delivery->phone ? $delivery->phone : $delivery->phone_mobile,
'{delivery_phone_mobile}' => $delivery->phone_mobile,
'{delivery_vat_number}' => $delivery->vat_number,
'{delivery_other}' => $delivery->other, '{delivery_other}' => $delivery->other,
'{invoice_company}' => $invoice->company, '{invoice_company}' => $invoice->company,
'{invoice_firstname}' => $invoice->firstname, '{invoice_firstname}' => $invoice->firstname,
@@ -366,21 +366,18 @@ class MailAlerts extends Module
'{invoice_postal_code}' => $invoice->postcode, '{invoice_postal_code}' => $invoice->postcode,
'{invoice_country}' => $invoice->country, '{invoice_country}' => $invoice->country,
'{invoice_state}' => $invoice->id_state ? $invoice_state->name : '', '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '',
'{invoice_phone}' => $invoice->phone, '{invoice_phone}' => $invoice->phone ? $invoice->phone : $invoice->phone_mobile,
'{invoice_phone_mobile}' => $invoice->phone_mobile,
'{invoice_vat_number}' => $invoice->vat_number,
'{invoice_other}' => $invoice->other, '{invoice_other}' => $invoice->other,
'{order_name}' => sprintf('%06d', $order->id), '{order_name}' => sprintf('%06d', $order->id),
'{shop_name}' => Configuration::get('PS_SHOP_NAME'), '{shop_name}' => $configuration['PS_SHOP_NAME'],
'{date}' => $order_date_text, '{date}' => $order_date_text,
'{carrier}' => (($carrier->name == '0') ? Configuration::get('PS_SHOP_NAME') : $carrier->name), '{carrier}' => (($carrier->name == '0') ? $configuration['PS_SHOP_NAME'] : $carrier->name),
'{payment}' => Tools::substr($order->payment, 0, 32), '{payment}' => Tools::substr($order->payment, 0, 32),
'{items}' => $items_table, '{items}' => $items_table,
'{total_paid}' => Tools::displayPrice($order->total_paid, $currency), '{total_paid}' => Tools::displayPrice($order->total_paid, $currency),
'{total_products}' => Tools::displayPrice($order->getTotalProductsWithTaxes(), $currency), '{total_products}' => Tools::displayPrice($order->getTotalProductsWithTaxes(), $currency),
'{total_discounts}' => Tools::displayPrice($order->total_discounts, $currency), '{total_discounts}' => Tools::displayPrice($order->total_discounts, $currency),
'{total_shipping}' => Tools::displayPrice($order->total_shipping, $currency), '{total_shipping}' => Tools::displayPrice($order->total_shipping, $currency),
'{total_tax_paid}' => Tools::displayPrice(($order->total_products_wt - $order->total_products) + ($order->total_shipping_tax_incl - $order->total_shipping_tax_excl), $currency, false),
'{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency), '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $currency),
'{currency}' => $currency->sign, '{currency}' => $currency->sign,
'{message}' => $message '{message}' => $message
@@ -390,19 +387,28 @@ class MailAlerts extends Module
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.txt') && if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.txt') &&
file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.html')) file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.html'))
Mail::Send( {
$id_lang, // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients
$template, $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails);
sprintf(Mail::l('New order - #%06d', $id_lang), $order->id), foreach ($merchant_mails as $merchant_mail)
$template_vars, {
explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), Mail::Send(
null, $id_lang,
$configuration['PS_SHOP_EMAIL'], $template,
$configuration['PS_SHOP_NAME'], sprintf(Mail::l('New order - #%06d', $id_lang), $order->id),
null, $template_vars,
null, $merchant_mail,
dirname(__FILE__).'/mails/' null,
); $configuration['PS_SHOP_EMAIL'],
$configuration['PS_SHOP_NAME'],
null,
null,
dirname(__FILE__).'/mails/',
null,
$id_shop
);
}
}
} }
public function hookActionProductOutOfStock($params) public function hookActionProductOutOfStock($params)
@@ -410,18 +416,20 @@ class MailAlerts extends Module
if (!$this->_customer_qty || !Configuration::get('PS_STOCK_MANAGEMENT') || Product::isAvailableWhenOutOfStock($params['product']->out_of_stock)) if (!$this->_customer_qty || !Configuration::get('PS_STOCK_MANAGEMENT') || Product::isAvailableWhenOutOfStock($params['product']->out_of_stock))
return; return;
$context = Context::getContext();
$id_product = (int)$params['product']->id; $id_product = (int)$params['product']->id;
$id_product_attribute = 0; $id_product_attribute = 0;
$id_customer = (int)Context::getContext()->customer->id; $id_customer = (int)$context->customer->id;
if (!(int)Context::getContext()->customer->isLogged()) if ((int)$context->customer->id <= 0)
$this->context->smarty->assign('email', 1); $this->context->smarty->assign('email', 1);
else if (MailAlert::customerHasNotification($id_customer, $id_product, $id_product_attribute)) elseif (MailAlert::customerHasNotification($id_customer, $id_product, $id_product_attribute, (int)$context->shop->id))
return; return;
$this->context->smarty->assign(array( $this->context->smarty->assign(array(
'id_product' => $id_product, 'id_product' => $id_product,
'id_product_attribute' => $id_product_attribute)); 'id_product_attribute' => $id_product_attribute
));
return $this->display(__FILE__, 'product.tpl'); return $this->display(__FILE__, 'product.tpl');
} }
@@ -431,33 +439,47 @@ class MailAlerts extends Module
$id_product = (int)$params['id_product']; $id_product = (int)$params['id_product'];
$id_product_attribute = (int)$params['id_product_attribute']; $id_product_attribute = (int)$params['id_product_attribute'];
$quantity = (int)$params['quantity']; $quantity = (int)$params['quantity'];
$id_shop = (int)Context::getContext()->shop->id; $context = Context::getContext();
$id_lang = (int)Context::getContext()->language->id; $id_shop = (int)$context->shop->id;
$product = new Product($id_product, true, $id_lang, $id_shop, Context::getContext()); $id_lang = (int)$context->language->id;
$ma_last_qties = (int)Configuration::get('MA_LAST_QTIES'); $product = new Product($id_product, true, $id_lang, $id_shop, $context);
$configuration = Configuration::getMultiple(array('MA_LAST_QTIES', 'PS_STOCK_MANAGEMENT', 'PS_SHOP_EMAIL', 'PS_SHOP_NAME'), $id_lang, null, $id_shop);
$ma_last_qties = (int)$configuration['MA_LAST_QTIES'];
if ($product->active == 1 && (int)$quantity <= $ma_last_qties && !(!$this->_merchant_oos || empty($this->_merchant_mails)) && Configuration::get('PS_STOCK_MANAGEMENT')) if ($product->active == 1 && (int)$quantity <= $ma_last_qties && !(!$this->_merchant_oos || empty($this->_merchant_mails)) && $configuration['PS_STOCK_MANAGEMENT'])
{ {
$iso = Language::getIsoById($id_lang); $iso = Language::getIsoById($id_lang);
$product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang); $product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang);
$template_vars = array( $template_vars = array(
'{qty}' => $quantity, '{qty}' => $quantity,
'{last_qty}' => $ma_last_qties, '{last_qty}' => $ma_last_qties,
'{product}' => $product_name); '{product}' => $product_name
);
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.txt') && if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.txt') &&
file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.html')) file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.html'))
Mail::Send($id_lang, {
'productoutofstock', // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients
Mail::l('Product out of stock', $id_lang), $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails);
$template_vars, foreach ($merchant_mails as $merchant_mail)
explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), {
null, Mail::Send(
strval(Configuration::get('PS_SHOP_EMAIL')), $id_lang,
strval(Configuration::get('PS_SHOP_NAME')), 'productoutofstock',
null, Mail::l('Product out of stock', $id_lang),
null, $template_vars,
dirname(__FILE__).'/mails/'); $merchant_mail,
null,
strval($configuration['PS_SHOP_EMAIL']),
strval($configuration['PS_SHOP_NAME']),
null,
null,
dirname(__FILE__).'/mails/',
false,
$id_shop
);
}
}
} }
if ($this->_customer_qty && $quantity > 0) if ($this->_customer_qty && $quantity > 0)
@@ -541,31 +563,44 @@ class MailAlerts extends Module
$coverage = StockManagerFactory::getManager()->getProductCoverage($id_product, $id_product_attribute, $warning_coverage, $id_warehouse); $coverage = StockManagerFactory::getManager()->getProductCoverage($id_product, $id_product_attribute, $warning_coverage, $id_warehouse);
// if we need to send a notification // if we need to send a notification
if ($product->active == 1 && $coverage !== -1 && ($coverage < $warning_coverage) && !empty($this->_merchant_mails) && if ($product->active == 1 &&
($coverage < $warning_coverage) && !empty($this->_merchant_mails) &&
Configuration::getGlobalValue('MA_MERCHANT_COVERAGE')) Configuration::getGlobalValue('MA_MERCHANT_COVERAGE'))
{ {
$id_lang = (int)Context::getContext()->language->id; $context = Context::getContext();
$id_lang = (int)$context->language->id;
$id_shop = (int)$context->shop->id;
$iso = Language::getIsoById($id_lang); $iso = Language::getIsoById($id_lang);
$product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang); $product_name = Product::getProductName($id_product, $id_product_attribute, $id_lang);
$template_vars = array( $template_vars = array(
'{current_coverage}' => $coverage, '{current_coverage}' => $coverage,
'{warning_coverage}' => $warning_coverage, '{warning_coverage}' => $warning_coverage,
'{product}' => pSQL($product_name)); '{product}' => pSQL($product_name)
);
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productcoverage.txt') && if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productcoverage.txt') &&
file_exists(dirname(__FILE__).'/mails/'.$iso.'/productcoverage.html')) file_exists(dirname(__FILE__).'/mails/'.$iso.'/productcoverage.html'))
{ {
Mail::Send($id_lang, // Send 1 email by merchant mail, because Mail::Send doesn't work with an array of recipients
'productcoverage', $merchant_mails = explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails);
Mail::l('Stock coverage', $id_lang), foreach ($merchant_mails as $merchant_mail)
$template_vars, {
explode(self::__MA_MAIL_DELIMITOR__, $this->_merchant_mails), Mail::Send(
null, $id_lang,
strval(Configuration::get('PS_SHOP_EMAIL')), 'productcoverage',
strval(Configuration::get('PS_SHOP_NAME')), Mail::l('Stock coverage', $id_lang),
null, $template_vars,
null, $merchant_mail,
dirname(__FILE__).'/mails/'); null,
strval(Configuration::get('PS_SHOP_EMAIL')),
strval(Configuration::get('PS_SHOP_NAME')),
null,
null,
dirname(__FILE__).'/mails/',
null,
$id_shop
);
}
} }
} }
} }
@@ -0,0 +1,29 @@
<?php
if (!defined('_PS_VERSION_'))
exit;
function upgrade_module_2_5($object)
{
return Db::getInstance()->execute('
ALTER TABLE '._DB_PREFIX_.'mailalert_customer_oos
ADD '.mailalerts_stripslashes_field('id_lang').' INT( 10 ) UNSIGNED NOT NULL ,
DROP PRIMARY KEY ,
ADD PRIMARY KEY (
'.mailalerts_stripslashes_field('id_customer').' ,
'.mailalerts_stripslashes_field('customer_email').' ,
'.mailalerts_stripslashes_field('id_product').' ,
'.mailalerts_stripslashes_field('id_product_attribute').' ,
'.mailalerts_stripslashes_field('id_shop').'
)'
);
}
function mailalerts_stripslashes_field($field)
{
$quotes = array('"\\\'"', '"\'"');
$dquotes = array('\'\\\\"\'', '\'"\'');
$backslashes = array('"\\\\\\\\"', '"\\\\"');
return '`'.bqSQL($field).'` = replace(replace(replace(`'.bqSQL($field).'`, '.$quotes[0].', '.$quotes[1].'), '.$dquotes[0].', '.$dquotes[1].'), '.$backslashes[0].', '.$backslashes[1].')';
}
+22 -13
View File
@@ -844,19 +844,15 @@ class shopimporter extends ImportModule
default: default:
case 'Product': case 'Product':
$path = _PS_PROD_IMG_DIR_; $path = _PS_PROD_IMG_DIR_;
$type = 'products';
break; break;
case 'Category': case 'Category':
$path = _PS_CAT_IMG_DIR_; $path = _PS_CAT_IMG_DIR_;
$type = 'categories';
break; break;
case 'Manufacturer': case 'Manufacturer':
$path = _PS_MANU_IMG_DIR_; $path = _PS_MANU_IMG_DIR_;
$type = 'manufacturers';
break; break;
case 'Supplier': case 'Supplier':
$path = _PS_SUPP_IMG_DIR_; $path = _PS_SUPP_IMG_DIR_;
$type = 'suppliers';
break; break;
} }
$cover = 1; $cover = 1;
@@ -865,11 +861,8 @@ class shopimporter extends ImportModule
foreach($item['images'] as $key => $image) foreach($item['images'] as $key => $image)
{ {
$tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'import'); $tmpfile = tempnam(_PS_TMP_IMG_DIR_, 'import');
if (@copy(str_replace(' ', '%20', $image), $tmpfile)) if (@copy(str_replace(' ', '%20', $image), $tmpfile))
{ {
$imagesTypes = ImageType::getImagesTypes($type);
ImageManager::resize($tmpfile, $path.(int)$matchId[$item[$identifier]].'.jpg');
if ($className == 'Product') if ($className == 'Product')
{ {
$image = new Image(); $image = new Image();
@@ -884,13 +877,13 @@ class shopimporter extends ImportModule
$legend[Configuration::get('PS_LANG_DEFAULT')] = Tools::link_rewrite($val); $legend[Configuration::get('PS_LANG_DEFAULT')] = Tools::link_rewrite($val);
$image->legend = $legend; $image->legend = $legend;
$image->add(); $image->add();
ImageManager::resize($tmpfile, $path.(int)$matchId[$item[$identifier]].'-'.(int)$image->id.'.jpg'); $path = $image->getPathForCreation();
foreach ($imagesTypes AS $k => $imageType) ImageManager::resize($tmpfile, $path.'.jpg');
ImageManager::resize($tmpfile, $path.(int)$matchId[$item[$identifier]].'-'.(int)$image->id.'-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height']);
} }
else else
foreach ($imagesTypes as $imageType) {
ImageManager::resize($tmpfile, $path.(int)$matchId[$item[$identifier]].'-'.stripslashes($imageType['name']).'.jpg', $imageType['width'], $imageType['height']); ImageManager::resize($tmpfile, $path.(int)$matchId[$item[$identifier]].'.jpg');
}
} }
else else
@unlink($tmpfile); @unlink($tmpfile);
@@ -1490,9 +1483,11 @@ class shopimporter extends ImportModule
$order->total_products_wt = (float)$item['total_products_wt']; $order->total_products_wt = (float)$item['total_products_wt'];
$order->total_discounts = (float)$item['total_discounts']; $order->total_discounts = (float)$item['total_discounts'];
$order->total_shipping = (float)$item['total_shipping']; $order->total_shipping = (float)$item['total_shipping'];
$order->total_shipping_tax_incl = (float)$item['total_shipping'];
$order->carrier_tax_rate = (float)$carrier->getTaxesRate(new Address((int)$item[Configuration::get('PS_TAX_ADDRESS_TYPE')])); $order->carrier_tax_rate = (float)$carrier->getTaxesRate(new Address((int)$item[Configuration::get('PS_TAX_ADDRESS_TYPE')]));
$order->total_wrapping = (float)$item['total_wrapping']; $order->total_wrapping = (float)$item['total_wrapping'];
$order->total_paid = (float)$item['total_paid']; $order->total_paid = (float)$item['total_paid'];
$order->total_paid_tax_incl = (float)$item['total_paid'];
$order->total_paid_real = (float)$item['total_paid_real']; $order->total_paid_real = (float)$item['total_paid_real'];
$order->invoice_date = '0000-00-00 00:00:00'; $order->invoice_date = '0000-00-00 00:00:00';
$order->delivery_date = '0000-00-00 00:00:00'; $order->delivery_date = '0000-00-00 00:00:00';
@@ -1505,6 +1500,20 @@ class shopimporter extends ImportModule
$order->valid = 1; $order->valid = 1;
else else
$order->valid = 0; $order->valid = 0;
if (array_key_exists('current_state', $item))
$order->current_state = $item['current_state'];
if (array_key_exists('reference', $item))
$order->reference = $item['reference'];
if (array_key_exists('invoice_number', $item))
$order->invoice_number = $item['invoice_number'];
if (array_key_exists('delivery_number', $item))
$order->delivery_number = $item['delivery_number'];
if (array_key_exists('invoice_date', $item))
$order->invoice_date = $item['invoice_date'];
if (array_key_exists('delivery_date', $item))
$order->delivery_date = $item['delivery_date'];
$order->save(false, false); $order->save(false, false);
$this->saveMatchId('order', (int)$order->id, (int)$item['id_cart']); $this->saveMatchId('order', (int)$order->id, (int)$item['id_cart']);
+1 -1
View File
@@ -160,7 +160,7 @@ $(document).ready(function() {
<fieldset> <fieldset>
<h3>{l s='Create an account'}</h3> <h3>{l s='Create an account'}</h3>
<div class="form_content clearfix"> <div class="form_content clearfix">
<p class="title_block">{l s='Please enter your email address to create an account.'}.</p> <p class="title_block">{l s='Please enter your email address to create an account.'}</p>
<div class="error" id="create_account_error" style="display:none"></div> <div class="error" id="create_account_error" style="display:none"></div>
<p class="text"> <p class="text">
<label for="email_create">{l s='Email address'}</label> <label for="email_create">{l s='Email address'}</label>
+1 -1
View File
@@ -34,7 +34,7 @@
</p> </p>
<p> <p>
<h2>{l s='Please provide an explanation for your RMA:'}</h2> <h2>{l s='Please provide an explanation for your RMA:'}</h2>
<form method="POST" id="returnOrderMessage"/> <form method="POST" id="returnOrderMessage">
<p class="textarea"> <p class="textarea">
<textarea name="returnText"></textarea> <textarea name="returnText"></textarea>
</p> </p>
+4 -11
View File
@@ -433,17 +433,10 @@ var fieldRequired = '{l s='Please fill in all the required fields before saving
{/if} {/if}
{*close if for show price*} {*close if for show price*}
{/if} {/if}
{if (!$allow_oosp && $product->quantity <= 0) OR !$product->available_for_order OR (isset($restricted_country_mode) AND $restricted_country_mode) OR $PS_CATALOG_MODE} <p id="add_to_cart" {if (!$allow_oosp && $product->quantity <= 0) OR !$product->available_for_order OR (isset($restricted_country_mode) AND $restricted_country_mode) OR $PS_CATALOG_MODE}style="display:none"{/if} class="buttons_bottom_block">
<span class="exclusive"> <span></span>
<span></span> <input type="submit" name="Submit" value="{l s='Add to cart'}" class="exclusive" />
{l s='Add to cart'} </p>
</span>
{else}
<p id="add_to_cart" class="buttons_bottom_block">
<span></span>
<input type="submit" name="Submit" value="{l s='Add to cart'}" class="exclusive" />
</p>
{/if}
{if isset($HOOK_PRODUCT_ACTIONS) && $HOOK_PRODUCT_ACTIONS}{$HOOK_PRODUCT_ACTIONS}{/if} {if isset($HOOK_PRODUCT_ACTIONS) && $HOOK_PRODUCT_ACTIONS}{$HOOK_PRODUCT_ACTIONS}{/if}
<div class="clear"></div> <div class="clear"></div>
@@ -278,9 +278,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data {
// //
// render cached template // render cached template
// //
/* PrestaShop related to PSCFV-10040 - http://www.smarty.net/forums/viewtopic.php?p=76467 */ $_template->properties['unifunc']($_template);
if (isset($_template->properties['unifunc']))
$_template->properties['unifunc']($_template);
// any unclosed {capture} tags ? // any unclosed {capture} tags ?
if (isset($_template->_capture_stack[0][0])) { if (isset($_template->_capture_stack[0][0])) {
$_template->capture_error(); $_template->capture_error();