// MERGE product_multistore branch : product fields are now editable per shop

git-svn-id: http://dev.prestashop.com/svn/v1/branches/1.5.x@14682 b9a71923-0436-4b27-9f14-aed3839534dd
This commit is contained in:
rMalie
2012-04-17 13:32:12 +00:00
parent d4d1c35cb9
commit 0c2dd0cd2f
134 changed files with 3185 additions and 1789 deletions
+4 -3
View File
@@ -18,6 +18,7 @@ fieldset{background-color:#EBEDF4; border:1px solid #CCCED7; color:#585A69; font
.Bloc {background-color:#EBEDF4; border:1px solid #CCCED7;font-size:1.1em;margin:0;padding:1em} .Bloc {background-color:#EBEDF4; border:1px solid #CCCED7;font-size:1.1em;margin:0;padding:1em}
legend{background:#EBEDF4;border:1px solid #CCCED7;font-weight:700;margin:0;padding:.2em .5em;text-align:left} legend{background:#EBEDF4;border:1px solid #CCCED7;font-weight:700;margin:0;padding:.2em .5em;text-align:left}
input[type="text"],input[type="password"],input[type="file"],textarea {border:1px solid #ccc; background-color:#fff;} input[type="text"],input[type="password"],input[type="file"],textarea {border:1px solid #ccc; background-color:#fff;}
input[type="text"]:disabled,input[type="password"]:disabled,input[type="file"]:disabled,textarea:disabled {border:1px solid #ccc; background-color:#dedede; color: #444444;}
select { border:1px solid #ccc; font-size: 12px;} select { border:1px solid #ccc; font-size: 12px;}
select[disabled="disabled"], input[disabled="disabled"],textarea[disabled="disabled"], option[disabled="disabled"] {border: 1px solid #CCCCCC;color: #AAAAAA} select[disabled="disabled"], input[disabled="disabled"],textarea[disabled="disabled"], option[disabled="disabled"] {border: 1px solid #CCCCCC;color: #AAAAAA}
.header_module{background:url('../img/header_module.png');padding-left: 0.5em;padding-top: 0.8em;height:20px;color: #812143;border:solid 1px #CCC;} .header_module{background:url('../img/header_module.png');padding-left: 0.5em;padding-top: 0.8em;height:20px;color: #812143;border:solid 1px #CCC;}
@@ -182,9 +183,9 @@ a.module_toggle_all{color: #268CCD;}
.multishop_toolbar select.shopList { width: 300px; } .multishop_toolbar select.shopList { width: 300px; }
.multishop_toolbar a.chzn-single { background: url('../img/icon-multishop.png') no-repeat 5px 5px; padding: 1px 2px 2px 25px; font-weight: bold; } .multishop_toolbar a.chzn-single { background: url('../img/icon-multishop.png') no-repeat 5px 5px; padding: 1px 2px 2px 25px; font-weight: bold; }
.multishop_toolbar .chzn-container .first{font-weight: bold;background-color: #408BD5;color: #ffffff;} .multishop_toolbar .chzn-container .chzn-results .first{font-weight: bold;background-color: #408BD5;color: #ffffff;}
.multishop_toolbar .chzn-container .group{font-weight: bold;font-style: italic;padding-left: 15px;background-color: #C6DEFC;} .multishop_toolbar .chzn-container .chzn-results .group{font-weight: bold;font-style: italic;padding-left: 15px;background-color: #C6DEFC;}
.multishop_toolbar .chzn-container .shop{padding-left: 30px;background-color: #EAF2FC;} .multishop_toolbar .chzn-container .chzn-results .shop{padding-left: 30px;background-color: #EAF2FC;}
/*toolbarBox*/ /*toolbarBox*/
.toolbarBox { background-color: #F8F8F8; border: 1px solid #CCCCCC; margin-bottom:10px; padding: 10px 0; border-radius:3px; -moz-border-radius:3px; -webkit-border-radius:3px;} .toolbarBox { background-color: #F8F8F8; border: 1px solid #CCCCCC; margin-bottom:10px; padding: 10px 0; border-radius:3px; -moz-border-radius:3px; -webkit-border-radius:3px;}
Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

@@ -69,10 +69,10 @@
var changeAssociationGroup = function() var changeAssociationGroup = function()
{ {
var id_attribute_group = $('#id_attribute_group').val(); var id_attribute_group = $('#id_attribute_group').val();
$('.input_group_shop').each(function(k, item) $('.input_shop_group').each(function(k, item)
{ {
var id_group_shop = $(item).val(); var id_shop_group = $(item).val();
if (typeof shop_associations[id_attribute_group] != 'undefined' && $.inArray(id_group_shop, shop_associations[id_attribute_group]) > -1) if (typeof shop_associations[id_attribute_group] != 'undefined' && $.inArray(id_shop_group, shop_associations[id_attribute_group]) > -1)
$(item).attr('disabled', false); $(item).attr('disabled', false);
else else
{ {
@@ -66,12 +66,6 @@
</td> </td>
</tr> </tr>
</table> </table>
{if $feature_shop_active}
<div class="separation"></div>
{* @todo use asso_shop from Helper *}
<label>{l s='Shop association:'}</label>
{$displayAssoShop}
{/if}
<div class="separation"></div> <div class="separation"></div>
<table> <table>
@@ -40,9 +40,19 @@
theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,media,|,ltr,rtl,|,fullscreen", theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,media,|,ltr,rtl,|,fullscreen",
theme_advanced_buttons4 : "styleprops,|,cite,abbr,acronym,del,ins,attribs,pagebreak", theme_advanced_buttons4 : "styleprops,|,cite,abbr,acronym,del,ins,attribs,pagebreak",
setup : function(ed) { setup : function(ed) {
{* Count the total number of the field *} {* Count the total number of the field *}
ed.onInit.add(function(ed)
{
if (typeof load_tinymce_multishop[ed.id] != 'undefined')
{
if (typeof load_tinymce_multishop[ed.id])
ed.hide();
else
ed.show();
}
});
ed.onKeyUp.add(function(ed, e) { ed.onKeyUp.add(function(ed, e) {
tinyMCE.triggerSave(); tinyMCE.triggerSave();
textarea = $('#'+ed.id); textarea = $('#'+ed.id);
@@ -94,8 +104,12 @@
var save_error = {if $save_error}true{else}false{/if}; var save_error = {if $save_error}true{else}false{/if};
var product_type = {$product_type}; var product_type = {$product_type};
{*var mce_maximum = '{l s='Maximum'}'; {*var mce_maximum = '{l s='Maximum'}';*}
var mce_characters = '{l s='characters'}';*} {if isset($display_multishop_checkboxes) && $display_multishop_checkboxes}
var display_multishop_checkboxes = true;
{else}
var display_multishop_checkboxes = false;
{/if}
$(document).ready(function() $(document).ready(function()
{ {
@@ -23,18 +23,74 @@
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{if $check_product_association_ajax}
{assign var=class_input_ajax value='check_product_name '}
{else}
{assign var=class_input_ajax value=''}
{/if}
<input type="hidden" name="submitted_tabs[]" value="Informations" /> <input type="hidden" name="submitted_tabs[]" value="Informations" />
<div id="step1"> <div id="step1">
<h4 class="tab">1. {l s='Info.'}</h4> <h4 class="tab">1. {l s='Info.'}</h4>
<h4>{l s='Product global information'}</h4> <h4>{l s='Product global information'}</h4>
<script type="text/javascript"> <script type="text/javascript">
{$combinationImagesJs} {$combinationImagesJs}
{if $check_product_association_ajax}
var search_term = '';
$('document').ready( function() {
$(".check_product_name")
.autocomplete(
'{$link->getAdminLink('AdminProducts', true)}', {
minChars: 3,
max: 10,
width: $(".check_product_name").width(),
selectFirst: false,
scroll: false,
dataType: "json",
formatItem: function(data, i, max, value, term) {
search_term = term;
// adding the little
if ($('.ac_results').find('.separation').length == 0)
$('.ac_results').css('background-color', '#EFEFEF')
.prepend('<div style="color:#585A69; padding:2px 5px">{l s='Use a product from the list'}<div class="separation"></div></div>');
return value;
},
parse: function(data) {
var mytab = new Array();
for (var i = 0; i < data.length; i++)
mytab[mytab.length] = { data: data[i], value: data[i].name };
return mytab;
},
extraParams: {
ajax: 1,
action: 'checkProductName',
id_lang: {$id_lang}
}
}
)
.result(function(event, data, formatted) {
// keep the searched term in the input
$('#name_{$id_lang}').val(search_term);
jConfirm('{l s='Do you want to use this product?'}&nbsp;<strong>'+data.name+'</strong>', '{l s='Confirmation'}', function(confirm){
if (confirm == true)
document.location.href = '{$link->getAdminLink('AdminProducts', true)}&updateproduct&id_product='+data.id_product;
else
return false;
});
});
});
{/if}
</script> </script>
{if isset($display_common_field) && $display_common_field}
<div class="warn" style="display: block">{l s='Warning, if you change the value of fields with an orange bullet %s, the value will be changed for all other shops for this product' sprintf=$bullet_common_field}</div>
{/if}
{include file="controllers/products/multishop/check_fields.tpl" product_tab="Informations"}
<div class="separation"></div> <div class="separation"></div>
<div> <div>
<label class="text">{l s='Type:'}</label> <label class="text">{$bullet_common_field} {l s='Type:'}</label>
<input type="radio" name="type_product" id="simple_product" value="{Product::PTYPE_SIMPLE}" {if $product_type == Product::PTYPE_SIMPLE}checked="checked"{/if} /> <input type="radio" name="type_product" id="simple_product" value="{Product::PTYPE_SIMPLE}" {if $product_type == Product::PTYPE_SIMPLE}checked="checked"{/if} />
<label class="radioCheck" for="simple_product">{l s='Product'}</label> <label class="radioCheck" for="simple_product">{l s='Product'}</label>
<input type="radio" name="type_product" id="pack_product" value="{Product::PTYPE_PACK}" {if $product_type == Product::PTYPE_PACK}checked="checked"{/if} /> <input type="radio" name="type_product" id="pack_product" value="{Product::PTYPE_PACK}" {if $product_type == Product::PTYPE_PACK}checked="checked"{/if} />
@@ -48,35 +104,37 @@
<table cellpadding="5" style="width: 50%; float: left; margin-right: 20px; border-right: 1px solid #CCCCCC;"> <table cellpadding="5" style="width: 50%; float: left; margin-right: 20px; border-right: 1px solid #CCCCCC;">
{* global information *} {* global information *}
<tr> <tr>
<td class="col-left"><label>{l s='Name:'}</label></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="name" type="default" multilang="true"}
<label>{l s='Name:'}</label>
</td>
<td style="padding-bottom:5px;" class="translatable"> <td style="padding-bottom:5px;" class="translatable">
{foreach from=$languages item=language} {foreach from=$languages item=language}
<div class="lang_{$language.id_lang}" style="{if !$language.is_default}display: none;{/if} float: left;"> <div class="lang_{$language.id_lang}" style="{if !$language.is_default}display: none;{/if} float: left;">
<input class="{if !$product->id}copy2friendlyUrl{/if} updateCurrentText" size="43" type="text" {if !$product->id}disabled="disabled"{/if} <input class="{$class_input_ajax}{if !$product->id}copy2friendlyUrl{/if} updateCurrentText" size="43" type="text" {if !$product->id}disabled="disabled"{/if}
id="name_{$language.id_lang}" name="name_{$language.id_lang}" id="name_{$language.id_lang}" name="name_{$language.id_lang}"
value="{$product->name[$language.id_lang]|htmlentitiesUTF8|default:''}"/><sup> *</sup> value="{$product->name[$language.id_lang]|htmlentitiesUTF8|default:''}"/><sup> *</sup>
<span class="hint" name="help_box">{l s='Invalid characters:'} <>;=#{}<span class="hint-pointer">&nbsp;</span> <span class="hint" name="help_box">{l s='Invalid characters:'} <>;=#{}<span class="hint-pointer">&nbsp;</span>
</span> </span>
</div> </div>
{/foreach} {/foreach}
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='Reference:'}</label></td> <td class="col-left"><label>{$bullet_common_field} {l s='Reference:'}</label></td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<input size="55" type="text" name="reference" value="{$product->reference|htmlentitiesUTF8}" style="width: 130px; margin-right: 44px;" /> <input size="55" type="text" name="reference" value="{$product->reference|htmlentitiesUTF8}" style="width: 130px; margin-right: 44px;" />
<span class="hint" name="help_box">{l s='Special characters allowed:'}.-_#\<span class="hint-pointer">&nbsp;</span></span> <span class="hint" name="help_box">{l s='Special characters allowed:'}.-_#\<span class="hint-pointer">&nbsp;</span></span>
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='EAN13 or JAN:'}</label></td> <td class="col-left"><label>{$bullet_common_field} {l s='EAN13 or JAN:'}</label></td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<input size="55" maxlength="13" type="text" name="ean13" value="{$product->ean13|htmlentitiesUTF8}" style="width: 130px; margin-right: 5px;" /> <span class="small">{l s='(Europe, Japan)'}</span> <input size="55" maxlength="13" type="text" name="ean13" value="{$product->ean13|htmlentitiesUTF8}" style="width: 130px; margin-right: 5px;" /> <span class="small">{l s='(Europe, Japan)'}</span>
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='UPC:'}</label></td> <td class="col-left"><label>{$bullet_common_field} {l s='UPC:'}</label></td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<input size="55" maxlength="12" type="text" name="upc" value="{$product->upc}" style="width: 130px; margin-right: 5px;" /> <span class="small">{l s='(US, Canada)'}</span> <input size="55" maxlength="12" type="text" name="upc" value="{$product->upc}" style="width: 130px; margin-right: 5px;" /> <span class="small">{l s='(US, Canada)'}</span>
</td> </td>
@@ -86,6 +144,7 @@
<table cellpadding="5" style="width: 40%; float: left; margin-left: 10px;"> <table cellpadding="5" style="width: 40%; float: left; margin-left: 10px;">
<tr> <tr>
<td class="col-left"> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="active" type="radio" onclick=""}
<label class="text">{l s='Status:'}</label> <label class="text">{l s='Status:'}</label>
</td> </td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
@@ -102,7 +161,10 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='Visibility:'}</label></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="visibility" type="default"}
<label>{l s='Visibility:'}</label>
</td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<select name="visibility" id="visibility"> <select name="visibility" id="visibility">
<option value="both" {if $product->visibility == 'both'}selected="selected"{/if} >{l s='Everywhere'}</option> <option value="both" {if $product->visibility == 'both'}selected="selected"{/if} >{l s='Everywhere'}</option>
@@ -113,7 +175,19 @@
</td> </td>
</tr> </tr>
<tr id="product_options" {if !$product->active}style="display:none"{/if} > <tr id="product_options" {if !$product->active}style="display:none"{/if} >
<td class="col-left"><label>{l s='Options:'}</label></td> <td class="col-left">
{if isset($display_multishop_checkboxes) && $display_multishop_checkboxes}
<div class="multishop_product_checkbox">
<ul class="listForm">
<li>{include file="controllers/products/multishop/checkbox.tpl" only_checkbox="true" field="available_for_order" type="default"}</li>
<li>{include file="controllers/products/multishop/checkbox.tpl" only_checkbox="true" field="show_price" type="show_price"}</li>
<li>{include file="controllers/products/multishop/checkbox.tpl" only_checkbox="true" field="online_only" type="default"}</li>
</ul>
</div>
{/if}
<label>{l s='Options:'}</label>
</td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<ul class="listForm"> <ul class="listForm">
<li> <li>
@@ -128,10 +202,14 @@
<input type="checkbox" name="online_only" id="online_only" value="1" {if $product->online_only}checked="checked"{/if} /> <input type="checkbox" name="online_only" id="online_only" value="1" {if $product->online_only}checked="checked"{/if} />
<label for="online_only" class="t">{l s='online only (not sold in store)'}</label> <label for="online_only" class="t">{l s='online only (not sold in store)'}</label>
</li> </li>
</ul>
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='Condition:'}</label></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="condition" type="default"}
<label>{l s='Condition:'}</label>
</td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<select name="condition" id="condition"> <select name="condition" id="condition">
<option value="new" {if $product->condition == 'new'}selected="selected"{/if} >{l s='New'}</option> <option value="new" {if $product->condition == 'new'}selected="selected"{/if} >{l s='New'}</option>
@@ -140,13 +218,16 @@
</select> </select>
</td> </td>
</tr> </tr>
</ul>
</table> </table>
<table cellpadding="5" cellspacing="0" border="0" style="width: 100%;"><tr><td><div class="separation"></div></td></tr></table> <table cellpadding="5" cellspacing="0" border="0" style="width: 100%;"><tr><td><div class="separation"></div></td></tr></table>
<table cellspacing="0" cellpadding="5" border="0"> <table cellspacing="0" cellpadding="5" border="0">
<tr> <tr>
<td class="col-left"><label>{l s='Short description:'}<br /></label><p class="product_description">({l s='appears in the product lists and on the top of the product page'})</p></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="description_short" type="tinymce" multilang="true"}
<label>{l s='Short description:'}<br /></label>
<p class="product_description">({l s='appears in the product lists and on the top of the product page'})</p>
</td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
{include file="controllers/products/textarea_lang.tpl" {include file="controllers/products/textarea_lang.tpl"
languages=$languages languages=$languages
@@ -157,7 +238,11 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='Description:'}<br /></label><p class="product_description">({l s='appears in the body of the product page'})</p></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="description" type="tinymce" multilang="true"}
<label>{l s='Description:'}<br /></label>
<p class="product_description">({l s='appears in the body of the product page'})</p>
</td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
{include file="controllers/products/textarea_lang.tpl" languages=$languages {include file="controllers/products/textarea_lang.tpl" languages=$languages
input_name='description' input_name='description'
@@ -257,4 +342,3 @@
</table> </table>
<br /> <br />
</div> </div>
@@ -0,0 +1,32 @@
{*
* 2007-2012 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2012 PrestaShop SA
* @version Release: $Revision: 9856 $
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
{if isset($display_multishop_checkboxes) && $display_multishop_checkboxes}
<label style="float: none">
<input type="checkbox" style="vertical-align: text-bottom" onclick="$('input[name^=\'multishop_check[\']').attr('checked', this.checked); multishopCheckAllProductFields{$product_tab}()" />
{l s='Check / uncheck all (you are editing this page for several shops, some fields like "name" or "price" are disabled, you have to check these fields in order to edit them for these shops)'}
</label>
{/if}
@@ -0,0 +1,51 @@
{*
* 2007-2012 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2012 PrestaShop SA
* @version Release: $Revision: 9856 $
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
{if isset($display_multishop_checkboxes) && $display_multishop_checkboxes}
{if isset($multilang) && $multilang}
{if isset($only_checkbox)}
{foreach from=$languages item=language}
<input type="checkbox" name="multishop_check[{$field}][{$language.id_lang}]" value="1" onclick="multishopCheckProductField(this.checked, '{$field}_{$language.id_lang}', '{$type}')" {if !empty($multishop_check[$field][$language.id_lang])}checked="checked"{/if} />
{/foreach}
{else}
<div class="multishop_product_checkbox">
{foreach from=$languages item=language}
<div class="multishop_lang_{$language.id_lang}" style="{if !$language.is_default}display: none;{/if}">
<input type="checkbox" name="multishop_check[{$field}][{$language.id_lang}]" value="1" onclick="multishopCheckProductField(this.checked, '{$field}_{$language.id_lang}', '{$type}')" {if !empty($multishop_check[$field][$language.id_lang])}checked="checked"{/if} />
</div>
{/foreach}
</div>
{/if}
{else}
{if isset($only_checkbox)}
<input type="checkbox" name="multishop_check[{$field}]" value="1" onclick="multishopCheckProductField(this.checked, '{$field}', '{$type}')" {if !empty($multishop_check[$field])}checked="checked"{/if} />
{else}
<div class="multishop_product_checkbox">
<input type="checkbox" name="multishop_check[{$field}]" value="1" onclick="multishopCheckProductField(this.checked, '{$field}', '{$type}')" {if !empty($multishop_check[$field])}checked="checked"{/if} />
</div>
{/if}
{/if}
{/if}
@@ -106,18 +106,27 @@ jQuery(document).ready(Customer.init);
<div class="hint" style="display:block;min-height:0;"> <div class="hint" style="display:block;min-height:0;">
{l s='You must enter either the pre-tax retail price, or the retail price with tax. The input field will be automatically calculated.'} {l s='You must enter either the pre-tax retail price, or the retail price with tax. The input field will be automatically calculated.'}
</div> </div>
{include file="controllers/products/multishop/check_fields.tpl" product_tab="Price"}
<div class="separation"></div> <div class="separation"></div>
<table> <table>
<tr> <tr>
<td class="col-left"><label>{l s='Pre-tax wholesale price:'}</label></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="wholesale_price" type="default"}
<label>{l s='Pre-tax wholesale price:'}</label>
</td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
{$currency->prefix}<input size="11" maxlength="14" name="wholesale_price" type="text" value="{$product->wholesale_price|string_format:'%.2f'}" onchange="this.value = this.value.replace(/,/g, '.');" />{$currency->suffix} {$currency->prefix}<input size="11" maxlength="14" name="wholesale_price" id="wholesale_price" type="text" value="{$product->wholesale_price|string_format:'%.2f'}" onchange="this.value = this.value.replace(/,/g, '.');" />{$currency->suffix}
<p class="preference_description">{l s='The wholesale price at which you bought this product'}</p> <p class="preference_description">{l s='The wholesale price at which you bought this product'}</p>
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='Pre-tax retail price:'}</label></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="price" type="price"}
<label>{l s='Pre-tax retail price:'}</label>
</td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<input type="hidden" id="priceTEReal" name="price" value="{$product->price}" /> <input type="hidden" id="priceTEReal" name="price" value="{$product->price}" />
{$currency->prefix}<input size="11" maxlength="14" id="priceTE" name="price_displayed" type="text" value="{$product->price|string_format:'%.2f'}" onchange="noComma('priceTE'); $('#priceTEReal').val(this.value);" onkeyup="$('#priceType').val('TE'); $('#priceTEReal').val(this.value.replace(/,/g, '.')); if (isArrowKey(event)) return; calcPriceTI();" />{$currency->suffix} {$currency->prefix}<input size="11" maxlength="14" id="priceTE" name="price_displayed" type="text" value="{$product->price|string_format:'%.2f'}" onchange="noComma('priceTE'); $('#priceTEReal').val(this.value);" onkeyup="$('#priceType').val('TE'); $('#priceTEReal').val(this.value.replace(/,/g, '.')); if (isArrowKey(event)) return; calcPriceTI();" />{$currency->suffix}
@@ -125,7 +134,10 @@ jQuery(document).ready(Customer.init);
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='Tax rule:'}</label></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="id_tax_rules_group" type="default"}
<label>{l s='Tax rule:'}</label>
</td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<script type="text/javascript"> <script type="text/javascript">
noTax = {if $tax_exclude_taxe_option}true{else}false{/if}; noTax = {if $tax_exclude_taxe_option}true{else}false{/if};
@@ -177,7 +189,10 @@ jQuery(document).ready(Customer.init);
</td> </td>
</tr> </tr>
<tr id="tr_unit_price"> <tr id="tr_unit_price">
<td class="col-left"><label>{l s='Unit price:'}</label></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="unit_price" type="unit_price"}
<label>{l s='Unit price:'}</label>
</td>
<td> <td>
{$currency->prefix} <input size="11" maxlength="14" id="unit_price" name="unit_price" type="text" value="{$unit_price|string_format:'%.2f'}" {$currency->prefix} <input size="11" maxlength="14" id="unit_price" name="unit_price" type="text" value="{$unit_price|string_format:'%.2f'}"
onkeyup="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.'); unitPriceWithTax('unit');"/>{$currency->suffix} onkeyup="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.'); unitPriceWithTax('unit');"/>{$currency->suffix}
@@ -197,7 +212,10 @@ jQuery(document).ready(Customer.init);
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>&nbsp;</label></td> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="on_sale" type="default"}
<label>&nbsp;</label>
</td>
<td> <td>
<input type="checkbox" name="on_sale" id="on_sale" style="padding-top: 5px;" {if $product->on_sale}checked="checked"{/if} value="1" />&nbsp;<label for="on_sale" class="t">{l s='Display "on sale" icon on product page and text on product listing'}</label> <input type="checkbox" name="on_sale" id="on_sale" style="padding-top: 5px;" {if $product->on_sale}checked="checked"{/if} value="1" />&nbsp;<label for="on_sale" class="t">{l s='Display "on sale" icon on product page and text on product listing'}</label>
</td> </td>
@@ -26,11 +26,15 @@
<input type="hidden" name="submitted_tabs[]" value="Seo" /> <input type="hidden" name="submitted_tabs[]" value="Seo" />
<h4>{l s='SEO'}</h4> <h4>{l s='SEO'}</h4>
{include file="controllers/products/multishop/check_fields.tpl" product_tab="Seo"}
<div class="separation"></div> <div class="separation"></div>
<table> <table>
<tr> <tr>
<td class="col-left"> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="meta_title" type="default" multilang="true"}
<label>{l s='Meta title:'}</label> <label>{l s='Meta title:'}</label>
</td> </td>
<td> <td>
@@ -43,6 +47,7 @@
</tr> </tr>
<tr> <tr>
<td class="col-left"> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="meta_description" type="default" multilang="true"}
<label>{l s='Meta description:'}</label> <label>{l s='Meta description:'}</label>
</td> </td>
<td> <td>
@@ -56,6 +61,7 @@
</tr> </tr>
<tr> <tr>
<td class="col-left"> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="meta_keywords" type="default" multilang="true"}
<label>{l s='Meta keywords:'}</label> <label>{l s='Meta keywords:'}</label>
</td> </td>
<td> <td>
@@ -67,6 +73,7 @@
</tr> </tr>
<tr> <tr>
<td class="col-left"> <td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="link_rewrite" type="default" multilang="true"}
<label>{l s='Friendly URL:'}</label> <label>{l s='Friendly URL:'}</label>
</td> </td>
<td> <td>
@@ -84,5 +91,3 @@
</td> </td>
</tr> </tr>
</table> </table>
@@ -28,31 +28,35 @@
<h4 class="tab">1. {l s='Info.'}</h4> <h4 class="tab">1. {l s='Info.'}</h4>
<h4>{l s='Shipping'}</h4> <h4>{l s='Shipping'}</h4>
{if isset($display_common_field) && $display_common_field}
<div class="hint" style="display: block">{l s='Warning, if you change the value of fields with an orange bullet %s, the value will be changed for all other shops for this product' sprintf=$bullet_common_field}</div>
{/if}
<div class="separation"></div> <div class="separation"></div>
<table> <table>
<tr> <tr>
<td class="col-left"><label>{l s='Width (package):'}</label></td> <td class="col-left"><label>{l s='Width (package):'}</label></td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<input size="6" maxlength="6" name="width" type="text" value="{$product->width}" onKeyUp="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.');" /> {$ps_dimension_unit} <input size="6" maxlength="6" name="width" type="text" value="{$product->width}" onKeyUp="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.');" />{$bullet_common_field} {$ps_dimension_unit}
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='Height (package):'}</label></td> <td class="col-left"><label>{l s='Height (package):'}</label></td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<input size="6" maxlength="6" name="height" type="text" value="{$product->height}" onKeyUp="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.');" /> {$ps_dimension_unit} <input size="6" maxlength="6" name="height" type="text" value="{$product->height}" onKeyUp="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.');" />{$bullet_common_field} {$ps_dimension_unit}
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='Depth (package):'}</label></td> <td class="col-left"><label>{l s='Depth (package):'}</label></td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<input size="6" maxlength="6" name="depth" type="text" value="{$product->depth}" onKeyUp="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.');" /> {$ps_dimension_unit} <input size="6" maxlength="6" name="depth" type="text" value="{$product->depth}" onKeyUp="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.');" />{$bullet_common_field} {$ps_dimension_unit}
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="col-left"><label>{l s='Weight (package):'}</label></td> <td class="col-left"><label>{l s='Weight (package):'}</label></td>
<td style="padding-bottom:5px;"> <td style="padding-bottom:5px;">
<input size="6" maxlength="6" name="weight" type="text" value="{$product->weight}" onKeyUp="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.');" /> {$ps_weight_unit} <input size="6" maxlength="6" name="weight" type="text" value="{$product->weight}" onKeyUp="if (isArrowKey(event)) return ;this.value = this.value.replace(/,/g, '.');" />{$bullet_common_field} {$ps_weight_unit}
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -27,7 +27,7 @@
{block name="label"} {block name="label"}
{if $input.type == 'text' && $input.name == 'name'} {if $input.type == 'text' && $input.name == 'name'}
<div class="hint" name="help_box" style="display:block;">{l s='You can\'t change the GroupShop when you have more than one Shop'}</div><br /> <div class="hint" name="help_box" style="display:block;">{l s='You can\'t change the shop group when you have more than one Shop'}</div><br />
{/if} {/if}
{$smarty.block.parent} {$smarty.block.parent}
{/block} {/block}
@@ -42,7 +42,7 @@
</div> </div>
{/foreach} {/foreach}
<div class="clear">&nbsp;</div> <div class="clear">&nbsp;</div>
{elseif $input.type == 'textGroupShop'} {elseif $input.type == 'textShopGroup'}
{$input.value} {$input.value}
{else} {else}
{if $input.type == 'select' && $input.name == 'id_category'} {if $input.type == 'select' && $input.name == 'id_category'}
@@ -67,57 +67,11 @@
{block name="label"} {block name="label"}
{if $input.type == 'text' && $input.name == 'name'} {if $input.type == 'text' && $input.name == 'name'}
<div class="hint" name="help_box" style="display:block;">{l s='You can\'t edit GroupShop when you have more than one shop'}</div><br /> <div class="hint" name="help_box" style="display:block;">{l s='You can\'t edit the shop group when you have more than one shop'}</div><br />
{/if} {/if}
{if isset($input.label)} {if isset($input.label)}
<label>{$input.label} </label> <label>{$input.label} </label>
{/if} {/if}
{/block} {/block}
{block name="other_fieldsets"}
{if isset($form_import)}
<br /><br />
<fieldset>
{foreach $form_import as $key => $field}
{if $key == 'legend'}
<legend>
{if isset($field.image)}<img src="{$field.image}" alt="{$field.title}" />{/if}
{$field.title}
</legend>
{elseif $key == 'label'}
<label>{$field}</label>
{/if}
<div class="clear"></div>
{if $key == 'checkbox'}
<div class="margin-form">
<label><input type="{$field.type}" value="{$field.value}" name="{$field.name}" id="{$field.name}" {if $checked} checked="checked"{/if}/> {$field.label}</label>
{elseif $key == 'select'}
<select name="{$field.name}" id="{$field.name}">
{foreach $field.options.query AS $key => $option}
<option value="{$key}" {if $key == $defaultGroup}selected="selected"{/if}>
{$option.name}
</option>
{/foreach}
</select>
{elseif $key == 'allcheckbox'}
<div id="importList" {if !$checked}style="display:none"{/if}>
<ul>
{foreach $field.values as $key => $label}
<li><label><input type="checkbox" name="importData[{$key}]" checked="checked" /> {$label}</label></li>
{/foreach}
</ul>
</div>
{elseif $key == 'p'}
<p>{$field}</p>
</div>
{elseif $key == 'submit'}
<div class="margin-form">
<input type="submit" value="{$field.title}" name="submitAdd{$table}" {if isset($field.class)}class="{$field.class}"{/if} />
</div>
{/if}
{/foreach}
</fieldset>
{/if}
{/block}
+1 -1
View File
@@ -221,7 +221,7 @@
</div> </div>
{/if} {/if}
{if $display_header && $is_multishop && ($multishop_context & Shop::CONTEXT_GROUP || $multishop_context & Shop::CONTEXT_SHOP)} {if $display_header && $is_multishop && $shop_list && ($multishop_context & Shop::CONTEXT_GROUP || $multishop_context & Shop::CONTEXT_SHOP)}
<div class="multishop_toolbar"> <div class="multishop_toolbar">
<span class="text_multishop">{l s='Multishop configuration for'}</span> <span class="text_multishop">{l s='Multishop configuration for'}</span>
{$shop_list} {$shop_list}
@@ -29,30 +29,30 @@ $().ready(function() {
// Click on "all shop" // Click on "all shop"
$('.input_all_shop').live('click', function() { $('.input_all_shop').live('click', function() {
var checked = $(this).attr('checked'); var checked = $(this).attr('checked');
$('.input_group_shop:not(:disabled)').attr('checked', checked); $('.input_shop_group:not(:disabled)').attr('checked', checked);
$('.input_shop:not(:disabled)').attr('checked', checked); $('.input_shop:not(:disabled)').attr('checked', checked);
}); });
// Click on a group shop // Click on a group shop
$('.input_group_shop').live('click', function() { $('.input_shop_group').live('click', function() {
$('.input_shop[value='+$(this).val()+']').attr('checked', $(this).attr('checked')); $('.input_shop[value='+$(this).val()+']').attr('checked', $(this).attr('checked'));
check_all_shop(); check_all_shop();
}); });
// Click on a shop // Click on a shop
$('.input_shop').live('click', function() { $('.input_shop').live('click', function() {
check_group_shop_status($(this).val()); check_shop_group_status($(this).val());
check_all_shop(); check_all_shop();
}); });
// Initialize checkbox // Initialize checkbox
$('.input_group_shop').each(function(k, v) { $('.input_shop_group').each(function(k, v) {
check_group_shop_status($(v).val()); check_shop_group_status($(v).val());
check_all_shop(); check_all_shop();
}); });
}); });
function check_group_shop_status(id_group) { function check_shop_group_status(id_group) {
var groupChecked = true; var groupChecked = true;
var total = 0; var total = 0;
$('.input_shop[value='+id_group+']').each(function(k, v) { $('.input_shop[value='+id_group+']').each(function(k, v) {
@@ -62,12 +62,12 @@ function check_group_shop_status(id_group) {
}); });
if (total > 0) if (total > 0)
$('.input_group_shop[value='+id_group+']').attr('checked', groupChecked); $('.input_shop_group[value='+id_group+']').attr('checked', groupChecked);
} }
function check_all_shop() { function check_all_shop() {
var allChecked = true; var allChecked = true;
$('.input_group_shop:not(:disabled)').each(function(k, v) { $('.input_shop_group:not(:disabled)').each(function(k, v) {
if (!$(v).attr('checked')) if (!$(v).attr('checked'))
allChecked = false; allChecked = false;
}); });
@@ -78,26 +78,22 @@ function check_all_shop() {
<div class="assoShop"> <div class="assoShop">
<table class="table" cellpadding="0" cellspacing="0" width="100%"> <table class="table" cellpadding="0" cellspacing="0" width="100%">
<tr> <tr>
<th>{if $input.type == 'group_shop'}{l s='Group shop'}{else}{l s='Shop'}{/if}</th> <th>{l s='Shop'}</th>
</tr> </tr>
<tr {if $input.type == 'group_shop'}class="alt_row"{/if}> <tr>
<td> <td>
<label class="t"><input class="input_all_shop" type="checkbox" /> <b>{if $input.type == 'group_shop'}{l s='All group shops'}{else}{l s='All shops'}{/if}</b></label> <label class="t"><input class="input_all_shop" type="checkbox" /> <b>{l s='All shops'}</b></label>
</td> </td>
</tr> </tr>
{foreach $input.values as $groupID => $groupData} {foreach $input.values as $groupID => $groupData}
{if ($input.type == 'group_shop' && isset($fields_value.shop[$groupID]))}
{assign var=groupChecked value=true}
{else}
{assign var=groupChecked value=false} {assign var=groupChecked value=false}
{/if}
<tr {if $input.type == 'shop'}class="alt_row"{/if}> <tr {if $input.type == 'shop'}class="alt_row"{/if}>
<td> <td>
<img style="vertical-align:middle;" alt="" src="../img/admin/lv2_b.gif" /> <img style="vertical-align:middle;" alt="" src="../img/admin/lv2_b.gif" />
<label class="t"> <label class="t">
<input class="input_group_shop" <input class="input_shop_group"
type="checkbox" type="checkbox"
name="checkBoxGroupShopAsso_{$table}[{$form_id}][{$groupID}]" name="checkBoxShopGroupAsso_{$table}[{$form_id}][{$groupID}]"
value="{$groupID}" value="{$groupID}"
{if $groupChecked} checked="checked"{/if} /> {if $groupChecked} checked="checked"{/if} />
<b>{l s='Group:'} {$groupData['name']}</b> <b>{l s='Group:'} {$groupData['name']}</b>
@@ -284,7 +284,7 @@
{elseif $input.type == 'group'} {elseif $input.type == 'group'}
{assign var=groups value=$input.values} {assign var=groups value=$input.values}
{include file='helpers/form/form_group.tpl'} {include file='helpers/form/form_group.tpl'}
{elseif $input.type == 'shop' OR $input.type == 'group_shop'} {elseif $input.type == 'shop'}
{$input.html} {$input.html}
{elseif $input.type == 'categories'} {elseif $input.type == 'categories'}
{include file='helpers/form/form_category.tpl' categories=$input.values} {include file='helpers/form/form_category.tpl' categories=$input.values}
@@ -58,11 +58,21 @@
<p>{$categoryData['info']}</p> <p>{$categoryData['info']}</p>
{/if} {/if}
{if $use_multishop}
<input type="checkbox" style="vertical-align: text-top" checked="checked" onclick="checkAllMultishopDefaultValue(this)" /> <b>{l s='Uncheck / check all'}</b> {l s='(uncheck boxes if you want to set a custom value for this shop or group shop context)'}
<div class="separation"></div>
{/if}
{foreach $categoryData['fields'] AS $key => $field} {foreach $categoryData['fields'] AS $key => $field}
{if $field['type'] == 'hidden'} {if $field['type'] == 'hidden'}
<input type="hidden" name="{$key}" value="{$field['value']}" /> <input type="hidden" name="{$key}" value="{$field['value']}" />
{else} {else}
<div style="clear: both; padding-top:15px;" id="conf_id_{$key}" {if $field['is_invisible']} class="isInvisible"{/if}> <div style="clear: both; padding-top:15px;" id="conf_id_{$key}" {if $field['is_invisible']} class="isInvisible"{/if}>
{if ($field['multishop_default'])}
<div class="preference_default_multishop">
<input type="checkbox" name="configUseDefault[{$key}]" value="1" {if $field['is_disabled']} checked="checked"{/if} onclick="checkMultishopDefaultValue(this, '{$key}')" />
</div>
{/if}
{block name="label"} {block name="label"}
{if isset($field['title'])} {if isset($field['title'])}
<label class="conf_title"> <label class="conf_title">
@@ -170,13 +180,6 @@
{/if} {/if}
{if isset($field['hint'])}<span class="hint" name="help_box">{$field['hint']}<span class="hint-pointer">&nbsp;</span></span>{/if} {if isset($field['hint'])}<span class="hint" name="help_box">{$field['hint']}<span class="hint-pointer">&nbsp;</span></span>{/if}
{/block}{* end block input *} {/block}{* end block input *}
{if ($field['multishop_default'])}
<div class="preference_default_multishop">
<label>
<input type="checkbox" name="configUseDefault[{$key}]" value="1" {if $field['is_disabled']} checked="checked"{/if} onclick="checkMultishopDefaultValue(this, '{$key}')" /> {l s='Use default value'}
</label>
</div>
{/if}
{if isset($field['desc'])}<p class="preference_description">{$field['desc']}</p>{/if} {if isset($field['desc'])}<p class="preference_description">{$field['desc']}</p>{/if}
{if $field['is_invisible']}<p class="warn">{l s='You can\'t change the value of this configuration field in the context of this shop'}</p>{/if} {if $field['is_invisible']}<p class="warn">{l s='You can\'t change the value of this configuration field in the context of this shop'}</p>{/if}
</div> </div>
+4 -4
View File
@@ -76,8 +76,6 @@
'AdminGendersControllerCore' => 'controllers/admin/AdminGendersController.php', 'AdminGendersControllerCore' => 'controllers/admin/AdminGendersController.php',
'AdminGeolocationController' => 'override/controllers/admin/AdminGeolocationController.php', 'AdminGeolocationController' => 'override/controllers/admin/AdminGeolocationController.php',
'AdminGeolocationControllerCore' => 'controllers/admin/AdminGeolocationController.php', 'AdminGeolocationControllerCore' => 'controllers/admin/AdminGeolocationController.php',
'AdminGroupShopController' => 'override/controllers/admin/AdminGroupShopController.php',
'AdminGroupShopControllerCore' => 'controllers/admin/AdminGroupShopController.php',
'AdminGroupsController' => 'override/controllers/admin/AdminGroupsController.php', 'AdminGroupsController' => 'override/controllers/admin/AdminGroupsController.php',
'AdminGroupsControllerCore' => 'controllers/admin/AdminGroupsController.php', 'AdminGroupsControllerCore' => 'controllers/admin/AdminGroupsController.php',
'AdminHomeController' => 'override/controllers/admin/AdminHomeController.php', 'AdminHomeController' => 'override/controllers/admin/AdminHomeController.php',
@@ -156,6 +154,8 @@
'AdminShippingControllerCore' => 'controllers/admin/AdminShippingController.php', 'AdminShippingControllerCore' => 'controllers/admin/AdminShippingController.php',
'AdminShopController' => 'override/controllers/admin/AdminShopController.php', 'AdminShopController' => 'override/controllers/admin/AdminShopController.php',
'AdminShopControllerCore' => 'controllers/admin/AdminShopController.php', 'AdminShopControllerCore' => 'controllers/admin/AdminShopController.php',
'AdminShopGroupController' => 'override/controllers/admin/AdminShopGroupController.php',
'AdminShopGroupControllerCore' => 'controllers/admin/AdminShopGroupController.php',
'AdminShopUrlController' => 'override/controllers/admin/AdminShopUrlController.php', 'AdminShopUrlController' => 'override/controllers/admin/AdminShopUrlController.php',
'AdminShopUrlControllerCore' => 'controllers/admin/AdminShopUrlController.php', 'AdminShopUrlControllerCore' => 'controllers/admin/AdminShopUrlController.php',
'AdminSlipController' => 'override/controllers/admin/AdminSlipController.php', 'AdminSlipController' => 'override/controllers/admin/AdminSlipController.php',
@@ -346,8 +346,6 @@
'GroupCore' => 'classes/Group.php', 'GroupCore' => 'classes/Group.php',
'GroupReduction' => 'override/classes/GroupReduction.php', 'GroupReduction' => 'override/classes/GroupReduction.php',
'GroupReductionCore' => 'classes/GroupReduction.php', 'GroupReductionCore' => 'classes/GroupReduction.php',
'GroupShop' => 'override/classes/shop/GroupShop.php',
'GroupShopCore' => 'classes/shop/GroupShop.php',
'Guest' => 'override/classes/Guest.php', 'Guest' => 'override/classes/Guest.php',
'GuestCore' => 'classes/Guest.php', 'GuestCore' => 'classes/Guest.php',
'GuestTrackingController' => 'override/controllers/front/GuestTrackingController.php', 'GuestTrackingController' => 'override/controllers/front/GuestTrackingController.php',
@@ -548,6 +546,8 @@
'SearchEngineCore' => 'classes/SearchEngine.php', 'SearchEngineCore' => 'classes/SearchEngine.php',
'Shop' => 'override/classes/shop/Shop.php', 'Shop' => 'override/classes/shop/Shop.php',
'ShopCore' => 'classes/shop/Shop.php', 'ShopCore' => 'classes/shop/Shop.php',
'ShopGroup' => 'override/classes/shop/ShopGroup.php',
'ShopGroupCore' => 'classes/shop/ShopGroup.php',
'ShopUrl' => 'override/classes/shop/ShopUrl.php', 'ShopUrl' => 'override/classes/shop/ShopUrl.php',
'ShopUrlCore' => 'classes/shop/ShopUrl.php', 'ShopUrlCore' => 'classes/shop/ShopUrl.php',
'SitemapController' => 'override/controllers/front/SitemapController.php', 'SitemapController' => 'override/controllers/front/SitemapController.php',
+26 -46
View File
@@ -98,7 +98,7 @@ abstract class AdminTabCore
public $optionTitle = null; public $optionTitle = null;
/** @var string shop | group_shop */ /** @var string shop */
public $shopLinkType; public $shopLinkType;
/** @var bool */ /** @var bool */
@@ -923,12 +923,8 @@ abstract class AdminTabCore
protected static function getAssoShop($table, $id_object = false) protected static function getAssoShop($table, $id_object = false)
{ {
$shopAsso = Shop::getAssoTables(); if (Shop::isTableAssociated($table))
$groupShopAsso = GroupShop::getAssoTables();
if (isset($shopAsso[$table]) && $shopAsso[$table]['type'] == 'shop')
$type = 'shop'; $type = 'shop';
else if (isset($groupShopAsso[$table]) && $groupShopAsso[$table]['type'] == 'group_shop')
$type = 'group_shop';
else else
return; return;
@@ -1313,15 +1309,6 @@ abstract class AdminTabCore
$filterKey = $assos[$this->table]['type']; $filterKey = $assos[$this->table]['type'];
$idenfierShop = Shop::getContextListShopID(); $idenfierShop = Shop::getContextListShopID();
} }
else if (Shop::getContext() == Shop::CONTEXT_GROUP)
{
$assos = GroupShop::getAssoTables();
if (isset($assos[$this->table]) && $assos[$this->table]['type'] == 'group_shop')
{
$filterKey = $assos[$this->table]['type'];
$idenfierShop = array(Shop::getContextGroupShopID());
}
}
$filterShop = ''; $filterShop = '';
if (isset($filterKey)) if (isset($filterKey))
@@ -2328,19 +2315,16 @@ abstract class AdminTabCore
$this->l('Click here if you want to modify the main shop domain name').'</a>'); $this->l('Click here if you want to modify the main shop domain name').'</a>');
} }
protected function displayAssoShop($type = 'shop') protected function displayAssoShop()
{ {
if (!Shop::isFeatureActive() || (!$this->_object && Shop::getContext() != Shop::CONTEXT_ALL)) if (!Shop::isFeatureActive() || (!$this->_object && Shop::getContext() != Shop::CONTEXT_ALL))
return; return;
if ($type != 'shop' && $type != 'group_shop')
$type = 'shop';
$assos = array(); $assos = array();
$sql = 'SELECT id_'.$type.', `'.pSQL($this->identifier).'` $sql = 'SELECT id_shop, `'.pSQL($this->identifier).'`
FROM `'._DB_PREFIX_.pSQL($this->table).'_'.$type.'`'; FROM `'._DB_PREFIX_.pSQL($this->table).'_shop`';
foreach (Db::getInstance()->executeS($sql) as $row) foreach (Db::getInstance()->executeS($sql) as $row)
$assos[$row['id_'.$type]][] = $row[$this->identifier]; $assos[$row['id_shop']][] = $row[$this->identifier];
$html = <<<EOF $html = <<<EOF
<script type="text/javascript"> <script type="text/javascript">
@@ -2350,12 +2334,12 @@ abstract class AdminTabCore
$('.input_all_shop').click(function() $('.input_all_shop').click(function()
{ {
var checked = $(this).attr('checked'); var checked = $(this).attr('checked');
$('.input_group_shop').attr('checked', checked); $('.input_shop_group').attr('checked', checked);
$('.input_shop').attr('checked', checked); $('.input_shop').attr('checked', checked);
}); });
// Click on a group shop // Click on a group shop
$('.input_group_shop').click(function() $('.input_shop_group').click(function()
{ {
$('.input_shop[value='+$(this).val()+']').attr('checked', $(this).attr('checked')); $('.input_shop[value='+$(this).val()+']').attr('checked', $(this).attr('checked'));
check_all_shop(); check_all_shop();
@@ -2364,19 +2348,19 @@ abstract class AdminTabCore
// Click on a shop // Click on a shop
$('.input_shop').click(function() $('.input_shop').click(function()
{ {
check_group_shop_status($(this).val()); check_shop_group_status($(this).val());
check_all_shop(); check_all_shop();
}); });
// Initialize checkbox // Initialize checkbox
$('.input_shop').each(function(k, v) $('.input_shop').each(function(k, v)
{ {
check_group_shop_status($(v).val()); check_shop_group_status($(v).val());
check_all_shop(); check_all_shop();
}); });
}); });
function check_group_shop_status(id_group) function check_shop_group_status(id_group)
{ {
var groupChecked = true; var groupChecked = true;
$('.input_shop[value='+id_group+']').each(function(k, v) $('.input_shop[value='+id_group+']').each(function(k, v)
@@ -2384,13 +2368,13 @@ abstract class AdminTabCore
if (!$(v).attr('checked')) if (!$(v).attr('checked'))
groupChecked = false; groupChecked = false;
}); });
$('.input_group_shop[value='+id_group+']').attr('checked', groupChecked); $('.input_shop_group[value='+id_group+']').attr('checked', groupChecked);
} }
function check_all_shop() function check_all_shop()
{ {
var allChecked = true; var allChecked = true;
$('.input_group_shop').each(function(k, v) $('.input_shop_group').each(function(k, v)
{ {
if (!$(v).attr('checked')) if (!$(v).attr('checked'))
allChecked = false; allChecked = false;
@@ -2403,28 +2387,24 @@ EOF;
$html .= '<div class="assoShop">'; $html .= '<div class="assoShop">';
$html .= '<table class="table" cellpadding="0" cellspacing="0" width="100%"> $html .= '<table class="table" cellpadding="0" cellspacing="0" width="100%">
<tr><th>'.$this->l('Shop').'</th></tr>'; <tr><th>'.$this->l('Shop').'</th></tr>';
$html .= '<tr'.(($type == 'group_shop') ? ' class="alt_row"' : '').'><td><label class="t"><input class="input_all_shop" type="checkbox" /> '.$this->l('All shops').'</label></td></tr>'; $html .= '<tr><td><label class="t"><input class="input_all_shop" type="checkbox" /> '.$this->l('All shops').'</label></td></tr>';
foreach (Shop::getTree() as $groupID => $groupData) foreach (Shop::getTree() as $groupID => $groupData)
{ {
$groupChecked = ($type == 'group_shop' && ((isset($assos[$groupID]) && in_array($this->_object->id, $assos[$groupID])) || !$this->_object->id)); $html .= '<tr class="alt_row">';
$html .= '<tr'.(($type == 'shop') ? ' class="alt_row"' : '').'>'; $html .= '<td><img style="vertical-align: middle;" alt="" src="../img/admin/lv2_b.gif" /><label class="t"><input class="input_shop_group" type="checkbox" name="checkBoxShopGroupAsso_'.$this->table.'_'.$this->_object->id.'_'.$groupID.'" value="'.$groupID.'" '.($groupChecked ? 'checked="checked"' : '').' /> '.$groupData['name'].'</label></td>';
$html .= '<td><img style="vertical-align: middle;" alt="" src="../img/admin/lv2_b.gif" /><label class="t"><input class="input_group_shop" type="checkbox" name="checkBoxGroupShopAsso_'.$this->table.'_'.$this->_object->id.'_'.$groupID.'" value="'.$groupID.'" '.($groupChecked ? 'checked="checked"' : '').' /> '.$groupData['name'].'</label></td>';
$html .= '</tr>'; $html .= '</tr>';
if ($type == 'shop') $total = count($groupData['shops']);
$j = 0;
foreach ($groupData['shops'] as $shopID => $shopData)
{ {
$total = count($groupData['shops']); $checked = ((isset($assos[$shopID]) && in_array($this->_object->id, $assos[$shopID])) || !$this->_object->id);
$j = 0; $html .= '<tr>';
foreach ($groupData['shops'] as $shopID => $shopData) $html .= '<td><img style="vertical-align: middle;" alt="" src="../img/admin/lv3_'.(($j < $total - 1) ? 'b' : 'f').'.png" /><label class="child">';
{ $html .= '<input class="input_shop" type="checkbox" value="'.$groupID.'" name="checkBoxShopAsso_'.$this->table.'_'.$this->_object->id.'_'.$shopID.'" id="checkedBox_'.$shopID.'" '.($checked ? 'checked="checked"' : '').' /> ';
$checked = ((isset($assos[$shopID]) && in_array($this->_object->id, $assos[$shopID])) || !$this->_object->id); $html .= $shopData['name'].'</label></td>';
$html .= '<tr>'; $html .= '</tr>';
$html .= '<td><img style="vertical-align: middle;" alt="" src="../img/admin/lv3_'.(($j < $total - 1) ? 'b' : 'f').'.png" /><label class="child">'; $j++;
$html .= '<input class="input_shop" type="checkbox" value="'.$groupID.'" name="checkBoxShopAsso_'.$this->table.'_'.$this->_object->id.'_'.$shopID.'" id="checkedBox_'.$shopID.'" '.($checked ? 'checked="checked"' : '').' /> ';
$html .= $shopData['name'].'</label></td>';
$html .= '</tr>';
$j++;
}
} }
} }
$html .= '</table></div>'; $html .= '</table></div>';
+3 -6
View File
@@ -135,12 +135,9 @@ class AttachmentCore extends ObjectModel
if ((int)$id_attachment > 0) if ((int)$id_attachment > 0)
$ids[] = array('id_product' => (int)$id_product, 'id_attachment' => (int)$id_attachment); $ids[] = array('id_product' => (int)$id_product, 'id_attachment' => (int)$id_attachment);
Db::getInstance()->execute(' Db::getInstance()->update('product', array(
UPDATE '._DB_PREFIX_.'product 'cache_has_attachments' => count($ids) ? 1 : 0
SET cache_has_attachments = '.(count($ids) ? '1' : '0').' ), 'id_product = '.(int)$id_product);
WHERE id_product = '.(int)$id_product.'
LIMIT 1
');
if (!empty($ids)) if (!empty($ids))
$result2 = Db::getInstance()->insert('product_attachment', $ids); $result2 = Db::getInstance()->insert('product_attachment', $ids);
+7 -11
View File
@@ -88,15 +88,10 @@ class AttributeCore extends ObjectModel
foreach ($result as $row) foreach ($result as $row)
$combination_ids[] = (int)$row['id_product_attribute']; $combination_ids[] = (int)$row['id_product_attribute'];
if (Db::getInstance()->execute(' $combinations = new Collection('Combination');
DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` $combinations->where('id_product', '=', $this->id);
WHERE `'.$this->def['primary'].'` = '.(int)$this->id) === false) foreach ($combinations as $combination)
return false; $combination->delete();
if (Db::getInstance()->execute('
DELETE FROM `'._DB_PREFIX_.'product_attribute`
WHERE `id_product_attribute` IN ('.implode(', ', $combination_ids).')') === false)
return false;
} }
/* Reinitializing position */ /* Reinitializing position */
@@ -241,8 +236,9 @@ class AttributeCore extends ObjectModel
{ {
$minimal_quantity = Db::getInstance()->getValue(' $minimal_quantity = Db::getInstance()->getValue('
SELECT `minimal_quantity` SELECT `minimal_quantity`
FROM `'._DB_PREFIX_.'product_attribute` FROM `'._DB_PREFIX_.'product_attribute_shop` pas
WHERE `id_product_attribute` = '.(int)$id_product_attribute WHERE `id_shop` = '.(int)Context::getContext()->shop->id.'
AND `id_product_attribute` = '.(int)$id_product_attribute
); );
if ($minimal_quantity > 1) if ($minimal_quantity > 1)
+9 -6
View File
@@ -91,6 +91,7 @@ class AttributeGroupCore extends ObjectModel
$attribute_combinations = Db::getInstance()->executeS(' $attribute_combinations = Db::getInstance()->executeS('
SELECT pac.`id_attribute`, pa.`id_product_attribute` SELECT pac.`id_attribute`, pa.`id_product_attribute`
FROM `'._DB_PREFIX_.'product_attribute` pa FROM `'._DB_PREFIX_.'product_attribute` pa
'.Shop::addSqlAssociation('product_attribute', 'pa').'
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac
ON (pa.`id_product_attribute` = pac.`id_product_attribute`) ON (pa.`id_product_attribute` = pac.`id_product_attribute`)
'); ');
@@ -98,12 +99,14 @@ class AttributeGroupCore extends ObjectModel
foreach ($attribute_combinations as $attribute_combination) foreach ($attribute_combinations as $attribute_combination)
if ((int)$attribute_combination['id_attribute'] == 0) if ((int)$attribute_combination['id_attribute'] == 0)
$to_remove[] = (int)$attribute_combination['id_product_attribute']; $to_remove[] = (int)$attribute_combination['id_product_attribute'];
if (!empty($to_remove) && Db::getInstance()->execute(' $return = true;
DELETE FROM `'._DB_PREFIX_.'product_attribute` if (!empty($to_remove))
WHERE `id_product_attribute` foreach ($to_remove as $remove)
IN ('.implode(', ', $to_remove).')') === false) {
return false; $combination = new Combination($remove);
return true; $return &= $combination->delete();
}
return $return;
} }
public function delete() public function delete()
+14 -14
View File
@@ -114,7 +114,7 @@ class CarrierCore extends ObjectModel
'table' => 'carrier', 'table' => 'carrier',
'primary' => 'id_carrier', 'primary' => 'id_carrier',
'multilang' => true, 'multilang' => true,
'multishop' => true, 'multilang_shop' => true,
'fields' => array( 'fields' => array(
/* Classic fields */ /* Classic fields */
'id_reference' => array('type' => self::TYPE_INT), 'id_reference' => array('type' => self::TYPE_INT),
@@ -714,9 +714,9 @@ class CarrierCore extends ObjectModel
$where = '`id_carrier` = '.(int)$this->id.' AND (`id_'.$range_table.'` IS NOT NULL OR `id_'.$range_table.'` = 0) '; $where = '`id_carrier` = '.(int)$this->id.' AND (`id_'.$range_table.'` IS NOT NULL OR `id_'.$range_table.'` = 0) ';
if (Shop::getContext() == Shop::CONTEXT_ALL) if (Shop::getContext() == Shop::CONTEXT_ALL)
$where .= 'AND id_shop IS NULL AND id_group_shop IS NULL'; $where .= 'AND id_shop IS NULL AND id_shop_group IS NULL';
else if (Shop::getContext() == Shop::CONTEXT_GROUP) else if (Shop::getContext() == Shop::CONTEXT_GROUP)
$where .= 'AND id_shop IS NULL AND id_group_shop = '.(int)Shop::getContextGroupShopID(); $where .= 'AND id_shop IS NULL AND id_shop_group = '.(int)Shop::getContextShopGroupID();
else else
$where .= 'AND id_shop = '.(int)Shop::getContextShopID(); $where .= 'AND id_shop = '.(int)Shop::getContextShopID();
@@ -737,16 +737,16 @@ class CarrierCore extends ObjectModel
$keys = array_keys($price_list[0]); $keys = array_keys($price_list[0]);
if (!in_array('id_shop', $keys)) if (!in_array('id_shop', $keys))
$keys[] = 'id_shop'; $keys[] = 'id_shop';
if (!in_array('id_group_shop', $keys)) if (!in_array('id_shop_group', $keys))
$keys[] = 'id_group_shop'; $keys[] = 'id_shop_group';
$sql = 'INSERT INTO `'._DB_PREFIX_.'delivery` ('.implode(', ', $keys).') VALUES '; $sql = 'INSERT INTO `'._DB_PREFIX_.'delivery` ('.implode(', ', $keys).') VALUES ';
foreach ($price_list as $values) foreach ($price_list as $values)
{ {
if (!isset($values['id_shop'])) if (!isset($values['id_shop']))
$values['id_shop'] = (Shop::getContext() == Shop::CONTEXT_SHOP) ? Shop::getContextShopID() : null; $values['id_shop'] = (Shop::getContext() == Shop::CONTEXT_SHOP) ? Shop::getContextShopID() : null;
if (!isset($values['id_group_shop'])) if (!isset($values['id_shop_group']))
$values['id_group_shop'] = (Shop::getContext() != Shop::CONTEXT_ALL) ? Shop::getContextGroupShopID() : null; $values['id_shop_group'] = (Shop::getContext() != Shop::CONTEXT_ALL) ? Shop::getContextShopGroupID() : null;
$sql .= '('; $sql .= '(';
foreach ($values as $v) foreach ($values as $v)
@@ -805,8 +805,8 @@ class CarrierCore extends ObjectModel
$range_weight_id = ($range == 'range_weight') ? $range_id : 'NULL'; $range_weight_id = ($range == 'range_weight') ? $range_id : 'NULL';
Db::getInstance()->execute(' Db::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'delivery` (`id_carrier`, `id_shop`, `id_group_shop`, `id_range_price`, `id_range_weight`, `id_zone`, `price`) ( INSERT INTO `'._DB_PREFIX_.'delivery` (`id_carrier`, `id_shop`, `id_shop_group`, `id_range_price`, `id_range_weight`, `id_zone`, `price`) (
SELECT '.(int)$this->id.', `id_shop`, `id_group_shop`, '.(int)$range_price_id.', '.(int)$range_weight_id.', `id_zone`, `price` SELECT '.(int)$this->id.', `id_shop`, `id_shop_group`, '.(int)$range_price_id.', '.(int)$range_weight_id.', `id_zone`, `price`
FROM `'._DB_PREFIX_.'delivery` FROM `'._DB_PREFIX_.'delivery`
WHERE `id_carrier` = '.(int)$old_id.' WHERE `id_carrier` = '.(int)$old_id.'
AND `id_'.$range.'` = '.(int)$val['id_range'].' AND `id_'.$range.'` = '.(int)$val['id_range'].'
@@ -1002,12 +1002,12 @@ class CarrierCore extends ObjectModel
public static function sqlDeliveryRangeShop($range_table, $alias = 'd') public static function sqlDeliveryRangeShop($range_table, $alias = 'd')
{ {
if (Shop::getContext() == Shop::CONTEXT_ALL) if (Shop::getContext() == Shop::CONTEXT_ALL)
$where = 'AND d2.id_shop IS NULL AND d2.id_group_shop IS NULL'; $where = 'AND d2.id_shop IS NULL AND d2.id_shop_group IS NULL';
else if (Shop::getContext() == Shop::CONTEXT_GROUP) else if (Shop::getContext() == Shop::CONTEXT_GROUP)
$where = 'AND ((d2.id_group_shop IS NULL OR d2.id_group_shop = '.Shop::getContextGroupShopID().') AND d2.id_shop IS NULL)'; $where = 'AND ((d2.id_shop_group IS NULL OR d2.id_shop_group = '.Shop::getContextShopGroupID().') AND d2.id_shop IS NULL)';
else else
$where = 'AND (d2.id_shop = '.Shop::getContextShopID().' OR (d2.id_group_shop = '.Shop::getContextGroupShopID().' $where = 'AND (d2.id_shop = '.Shop::getContextShopID().' OR (d2.id_shop_group = '.Shop::getContextShopGroupID().'
AND d2.id_shop IS NULL) OR (d2.id_group_shop IS NULL AND d2.id_shop IS NULL))'; AND d2.id_shop IS NULL) OR (d2.id_shop_group IS NULL AND d2.id_shop IS NULL))';
$sql = 'AND '.$alias.'.id_delivery = ( $sql = 'AND '.$alias.'.id_delivery = (
SELECT d2.id_delivery SELECT d2.id_delivery
@@ -1016,7 +1016,7 @@ class CarrierCore extends ObjectModel
AND d2.id_zone = '.$alias.'.id_zone AND d2.id_zone = '.$alias.'.id_zone
AND d2.id_'.$range_table.' = '.$alias.'.id_'.$range_table.' AND d2.id_'.$range_table.' = '.$alias.'.id_'.$range_table.'
'.$where.' '.$where.'
ORDER BY d2.id_shop DESC, d2.id_group_shop DESC ORDER BY d2.id_shop DESC, d2.id_shop_group DESC
LIMIT 1 LIMIT 1
)'; )';
return $sql; return $sql;
+17 -22
View File
@@ -29,7 +29,7 @@ class CartCore extends ObjectModel
{ {
public $id; public $id;
public $id_group_shop; public $id_shop_group;
public $id_shop; public $id_shop;
@@ -98,7 +98,7 @@ class CartCore extends ObjectModel
'table' => 'cart', 'table' => 'cart',
'primary' => 'id_cart', 'primary' => 'id_cart',
'fields' => array( 'fields' => array(
'id_group_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_shop_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_address_delivery' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_address_delivery' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_address_invoice' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_address_invoice' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
@@ -385,27 +385,26 @@ class CartCore extends ObjectModel
// Build SELECT // Build SELECT
$sql->select('cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, cp.id_shop, pl.`name`, p.`is_virtual`, $sql->select('cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, cp.id_shop, pl.`name`, p.`is_virtual`,
pl.`description_short`, pl.`available_now`, pl.`available_later`, p.`id_product`, ps.`id_category_default`, p.`id_supplier`, pl.`description_short`, pl.`available_now`, pl.`available_later`, p.`id_product`, product_shop.`id_category_default`, p.`id_supplier`,
p.`id_manufacturer`, p.`on_sale`, p.`ecotax`, p.`additional_shipping_cost`, p.`available_for_order`, p.`price`, p.`weight`, p.`id_manufacturer`, product_shop.`on_sale`, product_shop.`ecotax`, product_shop.`additional_shipping_cost`, product_shop.`available_for_order`, product_shop.`price`, p.`weight`,
stock.`quantity` quantity_available, p.`width`, p.`height`, p.`depth`, stock.`out_of_stock`, p.`active`, p.`date_add`, stock.`quantity` quantity_available, p.`width`, p.`height`, p.`depth`, stock.`out_of_stock`, p.`active`, p.`date_add`,
p.`date_upd`, t.`id_tax`, tl.`name` AS tax, t.`rate`, IFNULL(stock.quantity, 0) as quantity, pl.`link_rewrite`, cl.`link_rewrite` AS category, p.`date_upd`, t.`id_tax`, tl.`name` AS tax, t.`rate`, IFNULL(stock.quantity, 0) as quantity, pl.`link_rewrite`, cl.`link_rewrite` AS category,
CONCAT(cp.`id_product`, cp.`id_product_attribute`, cp.`id_address_delivery`) AS unique_id, cp.id_address_delivery, p.`wholesale_price`, CONCAT(cp.`id_product`, cp.`id_product_attribute`, cp.`id_address_delivery`) AS unique_id, cp.id_address_delivery,
p.advanced_stock_management'); product_shop.`wholesale_price`, product_shop.advanced_stock_management');
// Build FROM // Build FROM
$sql->from('cart_product', 'cp'); $sql->from('cart_product', 'cp');
// Build JOIN // Build JOIN
$sql->leftJoin('product', 'p', 'p.`id_product` = cp.`id_product`'); $sql->leftJoin('product', 'p', 'p.`id_product` = cp.`id_product`');
$sql->join(Shop::addSqlAssociation('product', 'p'));
$sql->leftJoin('product_lang', 'pl', ' $sql->leftJoin('product_lang', 'pl', '
p.`id_product` = pl.`id_product` p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('pl') AND pl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('pl')
); );
$sql->leftJoin('product_tax_rules_group_shop', 'ptrgs',
'p.`id_product` = ptrgs.`id_product` AND cp.`id_shop` = ptrgs.`id_shop`');
$sql->leftJoin('tax_rule', 'tr', ' $sql->leftJoin('tax_rule', 'tr', '
ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group` product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)$id_country.' AND tr.`id_country` = '.(int)$id_country.'
AND tr.`id_state` = 0 AND tr.`id_state` = 0
AND tr.`zipcode_from` = 0' AND tr.`zipcode_from` = 0'
@@ -415,12 +414,9 @@ class CartCore extends ObjectModel
t.`id_tax` = tl.`id_tax` t.`id_tax` = tl.`id_tax`
AND tl.`id_lang` = '.(int)$this->id_lang AND tl.`id_lang` = '.(int)$this->id_lang
); );
$sql->leftJoin('product_shop', 'ps', '
ps.`id_product` = p.`id_product`
AND ps.`id_shop` = '.(int)Context::getContext()->shop->id
);
$sql->leftJoin('category_lang', 'cl', ' $sql->leftJoin('category_lang', 'cl', '
ps.`id_category_default` = cl.`id_category` product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('cl') AND cl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('cl')
); );
@@ -432,7 +428,6 @@ class CartCore extends ObjectModel
if ($id_product) if ($id_product)
$sql->where('cp.`id_product` = '.(int)$id_product); $sql->where('cp.`id_product` = '.(int)$id_product);
$sql->where('p.`id_product` IS NOT NULL'); $sql->where('p.`id_product` IS NOT NULL');
$sql->where('ps.`id_shop` = '.(int)Context::getContext()->shop->id);
// Build GROUP BY // Build GROUP BY
$sql->groupBy('unique_id'); $sql->groupBy('unique_id');
@@ -450,26 +445,26 @@ class CartCore extends ObjectModel
if (Combination::isFeatureActive()) if (Combination::isFeatureActive())
{ {
$sql->select( $sql->select('
'pa.`price` AS price_attribute, pa.`ecotax` AS ecotax_attr, product_attribute_shop.`price` AS price_attribute, product_attribute_shop.`ecotax` AS ecotax_attr,
IF (IFNULL(pa.`reference`, \'\') = \'\', p.`reference`, pa.`reference`) AS reference, IF (IFNULL(pa.`reference`, \'\') = \'\', p.`reference`, pa.`reference`) AS reference,
IF (IFNULL(pa.`supplier_reference`, \'\') = \'\', p.`supplier_reference`, pa.`supplier_reference`) AS supplier_reference, IF (IFNULL(pa.`supplier_reference`, \'\') = \'\', p.`supplier_reference`, pa.`supplier_reference`) AS supplier_reference,
(p.`weight`+ pa.`weight`) weight_attribute, (p.`weight`+ pa.`weight`) weight_attribute,
IF (IFNULL(pa.`ean13`, \'\') = \'\', p.`ean13`, pa.`ean13`) AS ean13, IF (IFNULL(pa.`ean13`, \'\') = \'\', p.`ean13`, pa.`ean13`) AS ean13,
IF (IFNULL(pa.`upc`, \'\') = \'\', p.`upc`, pa.`upc`) AS upc, IF (IFNULL(pa.`upc`, \'\') = \'\', p.`upc`, pa.`upc`) AS upc,
pai.`id_image` as pai_id_image, il.`legend` as pai_legend, pai.`id_image` as pai_id_image, il.`legend` as pai_legend,
IFNULL(pa.`minimal_quantity`, p.`minimal_quantity`) as minimal_quantity, IFNULL(product_attribute_shop.`minimal_quantity`, product_shop.`minimal_quantity`) as minimal_quantity
pa.`ecotax` AS ecotax_attr' ');
);
$sql->leftJoin('product_attribute', 'pa', 'pa.`id_product_attribute` = cp.`id_product_attribute`'); $sql->leftJoin('product_attribute', 'pa', 'pa.`id_product_attribute` = cp.`id_product_attribute`');
$sql->join(Shop::addSqlAssociation('product_attribute', 'pa'));
$sql->leftJoin('product_attribute_image', 'pai', 'pai.`id_product_attribute` = pa.`id_product_attribute`'); $sql->leftJoin('product_attribute_image', 'pai', 'pai.`id_product_attribute` = pa.`id_product_attribute`');
$sql->leftJoin('image_lang', 'il', 'il.id_image = pai.id_image AND il.id_lang = '.(int)$this->id_lang); $sql->leftJoin('image_lang', 'il', 'il.id_image = pai.id_image AND il.id_lang = '.(int)$this->id_lang);
} }
else else
$sql->select( $sql->select(
'p.`reference` AS reference, p.`supplier_reference` AS supplier_reference, p.`ean13`, 'p.`reference` AS reference, p.`supplier_reference` AS supplier_reference, p.`ean13`,
p.`upc` AS upc, p.`minimal_quantity` AS minimal_quantity' p.`upc` AS upc, product_shop.`minimal_quantity` AS minimal_quantity'
); );
$result = Db::getInstance()->executeS($sql); $result = Db::getInstance()->executeS($sql);
@@ -2756,7 +2751,7 @@ class CartCore extends ObjectModel
$cart = new Cart($this->id); $cart = new Cart($this->id);
$cart->id = null; $cart->id = null;
$cart->id_shop = $this->id_shop; $cart->id_shop = $this->id_shop;
$cart->id_group_shop = $this->id_group_shop; $cart->id_shop_group = $this->id_shop_group;
$cart->add(); $cart->add();
if (!Validate::isLoadedObject($cart)) if (!Validate::isLoadedObject($cart))
+18 -18
View File
@@ -94,7 +94,7 @@ class CategoryCore extends ObjectModel
'table' => 'category', 'table' => 'category',
'primary' => 'id_category', 'primary' => 'id_category',
'multilang' => true, 'multilang' => true,
'multishop' => true, 'multilang_shop' => true,
'fields' => array( 'fields' => array(
'nleft' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'nleft' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
'nright' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'nright' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'),
@@ -629,28 +629,29 @@ class CategoryCore extends ObjectModel
'.Shop::addSqlAssociation('product', 'p').' '.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product` LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product`
WHERE cp.`id_category` = '.(int)$this->id. WHERE cp.`id_category` = '.(int)$this->id.
($front ? ' AND p.`visibility` IN ("both", "catalog")' : ''). ($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').
($active ? ' AND p.`active` = 1' : ''). ($active ? ' AND product_shop.`active` = 1' : '').
($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : ''); ($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '');
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
} }
$sql = 'SELECT p.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`,
pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`,
il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default,
DATEDIFF(p.`date_add`, DATE_SUB(NOW(), DATEDIFF(product_shop.`date_add`, DATE_SUB(NOW(),
INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).'
DAY)) > 0 AS new, DAY)) > 0 AS new,
(p.`price` * IF(t.`rate`,((100 + (t.`rate`))/100),1)) AS orderprice (product_shop.`price` * IF(t.`rate`,((100 + (t.`rate`))/100),1)) AS orderprice
FROM `'._DB_PREFIX_.'category_product` cp FROM `'._DB_PREFIX_.'category_product` cp
LEFT JOIN `'._DB_PREFIX_.'product` p LEFT JOIN `'._DB_PREFIX_.'product` p
ON p.`id_product` = cp.`id_product` ON p.`id_product` = cp.`id_product`
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa
ON (p.`id_product` = pa.`id_product` AND default_on = 1) ON (p.`id_product` = pa.`id_product`)
'.Shop::addSqlAssociation('product_attribute', 'pa').'
'.Shop::addSqlAssociation('product', 'p').' '.Shop::addSqlAssociation('product', 'p').'
'.Product::sqlStock('p', 'pa', false, $context->shop).' '.Product::sqlStock('p', 'pa', false, $context->shop).'
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
ON (asso_shop_product.`id_category_default` = cl.`id_category` ON (product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').') AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
ON (p.`id_product` = pl.`id_product` ON (p.`id_product` = pl.`id_product`
@@ -661,10 +662,8 @@ class CategoryCore extends ObjectModel
LEFT JOIN `'._DB_PREFIX_.'image_lang` il LEFT JOIN `'._DB_PREFIX_.'image_lang` il
ON (i.`id_image` = il.`id_image` ON (i.`id_image` = il.`id_image`
AND il.`id_lang` = '.(int)$id_lang.') AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (p.`id_product` = ptrgs.`id_product`
AND ptrgs.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr
ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group` ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)$context->country->id.' AND tr.`id_country` = '.(int)$context->country->id.'
AND tr.`id_state` = 0 AND tr.`id_state` = 0
AND tr.`zipcode_from` = 0) AND tr.`zipcode_from` = 0)
@@ -675,12 +674,14 @@ class CategoryCore extends ObjectModel
AND tl.`id_lang` = '.(int)$id_lang.') AND tl.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m LEFT JOIN `'._DB_PREFIX_.'manufacturer` m
ON m.`id_manufacturer` = p.`id_manufacturer` ON m.`id_manufacturer` = p.`id_manufacturer`
WHERE asso_shop_product.`id_shop` = '.(int)Context::getContext()->shop->id.' WHERE product_shop.`id_shop` = '.(int)Context::getContext()->shop->id.'
AND cp.`id_category` = '.(int)$this->id AND product_attribute_shop.default_on = 1
.($active ? ' AND p.`active` = 1' : '') AND cp.`id_category` = '.(int)$this->id
.($front ? ' AND p.`visibility` IN ("both", "catalog")' : '') .($active ? ' AND product_shop.`active` = 1' : '')
.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
.($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : ''); .($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '');
$sql .= 'GROUP BY p.`id_product`';
if ($random === true) if ($random === true)
{ {
$sql .= ' ORDER BY RAND()'; $sql .= ' ORDER BY RAND()';
@@ -747,15 +748,14 @@ class CategoryCore extends ObjectModel
if (!Validate::isBool($active)) if (!Validate::isBool($active))
die(Tools::displayError()); die(Tools::displayError());
$query = 'SELECT c.`id_category`, cl.`name`, cl.`link_rewrite`, asso_shop_category.`id_shop` $query = 'SELECT c.`id_category`, cl.`name`, cl.`link_rewrite`, category_shop.`id_shop`
FROM `'._DB_PREFIX_.'category` c FROM `'._DB_PREFIX_.'category` c
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category`'.Shop::addSqlRestrictionOnLang('cl').') LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category`'.Shop::addSqlRestrictionOnLang('cl').')
'.Shop::addSqlAssociation('category', 'c').' '.Shop::addSqlAssociation('category', 'c').'
WHERE `id_lang` = '.(int)$id_lang.' WHERE `id_lang` = '.(int)$id_lang.'
AND c.`id_parent` = '.(int)$id_parent.' AND c.`id_parent` = '.(int)$id_parent.'
'.(($id_shop != false) ? 'AND asso_shop_category.`id_shop` = '.(int)$id_shop : '').'
'.($active ? 'AND `active` = 1' : '').' '.($active ? 'AND `active` = 1' : '').'
ORDER BY asso_shop_category.`position` ASC'; ORDER BY category_shop.`position` ASC';
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query); return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
} }
+37 -12
View File
@@ -43,6 +43,8 @@ class CombinationCore extends ObjectModel
public $price; public $price;
public $unit_price_impact;
public $ecotax; public $ecotax;
public $minimal_quantity = 1; public $minimal_quantity = 1;
@@ -61,21 +63,25 @@ class CombinationCore extends ObjectModel
public static $definition = array( public static $definition = array(
'table' => 'product_attribute', 'table' => 'product_attribute',
'primary' => 'id_product_attribute', 'primary' => 'id_product_attribute',
'multishop' => true,
'fields' => array( 'fields' => array(
'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'location' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'size' => 64), 'location' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'size' => 64),
'ean13' => array('type' => self::TYPE_STRING, 'validate' => 'isEan13', 'size' => 13), 'ean13' => array('type' => self::TYPE_STRING, 'validate' => 'isEan13', 'size' => 13),
'upc' => array('type' => self::TYPE_STRING, 'validate' => 'isUpc', 'size' => 12), 'upc' => array('type' => self::TYPE_STRING, 'validate' => 'isUpc', 'size' => 12),
'wholesale_price' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'size' => 27),
'price' => array('type' => self::TYPE_FLOAT, 'validate' => 'isNegativePrice', 'size' => 20),
'ecotax' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'size' => 20),
'quantity' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'size' => 10), 'quantity' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'size' => 10),
'weight' => array('type' => self::TYPE_INT, 'validate' => 'isFloat'), 'weight' => array('type' => self::TYPE_INT, 'validate' => 'isFloat'),
'minimal_quantity' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'default_on' => array('type' => self::TYPE_INT, 'validate' => 'isBool'),
'available_date' => array('type' => self::TYPE_DATE, 'validate' => 'isDateFormat'),
'reference' => array('type' => self::TYPE_STRING, 'size' => 32), 'reference' => array('type' => self::TYPE_STRING, 'size' => 32),
'supplier_reference' => array('type' => self::TYPE_STRING, 'size' => 32), 'supplier_reference' => array('type' => self::TYPE_STRING, 'size' => 32),
/* Shop fields */
'wholesale_price' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice', 'size' => 27),
'price' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isNegativePrice', 'size' => 20),
'ecotax' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice', 'size' => 20),
'unit_price_impact' => array('type' => self::TYPE_FLOAT, 'shop' => true, 'validate' => 'isPrice', 'size' => 20),
'minimal_quantity' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedId', 'required' => true),
'default_on' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isBool'),
'available_date' => array('type' => self::TYPE_DATE, 'shop' => true, 'validate' => 'isDateFormat'),
), ),
); );
@@ -93,18 +99,20 @@ class CombinationCore extends ObjectModel
public function delete() public function delete()
{ {
if (!parent::delete() || $this->deleteAssociations() === false) if (!parent::delete())
return false;
if (!$this->hasMultishopEntries() && !$this->deleteAssociations())
return false; return false;
return true; return true;
} }
public function deleteAssociations() public function deleteAssociations()
{ {
if (Db::getInstance()->execute(' $result = Db::getInstance()->delete('product_attribute_combination', '`id_product_attribute` = '.(int)$this->id);
DELETE FROM `'._DB_PREFIX_.'product_attribute_combination` $result &= Db::getInstance()->delete('cart_product', '`id_product_attribute` = '.(int)$this->id);
WHERE `id_product_attribute` = '.(int)$this->id) === false)
return false; return $result;
return true;
} }
public function setAttributes($ids_attribute) public function setAttributes($ids_attribute)
@@ -227,4 +235,21 @@ class CombinationCore extends ObjectModel
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query); return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
} }
/**
* Retrive the price of combination
*
* @since 1.5.0
* @param int $id_product_attribute
* @return float mixed
*/
public static function getPrice($id_product_attribute)
{
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
SELECT product_attribute_shop.`price`
FROM `'._DB_PREFIX_.'product_attribute` pa
'.Shop::addSqlAssociation('product_attribute', 'pa').'
WHERE pa.`id_product_attribute` = '.(int)$id_product_attribute
);
}
} }
+32 -32
View File
@@ -32,7 +32,7 @@ class ConfigurationCore extends ObjectModel
/** @var string Key */ /** @var string Key */
public $name; public $name;
public $id_group_shop; public $id_shop_group;
public $id_shop; public $id_shop;
/** @var string Value */ /** @var string Value */
@@ -53,7 +53,7 @@ class ConfigurationCore extends ObjectModel
'multilang' => true, 'multilang' => true,
'fields' => array( 'fields' => array(
'name' => array('type' => self::TYPE_STRING, 'validate' => 'isConfigName', 'required' => true, 'size' => 32), 'name' => array('type' => self::TYPE_STRING, 'validate' => 'isConfigName', 'required' => true, 'size' => 32),
'id_group_shop' => array('type' => self::TYPE_NOTHING, 'validate' => 'isUnsignedId'), 'id_shop_group' => array('type' => self::TYPE_NOTHING, 'validate' => 'isUnsignedId'),
'id_shop' => array('type' => self::TYPE_NOTHING, 'validate' => 'isUnsignedId'), 'id_shop' => array('type' => self::TYPE_NOTHING, 'validate' => 'isUnsignedId'),
'value' => array('type' => self::TYPE_STRING), 'value' => array('type' => self::TYPE_STRING),
'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
@@ -107,7 +107,7 @@ class ConfigurationCore extends ObjectModel
public static function loadConfiguration() public static function loadConfiguration()
{ {
self::$_CONF = array(); self::$_CONF = array();
$sql = 'SELECT c.`name`, cl.`id_lang`, IF(cl.`id_lang` IS NULL, c.`value`, cl.`value`) AS value, c.id_group_shop, c.id_shop $sql = 'SELECT c.`name`, cl.`id_lang`, IF(cl.`id_lang` IS NULL, c.`value`, cl.`value`) AS value, c.id_shop_group, c.id_shop
FROM `'._DB_PREFIX_.'configuration` c FROM `'._DB_PREFIX_.'configuration` c
LEFT JOIN `'._DB_PREFIX_.'configuration_lang` cl ON (c.id_configuration = cl.id_configuration)'; LEFT JOIN `'._DB_PREFIX_.'configuration_lang` cl ON (c.id_configuration = cl.id_configuration)';
if (!$results = Db::getInstance()->executeS($sql)) if (!$results = Db::getInstance()->executeS($sql))
@@ -126,8 +126,8 @@ class ConfigurationCore extends ObjectModel
if ($row['id_shop']) if ($row['id_shop'])
self::$_CONF[$lang]['shop'][$row['id_shop']][$row['name']] = $row['value']; self::$_CONF[$lang]['shop'][$row['id_shop']][$row['name']] = $row['value'];
else if ($row['id_group_shop']) else if ($row['id_shop_group'])
self::$_CONF[$lang]['group'][$row['id_group_shop']][$row['name']] = $row['value']; self::$_CONF[$lang]['group'][$row['id_shop_group']][$row['name']] = $row['value'];
else else
self::$_CONF[$lang]['global'][$row['name']] = $row['value']; self::$_CONF[$lang]['global'][$row['name']] = $row['value'];
} }
@@ -173,12 +173,12 @@ class ConfigurationCore extends ObjectModel
* @param int $shopID * @param int $shopID
* @return array Values in multiple languages * @return array Values in multiple languages
*/ */
public static function getInt($key, $id_group_shop = null, $id_shop = null) public static function getInt($key, $id_shop_group = null, $id_shop = null)
{ {
$languages = Language::getLanguages(); $languages = Language::getLanguages();
$resultsArray = array(); $resultsArray = array();
foreach ($languages as $language) foreach ($languages as $language)
$resultsArray[$language['id_lang']] = Configuration::get($key, $language['id_lang'], $id_group_shop, $id_shop); $resultsArray[$language['id_lang']] = Configuration::get($key, $language['id_lang'], $id_shop_group, $id_shop);
return $resultsArray; return $resultsArray;
} }
@@ -230,11 +230,11 @@ class ConfigurationCore extends ObjectModel
* @param int $shopGroupID * @param int $shopGroupID
* @param int $shopID * @param int $shopID
*/ */
public static function set($key, $values, $id_group_shop = null, $id_shop = null) public static function set($key, $values, $id_shop_group = null, $id_shop = null)
{ {
if (!Validate::isConfigName($key)) if (!Validate::isConfigName($key))
die(Tools::displayError()); die(Tools::displayError());
Configuration::getShopFromContext($id_group_shop, $id_shop); Configuration::getShopFromContext($id_shop_group, $id_shop);
if (!is_array($values)) if (!is_array($values))
$values = array($values); $values = array($values);
@@ -243,8 +243,8 @@ class ConfigurationCore extends ObjectModel
{ {
if ($id_shop) if ($id_shop)
self::$_CONF[$lang]['shop'][$id_shop][$key] = $value; self::$_CONF[$lang]['shop'][$id_shop][$key] = $value;
else if ($id_group_shop) else if ($id_shop_group)
self::$_CONF[$lang]['group'][$id_group_shop][$key] = $value; self::$_CONF[$lang]['group'][$id_shop_group][$key] = $value;
else else
self::$_CONF[$lang]['global'][$key] = $value; self::$_CONF[$lang]['global'][$key] = $value;
} }
@@ -325,7 +325,7 @@ class ConfigurationCore extends ObjectModel
if ($shopID) if ($shopID)
$newConfig->id_shop = (int)$shopID; $newConfig->id_shop = (int)$shopID;
if ($shopGroupID) if ($shopGroupID)
$newConfig->id_group_shop = (int)$shopGroupID; $newConfig->id_shop_group = (int)$shopGroupID;
if (!$lang) if (!$lang)
$newConfig->value = $value; $newConfig->value = $value;
$result &= $newConfig->add(true, true); $result &= $newConfig->add(true, true);
@@ -382,22 +382,22 @@ class ConfigurationCore extends ObjectModel
public static function deleteFromContext($key) public static function deleteFromContext($key)
{ {
if (Shop::getContext() == Shop::CONTEXT_ALL) if (Shop::getContext() == Shop::CONTEXT_ALL)
$id_shop = $id_group_shop = null; $id_shop = $id_shop_group = null;
else if (Shop::getContext() == Shop::CONTEXT_GROUP) else if (Shop::getContext() == Shop::CONTEXT_GROUP)
{ {
$id_group_shop = Shop::getContextGroupShopID(); $id_shop_group = Shop::getContextShopGroupID();
$id_shop = null; $id_shop = null;
} }
else else
{ {
$id_group_shop = Shop::getContextGroupShopID(); $id_shop_group = Shop::getContextShopGroupID();
$id_shop = Shop::getContextShopID(); $id_shop = Shop::getContextShopID();
} }
if (!$id_shop && !$id_group_shop) if (!$id_shop && !$id_shop_group)
return; return;
$id = Configuration::getIdByName($key, $id_group_shop, $id_shop); $id = Configuration::getIdByName($key, $id_shop_group, $id_shop);
$sql = 'DELETE FROM '._DB_PREFIX_.'configuration $sql = 'DELETE FROM '._DB_PREFIX_.'configuration
WHERE id_configuration = '.$id; WHERE id_configuration = '.$id;
Db::getInstance()->execute($sql); Db::getInstance()->execute($sql);
@@ -417,21 +417,21 @@ class ConfigurationCore extends ObjectModel
public static function hasContext($key, $id_lang, $context) public static function hasContext($key, $id_lang, $context)
{ {
if (Shop::getContext() == Shop::CONTEXT_ALL) if (Shop::getContext() == Shop::CONTEXT_ALL)
$id_shop = $id_group_shop = null; $id_shop = $id_shop_group = null;
else if (Shop::getContext() == Shop::CONTEXT_GROUP) else if (Shop::getContext() == Shop::CONTEXT_GROUP)
{ {
$id_group_shop = Shop::getContextGroupShopID(); $id_shop_group = Shop::getContextShopGroupID();
$id_shop = null; $id_shop = null;
} }
else else
{ {
$id_group_shop = Shop::getContextGroupShopID(); $id_shop_group = Shop::getContextShopGroupID();
$id_shop = Shop::getContextShopID(); $id_shop = Shop::getContextShopID();
} }
if ($context == Shop::CONTEXT_SHOP && Configuration::hasKey($key, $id_lang, null, $id_shop)) if ($context == Shop::CONTEXT_SHOP && Configuration::hasKey($key, $id_lang, null, $id_shop))
return true; return true;
else if ($context == Shop::CONTEXT_GROUP && Configuration::hasKey($key, $id_lang, $id_group_shop)) else if ($context == Shop::CONTEXT_GROUP && Configuration::hasKey($key, $id_lang, $id_shop_group))
return true; return true;
else if ($context == Shop::CONTEXT_ALL && Configuration::hasKey($key, $id_lang)) else if ($context == Shop::CONTEXT_ALL && Configuration::hasKey($key, $id_lang))
return true; return true;
@@ -469,36 +469,36 @@ class ConfigurationCore extends ObjectModel
} }
/** /**
* Fill $id_group_shop and $id_shop vars from correct context * Fill $id_shop_group and $id_shop vars from correct context
* *
* @param int $id_group_shop * @param int $id_shop_group
* @param int $id_shop * @param int $id_shop
*/ */
protected static function getShopFromContext(&$id_group_shop, &$id_shop) protected static function getShopFromContext(&$id_shop_group, &$id_shop)
{ {
if (!Shop::isFeatureActive()) if (!Shop::isFeatureActive())
return; return;
if (Shop::getContext() == Shop::CONTEXT_ALL) if (Shop::getContext() == Shop::CONTEXT_ALL)
$shop_id = $group_shop_id = null; $shop_id = $shop_group_id = null;
else if (Shop::getContext() == Shop::CONTEXT_GROUP) else if (Shop::getContext() == Shop::CONTEXT_GROUP)
{ {
$group_shop_id = Shop::getContextGroupShopID(); $shop_group_id = Shop::getContextShopGroupID();
$shop_id = null; $shop_id = null;
} }
else else
{ {
$group_shop_id = Shop::getContextGroupShopID(); $shop_group_id = Shop::getContextShopGroupID();
$shop_id = Shop::getContextShopID(); $shop_id = Shop::getContextShopID();
} }
if (is_null($id_shop)) if (is_null($id_shop))
$id_shop = $shop_id; $id_shop = $shop_id;
if (is_null($id_group_shop)) if (is_null($id_shop_group))
$id_group_shop = $group_shop_id; $id_shop_group = $shop_group_id;
$id_shop = (int)$id_shop; $id_shop = (int)$id_shop;
$id_group_shop = (int)$id_group_shop; $id_shop_group = (int)$id_shop_group;
} }
/** /**
@@ -513,9 +513,9 @@ class ConfigurationCore extends ObjectModel
if ($shopID) if ($shopID)
return ' AND id_shop = '.$shopID; return ' AND id_shop = '.$shopID;
else if ($shopGroupID) else if ($shopGroupID)
return ' AND id_group_shop = '.$shopGroupID.' AND id_shop IS NULL'; return ' AND id_shop_group = '.$shopGroupID.' AND id_shop IS NULL';
else else
return ' AND id_group_shop IS NULL AND id_shop IS NULL'; return ' AND id_shop_group IS NULL AND id_shop IS NULL';
} }
/** /**
+5 -5
View File
@@ -43,7 +43,7 @@ class ConnectionCore extends ObjectModel
public $id_shop; public $id_shop;
/** @var int */ /** @var int */
public $id_group_shop; public $id_shop_group;
/** @var string */ /** @var string */
public $date_add; public $date_add;
@@ -60,7 +60,7 @@ class ConnectionCore extends ObjectModel
'ip_address' => array('type' => self::TYPE_INT, 'validate' => 'isInt'), 'ip_address' => array('type' => self::TYPE_INT, 'validate' => 'isInt'),
'http_referer' => array('type' => self::TYPE_STRING, 'validate' => 'isAbsoluteUrl'), 'http_referer' => array('type' => self::TYPE_STRING, 'validate' => 'isAbsoluteUrl'),
'id_shop' => array('type' => self::TYPE_INT, 'required' => true), 'id_shop' => array('type' => self::TYPE_INT, 'required' => true),
'id_group_shop' => array('type' => self::TYPE_INT, 'required' => true), 'id_shop_group' => array('type' => self::TYPE_INT, 'required' => true),
'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate') 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate')
), ),
); );
@@ -73,8 +73,8 @@ class ConnectionCore extends ObjectModel
{ {
if (!$this->id_shop) if (!$this->id_shop)
$this->id_shop = Context::getContext()->shop->id; $this->id_shop = Context::getContext()->shop->id;
if (!$this->id_group_shop) if (!$this->id_shop_group)
$this->id_group_shop = Context::getContext()->shop->id_group_shop; $this->id_shop_group = Context::getContext()->shop->id_shop_group;
$fields = parent::getFields(); $fields = parent::getFields();
return $fields; return $fields;
@@ -145,7 +145,7 @@ class ConnectionCore extends ObjectModel
$connection->id_page = Page::getCurrentId(); $connection->id_page = Page::getCurrentId();
$connection->ip_address = Tools::getRemoteAddr() ? ip2long(Tools::getRemoteAddr()) : ''; $connection->ip_address = Tools::getRemoteAddr() ? ip2long(Tools::getRemoteAddr()) : '';
$connection->id_shop = Context::getContext()->shop->id; $connection->id_shop = Context::getContext()->shop->id;
$connection->id_group_shop = Context::getContext()->shop->id_group_shop; $connection->id_shop_group = Context::getContext()->shop->id_shop_group;
$connection->date_add = $cookie->date_add; $connection->date_add = $cookie->date_add;
if (Validate::isAbsoluteUrl($referer)) if (Validate::isAbsoluteUrl($referer))
$connection->http_referer = $referer; $connection->http_referer = $referer;
+1 -1
View File
@@ -65,7 +65,7 @@ class CurrencyCore extends ObjectModel
public static $definition = array( public static $definition = array(
'table' => 'currency', 'table' => 'currency',
'primary' => 'id_currency', 'primary' => 'id_currency',
'multishop' => true, 'multilang_shop' => true,
'fields' => array( 'fields' => array(
'name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true, 'size' => 32), 'name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true, 'size' => 32),
'iso_code' => array('type' => self::TYPE_STRING, 'validate' => 'isLanguageIsoCode', 'required' => true, 'size' => 3), 'iso_code' => array('type' => self::TYPE_STRING, 'validate' => 'isLanguageIsoCode', 'required' => true, 'size' => 3),
+3 -3
View File
@@ -31,7 +31,7 @@ class CustomerCore extends ObjectModel
public $id_shop; public $id_shop;
public $id_group_shop; public $id_shop_group;
/** @var string Secure key */ /** @var string Secure key */
public $secure_key; public $secure_key;
@@ -183,7 +183,7 @@ class CustomerCore extends ObjectModel
'note' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'size' => 65000, 'copy_post' => false), 'note' => array('type' => self::TYPE_STRING, 'validate' => 'isCleanHtml', 'size' => 65000, 'copy_post' => false),
'is_guest' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'copy_post' => false), 'is_guest' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'copy_post' => false),
'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'copy_post' => false), 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'copy_post' => false),
'id_group_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'copy_post' => false), 'id_shop_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'copy_post' => false),
'id_default_group' => array('type' => self::TYPE_INT, 'copy_post' => false), 'id_default_group' => array('type' => self::TYPE_INT, 'copy_post' => false),
'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate', 'copy_post' => false), 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate', 'copy_post' => false),
'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate', 'copy_post' => false), 'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate', 'copy_post' => false),
@@ -197,7 +197,7 @@ class CustomerCore extends ObjectModel
public function add($autodate = true, $null_values = true) public function add($autodate = true, $null_values = true)
{ {
$this->id_shop = ($this->id_shop) ? $this->id_shop : Context::getContext()->shop->id; $this->id_shop = ($this->id_shop) ? $this->id_shop : Context::getContext()->shop->id;
$this->id_group_shop = ($this->id_group_shop) ? $this->id_group_shop : Context::getContext()->shop->id_group_shop; $this->id_shop_group = ($this->id_shop_group) ? $this->id_shop_group : Context::getContext()->shop->id_shop_group;
$this->birthday = (empty($this->years) ? $this->birthday : (int)$this->years.'-'.(int)$this->months.'-'.(int)$this->days); $this->birthday = (empty($this->years) ? $this->birthday : (int)$this->years.'-'.(int)$this->months.'-'.(int)$this->days);
$this->secure_key = md5(uniqid(rand(), true)); $this->secure_key = md5(uniqid(rand(), true));
$this->last_passwd_gen = date('Y-m-d H:i:s', strtotime('-'.Configuration::get('PS_PASSWD_TIME_FRONT').'minutes')); $this->last_passwd_gen = date('Y-m-d H:i:s', strtotime('-'.Configuration::get('PS_PASSWD_TIME_FRONT').'minutes'));
+5 -5
View File
@@ -34,7 +34,7 @@ class DeliveryCore extends ObjectModel
public $id_shop; public $id_shop;
/** @var int **/ /** @var int **/
public $id_group_shop; public $id_shop_group;
/** @var integer */ /** @var integer */
public $id_carrier; public $id_carrier;
@@ -63,7 +63,7 @@ class DeliveryCore extends ObjectModel
'id_range_weight' =>array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_range_weight' =>array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_zone' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_zone' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_shop' => array('type' => self::TYPE_INT), 'id_shop' => array('type' => self::TYPE_INT),
'id_group_shop' => array('type' => self::TYPE_INT), 'id_shop_group' => array('type' => self::TYPE_INT),
'price' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'required' => true), 'price' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'required' => true),
), ),
); );
@@ -88,10 +88,10 @@ class DeliveryCore extends ObjectModel
else else
$fields['id_shop'] = null; $fields['id_shop'] = null;
if ($this->id_group_shop) if ($this->id_shop_group)
$fields['id_group_shop'] = (int)$this->id_group_shop; $fields['id_shop_group'] = (int)$this->id_shop_group;
else else
$fields['id_group_shop'] = null; $fields['id_shop_group'] = null;
return $fields; return $fields;
} }
+2 -2
View File
@@ -270,9 +270,9 @@ class EmployeeCore extends ObjectModel
break; break;
case Shop::CONTEXT_GROUP: case Shop::CONTEXT_GROUP:
if ($context->shop->checkIfGroupShopExist(Shop::getContextGroupShopID())) if ($context->shop->checkIfShopGroupExist(Shop::getContextShopGroupID()))
{ {
$shops = $context->shop->getIdShopsByIdGroupShop(Shop::getContextGroupShopID()); $shops = $context->shop->getIdShopsByIdShopGroup(Shop::getContextShopGroupID());
foreach ($shops as $shop) foreach ($shops as $shop)
if (!in_array($shop, Employee::getEmployeeShopById($id_employee))) if (!in_array($shop, Employee::getEmployeeShopById($id_employee)))
return false; return false;
+21 -20
View File
@@ -165,25 +165,24 @@ class ManufacturerCore extends ObjectModel
* @return array Manufacturers * @return array Manufacturers
*/ */
public static function getManufacturers($get_nb_products = false, $id_lang = 0, $active = true, $p = false, public static function getManufacturers($get_nb_products = false, $id_lang = 0, $active = true, $p = false,
$n = false, $all_group = false, $id_group_shop = false) $n = false, $all_group = false, $id_shop_group = false)
{ {
if (!$id_lang) if (!$id_lang)
$id_lang = (int)Configuration::get('PS_LANG_DEFAULT'); $id_lang = (int)Configuration::get('PS_LANG_DEFAULT');
if (!$id_group_shop) if (!$id_shop_group)
if (Context::getContext()->shop->id) if (Context::getContext()->shop->id)
$id_group_shop = Shop::getGroupFromShop(Context::getContext()->shop->id); $id_shop_group = Shop::getGroupFromShop(Context::getContext()->shop->id);
else else
$id_group_shop = Shop::getGroupFromShop(Configuration::get('PS_SHOP_DEFAULT')); $id_shop_group = Shop::getGroupFromShop(Configuration::get('PS_SHOP_DEFAULT'));
$sql = 'SELECT m.*, ml.`description` $sql = 'SELECT m.*, ml.`description`
FROM `'._DB_PREFIX_.'manufacturer_group_shop` mgs FROM `'._DB_PREFIX_.'manufacturer` m
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.id_manufacturer = mgs.id_manufacturer)
LEFT JOIN `'._DB_PREFIX_.'manufacturer_lang` ml ON ( LEFT JOIN `'._DB_PREFIX_.'manufacturer_lang` ml ON (
m.`id_manufacturer` = ml.`id_manufacturer` m.`id_manufacturer` = ml.`id_manufacturer`
AND ml.`id_lang` = '.(int)$id_lang.' AND ml.`id_lang` = '.(int)$id_lang.'
) )
WHERE mgs.id_group_shop='.(int)$id_group_shop. '.Shop::addSqlAssociation('manufacturer', 'm').
($active ? ' AND m.`active` = 1' : '').' ($active ? ' AND m.`active` = 1' : '').'
ORDER BY m.`name` ASC'. ORDER BY m.`name` ASC'.
($p ? ' LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n : ''); ($p ? ' LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n : '');
@@ -206,9 +205,10 @@ class ManufacturerCore extends ObjectModel
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS( $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
'SELECT p.`id_product` 'SELECT p.`id_product`
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'manufacturer` as m ON (m.`id_manufacturer`= p.`id_manufacturer`) LEFT JOIN `'._DB_PREFIX_.'manufacturer` as m ON (m.`id_manufacturer`= p.`id_manufacturer`)
WHERE m.`id_manufacturer` = '.(int)$manufacturer['id_manufacturer']. WHERE m.`id_manufacturer` = '.(int)$manufacturer['id_manufacturer'].
($active ? ' AND p.`active` = 1 ' : ''). ($active ? ' AND product_shop.`active` = 1 ' : '').
($all_group ? '' : ' AND p.`id_product` IN ( ($all_group ? '' : ' AND p.`id_product` IN (
SELECT cp.`id_product` SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg FROM `'._DB_PREFIX_.'category_group` cg
@@ -304,8 +304,8 @@ class ManufacturerCore extends ObjectModel
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').' '.Shop::addSqlAssociation('product', 'p').'
WHERE p.id_manufacturer = '.(int)$id_manufacturer WHERE p.id_manufacturer = '.(int)$id_manufacturer
.($active ? ' AND p.`active` = 1' : '').' .($active ? ' AND product_shop.`active` = 1' : '').'
'.($front ? ' AND p.`visibility` IN ("both", "catalog")' : '').' '.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').'
AND p.`id_product` IN ( AND p.`id_product` IN (
SELECT cp.`id_product` SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg FROM `'._DB_PREFIX_.'category_group` cg
@@ -322,31 +322,30 @@ class ManufacturerCore extends ObjectModel
$order_by = explode('.', $order_by); $order_by = explode('.', $order_by);
$order_by = pSQL($order_by[0]).'.`'.pSQL($order_by[1]).'`'; $order_by = pSQL($order_by[0]).'.`'.pSQL($order_by[1]).'`';
} }
$sql = 'SELECT p.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pa.`id_product_attribute`, $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pa.`id_product_attribute`,
pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`,
pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`,
DATEDIFF( DATEDIFF(
p.`date_add`, product_shop.`date_add`,
DATE_SUB( DATE_SUB(
NOW(), NOW(),
INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY
) )
) > 0 AS new, ) > 0 AS new,
(p.`price` * ((100 + (t.`rate`))/100)) AS orderprice (product_shop.`price` * ((100 + (t.`rate`))/100)) AS orderprice
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').' '.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa
ON (p.`id_product` = pa.`id_product` AND default_on = 1) ON (p.`id_product` = pa.`id_product`)
'.Shop::addSqlAssociation('product_attribute', 'pa').'
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').') ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
LEFT JOIN `'._DB_PREFIX_.'image` i LEFT JOIN `'._DB_PREFIX_.'image` i
ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
LEFT JOIN `'._DB_PREFIX_.'image_lang` il LEFT JOIN `'._DB_PREFIX_.'image_lang` il
ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (p.`id_product` = ptrgs.`id_product`
AND ptrgs.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr
ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group` ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)$context->country->id.' AND tr.`id_country` = '.(int)$context->country->id.'
AND tr.`id_state` = 0 AND tr.`id_state` = 0
AND tr.`zipcode_from` = 0) AND tr.`zipcode_from` = 0)
@@ -358,8 +357,9 @@ class ManufacturerCore extends ObjectModel
ON (m.`id_manufacturer` = p.`id_manufacturer`) ON (m.`id_manufacturer` = p.`id_manufacturer`)
'.Product::sqlStock('p', 0).' '.Product::sqlStock('p', 0).'
WHERE p.`id_manufacturer` = '.(int)$id_manufacturer.' WHERE p.`id_manufacturer` = '.(int)$id_manufacturer.'
'.($active ? ' AND p.`active` = 1' : '').' '.($active ? ' AND product_shop.`active` = 1' : '').'
'.($front ? ' AND p.`visibility` IN ("both", "catalog")' : '').' '.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').'
AND product_attribute_shop.`default_on` = 1
AND p.`id_product` IN ( AND p.`id_product` IN (
SELECT cp.`id_product` SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg FROM `'._DB_PREFIX_.'category_group` cg
@@ -392,12 +392,13 @@ class ManufacturerCore extends ObjectModel
return Db::getInstance()->executeS(' return Db::getInstance()->executeS('
SELECT p.`id_product`, pl.`name` SELECT p.`id_product`, pl.`name`
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('procut', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON ( LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (
p.`id_product` = pl.`id_product` p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.$context->shop->addSqlRestrictionOnLang('pl').' AND pl.`id_lang` = '.(int)$id_lang.$context->shop->addSqlRestrictionOnLang('pl').'
) )
WHERE p.`id_manufacturer` = '.(int)$this->id. WHERE p.`id_manufacturer` = '.(int)$this->id.
($front ? ' AND p.`visibility` IN ("both", "catalog")' : '')); ($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : ''));
} }
/* /*
+1 -1
View File
@@ -41,7 +41,7 @@ class MetaCore extends ObjectModel
'table' => 'meta', 'table' => 'meta',
'primary' => 'id_meta', 'primary' => 'id_meta',
'multilang' => true, 'multilang' => true,
'multishop' => true, 'multilang_shop' => true,
'fields' => array( 'fields' => array(
'page' => array('type' => self::TYPE_STRING, 'validate' => 'isFileName', 'required' => true, 'size' => 64), 'page' => array('type' => self::TYPE_STRING, 'validate' => 'isFileName', 'required' => true, 'size' => 64),
+199 -65
View File
@@ -38,6 +38,13 @@ abstract class ObjectModelCore
const TYPE_HTML = 6; const TYPE_HTML = 6;
const TYPE_NOTHING = 7; const TYPE_NOTHING = 7;
/**
* List of data to format
*/
const FORMAT_COMMON = 1;
const FORMAT_LANG = 2;
const FORMAT_SHOP = 3;
/** /**
* List of association types * List of association types
*/ */
@@ -121,6 +128,11 @@ abstract class ObjectModelCore
*/ */
protected $def; protected $def;
/**
* @var array List of specific fields to update (all fields if null)
*/
protected $update_fields = null;
/** /**
* Returns object validation rules (fields validity) * Returns object validation rules (fields validity)
* *
@@ -155,13 +167,13 @@ abstract class ObjectModelCore
if (!is_null($id_lang)) if (!is_null($id_lang))
$this->id_lang = (Language::getLanguage($id_lang) !== false) ? $id_lang : Configuration::get('PS_LANG_DEFAULT'); $this->id_lang = (Language::getLanguage($id_lang) !== false) ? $id_lang : Configuration::get('PS_LANG_DEFAULT');
if ($id_shop && $this->isLangMultishop()) if ($id_shop && $this->isMultishop())
{ {
$this->id_shop = (int)$id_shop; $this->id_shop = (int)$id_shop;
$this->get_shop_from_context = false; $this->get_shop_from_context = false;
} }
if ($this->isLangMultishop() && !$this->id_shop) if ($this->isMultishop() && !$this->id_shop)
$this->id_shop = Context::getContext()->shop->id; $this->id_shop = Context::getContext()->shop->id;
if (!Validate::isTableOrIdentifier($this->def['primary']) || !Validate::isTableOrIdentifier($this->def['table'])) if (!Validate::isTableOrIdentifier($this->def['primary']) || !Validate::isTableOrIdentifier($this->def['table']))
@@ -176,12 +188,19 @@ abstract class ObjectModelCore
$sql = new DbQuery(); $sql = new DbQuery();
$sql->from($this->def['table'], 'a'); $sql->from($this->def['table'], 'a');
$sql->where('a.'.$this->def['primary'].' = '.(int)$id); $sql->where('a.'.$this->def['primary'].' = '.(int)$id);
// Get lang informations
if ($id_lang) if ($id_lang)
{ {
$sql->leftJoin($this->def['table'].'_lang', 'b', 'a.'.$this->def['primary'].' = b.'.$this->def['primary'].' AND b.id_lang = '.(int)$id_lang); $sql->leftJoin($this->def['table'].'_lang', 'b', 'a.'.$this->def['primary'].' = b.'.$this->def['primary'].' AND b.id_lang = '.(int)$id_lang);
if ($this->id_shop) if ($this->id_shop)
$sql->where('b.id_shop = '.$this->id_shop); $sql->where('b.id_shop = '.$this->id_shop);
} }
// Get shop informations
if (!empty($this->def['multishop']))
$sql->leftJoin($this->def['table'].'_shop', 'c', 'a.'.$this->def['primary'].' = c.'.$this->def['primary'].' AND c.id_shop = '.(int)$this->id_shop);
Cache::store($cache_id, Db::getInstance()->getRow($sql)); Cache::store($cache_id, Db::getInstance()->getRow($sql));
} }
@@ -234,7 +253,29 @@ abstract class ObjectModelCore
public function getFields() public function getFields()
{ {
$this->validateFields(); $this->validateFields();
$fields = $this->formatFields(); $fields = $this->formatFields(self::FORMAT_COMMON);
// For retro compatibility, get common fields for default shop
if ($this->id_shop == Configuration::get('PS_SHOP_DEFAULT'))
$fields = array_merge($fields, $this->getFieldsShop());
// Ensure that we get something to insert
if (!$fields)
$fields[$this->def['primary']] = $this->id;
return $fields;
}
/**
* Prepare fields for multishop
* Fields are not validated here, we considere they are already validated in getFields() method, this
* not the best solution but this is the only one possible for retro compatibility.
*
* @since 1.5.0
* @return array All object fields
*/
public function getFieldsShop()
{
$fields = $this->formatFields(self::FORMAT_SHOP);
if (!$fields) if (!$fields)
$fields[$this->def['primary']] = $this->id; $fields[$this->def['primary']] = $this->id;
return $fields; return $fields;
@@ -253,23 +294,35 @@ abstract class ObjectModelCore
return $this->getTranslationsFieldsChild(); return $this->getTranslationsFieldsChild();
$this->validateFieldsLang(); $this->validateFieldsLang();
$is_lang_multishop = $this->isLangMultishop();
$fields = array(); $fields = array();
if (is_null($this->id_lang)) if (is_null($this->id_lang))
foreach (Language::getLanguages(false) as $language) foreach (Language::getLanguages(false) as $language)
$fields[$language['id_lang']] = $this->formatFields($language['id_lang']); {
$fields[$language['id_lang']] = $this->formatFields(self::FORMAT_LANG, $language['id_lang']);
$fields[$language['id_lang']]['id_lang'] = $language['id_lang'];
if ($this->id_shop && $is_lang_multishop)
$fields[$language['id_lang']]['id_shop'] = (int)$this->id_shop;
}
else else
$fields = array($this->id_lang => $this->formatFields($this->id_lang)); {
$fields = array($this->id_lang => $this->formatFields(self::FORMAT_LANG, $this->id_lang));
$fields['id_lang'] = $this->id_lang;
if ($this->id_shop && $is_lang_multishop)
$fields['id_shop'] = (int)$this->id_shop;
}
return $fields; return $fields;
} }
/** /**
* @since 1.5.0 * @since 1.5.0
* @param int $type FORMAT_COMMON or FORMAT_LANG or FORMAT_SHOP
* @param int $id_lang If this parameter is given, only take lang fields * @param int $id_lang If this parameter is given, only take lang fields
* @return array * @return array
*/ */
protected function formatFields($id_lang = null) protected function formatFields($type, $id_lang = null)
{ {
$fields = array(); $fields = array();
@@ -277,23 +330,21 @@ abstract class ObjectModelCore
if (isset($this->id)) if (isset($this->id))
$fields[$this->def['primary']] = $this->id; $fields[$this->def['primary']] = $this->id;
// Set id_lang field for multilang fields and id_shop for multishop field
if ($id_lang)
{
$fields['id_lang'] = $id_lang;
if ($this->id_shop && $this->isLangMultishop())
$fields['id_shop'] = (int)$this->id_shop;
}
foreach ($this->def['fields'] as $field => $data) foreach ($this->def['fields'] as $field => $data)
{ {
// If $id_lang take only language fields, else take only classic fields // Only get fields we need for the type
if (($id_lang && empty($data['lang'])) || (!$id_lang && !empty($data['lang']))) // E.g. if only lang fields are filtered, ignore fields without lang => true
if (($type == self::FORMAT_LANG && empty($data['lang']))
|| ($type == self::FORMAT_SHOP && empty($data['shop']))
|| ($type == self::FORMAT_COMMON && (!empty($data['shop']) || !empty($data['lang']))))
continue;
if (is_array($this->update_fields) && (empty($this->update_fields[$field]) || ($type == self::FORMAT_LANG && empty($this->update_fields[$field][$id_lang]))))
continue; continue;
// Get field value, if value is multilang and field is empty, use value from default lang // Get field value, if value is multilang and field is empty, use value from default lang
$value = $this->$field; $value = $this->$field;
if ($id_lang && is_array($value)) if ($type == self::FORMAT_LANG && $id_lang && is_array($value))
{ {
if (!empty($value[$id_lang])) if (!empty($value[$id_lang]))
$value = $value[$id_lang]; $value = $value[$id_lang];
@@ -392,10 +443,28 @@ abstract class ObjectModelCore
// Get object id in database // Get object id in database
$this->id = Db::getInstance()->Insert_ID(); $this->id = Db::getInstance()->Insert_ID();
// Database insertion for multishop fields related to the object
if (!empty($this->def['multishop']))
{
$fields = $this->getFieldsShop();
$fields[$this->def['primary']] = (int)$this->id;
$fields['id_shop'] = (int)$this->id_shop;
if ($null_values)
$result &= Db::getInstance()->insert($this->def['table'].'_shop', $fields, true);
else
$result &= Db::getInstance()->insert($this->def['table'].'_shop', $fields);
}
else if (!Shop::isFeatureActive() && Shop::isTableAssociated($this->def['table']))
$result &= $this->associateTo(Context::getContext()->shop->id);
if (!$result)
return false;
$assos = Shop::getAssoTables(); $assos = Shop::getAssoTables();
// Database insertion for multilingual fields related to the object // Database insertion for multilingual fields related to the object
if (isset($this->def['multilang']) && $this->def['multilang']) if (!empty($this->def['multilang']))
{ {
$fields = $this->getFieldsLang(); $fields = $this->getFieldsLang();
$shops = Shop::getShops(true, null, true); $shops = Shop::getShops(true, null, true);
@@ -420,16 +489,6 @@ abstract class ObjectModelCore
} }
} }
if (!Shop::isFeatureActive())
{
if (isset($assos[$this->def['table']]) && $assos[$this->def['table']]['type'] == 'shop')
$result &= $this->associateTo(Context::getContext()->shop->id, 'shop');
$assos = GroupShop::getAssoTables();
if (isset($assos[$this->def['table']]) && $assos[$this->def['table']]['type'] == 'group_shop')
$result &= $this->associateTo(Context::getContext()->shop->id_group_shop, 'group_shop');
}
// @hook actionObject*AddAfter // @hook actionObject*AddAfter
Hook::exec('actionObjectAddAfter', array('object' => $this)); Hook::exec('actionObjectAddAfter', array('object' => $this));
Hook::exec('actionObject'.get_class($this).'AddAfter', array('object' => $this)); Hook::exec('actionObject'.get_class($this).'AddAfter', array('object' => $this));
@@ -460,9 +519,26 @@ abstract class ObjectModelCore
$result = Db::getInstance()->update($this->def['table'], $this->getFields(), '`'.pSQL($this->def['primary']).'` = '.(int)$this->id, 0, true); $result = Db::getInstance()->update($this->def['table'], $this->getFields(), '`'.pSQL($this->def['primary']).'` = '.(int)$this->id, 0, true);
else else
$result = Db::getInstance()->update($this->def['table'], $this->getFields(), '`'.pSQL($this->def['primary']).'` = '.(int)$this->id); $result = Db::getInstance()->update($this->def['table'], $this->getFields(), '`'.pSQL($this->def['primary']).'` = '.(int)$this->id);
if (!$result) if (!$result)
return false; return false;
// Database insertion for multishop fields related to the object
if (!empty($this->def['multishop']))
{
$fields = $this->getFieldsShop();
$fields[$this->def['primary']] = (int)$this->id;
foreach (Shop::getContextListShopID() as $id_shop)
{
$fields['id_shop'] = $id_shop;
$where = 'id_product = '.(int)$this->id.' AND id_shop = '.(int)$id_shop;
if (Db::getInstance()->getValue('SELECT id_product FROM '._DB_PREFIX_.$this->def['table'].'_shop WHERE '.$where))
$result &= Db::getInstance()->update($this->def['table'].'_shop', $fields, $where, 0, $null_values);
else
$result &= Db::getInstance()->insert($this->def['table'].'_shop', $fields, $null_values);
}
}
// Database update for multilingual fields related to the object // Database update for multilingual fields related to the object
if (isset($this->def['multilang']) && $this->def['multilang']) if (isset($this->def['multilang']) && $this->def['multilang'])
{ {
@@ -525,23 +601,25 @@ abstract class ObjectModelCore
Hook::exec('actionObject'.get_class($this).'DeleteBefore', array('object' => $this)); Hook::exec('actionObject'.get_class($this).'DeleteBefore', array('object' => $this));
$this->clearCache(); $this->clearCache();
$result = true;
// Remove association to multishop table
if (!empty($this->def['multishop']))
$result &= Db::getInstance()->delete($this->def['table'].'_shop', '`'.$this->def['primary'].'`='.(int)$this->id.' AND id_shop IN ('.implode(', ', Shop::getContextListShopID()).')');
else if (Shop::isTableAssociated($this->def['table']))
$result &= Db::getInstance()->delete($this->def['table'].'_shop', '`'.$this->def['primary'].'`='.(int)$this->id);
// Database deletion // Database deletion
$result = Db::getInstance()->delete($this->def['table'], '`'.pSQL($this->def['primary']).'` = '.(int)$this->id); $has_multishop_entries = !empty($this->def['multishop']) ? $this->hasMultishopEntries() : false;
if ($result && !$has_multishop_entries)
$result &= Db::getInstance()->delete($this->def['table'], '`'.pSQL($this->def['primary']).'` = '.(int)$this->id);
if (!$result) if (!$result)
return false; return false;
// Database deletion for multilingual fields related to the object // Database deletion for multilingual fields related to the object
if (isset($this->def['multilang']) && $this->def['multilang']) if (!empty($this->def['multilang']) && !$has_multishop_entries)
Db::getInstance()->delete($this->def['table'].'_lang', '`'.pSQL($this->def['primary']).'` = '.(int)$this->id); $result &= Db::getInstance()->delete($this->def['table'].'_lang', '`'.pSQL($this->def['primary']).'` = '.(int)$this->id);
$assos = Shop::getAssoTables();
if (isset($assos[$this->def['table']]) && $assos[$this->def['table']]['type'] == 'shop')
Db::getInstance()->delete($this->def['table'].'_shop', '`'.$this->def['primary'].'`='.(int)$this->id);
$assos = GroupShop::getAssoTables();
if (isset($assos[$this->def['table']]) && $assos[$this->def['table']]['type'] == 'group_shop')
Db::getInstance()->delete($this->def['table'].'_group_shop', '`'.$this->def['primary'].'`='.(int)$this->id);
// @hook actionObject*DeleteAfter // @hook actionObject*DeleteAfter
Hook::exec('actionObjectDeleteAfter', array('object' => $this)); Hook::exec('actionObjectDeleteAfter', array('object' => $this));
@@ -653,6 +731,9 @@ abstract class ObjectModelCore
if (!empty($data['lang'])) if (!empty($data['lang']))
continue; continue;
if (is_array($this->update_fields) && empty($this->update_fields[$field]))
continue;
$message = $this->validateField($field, $this->$field); $message = $this->validateField($field, $this->$field);
if ($message !== true) if ($message !== true)
{ {
@@ -685,6 +766,9 @@ abstract class ObjectModelCore
foreach ($values as $id_lang => $value) foreach ($values as $id_lang => $value)
{ {
if (is_array($this->update_fields) && empty($this->update_fields[$field][$id_lang]))
continue;
$message = $this->validateField($field, $value, $id_lang); $message = $this->validateField($field, $value, $id_lang);
if ($message !== true) if ($message !== true)
{ {
@@ -967,10 +1051,9 @@ abstract class ObjectModelCore
* This function associate an item to its context * This function associate an item to its context
* *
* @param int|array $id_shops * @param int|array $id_shops
* @param string $type
* @return boolean * @return boolean
*/ */
public function associateTo($id_shops, $type = 'shop') public function associateTo($id_shops)
{ {
if (!$this->id) if (!$this->id)
return; return;
@@ -981,43 +1064,24 @@ abstract class ObjectModelCore
$data = array(); $data = array();
foreach ($id_shops as $id_shop) foreach ($id_shops as $id_shop)
{ {
if (($type == 'shop' && !$this->isAssociatedToShop($id_shop)) || ($type == 'group_shop' && !$this->isAssociatedToGroupShop($id_shop))) if (!$this->isAssociatedToShop($id_shop))
$data[] = array( $data[] = array(
$this->def['primary'] => (int)$this->id, $this->def['primary'] => (int)$this->id,
'id_'.$type => (int)$id_shop, 'id_shop' => (int)$id_shop,
); );
} }
if ($data) if ($data)
return Db::getInstance()->insert($this->def['table'].'_'.$type, $data); return Db::getInstance()->insert($this->def['table'].'_shop', $data);
return true; return true;
} }
/**
* Check if current object is associated to a group shop
*
* @since 1.5.0
* @param int $id_group_shop
* @return bool
*/
public function isAssociatedToGroupShop($id_group_shop = null)
{
if (is_null($id_group_shop))
$id_group_shop = Context::getContext()->shop->id_group_shop;
$sql = 'SELECT id_group_shop
FROM `'.pSQL(_DB_PREFIX_.$this->def['table']).'_group_shop`
WHERE `'.$this->def['primary'].'`='.(int)$this->id.' AND id_group_shop='.(int)$id_group_shop;
return (bool)Db::getInstance()->getValue($sql);
}
/** /**
* @since 1.5.0 * @since 1.5.0
*/ */
public function duplicateShops($id) public function duplicateShops($id)
{ {
$asso = Shop::getAssoTables(); if (!Shop::isTableAssociated($this->def['table']))
if (!isset($asso[$this->def['table']]) || $asso[$this->def['table']]['type'] != 'shop')
return false; return false;
$sql = 'SELECT id_shop $sql = 'SELECT id_shop
@@ -1034,9 +1098,67 @@ abstract class ObjectModelCore
return false; return false;
} }
/**
* Check if there is entries in associated shop table for current entity
*
* @since 1.5.0
* @return bool
*/
public function hasMultishopEntries()
{
if (empty($this->def['multishop']))
return false;
return (bool)Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.$this->def['table'].'_shop` WHERE `'.$this->def['primary'].'` = '.(int)$this->id);
}
public function isMultishop()
{
return !empty($this->def['multishop']) || !empty($this->def['multilang_shop']);
}
public function isLangMultishop() public function isLangMultishop()
{ {
return isset($this->def['multishop']) && $this->def['multishop'] && isset($this->def['multilang']) && $this->def['multilang']; return !empty($this->def['multilang']) && !empty($this->def['multilang_shop']);
}
/**
* Update a table and splits the common datas and the shop datas
*
* @since 1.5.0
* @param string $classname
* @param array $data
* @param string $where
* @return bool
*/
public static function updateMultishopTable($classname, $data, $where)
{
$def = ObjectModel::getDefinition($classname);
$common_data = $shop_data = array();
$is_default_shop = Context::getContext()->shop->id == Configuration::get('PS_SHOP_DEFAULT');
foreach ($data as $field => $value)
{
if (!isset($def['fields'][$field]))
continue;
if (!empty($def['fields'][$field]['shop']))
{
if ($is_default_shop)
$common_data[$field] = $value;
$shop_data[$field] = $value;
}
else
$common_data[$field] = $value;
}
$result = true;
if ($common_data)
$result &= Db::getInstance()->update($def['table'], $common_data, $where);
if ($shop_data)
$result &= Db::getInstance()->update($def['table'].'_shop', $shop_data, $where.' AND id_shop = '.(int)Context::getContext()->shop->id);
return $result;
} }
/** /**
@@ -1276,4 +1398,16 @@ abstract class ObjectModelCore
else else
throw new PrestaShopException('Could not load field from definition.'); throw new PrestaShopException('Could not load field from definition.');
} }
/**
* Set a list of specific fields to update
* array(field1 => true, field2 => false, langfield1 => array(1 => true, 2 => false))
*
* @since 1.5.0
* @param array $fields
*/
public function setFieldsToUpdate(array $fields)
{
$this->update_fields = $fields;
}
} }
+9 -12
View File
@@ -126,7 +126,7 @@ class PackCore extends Product
if (!Pack::isFeatureActive()) if (!Pack::isFeatureActive())
return array(); return array();
$sql = 'SELECT p.*, pl.*, i.`id_image`, il.`legend`, t.`rate`, cl.`name` AS category_default, a.quantity AS pack_quantity, asso_shop_product.`id_category_default` $sql = 'SELECT p.*, product_shop.*, pl.*, i.`id_image`, il.`legend`, t.`rate`, cl.`name` AS category_default, a.quantity AS pack_quantity, product_shop.`id_category_default`
FROM `'._DB_PREFIX_.'pack` a FROM `'._DB_PREFIX_.'pack` a
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_product = a.id_product_item LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_product = a.id_product_item
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
@@ -136,16 +136,14 @@ class PackCore extends Product
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
'.Shop::addSqlAssociation('product', 'p').' '.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
ON asso_shop_product.`id_category_default` = cl.`id_category` ON product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').' AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').'
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (p.`id_product` = ptrgs.`id_product` LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND ptrgs.id_shop='.(int)Context::getContext()->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)Context::getContext()->country->id.' AND tr.`id_country` = '.(int)Context::getContext()->country->id.'
AND tr.`id_state` = 0) AND tr.`id_state` = 0)
LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)$id_lang.')
WHERE asso_shop_product.`id_shop` = '.(int)Context::getContext()->shop->id.' WHERE product_shop.`id_shop` = '.(int)Context::getContext()->shop->id.'
AND a.`id_product_pack` = '.(int)$id_product; AND a.`id_product_pack` = '.(int)$id_product;
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
if (!$full) if (!$full)
@@ -172,14 +170,13 @@ class PackCore extends Product
return array(); return array();
$sql = ' $sql = '
SELECT p.*, pl.*, i.`id_image`, il.`legend`, t.`rate` SELECT p.*, product_shop.*, pl.*, i.`id_image`, il.`legend`, t.`rate`
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
NATURAL LEFT JOIN `'._DB_PREFIX_.'product_lang` pl NATURAL LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (p.`id_product` = ptrgs.`id_product` LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND ptrgs.id_shop='.(int)Context::getContext()->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)Context::getContext()->country->id.' AND tr.`id_country` = '.(int)Context::getContext()->country->id.'
AND tr.`id_state` = 0) AND tr.`id_state` = 0)
LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
@@ -202,7 +199,7 @@ class PackCore extends Product
public static function deleteItems($id_product) public static function deleteItems($id_product)
{ {
return Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'product SET cache_is_pack = 0 WHERE id_product = '.(int)$id_product.' LIMIT 1') && return Db::getInstance()->update('product', array('cache_is_pack' => 0), 'id_product = '.(int)$id_product) &&
Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'pack` WHERE `id_product_pack` = '.(int)$id_product) && Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'pack` WHERE `id_product_pack` = '.(int)$id_product) &&
Configuration::updateGlobalValue('PS_PACK_FEATURE_ACTIVE', Pack::isCurrentlyUsed()); Configuration::updateGlobalValue('PS_PACK_FEATURE_ACTIVE', Pack::isCurrentlyUsed());
} }
@@ -217,7 +214,7 @@ class PackCore extends Product
*/ */
public static function addItem($id_product, $id_item, $qty) public static function addItem($id_product, $id_item, $qty)
{ {
return Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'product SET cache_is_pack = 1 WHERE id_product = '.(int)$id_product.' LIMIT 1') && return Db::getInstance()->update('product', array('cache_is_pack', 1), 'id_product = '.(int)$id_product) &&
Db::getInstance()->insert('pack', array('id_product_pack' => (int)$id_product, 'id_product_item' => (int)$id_item, 'quantity' => (int)$qty)) && Db::getInstance()->insert('pack', array('id_product_pack' => (int)$id_product, 'id_product_item' => (int)$id_item, 'quantity' => (int)$qty)) &&
Configuration::updateGlobalValue('PS_PACK_FEATURE_ACTIVE', '1'); Configuration::updateGlobalValue('PS_PACK_FEATURE_ACTIVE', '1');
} }
+1 -1
View File
@@ -123,7 +123,7 @@ class PageCore extends ObjectModel
'id_page' => (int)$id_page, 'id_page' => (int)$id_page,
'counter' => 1, 'counter' => 1,
'id_shop' => (int)$context->shop->id, 'id_shop' => (int)$context->shop->id,
'id_group_shop' => (int)$context->shop->id_group_shop, 'id_shop_group' => (int)$context->shop->id_shop_group,
)); ));
} }
} }
+1 -1
View File
@@ -152,7 +152,7 @@ abstract class PaymentModuleCore extends Module
$order->reference = $reference; $order->reference = $reference;
$order->id_shop = (int)(Shop::getContext() == Shop::CONTEXT_SHOP ? $shop->id : $cart->id_shop); $order->id_shop = (int)(Shop::getContext() == Shop::CONTEXT_SHOP ? $shop->id : $cart->id_shop);
$order->id_group_shop = (int)(Shop::getContext() == Shop::CONTEXT_SHOP ? $shop->id_group_shop : $cart->id_group_shop); $order->id_shop_group = (int)(Shop::getContext() == Shop::CONTEXT_SHOP ? $shop->id_shop_group : $cart->id_shop_group);
$customer = new Customer($order->id_customer); $customer = new Customer($order->id_customer);
$order->secure_key = ($secure_key ? pSQL($secure_key) : pSQL($customer->secure_key)); $order->secure_key = ($secure_key ? pSQL($secure_key) : pSQL($customer->secure_key));
+241 -358
View File
File diff suppressed because it is too large Load Diff
+3 -2
View File
@@ -128,9 +128,10 @@ class ProductDownloadCore extends ObjectModel
public function delete($delete = false) public function delete($delete = false)
{ {
if ($delete) $result = parent::delete();
if ($result && $delete)
return $this->deleteFile(); return $this->deleteFile();
return true; return $result;
} }
/** /**
+6 -8
View File
@@ -50,7 +50,7 @@ class ProductSaleCore
FROM `'._DB_PREFIX_.'product_sale` ps FROM `'._DB_PREFIX_.'product_sale` ps
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = ps.`id_product` LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = ps.`id_product`
'.Shop::addSqlAssociation('product', 'p', false).' '.Shop::addSqlAssociation('product', 'p', false).'
WHERE p.`active` = 1'; WHERE product_shop.`active` = 1';
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
} }
@@ -73,7 +73,7 @@ class ProductSaleCore
$sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); $sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');
$interval = Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20; $interval = Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20;
$sql = 'SELECT p.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity,
pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`,
pl.`meta_keywords`, pl.`meta_title`, pl.`name`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`,
m.`name` AS manufacturer_name, p.`id_manufacturer` as id_manufacturer, m.`name` AS manufacturer_name, p.`id_manufacturer` as id_manufacturer,
@@ -90,14 +90,12 @@ class ProductSaleCore
LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`) LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (p.`id_product` = ptrgs.`id_product` LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`)
AND ptrgs.id_shop='.(int)Context::getContext()->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group`)
AND tr.`id_country` = '.(int)Context::getContext()->country->id.' AND tr.`id_country` = '.(int)Context::getContext()->country->id.'
AND tr.`id_state` = 0 AND tr.`id_state` = 0
LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
'.Product::sqlStock('p').' '.Product::sqlStock('p').'
WHERE p.`active` = 1 WHERE product_shop.`active` = 1
AND p.`id_product` IN ( AND p.`id_product` IN (
SELECT cp.`id_product` SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg FROM `'._DB_PREFIX_.'category_group` cg
@@ -145,9 +143,9 @@ class ProductSaleCore
LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
ON cl.`id_category` = asso_shop_product.`id_category_default` ON cl.`id_category` = product_shop.`id_category_default`
AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').' AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').'
WHERE p.`active` = 1 WHERE product_shop.`active` = 1
AND p.`id_product` IN ( AND p.`id_product` IN (
SELECT cp.`id_product` SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg FROM `'._DB_PREFIX_.'category_group` cg
+2 -1
View File
@@ -245,7 +245,8 @@ class SceneCore extends ObjectModel
SELECT s.* SELECT s.*
FROM `'._DB_PREFIX_.'scene_products` s FROM `'._DB_PREFIX_.'scene_products` s
LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_product = s.id_product) LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_product = s.id_product)
WHERE s.id_scene = '.(int)$this->id.($only_active ? ' AND p.active = 1' : '')); '.Shop::addSqlAssociation('product', 'p').'
WHERE s.id_scene = '.(int)$this->id.($only_active ? ' AND product_shop.active = 1' : ''));
if (!$lite_result && $products) if (!$lite_result && $products)
foreach ($products as &$product) foreach ($products as &$product)
+24 -31
View File
@@ -222,9 +222,9 @@ class SearchCore
INNER JOIN `'._DB_PREFIX_.'product` p ON cp.`id_product` = p.`id_product` INNER JOIN `'._DB_PREFIX_.'product` p ON cp.`id_product` = p.`id_product`
'.Shop::addSqlAssociation('product', 'p', false).' '.Shop::addSqlAssociation('product', 'p', false).'
WHERE c.`active` = 1 WHERE c.`active` = 1
AND p.`active` = 1 AND product_shop.`active` = 1
AND p.`visibility` IN ("both", "search") AND product_shop.`visibility` IN ("both", "search")
AND indexed = 1 AND product_shop.indexed = 1
AND cg.`id_group` '.(!$id_customer ? '= 1' : 'IN ( AND cg.`id_group` '.(!$id_customer ? '= 1' : 'IN (
SELECT id_group FROM '._DB_PREFIX_.'customer_group SELECT id_group FROM '._DB_PREFIX_.'customer_group
WHERE id_customer = '.(int)$id_customer.' WHERE id_customer = '.(int)$id_customer.'
@@ -266,7 +266,7 @@ class SearchCore
) )
'.Shop::addSqlAssociation('product', 'p').' '.Shop::addSqlAssociation('product', 'p').'
INNER JOIN `'._DB_PREFIX_.'category_lang` cl ON ( INNER JOIN `'._DB_PREFIX_.'category_lang` cl ON (
asso_shop_product.`id_category_default` = cl.`id_category` product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').' AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').'
) )
WHERE p.`id_product` '.$product_pool.' WHERE p.`id_product` '.$product_pool.'
@@ -279,7 +279,7 @@ class SearchCore
$order_by = explode('.', $order_by); $order_by = explode('.', $order_by);
$order_by = pSQL($order_by[0]).'.`'.pSQL($order_by[1]).'`'; $order_by = pSQL($order_by[0]).'.`'.pSQL($order_by[1]).'`';
} }
$sql = 'SELECT p.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity,
pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`name`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`name`,
tax.`rate`, i.`id_image`, il.`legend`, m.`name` manufacturer_name '.$score.', tax.`rate`, i.`id_image`, il.`legend`, m.`name` manufacturer_name '.$score.',
DATEDIFF( DATEDIFF(
@@ -290,13 +290,12 @@ class SearchCore
) )
) > 0 new ) > 0 new
FROM '._DB_PREFIX_.'product p FROM '._DB_PREFIX_.'product p
'.Shop::addSqlAssociation('product', 'p').'
INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON ( INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (
p.`id_product` = pl.`id_product` p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').' AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
) )
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (p.`id_product` = ptrgs.`id_product` LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND ptrgs.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)$context->country->id.' AND tr.`id_country` = '.(int)$context->country->id.'
AND tr.`id_state` = 0) AND tr.`id_state` = 0)
LEFT JOIN `'._DB_PREFIX_.'tax` tax ON (tax.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax` tax ON (tax.`id_tax` = tr.`id_tax`)
@@ -311,13 +310,12 @@ class SearchCore
$sql = 'SELECT COUNT(*) $sql = 'SELECT COUNT(*)
FROM '._DB_PREFIX_.'product p FROM '._DB_PREFIX_.'product p
'.Shop::addSqlAssociation('product', 'p').'
INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON ( INNER JOIN `'._DB_PREFIX_.'product_lang` pl ON (
p.`id_product` = pl.`id_product` p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').' AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
) )
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (p.`id_product` = ptrgs.`id_product` LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND ptrgs.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)Context::getContext()->country->id.' AND tr.`id_country` = '.(int)Context::getContext()->country->id.'
AND tr.`id_state` = 0) AND tr.`id_state` = 0)
LEFT JOIN `'._DB_PREFIX_.'tax` tax ON (tax.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax` tax ON (tax.`id_tax` = tr.`id_tax`)
@@ -357,6 +355,7 @@ class SearchCore
SELECT al.name FROM '._DB_PREFIX_.'product_attribute pa SELECT al.name FROM '._DB_PREFIX_.'product_attribute pa
INNER JOIN '._DB_PREFIX_.'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute INNER JOIN '._DB_PREFIX_.'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute
INNER JOIN '._DB_PREFIX_.'attribute_lang al ON (pac.id_attribute = al.id_attribute AND al.id_lang = '.(int)$id_lang.') INNER JOIN '._DB_PREFIX_.'attribute_lang al ON (pac.id_attribute = al.id_attribute AND al.id_lang = '.(int)$id_lang.')
'.Shop::addSqlAssociation('product_attribute', 'pa').'
WHERE pa.id_product = '.(int)$id_product); WHERE pa.id_product = '.(int)$id_product);
foreach ($attributesArray as $attribute) foreach ($attributesArray as $attribute)
$attributes .= $attribute['name'].' '; $attributes .= $attribute['name'].' ';
@@ -391,11 +390,11 @@ class SearchCore
ON p.id_product = pl.id_product ON p.id_product = pl.id_product
'.Shop::addSqlAssociation('product', 'p').' '.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN '._DB_PREFIX_.'category_lang cl LEFT JOIN '._DB_PREFIX_.'category_lang cl
ON (cl.id_category = asso_shop_product.id_category_default AND pl.id_lang = cl.id_lang) ON (cl.id_category = product_shop.id_category_default AND pl.id_lang = cl.id_lang)
LEFT JOIN '._DB_PREFIX_.'manufacturer m LEFT JOIN '._DB_PREFIX_.'manufacturer m
ON m.id_manufacturer = p.id_manufacturer ON m.id_manufacturer = p.id_manufacturer
WHERE p.indexed = 0 WHERE product_shop.indexed = 0
AND p.visibility IN ("both", "search") AND product_shop.visibility IN ("both", "search")
'.($id_product ? 'AND p.id_product = '.(int)$id_product : '').' '.($id_product ? 'AND p.id_product = '.(int)$id_product : '').'
LIMIT '.(int)$limit LIMIT '.(int)$limit
); );
@@ -412,16 +411,17 @@ class SearchCore
{ {
$db->execute('TRUNCATE '._DB_PREFIX_.'search_index'); $db->execute('TRUNCATE '._DB_PREFIX_.'search_index');
$db->execute('TRUNCATE '._DB_PREFIX_.'search_word'); $db->execute('TRUNCATE '._DB_PREFIX_.'search_word');
$db->execute('UPDATE '._DB_PREFIX_.'product SET indexed = 0'); ObjectModel::updateMultishopTable('Product', array('indexed' => 0), '1');
} }
else else
{ {
// Do it even if you already know the product id in order to be sure that it exists and it needs to be indexed // Do it even if you already know the product id in order to be sure that it exists and it needs to be indexed
$products = $db->executeS(' $products = $db->executeS('
SELECT id_product SELECT p.id_product
FROM '._DB_PREFIX_.'product FROM '._DB_PREFIX_.'product p
WHERE visibility IN ("both", "search") '.Shop::addSqlAssociation('product', 'p').'
AND '.($id_product ? 'id_product = '.(int)$id_product : 'indexed = 0') WHERE product_shop.visibility IN ("both", "search")
AND '.($id_product ? 'p.id_product = '.(int)$id_product : 'product_shop.indexed = 0')
); );
$ids = array(); $ids = array();
@@ -574,12 +574,7 @@ class SearchCore
protected static function setProductsAsIndexed(&$products) protected static function setProductsAsIndexed(&$products)
{ {
if (count($products)) if (count($products))
Db::getInstance()->execute( ObjectModel::updateMultishopTable('Product', array('indexed' => 1), 'id_product IN ('.implode(',', $products).')');
'UPDATE '._DB_PREFIX_.'product SET indexed = 1
WHERE id_product IN ('.implode(',', $products).')
LIMIT '.(int)count($products)
);
$productsArray = array();
} }
/** $queryArray3 is automatically emptied in order to be reused immediatly */ /** $queryArray3 is automatically emptied in order to be reused immediatly */
@@ -625,7 +620,7 @@ class SearchCore
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_product` = p.`id_product`) LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_product` = p.`id_product`)
LEFT JOIN `'._DB_PREFIX_.'category_shop` cs ON (cp.`id_category` = cs.`id_category` AND cs.`id_shop` = '.(int)$id_shop.') LEFT JOIN `'._DB_PREFIX_.'category_shop` cs ON (cp.`id_category` = cs.`id_category` AND cs.`id_shop` = '.(int)$id_shop.')
LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = cp.`id_category`) LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = cp.`id_category`)
WHERE p.`active` = 1 WHERE product_shop.`active` = 1
AND cs.`id_shop` = '.(int)Context::getContext()->shop->id.' AND cs.`id_shop` = '.(int)Context::getContext()->shop->id.'
AND cg.`id_group` '.(!$id_customer ? '= 1' : 'IN ( AND cg.`id_group` '.(!$id_customer ? '= 1' : 'IN (
SELECT id_group FROM '._DB_PREFIX_.'customer_group SELECT id_group FROM '._DB_PREFIX_.'customer_group
@@ -634,7 +629,7 @@ class SearchCore
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
} }
$sql = 'SELECT DISTINCT p.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pl.`description_short`, pl.`link_rewrite`, pl.`name`, $sql = 'SELECT DISTINCT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pl.`description_short`, pl.`link_rewrite`, pl.`name`,
tax.`rate`, i.`id_image`, il.`legend`, m.`name` manufacturer_name, 1 position, tax.`rate`, i.`id_image`, il.`legend`, m.`name` manufacturer_name, 1 position,
DATEDIFF( DATEDIFF(
p.`date_add`, p.`date_add`,
@@ -651,9 +646,7 @@ class SearchCore
'.Shop::addSqlAssociation('product', 'p', false).' '.Shop::addSqlAssociation('product', 'p', false).'
LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (p.`id_product` = ptrgs.`id_product` LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND ptrgs.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)$context->country->id.' AND tr.`id_country` = '.(int)$context->country->id.'
AND tr.`id_state` = 0) AND tr.`id_state` = 0)
LEFT JOIN `'._DB_PREFIX_.'tax` tax ON (tax.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax` tax ON (tax.`id_tax` = tr.`id_tax`)
@@ -664,7 +657,7 @@ class SearchCore
LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = cp.`id_category`) LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = cp.`id_category`)
LEFT JOIN `'._DB_PREFIX_.'category_shop` cs ON (cg.`id_category` = cs.`id_category` AND cs.`id_shop` = '.(int)$id_shop.') LEFT JOIN `'._DB_PREFIX_.'category_shop` cs ON (cg.`id_category` = cs.`id_category` AND cs.`id_shop` = '.(int)$id_shop.')
'.Product::sqlStock('p', 0).' '.Product::sqlStock('p', 0).'
WHERE p.`active` = 1 WHERE product_shop.`active` = 1
AND cs.`id_shop` = '.(int)Context::getContext()->shop->id.' AND cs.`id_shop` = '.(int)Context::getContext()->shop->id.'
AND cg.`id_group` '.(!$id_customer ? '= 1' : 'IN ( AND cg.`id_group` '.(!$id_customer ? '= 1' : 'IN (
SELECT id_group FROM '._DB_PREFIX_.'customer_group SELECT id_group FROM '._DB_PREFIX_.'customer_group
+3 -3
View File
@@ -32,7 +32,7 @@ class SpecificPriceCore extends ObjectModel
public $id_cart = 0; public $id_cart = 0;
public $id_product_attribute; public $id_product_attribute;
public $id_shop; public $id_shop;
public $id_group_shop; public $id_shop_group;
public $id_currency; public $id_currency;
public $id_country; public $id_country;
public $id_group; public $id_group;
@@ -51,7 +51,7 @@ class SpecificPriceCore extends ObjectModel
'table' => 'specific_price', 'table' => 'specific_price',
'primary' => 'id_specific_price', 'primary' => 'id_specific_price',
'fields' => array( 'fields' => array(
'id_group_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_shop_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_cart' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_cart' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
@@ -74,7 +74,7 @@ class SpecificPriceCore extends ObjectModel
'objectsNodeName' => 'specific_prices', 'objectsNodeName' => 'specific_prices',
'objectNodeName' => 'specific_price', 'objectNodeName' => 'specific_price',
'fields' => array( 'fields' => array(
'id_group_shop' => array('xlink_resource' => 'shop_groups'), 'id_shop_group' => array('xlink_resource' => 'shop_groups'),
'id_shop' => array('xlink_resource' => 'shops', 'required' => true), 'id_shop' => array('xlink_resource' => 'shops', 'required' => true),
'id_cart' => array('xlink_resource' => 'carts', 'required' => true), 'id_cart' => array('xlink_resource' => 'carts', 'required' => true),
'id_product' => array('xlink_resource' => 'products', 'required' => true), 'id_product' => array('xlink_resource' => 'products', 'required' => true),
+3 -1
View File
@@ -172,6 +172,7 @@ class SpecificPriceRuleCore extends ObjectModel
$query = new DbQuery(); $query = new DbQuery();
$query->select('p.id_product'); $query->select('p.id_product');
$query->from('product', 'p'); $query->from('product', 'p');
$query->join(Shop::addSqlAssociation('product', 'p'));
$query->groupBy('p.id_product'); $query->groupBy('p.id_product');
$attributes = false; $attributes = false;
@@ -221,11 +222,12 @@ class SpecificPriceRuleCore extends ObjectModel
{ {
$query->select('pa.id_product_attribute'); $query->select('pa.id_product_attribute');
$query->leftJoin('product_attribute', 'pa', 'p.id_product = pa.id_product'); $query->leftJoin('product_attribute', 'pa', 'p.id_product = pa.id_product');
$query->join(Shop::addSqlAssociation('product_attribute', 'pa'));
$query->leftJoin('product_attribute_combination', 'pac', 'pa.id_product_attribute = pac.id_product_attribute'); $query->leftJoin('product_attribute_combination', 'pac', 'pa.id_product_attribute = pac.id_product_attribute');
$query->groupBy('pa.id_product_attribute'); $query->groupBy('pa.id_product_attribute');
} }
else else
$query->select('NULL id_product_attribute'); $query->select('NULL as id_product_attribute');
if ($features) if ($features)
$query->leftJoin('feature_product', 'fp', 'p.id_product = fp.id_product'); $query->leftJoin('feature_product', 'fp', 'p.id_product = fp.id_product');
+12 -10
View File
@@ -131,9 +131,10 @@ class SupplierCore extends ObjectModel
SELECT DISTINCT(ps.`id_product`) SELECT DISTINCT(ps.`id_product`)
FROM `'._DB_PREFIX_.'product_supplier` ps FROM `'._DB_PREFIX_.'product_supplier` ps
JOIN `'._DB_PREFIX_.'product` p ON (ps.`id_product`= p.`id_product`) JOIN `'._DB_PREFIX_.'product` p ON (ps.`id_product`= p.`id_product`)
'.Shop::addSqlAssociation('product', 'p').'
WHERE ps.`id_supplier` = '.(int)$supplier['id_supplier'].' WHERE ps.`id_supplier` = '.(int)$supplier['id_supplier'].'
AND ps.id_product_attribute = 0'. AND ps.id_product_attribute = 0'.
($active ? ' AND p.`active` = 1' : ''). ($active ? ' AND product_shop.`active` = 1' : '').
($all_groups ? '' :' ($all_groups ? '' :'
AND ps.`id_product` IN ( AND ps.`id_product` IN (
SELECT cp.`id_product` SELECT cp.`id_product`
@@ -209,10 +210,11 @@ class SupplierCore extends ObjectModel
SELECT DISTINCT(ps.`id_product`) SELECT DISTINCT(ps.`id_product`)
FROM `'._DB_PREFIX_.'product_supplier` ps FROM `'._DB_PREFIX_.'product_supplier` ps
JOIN `'._DB_PREFIX_.'product` p ON (ps.`id_product`= p.`id_product`) JOIN `'._DB_PREFIX_.'product` p ON (ps.`id_product`= p.`id_product`)
'.Shop::addSqlAssociation('product', 'p').'
WHERE ps.`id_supplier` = '.(int)$id_supplier.' WHERE ps.`id_supplier` = '.(int)$id_supplier.'
AND ps.id_product_attribute = 0'. AND ps.id_product_attribute = 0'.
($active ? ' AND p.`active` = 1' : '').' ($active ? ' AND product_shop.`active` = 1' : '').'
'.($front ? ' AND p.`visibility` IN ("both", "catalog")' : '').' '.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').'
AND p.`id_product` IN ( AND p.`id_product` IN (
SELECT cp.`id_product` SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg FROM `'._DB_PREFIX_.'category_group` cg
@@ -231,7 +233,7 @@ class SupplierCore extends ObjectModel
$order_by = explode('.', $order_by); $order_by = explode('.', $order_by);
$order_by = pSQL($order_by[0]).'.`'.pSQL($order_by[1]).'`'; $order_by = pSQL($order_by[0]).'.`'.pSQL($order_by[1]).'`';
} }
$sql = 'SELECT p.*, stock.out_of_stock, $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock,
IFNULL(stock.quantity, 0) as quantity, IFNULL(stock.quantity, 0) as quantity,
pl.`description`, pl.`description`,
pl.`description_short`, pl.`description_short`,
@@ -249,6 +251,7 @@ class SupplierCore extends ObjectModel
(p.`price` * ((100 + (t.`rate`))/100)) AS orderprice, (p.`price` * ((100 + (t.`rate`))/100)) AS orderprice,
m.`name` AS manufacturer_name m.`name` AS manufacturer_name
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').'
JOIN `'._DB_PREFIX_.'product_supplier` ps ON (ps.id_product = p.id_product JOIN `'._DB_PREFIX_.'product_supplier` ps ON (ps.id_product = p.id_product
AND ps.id_product_attribute = 0) AND ps.id_product_attribute = 0)
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product`
@@ -257,9 +260,7 @@ class SupplierCore extends ObjectModel
AND i.`cover` = 1) AND i.`cover` = 1)
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image`
AND il.`id_lang` = '.(int)$id_lang.') AND il.`id_lang` = '.(int)$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (p.`id_product` = ptrgs.`id_product` LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND ptrgs.id_shop='.(int)Context::getContext()->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)Context::getContext()->country->id.' AND tr.`id_country` = '.(int)Context::getContext()->country->id.'
AND tr.`id_state` = 0 AND tr.`id_state` = 0
AND tr.`zipcode_from` = 0) AND tr.`zipcode_from` = 0)
@@ -270,8 +271,8 @@ class SupplierCore extends ObjectModel
LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer`
'.Product::sqlStock('p').' '.Product::sqlStock('p').'
WHERE ps.`id_supplier` = '.(int)$id_supplier. WHERE ps.`id_supplier` = '.(int)$id_supplier.
($active ? ' AND p.`active` = 1' : '').' ($active ? ' AND product_shop.`active` = 1' : '').'
'.($front ? ' AND p.`visibility` IN ("both", "catalog")' : '').' '.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').'
AND p.`id_product` IN ( AND p.`id_product` IN (
SELECT cp.`id_product` SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg FROM `'._DB_PREFIX_.'category_group` cg
@@ -304,6 +305,7 @@ class SupplierCore extends ObjectModel
SELECT p.`id_product`, SELECT p.`id_product`,
pl.`name` pl.`name`
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON ( LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (
p.`id_product` = pl.`id_product` p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.' AND pl.`id_lang` = '.(int)$id_lang.'
@@ -312,7 +314,7 @@ class SupplierCore extends ObjectModel
ps.`id_product` = p.`id_product` ps.`id_product` = p.`id_product`
AND ps.`id_supplier` = '.(int)$this->id.' AND ps.`id_supplier` = '.(int)$this->id.'
) )
'.($front ? ' WHERE p.`visibility` IN ("both", "catalog")' : '').' '.($front ? ' WHERE product_shop.`visibility` IN ("both", "catalog")' : '').'
GROUP BY p.`id_product`'; GROUP BY p.`id_product`';
$res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
+5 -4
View File
@@ -139,8 +139,8 @@ class TagCore extends ObjectModel
LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_product = pt.id_product) LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.id_product = pt.id_product)
'.Shop::addSqlAssociation('product', 'p').' '.Shop::addSqlAssociation('product', 'p').'
WHERE t.`id_lang` = '.(int)$id_lang.' WHERE t.`id_lang` = '.(int)$id_lang.'
AND p.`active` = 1 AND product_shop.`active` = 1
AND p.`id_product` IN ( AND product_shop.`id_product` IN (
SELECT cp.`id_product` SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
@@ -179,8 +179,9 @@ class TagCore extends ObjectModel
SELECT pl.name, pl.id_product SELECT pl.name, pl.id_product
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON p.id_product = pl.id_product'.Shop::addSqlRestrictionOnLang('pl').' LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON p.id_product = pl.id_product'.Shop::addSqlRestrictionOnLang('pl').'
'.Shop::addSqlAssociation('product', 'p').'
WHERE pl.id_lang = '.(int)$id_lang.' WHERE pl.id_lang = '.(int)$id_lang.'
AND p.active = 1 AND product_shop.active = 1
'.($this->id ? ('AND p.id_product '.$in.' (SELECT pt.id_product FROM `'._DB_PREFIX_.'product_tag` pt WHERE pt.id_tag = '.(int)$this->id.')') : '').' '.($this->id ? ('AND p.id_product '.$in.' (SELECT pt.id_product FROM `'._DB_PREFIX_.'product_tag` pt WHERE pt.id_tag = '.(int)$this->id.')') : '').'
ORDER BY pl.name'); ORDER BY pl.name');
} }
@@ -191,7 +192,7 @@ class TagCore extends ObjectModel
if (is_array($array)) if (is_array($array))
{ {
$array = array_map('intval', $array); $array = array_map('intval', $array);
$result &= Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'product SET indexed = 0 WHERE id_product IN ('.implode(',', $array).')'); $result &= ObjectModel::updateMultishopTable('Product', array('indexed' => 0), 'id_product IN ('.implode(',', $array).')');
$ids = array(); $ids = array();
foreach ($array as $id_product) foreach ($array as $id_product)
$ids[] = '('.(int)$id_product.','.(int)$this->id.')'; $ids[] = '('.(int)$id_product.','.(int)$this->id.')';
+2 -1
View File
@@ -759,9 +759,10 @@ class ToolsCore
$sql = 'SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description_short` $sql = 'SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `description_short`
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product`'.Shop::addSqlRestrictionOnLang('pl').') LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = p.`id_product`'.Shop::addSqlRestrictionOnLang('pl').')
'.Shop::addSqlAssociation('product', 'p').'
WHERE pl.id_lang = '.(int)$id_lang.' WHERE pl.id_lang = '.(int)$id_lang.'
AND pl.id_product = '.(int)$id_product.' AND pl.id_product = '.(int)$id_product.'
AND p.active = 1'; AND product_shop.active = 1';
$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); $row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);
if ($row) if ($row)
{ {
+2 -1
View File
@@ -73,6 +73,7 @@ class TranslateCore
$str = Translate::getGenericAdminTranslation($string, $key, $_LANGADM); $str = Translate::getGenericAdminTranslation($string, $key, $_LANGADM);
$str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str; $str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str;
$str = str_replace('"', '&quot;', $str);
if ($sprintf) if ($sprintf)
{ {
@@ -82,7 +83,7 @@ class TranslateCore
$str = vsprintf($str, $sprintf); $str = vsprintf($str, $sprintf);
} }
return str_replace('"', '&quot;', ($addslashes ? addslashes($str) : stripslashes($str))); return ($addslashes ? addslashes($str) : stripslashes($str));
} }
/** /**
+1 -1
View File
@@ -43,7 +43,7 @@ class TranslatedConfigurationCore extends Configuration
'multilang' => true, 'multilang' => true,
'fields' => array( 'fields' => array(
'name' => array('type' => self::TYPE_STRING, 'validate' => 'isConfigName', 'required' => true, 'size' => 32), 'name' => array('type' => self::TYPE_STRING, 'validate' => 'isConfigName', 'required' => true, 'size' => 32),
'id_group_shop' => array('type' => self::TYPE_NOTHING, 'validate' => 'isUnsignedId'), 'id_shop_group' => array('type' => self::TYPE_NOTHING, 'validate' => 'isUnsignedId'),
'id_shop' => array('type' => self::TYPE_NOTHING, 'validate' => 'isUnsignedId'), 'id_shop' => array('type' => self::TYPE_NOTHING, 'validate' => 'isUnsignedId'),
'value' => array('type' => self::TYPE_STRING, 'lang' => true), 'value' => array('type' => self::TYPE_STRING, 'lang' => true),
'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
+18 -33
View File
@@ -884,7 +884,7 @@ class AdminControllerCore extends Controller
$this->errors[] = Tools::displayError('field').' <b>'.$values['title'].'</b> '.Tools::displayError('is invalid.'); $this->errors[] = Tools::displayError('field').' <b>'.$values['title'].'</b> '.Tools::displayError('is invalid.');
// Set default value // Set default value
if (!Tools::getValue($field) && isset($values['default'])) if (Tools::getValue($field) === false && isset($values['default']))
$_POST[$field] = $values['default']; $_POST[$field] = $values['default'];
} }
@@ -1269,7 +1269,7 @@ class AdminControllerCore extends Controller
'multi_shop' => Shop::isFeatureActive(), 'multi_shop' => Shop::isFeatureActive(),
'shop_list' => Helper::renderShopList(), 'shop_list' => Helper::renderShopList(),
'shop' => $this->context->shop, 'shop' => $this->context->shop,
'group_shop' => $this->context->shop->getGroup(), 'shop_group' => $this->context->shop->getGroup(),
'tab' => $tab, 'tab' => $tab,
'current_parent_id' => (int)Tab::getCurrentParentId(), 'current_parent_id' => (int)Tab::getCurrentParentId(),
'tabs' => $tabs, 'tabs' => $tabs,
@@ -1675,7 +1675,7 @@ class AdminControllerCore extends Controller
if (!($this->multishop_context & Shop::getContext())) if (!($this->multishop_context & Shop::getContext()))
{ {
if (Shop::getContext() == Shop::CONTEXT_SHOP && !($this->multishop_context & Shop::CONTEXT_SHOP)) if (Shop::getContext() == Shop::CONTEXT_SHOP && !($this->multishop_context & Shop::CONTEXT_SHOP))
Shop::setContext(Shop::CONTEXT_GROUP, Shop::getContextGroupShopID()); Shop::setContext(Shop::CONTEXT_GROUP, Shop::getContextShopGroupID());
if (Shop::getContext() == Shop::CONTEXT_GROUP && !($this->multishop_context & Shop::CONTEXT_GROUP)) if (Shop::getContext() == Shop::CONTEXT_GROUP && !($this->multishop_context & Shop::CONTEXT_GROUP))
Shop::setContext(Shop::CONTEXT_ALL); Shop::setContext(Shop::CONTEXT_ALL);
} }
@@ -1940,35 +1940,20 @@ class AdminControllerCore extends Controller
$where_shop = Shop::addSqlRestriction($this->shopShareDatas, 'a', $this->shopLinkType); $where_shop = Shop::addSqlRestriction($this->shopShareDatas, 'a', $this->shopLinkType);
} }
if ($this->multishop_context)
{
$assos = Shop::getAssoTables();
$assos_group = GroupShop::getAssoTables();
if (isset($assos[$this->table]) && $assos[$this->table]['type'] == 'shop')
{
$filter_key = $assos[$this->table]['type'];
$idenfier_shop = Shop::getContextListShopID();
}
elseif (isset($assos_group[$this->table]) && $assos_group[$this->table]['type'] == 'group_shop')
{
$filter_key = $assos_group[$this->table]['type'];
$idenfier_shop = array(Shop::getContextGroupShopID());
}
}
$filter_shop = ''; $filter_shop = '';
if (isset($filter_key)) if ($this->multishop_context && Shop::isTableAssociated($this->table))
{ {
$idenfier_shop = Shop::getContextListShopID();
if (!$this->_group) if (!$this->_group)
$this->_group = ' GROUP BY a.'.pSQL($this->identifier); $this->_group = ' GROUP BY a.'.pSQL($this->identifier);
elseif (!preg_match('#(\s|,)\s*a\.`?'.pSQL($this->identifier).'`?(\s|,|$)#', $this->_group)) elseif (!preg_match('#(\s|,)\s*a\.`?'.pSQL($this->identifier).'`?(\s|,|$)#', $this->_group))
$this->_group .= ', a.'.pSQL($this->identifier); $this->_group .= ', a.'.pSQL($this->identifier);
$test_join = !preg_match('#`?'.preg_quote(_DB_PREFIX_.$this->table.'_'.$filter_key).'`? *sa#', $this->_join); $test_join = !preg_match('#`?'.preg_quote(_DB_PREFIX_.$this->table.'_shop').'`? *sa#', $this->_join);
if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_ALL && $test_join) if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_ALL && $test_join)
{ {
$filter_shop = ' JOIN `'._DB_PREFIX_.$this->table.'_'.$filter_key.'` sa '; $filter_shop = ' JOIN `'._DB_PREFIX_.$this->table.'_shop` sa ';
$filter_shop .= 'ON (sa.'.$this->identifier.' = a.'.$this->identifier.' AND sa.id_'.$filter_key.' IN ('.implode(', ', $idenfier_shop).'))'; $filter_shop .= 'ON (sa.'.$this->identifier.' = a.'.$this->identifier.' AND sa.id_shop IN ('.implode(', ', $idenfier_shop).'))';
} }
} }
@@ -2055,15 +2040,11 @@ class AdminControllerCore extends Controller
if (isset($fieldset['form']['input'])) if (isset($fieldset['form']['input']))
foreach ($fieldset['form']['input'] as $input) foreach ($fieldset['form']['input'] as $input)
if (!isset($this->fields_value[$input['name']])) if (!isset($this->fields_value[$input['name']]))
if (isset($input['type']) && ($input['type'] == 'group_shop' || $input['type'] == 'shop')) if (isset($input['type']) && $input['type'] == 'shop')
{ {
if ($obj->id) if ($obj->id)
{ {
if ($input['type'] == 'group_shop')
$result = GroupShop::getGroupShopById((int)$obj->id, $this->identifier, $this->table);
else
$result = Shop::getShopById((int)$obj->id, $this->identifier, $this->table); $result = Shop::getShopById((int)$obj->id, $this->identifier, $this->table);
foreach ($result as $row) foreach ($result as $row)
$this->fields_value['shop'][$row['id_'.$input['type']]][] = $row[$this->identifier]; $this->fields_value['shop'][$row['id_'.$input['type']]][] = $row[$this->identifier];
} }
@@ -2299,15 +2280,15 @@ class AdminControllerCore extends Controller
*/ */
protected function getAssoShop($table, $id_object = false) protected function getAssoShop($table, $id_object = false)
{ {
$shop_asso = Shop::getAssoTables(); if (Shop::isTableAssociated($table))
$group_shop_asso = GroupShop::getAssoTables();
if (isset($shop_asso[$table]) && $shop_asso[$table]['type'] == 'shop')
$type = 'shop'; $type = 'shop';
elseif (isset($group_shop_asso[$table]) && $group_shop_asso[$table]['type'] == 'group_shop')
$type = 'group_shop';
else else
return; return;
$shops = Shop::getShops(true, null, true);
if (count($shops) == 1)
return array($shops[0], 'shop');
$assos = array(); $assos = array();
if (Tools::isSubmit('checkBox'.Tools::toCamelCase($type, true).'Asso_'.$table)) if (Tools::isSubmit('checkBox'.Tools::toCamelCase($type, true).'Asso_'.$table))
{ {
@@ -2334,6 +2315,10 @@ class AdminControllerCore extends Controller
if (!Shop::isFeatureActive()) if (!Shop::isFeatureActive())
return; return;
$def = ObjectModel::getDefinition($this->className);
if (!empty($def['multishop']))
return;
$assos_data = $this->getAssoShop($this->table, $id_object); $assos_data = $this->getAssoShop($this->table, $id_object);
$assos = $assos_data[0]; $assos = $assos_data[0];
$type = $assos_data[1]; $type = $assos_data[1];
+1 -1
View File
@@ -232,7 +232,7 @@ class FrontControllerCore extends Controller
$cart->id_lang = (int)($this->context->cookie->id_lang); $cart->id_lang = (int)($this->context->cookie->id_lang);
$cart->id_currency = (int)($this->context->cookie->id_currency); $cart->id_currency = (int)($this->context->cookie->id_currency);
$cart->id_guest = (int)($this->context->cookie->id_guest); $cart->id_guest = (int)($this->context->cookie->id_guest);
$cart->id_group_shop = (int)$this->context->shop->id_group_shop; $cart->id_shop_group = (int)$this->context->shop->id_shop_group;
$cart->id_shop = $this->context->shop->id; $cart->id_shop = $this->context->shop->id;
if ($this->context->cookie->id_customer) if ($this->context->cookie->id_customer)
{ {
+3 -3
View File
@@ -348,7 +348,7 @@ class HelperCore
public static function renderShopList() public static function renderShopList()
{ {
if (!Shop::isFeatureActive()) if (!Shop::isFeatureActive() || count(Shop::getShops(false, null, true)) < 2)
return null; return null;
$tree = Shop::getTree(); $tree = Shop::getTree();
@@ -358,7 +358,7 @@ class HelperCore
if (Shop::getContext() == Shop::CONTEXT_ALL) if (Shop::getContext() == Shop::CONTEXT_ALL)
$value = ''; $value = '';
else if (Shop::getContext() == Shop::CONTEXT_GROUP) else if (Shop::getContext() == Shop::CONTEXT_GROUP)
$value = 'g-'.Shop::getContextGroupShopID(); $value = 'g-'.Shop::getContextShopGroupID();
else else
$value = 's-'.Shop::getContextShopID(); $value = 's-'.Shop::getContextShopID();
@@ -369,7 +369,7 @@ class HelperCore
$html .= '<option value="" class="first">'.translate('All shops').'</option>'; $html .= '<option value="" class="first">'.translate('All shops').'</option>';
foreach ($tree as $gID => $group_data) foreach ($tree as $gID => $group_data)
{ {
if (!isset($context->controller->multishop_context) || $context->controller->multishop_context & Shop::CONTEXT_GROUP) if ((!isset($context->controller->multishop_context) || $context->controller->multishop_context & Shop::CONTEXT_GROUP) && count($group_data['shops']) > 1)
$html .= '<option class="group" value="g-'.$gID.'" '.(($value == 'g-'.$gID) ? 'selected="selected"' : '').'>'.translate('Group:').' '.htmlspecialchars($group_data['name']).'</option>'; $html .= '<option class="group" value="g-'.$gID.'" '.(($value == 'g-'.$gID) ? 'selected="selected"' : '').'>'.translate('Group:').' '.htmlspecialchars($group_data['name']).'</option>';
else else
$html .= '<optgroup class="group" label="'.translate('Group:').' '.htmlspecialchars($group_data['name']).'">'; $html .= '<optgroup class="group" label="'.translate('Group:').' '.htmlspecialchars($group_data['name']).'">';
+16 -24
View File
@@ -137,8 +137,10 @@ class HelperFormCore extends Helper
break; break;
case 'shop' : case 'shop' :
case 'group_shop' :
$params['html'] = $this->renderAssoShop($params['type']); $params['html'] = $this->renderAssoShop($params['type']);
$shops = Shop::getShops(true, null, true);
if (count($shops) == 1)
unset($this->fields_form[$fieldset_key]['form']['input'][$key]);
break; break;
} }
} }
@@ -186,69 +188,59 @@ class HelperFormCore extends Helper
/** /**
* Render an area to determinate shop association * Render an area to determinate shop association
* *
* @param string $type 'shop' or 'group_shop'
*
* @return string * @return string
*/ */
public function renderAssoShop($type = 'shop') public function renderAssoShop()
{ {
if (!Shop::isFeatureActive()) if (!Shop::isFeatureActive())
return; return;
if ($type != 'shop' && $type != 'group_shop')
$type = 'shop';
$assos = array(); $assos = array();
if ((int)$this->id) if ((int)$this->id)
{ {
$sql = 'SELECT `id_'.$type.'`, `'.bqSQL($this->identifier).'` $sql = 'SELECT `id_shop`, `'.bqSQL($this->identifier).'`
FROM `'._DB_PREFIX_.bqSQL($this->table).'_'.$type.'` FROM `'._DB_PREFIX_.bqSQL($this->table).'_shop`
WHERE `'.bqSQL($this->identifier).'` = '.(int)$this->id; WHERE `'.bqSQL($this->identifier).'` = '.(int)$this->id;
foreach (Db::getInstance()->executeS($sql) as $row) foreach (Db::getInstance()->executeS($sql) as $row)
$assos[$row['id_'.$type]] = $row['id_'.$type]; $assos[$row['id_shop']] = $row['id_shop'];
} }
else else
{ {
switch (Shop::getContext()) switch (Shop::getContext())
{ {
case Shop::CONTEXT_SHOP : case Shop::CONTEXT_SHOP :
if ($type == 'shop')
$assos[Shop::getContextShopID()] = Shop::getContextShopID(); $assos[Shop::getContextShopID()] = Shop::getContextShopID();
else
$assos[Shop::getContextGroupShopID()] = Shop::getContextGroupShopID();
break; break;
case Shop::CONTEXT_GROUP : case Shop::CONTEXT_GROUP :
if ($type == 'shop') foreach (Shop::getShops(false, Shop::getContextShopGroupID(), true) as $id_shop)
foreach (Shop::getShops(false, Shop::getContextGroupShopID(), true) as $id_shop)
$assos[$id_shop] = $id_shop; $assos[$id_shop] = $id_shop;
else
$assos[Shop::getContextGroupShopID()] = Shop::getContextGroupShopID();
break; break;
default : default :
if ($type == 'shop')
foreach (Shop::getShops(false, null, true) as $id_shop) foreach (Shop::getShops(false, null, true) as $id_shop)
$assos[$id_shop] = $id_shop; $assos[$id_shop] = $id_shop;
else
foreach (Shop::getTree() as $group_shop)
$assos[$group_shop['id']] = $group_shop['id'];
break; break;
} }
} }
$tpl = $this->createTemplate('assoshop.tpl'); $tpl = $this->createTemplate('assoshop.tpl');
$tree = Shop::getTree();
$nb_shop = 0;
foreach ($tree as $value)
$nb_shop += count($value['shops']);
$tpl->assign(array( $tpl->assign(array(
'input' => array( 'input' => array(
'type' => $type, 'type' => 'shop',
'values' => Shop::getTree(), 'values' => $tree,
), ),
'fields_value' => array( 'fields_value' => array(
'shop' => $assos 'shop' => $assos
), ),
'form_id' => $this->id, 'form_id' => $this->id,
'table' => $this->table 'table' => $this->table,
'nb_shop' => $nb_shop
)); ));
return $tpl->fetch(); return $tpl->fetch();
} }
+8 -1
View File
@@ -51,6 +51,7 @@ class HelperOptionsCore extends Helper
if (!isset($languages)) if (!isset($languages))
$languages = Language::getLanguages(false); $languages = Language::getLanguages(false);
$use_multishop = false;
foreach ($option_list as $category => $category_data) foreach ($option_list as $category => $category_data)
{ {
if (!is_array($category_data)) if (!is_array($category_data))
@@ -125,7 +126,12 @@ class HelperOptionsCore extends Helper
} }
// Multishop default value // Multishop default value
$field['multishop_default'] = (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_ALL && !$isInvisible); $field['multishop_default'] = false;
if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_ALL && !$isInvisible)
{
$field['multishop_default'] = true;
$use_multishop = true;
}
// Assign the modifications back to parent array // Assign the modifications back to parent array
$category_data['fields'][$key] = $field; $category_data['fields'][$key] = $field;
@@ -151,6 +157,7 @@ class HelperOptionsCore extends Helper
'languages' => isset($languages) ? $languages : null, 'languages' => isset($languages) ? $languages : null,
'currency_left_sign' => $this->context->currency->getSign('left'), 'currency_left_sign' => $this->context->currency->getSign('left'),
'currency_right_sign' => $this->context->currency->getSign('right'), 'currency_right_sign' => $this->context->currency->getSign('right'),
'use_multishop' => $use_multishop,
)); ));
return parent::generate(); return parent::generate();
+3 -2
View File
@@ -33,7 +33,7 @@ class OrderCore extends ObjectModel
/** @var integer Invoice address id */ /** @var integer Invoice address id */
public $id_address_invoice; public $id_address_invoice;
public $id_group_shop; public $id_shop_group;
public $id_shop; public $id_shop;
@@ -165,7 +165,7 @@ class OrderCore extends ObjectModel
'id_address_invoice' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_address_invoice' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_cart' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_cart' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_currency' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_currency' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_group_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_shop_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_lang' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_lang' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
@@ -490,6 +490,7 @@ class OrderCore extends ObjectModel
FROM `'._DB_PREFIX_.'order_detail` od FROM `'._DB_PREFIX_.'order_detail` od
LEFT JOIN `'._DB_PREFIX_.'product` p LEFT JOIN `'._DB_PREFIX_.'product` p
ON p.id_product = od.product_id ON p.id_product = od.product_id
'.Shop::addSqlAssociation('product', 'p').'
WHERE od.`id_order` = '.(int)($this->id)); WHERE od.`id_order` = '.(int)($this->id));
} }
+1
View File
@@ -111,6 +111,7 @@ class OrderInvoiceCore extends ObjectModel
FROM `'._DB_PREFIX_.'order_detail` od FROM `'._DB_PREFIX_.'order_detail` od
LEFT JOIN `'._DB_PREFIX_.'product` p LEFT JOIN `'._DB_PREFIX_.'product` p
ON p.id_product = od.product_id ON p.id_product = od.product_id
'.Shop::addSqlAssociation('product', 'p').'
WHERE od.`id_order` = '.(int)$this->id_order.' WHERE od.`id_order` = '.(int)$this->id_order.'
AND od.`id_order_invoice` = '.(int)$this->id); AND od.`id_order_invoice` = '.(int)$this->id);
} }
-194
View File
@@ -1,194 +0,0 @@
<?php
/*
* 2007-2012 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2012 PrestaShop SA
* @version Release: $Revision$
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
/**
* @since 1.5.0
*/
class GroupShopCore extends ObjectModel
{
public $name;
public $active;
public $share_customer;
public $share_stock;
public $share_order;
public $deleted;
/**
* @see ObjectModel::$definition
*/
public static $definition = array(
'table' => 'group_shop',
'primary' => 'id_group_shop',
'fields' => array(
'name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true, 'size' => 64),
'share_customer' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'share_order' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'share_stock' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'active' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'deleted' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
),
);
private static $assoTables = array(
'attribute_group' => array('type' => 'group_shop'),
'attribute' => array('type' => 'group_shop'),
'feature' => array('type' => 'group_shop'),
'group' => array('type' => 'group_shop'),
'manufacturer' => array('type' => 'group_shop'),
'supplier' => array('type' => 'group_shop'),
'zone' => array('type' => 'group_shop'),
'tax_rules_group' => array('type' => 'group_shop'),
);
/**
* @see ObjectModel::getFields()
* @return array
*/
public function getFields()
{
if (!$this->share_customer || !$this->share_stock)
$this->share_order = false;
return parent::getFields();
}
public static function getGroupShops($active = true)
{
$groups = new Collection('GroupShop');
$groups->where('deleted', '=', false);
if ($active)
$groups->where('active', '=', true);
return $groups;
}
public function delete()
{
if (!$res = parent::delete())
return false;
foreach (GroupShop::getAssoTables() as $table_name => $row)
{
$id = 'id_'.$row['type'];
if ($row['type'] == 'fk_group_shop')
$id = 'id_group_shop';
else
$table_name .= '_'.$row['type'];
$res &= Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.$table_name.'` WHERE `'.$id.'`='.(int)$this->id);
}
return $res;
}
public static function getAssoTables()
{
return self::$assoTables;
}
/**
* @return int Total of groupshops
*/
public static function getTotalGroupShops($active = true)
{
return count(GroupShop::getGroupShops($active));
}
public function haveShops()
{
return (bool)$this->getTotalShops();
}
public function getTotalShops()
{
$sql = 'SELECT COUNT(*)
FROM '._DB_PREFIX_.'shop s
WHERE id_group_shop='.(int)$this->id;
return (int)Db::getInstance()->getValue($sql);
}
/**
* Return a group shop ID from group shop name
*
* @param string $name
* @return int
*/
public static function getIdByName($name)
{
$sql = 'SELECT id_group_shop
FROM '._DB_PREFIX_.'group_shop
WHERE name = \''.pSQL($name).'\'';
return (int)Db::getInstance()->getValue($sql);
}
/**
* Return the list of group shop by id
*
* @param int $id
* @param string $identifier
* @param string $table
* @return array
*/
public static function getGroupShopById($id, $identifier, $table)
{
return Db::getInstance()->executeS('SELECT `id_group_shop`, `'.pSQL($identifier).'` FROM `'._DB_PREFIX_.pSQL($table).'_group_shop` WHERE `'.pSQL($identifier).'` = '.(int)$id);
}
public function copyGroupShopData($old_id, $tables_import = false, $deleted = false)
{
foreach (GroupShop::getAssoTables() as $table_name => $row)
{
if ($tables_import && !isset($tables_import[$table_name]))
continue;
$id = 'id_'.$row['type'];
if ($row['type'] == 'fk_group_shop')
$id = 'id_group_shop';
else
$table_name .= '_'.$row['type'];
if (!$deleted)
{
$res = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.$table_name.'` WHERE `'.$id.'` = '.(int)$old_id);
if ($res)
{
unset($res[$id]);
if (isset($row['primary']))
unset($res[$row['primary']]);
$keys = implode(', ', array_keys($res));
$sql = 'INSERT IGNORE INTO `'._DB_PREFIX_.$table_name.'` ('.$keys.', '.$id.')
(SELECT '.$keys.', '.(int)$this->id.' FROM '._DB_PREFIX_.$table_name.'
WHERE `'.$id.'` = '.(int)$old_id.')';
Db::getInstance()->execute($sql);
}
}
else
{
//Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.$table_name.'` SET WHERE `'.$id.'`='.(int)$old_id);
}
}
}
}
+57 -52
View File
@@ -30,7 +30,7 @@
*/ */
class ShopCore extends ObjectModel class ShopCore extends ObjectModel
{ {
public $id_group_shop; public $id_shop_group;
public $id_theme; public $id_theme;
public $name; public $name;
public $active = true; public $active = true;
@@ -45,7 +45,7 @@ class ShopCore extends ObjectModel
public $domain_ssl; public $domain_ssl;
/** /**
* @var GroupShop * @var ShopGroup
*/ */
protected $group; protected $group;
@@ -61,7 +61,7 @@ class ShopCore extends ObjectModel
'name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true, 'size' => 64), 'name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true, 'size' => 64),
'id_theme' => array('type' => self::TYPE_INT, 'required' => true), 'id_theme' => array('type' => self::TYPE_INT, 'required' => true),
'id_category' => array('type' => self::TYPE_INT, 'required' => true), 'id_category' => array('type' => self::TYPE_INT, 'required' => true),
'id_group_shop' => array('type' => self::TYPE_INT, 'required' => true), 'id_shop_group' => array('type' => self::TYPE_INT, 'required' => true),
), ),
); );
@@ -88,6 +88,7 @@ class ShopCore extends ObjectModel
'module_country' => array('type' => 'fk_shop'), 'module_country' => array('type' => 'fk_shop'),
'module_group' => array('type' => 'fk_shop'), 'module_group' => array('type' => 'fk_shop'),
'product' => array('type' => 'shop'), 'product' => array('type' => 'shop'),
'product_attribute' => array('type' => 'shop'),
'product_lang' => array('type' => 'fk_shop'), 'product_lang' => array('type' => 'fk_shop'),
'referrer' => array('type' => 'shop'), 'referrer' => array('type' => 'shop'),
'scene' => array('type' => 'shop'), 'scene' => array('type' => 'shop'),
@@ -95,13 +96,20 @@ class ShopCore extends ObjectModel
'webservice_account' => array('type' => 'shop'), 'webservice_account' => array('type' => 'shop'),
'warehouse' => array('type' => 'shop'), 'warehouse' => array('type' => 'shop'),
'stock_available' => array('type' => 'fk_shop'), 'stock_available' => array('type' => 'fk_shop'),
'product_tax_rules_group_shop' => array('type' => 'fk_shop'),
'carrier_tax_rules_group_shop' => array('type' => 'fk_shop'), 'carrier_tax_rules_group_shop' => array('type' => 'fk_shop'),
'attribute' => array('type' => 'shop'),
'feature' => array('type' => 'shop'),
'group' => array('type' => 'shop'),
'attribute_group' => array('type' => 'shop'),
'tax_rules_group' => array('type' => 'shop'),
'zone' => array('type' => 'shop'),
'manufacturer' => array('type' => 'shop'),
'supplier' => array('type' => 'shop'),
); );
protected $webserviceParameters = array( protected $webserviceParameters = array(
'fields' => array( 'fields' => array(
'id_group_shop' => array('xlink_resource' => 'shop_groups'), 'id_shop_group' => array('xlink_resource' => 'shop_groups'),
'id_category' => array(), 'id_category' => array(),
'id_theme' => array(), 'id_theme' => array(),
), ),
@@ -109,7 +117,7 @@ class ShopCore extends ObjectModel
protected static $context; protected static $context;
protected static $context_id_shop; protected static $context_id_shop;
protected static $context_id_group_shop; protected static $context_id_shop_group;
/** /**
* There are 3 kinds of shop context : shop, group shop and general * There are 3 kinds of shop context : shop, group shop and general
@@ -371,12 +379,12 @@ class ShopCore extends ObjectModel
/** /**
* Get group of current shop * Get group of current shop
* *
* @return GroupShop * @return ShopGroup
*/ */
public function getGroup() public function getGroup()
{ {
if (!$this->group) if (!$this->group)
$this->group = new GroupShop($this->id_group_shop); $this->group = new ShopGroup($this->id_shop_group);
return $this->group; return $this->group;
} }
@@ -424,6 +432,17 @@ class ShopCore extends ObjectModel
return self::$asso_tables; return self::$asso_tables;
} }
/**
* Check if given table is associated to shop
*
* @param string $table
* @return bool
*/
public static function isTableAssociated($table)
{
return isset(self::$asso_tables[$table]) && self::$asso_tables[$table]['type'] == 'shop';
}
/** /**
* Load list of groups and shops, and cache it * Load list of groups and shops, and cache it
* *
@@ -451,9 +470,9 @@ class ShopCore extends ObjectModel
} }
$sql = 'SELECT gs.*, s.*, gs.name AS group_name, s.name AS shop_name, s.active, su.domain, su.domain_ssl, su.physical_uri, su.virtual_uri'.$select.' $sql = 'SELECT gs.*, s.*, gs.name AS group_name, s.name AS shop_name, s.active, su.domain, su.domain_ssl, su.physical_uri, su.virtual_uri'.$select.'
FROM '._DB_PREFIX_.'group_shop gs FROM '._DB_PREFIX_.'shop_group gs
LEFT JOIN '._DB_PREFIX_.'shop s LEFT JOIN '._DB_PREFIX_.'shop s
ON s.id_group_shop = gs.id_group_shop ON s.id_shop_group = gs.id_shop_group
LEFT JOIN '._DB_PREFIX_.'shop_url su LEFT JOIN '._DB_PREFIX_.'shop_url su
ON s.id_shop = su.id_shop AND su.main = 1 ON s.id_shop = su.id_shop AND su.main = 1
'.$from.' '.$from.'
@@ -466,19 +485,19 @@ class ShopCore extends ObjectModel
{ {
foreach ($results as $row) foreach ($results as $row)
{ {
if (!isset(self::$shops[$row['id_group_shop']])) if (!isset(self::$shops[$row['id_shop_group']]))
self::$shops[$row['id_group_shop']] = array( self::$shops[$row['id_shop_group']] = array(
'id' => $row['id_group_shop'], 'id' => $row['id_shop_group'],
'name' => $row['group_name'], 'name' => $row['group_name'],
'share_customer' => $row['share_customer'], 'share_customer' => $row['share_customer'],
'share_order' => $row['share_order'], 'share_order' => $row['share_order'],
'totalShops' => Shop::getTotalShopsByIdGroupShop($row['id_group_shop']), 'totalShops' => Shop::getTotalShopsByIdShopGroup($row['id_shop_group']),
'shops' => array(), 'shops' => array(),
); );
self::$shops[$row['id_group_shop']]['shops'][$row['id_shop']] = array( self::$shops[$row['id_shop_group']]['shops'][$row['id_shop']] = array(
'id_shop' => $row['id_shop'], 'id_shop' => $row['id_shop'],
'id_group_shop' => $row['id_group_shop'], 'id_shop_group' => $row['id_shop_group'],
'name' => $row['shop_name'], 'name' => $row['shop_name'],
'id_theme' => $row['id_theme'], 'id_theme' => $row['id_theme'],
'id_category' => $row['id_category'], 'id_category' => $row['id_category'],
@@ -495,17 +514,17 @@ class ShopCore extends ObjectModel
* Get shops list * Get shops list
* *
* @param bool $active * @param bool $active
* @param int $id_group_shop * @param int $id_shop_group
* @param bool $get_as_list_id * @param bool $get_as_list_id
*/ */
public static function getShops($active = true, $id_group_shop = null, $get_as_list_id = false) public static function getShops($active = true, $id_shop_group = null, $get_as_list_id = false)
{ {
Shop::cacheShops(); Shop::cacheShops();
$results = array(); $results = array();
foreach (self::$shops as $group_id => $group_data) foreach (self::$shops as $group_id => $group_data)
foreach ($group_data['shops'] as $id => $shop_data) foreach ($group_data['shops'] as $id => $shop_data)
if ((!$active || $shop_data['active']) && (!$id_group_shop || $id_group_shop == $group_id)) if ((!$active || $shop_data['active']) && (!$id_shop_group || $id_shop_group == $group_id))
{ {
if ($get_as_list_id) if ($get_as_list_id)
$results[$id] = $id; $results[$id] = $id;
@@ -565,14 +584,14 @@ class ShopCore extends ObjectModel
/** /**
* @return int Total of shops * @return int Total of shops
*/ */
public static function getTotalShopsByIdGroupShop($id) public static function getTotalShopsByIdShopGroup($id)
{ {
return (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'shop` WHERE `id_group_shop` = '.(int)$id); return (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM `'._DB_PREFIX_.'shop` WHERE `id_shop_group` = '.(int)$id);
} }
public static function getIdShopsByIdGroupShop($id) public static function getIdShopsByIdShopGroup($id)
{ {
$result = Db::getInstance()->executeS('SELECT `id_shop`, `id_group_shop` FROM `'._DB_PREFIX_.'shop` WHERE `id_group_shop` = '.(int)$id); $result = Db::getInstance()->executeS('SELECT `id_shop`, `id_shop_group` FROM `'._DB_PREFIX_.'shop` WHERE `id_shop_group` = '.(int)$id);
$data = array(); $data = array();
foreach ($result as $group_data) foreach ($result as $group_data)
$data[] = (int)$group_data['id_shop']; $data[] = (int)$group_data['id_shop'];
@@ -624,7 +643,7 @@ class ShopCore extends ObjectModel
if (Shop::getContext() == Shop::CONTEXT_SHOP) if (Shop::getContext() == Shop::CONTEXT_SHOP)
$list = ($share) ? Shop::getSharedShops(Shop::getContextShopID(), $share) : array(Shop::getContextShopID()); $list = ($share) ? Shop::getSharedShops(Shop::getContextShopID(), $share) : array(Shop::getContextShopID());
else if (Shop::getContext() == Shop::CONTEXT_GROUP) else if (Shop::getContext() == Shop::CONTEXT_GROUP)
$list = Shop::getShops(true, Shop::getContextGroupShopID(), true); $list = Shop::getShops(true, Shop::getContextShopGroupID(), true);
else else
$list = Shop::getShops(true, null, true); $list = Shop::getShops(true, null, true);
@@ -650,17 +669,17 @@ class ShopCore extends ObjectModel
{ {
case self::CONTEXT_ALL : case self::CONTEXT_ALL :
self::$context_id_shop = null; self::$context_id_shop = null;
self::$context_id_group_shop = null; self::$context_id_shop_group = null;
break; break;
case self::CONTEXT_GROUP : case self::CONTEXT_GROUP :
self::$context_id_shop = null; self::$context_id_shop = null;
self::$context_id_group_shop = (int)$id; self::$context_id_shop_group = (int)$id;
break; break;
case self::CONTEXT_SHOP : case self::CONTEXT_SHOP :
self::$context_id_shop = (int)$id; self::$context_id_shop = (int)$id;
self::$context_id_group_shop = Shop::getGroupFromShop($id); self::$context_id_shop_group = Shop::getGroupFromShop($id);
break; break;
default : default :
@@ -680,9 +699,9 @@ class ShopCore extends ObjectModel
return self::$context_id_shop; return self::$context_id_shop;
} }
public static function getContextGroupShopID() public static function getContextShopGroupID()
{ {
return self::$context_id_group_shop; return self::$context_id_shop_group;
} }
/** /**
@@ -690,29 +709,17 @@ class ShopCore extends ObjectModel
* *
* @param int $share If false, dont check share datas from group. Else can take a Shop::SHARE_* constant value * @param int $share If false, dont check share datas from group. Else can take a Shop::SHARE_* constant value
* @param string $alias * @param string $alias
* @param string $type shop|group_shop
*/ */
public static function addSqlRestriction($share = false, $alias = null, $type = 'shop') public static function addSqlRestriction($share = false, $alias = null)
{ {
if ($type != 'shop' && $type != 'group_shop')
$type = 'shop';
if ($alias) if ($alias)
$alias .= '.'; $alias .= '.';
$restriction = ''; $restriction = '';
if ($type == 'group_shop')
{
if (Shop::getContext() != Shop::CONTEXT_ALL)
$restriction = ' AND '.$alias.'id_group_shop = '.Shop::getContextGroupShopID().' ';
}
else
{
if (Shop::getContext() != Shop::CONTEXT_ALL) if (Shop::getContext() != Shop::CONTEXT_ALL)
$restriction = ' AND '.$alias.'id_shop IN ('.implode(', ', Shop::getContextListShopID($share)).') '; $restriction = ' AND '.$alias.'id_shop IN ('.implode(', ', Shop::getContextListShopID($share)).') ';
//else if ($share == Shop::SHARE_STOCK) //else if ($share == Shop::SHARE_STOCK)
// $restriction = ' AND '.$alias.'id_shop = '.$this->getID(true); // $restriction = ' AND '.$alias.'id_shop = '.$this->getID(true);
}
return $restriction; return $restriction;
} }
@@ -728,7 +735,7 @@ class ShopCore extends ObjectModel
*/ */
public static function addSqlAssociation($table, $alias, $inner_join = true) public static function addSqlAssociation($table, $alias, $inner_join = true)
{ {
$table_alias = ' asso_shop_'.$table; $table_alias = $table.'_shop';
if (strpos($table, '.') !== false) if (strpos($table, '.') !== false)
list($table_alias, $table) = explode('.', $table); list($table_alias, $table) = explode('.', $table);
@@ -781,9 +788,6 @@ class ShopCore extends ObjectModel
public function copyShopData($old_id, $tables_import = false, $deleted = false) public function copyShopData($old_id, $tables_import = false, $deleted = false)
{ {
if (isset($tables_import['product']))
$tables_import['product_tax_rules_group_shop'] = true;
if (isset($tables_import['carrier'])) if (isset($tables_import['carrier']))
$tables_import['carrier_tax_rules_group_shop'] = true; $tables_import['carrier_tax_rules_group_shop'] = true;
@@ -795,7 +799,7 @@ class ShopCore extends ObjectModel
// Special case for stock_available if current shop is in a share stock group // Special case for stock_available if current shop is in a share stock group
if ($table_name == 'stock_available') if ($table_name == 'stock_available')
{ {
$group = new GroupShop($this->id_group_shop); $group = new ShopGroup($this->id_shop_group);
if ($group->share_stock && $group->haveShops()) if ($group->share_stock && $group->haveShops())
continue; continue;
} }
@@ -815,9 +819,9 @@ class ShopCore extends ObjectModel
if (isset($row['primary'])) if (isset($row['primary']))
unset($res[$row['primary']]); unset($res[$row['primary']]);
$keys = implode(', ', array_keys($res)); $keys = implode('`, `', array_keys($res));
$sql = 'INSERT IGNORE INTO `'._DB_PREFIX_.$table_name.'` ('.$keys.', '.$id.') $sql = 'INSERT IGNORE INTO `'._DB_PREFIX_.$table_name.'` (`'.$keys.'`, '.$id.')
(SELECT '.$keys.', '.(int)$this->id.' FROM '._DB_PREFIX_.$table_name.' (SELECT `'.$keys.'`, '.(int)$this->id.' FROM '._DB_PREFIX_.$table_name.'
WHERE `'.$id.'` = '.(int)$old_id.')'; WHERE `'.$id.'` = '.(int)$old_id.')';
Db::getInstance()->execute($sql); Db::getInstance()->execute($sql);
} }
@@ -834,9 +838,9 @@ class ShopCore extends ObjectModel
return (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM`'._DB_PREFIX_.'shop` WHERE `id_shop` = '.(int)$id); return (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM`'._DB_PREFIX_.'shop` WHERE `id_shop` = '.(int)$id);
} }
public function checkIfGroupShopExist($id) public function checkIfShopGroupExist($id)
{ {
return (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM`'._DB_PREFIX_.'group_shop` WHERE `id_group_shop` = '.(int)$id); return (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM`'._DB_PREFIX_.'shop_group` WHERE `id_shop_group` = '.(int)$id);
} }
/** /**
@@ -905,6 +909,7 @@ class ShopCore extends ObjectModel
return (bool)Db::getInstance()->getValue(' return (bool)Db::getInstance()->getValue('
SELECT p.`id_product` SELECT p.`id_product`
FROM `'._DB_PREFIX_.'product` p FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'category_product` cp LEFT JOIN `'._DB_PREFIX_.'category_product` cp
ON p.`id_product` = cp.`id_product` ON p.`id_product` = cp.`id_product`
LEFT JOIN `'._DB_PREFIX_.'category_shop` cs LEFT JOIN `'._DB_PREFIX_.'category_shop` cs
+111
View File
@@ -0,0 +1,111 @@
<?php
/*
* 2007-2012 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2012 PrestaShop SA
* @version Release: $Revision$
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
/**
* @since 1.5.0
*/
class ShopGroupCore extends ObjectModel
{
public $name;
public $active;
public $share_customer;
public $share_stock;
public $share_order;
public $deleted;
/**
* @see ObjectModel::$definition
*/
public static $definition = array(
'table' => 'shop_group',
'primary' => 'id_shop_group',
'fields' => array(
'name' => array('type' => self::TYPE_STRING, 'validate' => 'isGenericName', 'required' => true, 'size' => 64),
'share_customer' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'share_order' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'share_stock' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'active' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
'deleted' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
),
);
/**
* @see ObjectModel::getFields()
* @return array
*/
public function getFields()
{
if (!$this->share_customer || !$this->share_stock)
$this->share_order = false;
return parent::getFields();
}
public static function getShopGroups($active = true)
{
$groups = new Collection('ShopGroup');
$groups->where('deleted', '=', false);
if ($active)
$groups->where('active', '=', true);
return $groups;
}
/**
* @return int Total of shop groups
*/
public static function getTotalShopGroup($active = true)
{
return count(ShopGroup::getShopGroups($active));
}
public function haveShops()
{
return (bool)$this->getTotalShops();
}
public function getTotalShops()
{
$sql = 'SELECT COUNT(*)
FROM '._DB_PREFIX_.'shop s
WHERE id_shop_group='.(int)$this->id;
return (int)Db::getInstance()->getValue($sql);
}
/**
* Return a group shop ID from group shop name
*
* @param string $name
* @return int
*/
public static function getIdByName($name)
{
$sql = 'SELECT id_shop_group
FROM '._DB_PREFIX_.'shop_group
WHERE name = \''.pSQL($name).'\'';
return (int)Db::getInstance()->getValue($sql);
}
}
+25 -25
View File
@@ -43,7 +43,7 @@ class StockAvailableCore extends ObjectModel
public $id_shop; public $id_shop;
/** @var int the group shop associated to the current product and corresponding quantity */ /** @var int the group shop associated to the current product and corresponding quantity */
public $id_group_shop; public $id_shop_group;
/** @var int the quantity available for sale */ /** @var int the quantity available for sale */
public $quantity = 0; public $quantity = 0;
@@ -64,7 +64,7 @@ class StockAvailableCore extends ObjectModel
'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_product_attribute' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_product_attribute' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'id_group_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_shop_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
'quantity' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true), 'quantity' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true),
'depends_on_stock' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'required' => true), 'depends_on_stock' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'required' => true),
'out_of_stock' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true), 'out_of_stock' => array('type' => self::TYPE_INT, 'validate' => 'isInt', 'required' => true),
@@ -79,7 +79,7 @@ class StockAvailableCore extends ObjectModel
'id_product' => array('xlink_resource' => 'products'), 'id_product' => array('xlink_resource' => 'products'),
'id_product_attribute' => array('xlink_resource' => 'combinations'), 'id_product_attribute' => array('xlink_resource' => 'combinations'),
'id_shop' => array('xlink_resource' => 'shops'), 'id_shop' => array('xlink_resource' => 'shops'),
'id_group_shop' => array('xlink_resource' => 'shop_groups'), 'id_shop_group' => array('xlink_resource' => 'shop_groups'),
), ),
'hidden_fields' => array( 'hidden_fields' => array(
), ),
@@ -415,22 +415,22 @@ class StockAvailableCore extends ObjectModel
$stock_available->id_product_attribute = (int)$id_product_attribute; $stock_available->id_product_attribute = (int)$id_product_attribute;
$stock_available->quantity = (int)$quantity; $stock_available->quantity = (int)$quantity;
// if we are in group_shop context // if we are in shop_group context
if (Shop::getContext() == Shop::CONTEXT_GROUP) if (Shop::getContext() == Shop::CONTEXT_GROUP)
{ {
$group_shop = $context->shop->getGroup(); $shop_group = $context->shop->getGroup();
// if quantities are shared between shops of the group // if quantities are shared between shops of the group
if ($group_shop->share_stock) if ($shop_group->share_stock)
{ {
$stock_available->id_shop = 0; $stock_available->id_shop = 0;
$stock_available->id_group_shop = (int)$group_shop->id; $stock_available->id_shop_group = (int)$shop_group->id;
} }
} }
else else
{ {
$stock_available->id_shop = $id_shop; $stock_available->id_shop = $id_shop;
$stock_available->id_group_shop = Shop::getGroupFromShop($id_shop); $stock_available->id_shop_group = Shop::getGroupFromShop($id_shop);
} }
$stock_available->add(); $stock_available->add();
@@ -468,13 +468,13 @@ class StockAvailableCore extends ObjectModel
* If stocks are shared, remoe all old available quantities for all shops of the group * If stocks are shared, remoe all old available quantities for all shops of the group
* Else remove all available quantities for the current group * Else remove all available quantities for the current group
* *
* @param GroupShop $group_shop the GroupShop object * @param ShopGroup $shop_group the ShopGroup object
*/ */
public static function resetProductFromStockAvailableByGroupShop($group_shop) public static function resetProductFromStockAvailableByShopGroup(ShopGroup $shop_group)
{ {
if ($group_shop->share_stock) if ($shop_group->share_stock)
{ {
$shop_list = Shop::getIdShopsByIdGroupShop($group_shop->id); $shop_list = Shop::getIdShopsByIdShopGroup($shop_group->id);
if (count($shop_list) > 0) if (count($shop_list) > 0)
{ {
@@ -490,7 +490,7 @@ class StockAvailableCore extends ObjectModel
{ {
return Db::getInstance()->execute(' return Db::getInstance()->execute('
DELETE FROM '._DB_PREFIX_.'stock_available DELETE FROM '._DB_PREFIX_.'stock_available
WHERE id_group_shop = '.$group_shop->id WHERE id_shop_group = '.$shop_group->id
); );
} }
} }
@@ -561,20 +561,20 @@ class StockAvailableCore extends ObjectModel
if (is_null($id_shop)) if (is_null($id_shop))
$id_shop = $context->shop->id; $id_shop = $context->shop->id;
// if we are in group_shop context // if we are in $shop_group context
$group_shop = $context->shop->getGroup(); $shop_group = $context->shop->getGroup();
// if quantities are shared between shops of the group // if quantities are shared between shops of the group
if ($group_shop->share_stock) if ($shop_group->share_stock)
{ {
if (is_object($sql)) if (is_object($sql))
{ {
$sql->where(pSQL($alias).'id_group_shop = '.(int)$group_shop->id); $sql->where(pSQL($alias).'id_shop_group = '.(int)$shop_group->id);
$sql->where(pSQL($alias).'id_shop = 0'); $sql->where(pSQL($alias).'id_shop = 0');
} }
else else
{ {
$sql = ' AND '.pSQL($alias).'id_group_shop = '.(int)$group_shop->id.' '; $sql = ' AND '.pSQL($alias).'id_shop_group = '.(int)$shop_group->id.' ';
$sql .= ' AND '.pSQL($alias).'id_shop = 0 '; $sql .= ' AND '.pSQL($alias).'id_shop = 0 ';
} }
} }
@@ -582,9 +582,9 @@ class StockAvailableCore extends ObjectModel
else if (Shop::getContext() == Shop::CONTEXT_GROUP) else if (Shop::getContext() == Shop::CONTEXT_GROUP)
{ {
if (is_object($sql)) if (is_object($sql))
$sql->where(pSQL($alias).'id_shop IN ('.implode(', ', Shop::getShops(true, $group_shop->id, true)).')'); $sql->where(pSQL($alias).'id_shop IN ('.implode(', ', Shop::getShops(true, $shop_group->id, true)).')');
else else
$sql = ' AND '.pSQL($alias).'id_shop IN ('.implode(', ', Shop::getShops(true, $group_shop->id, true)).') '; $sql = ' AND '.pSQL($alias).'id_shop IN ('.implode(', ', Shop::getShops(true, $shop_group->id, true)).') ';
} }
// if no group specific restriction, set simple shop restriction // if no group specific restriction, set simple shop restriction
else else
@@ -614,18 +614,18 @@ class StockAvailableCore extends ObjectModel
if (is_null($id_shop)) if (is_null($id_shop))
$id_shop = $context->shop->id; $id_shop = $context->shop->id;
$group_shop = $context->shop->getGroup(); $shop_group = $context->shop->getGroup();
// if quantities are shared between shops of the group // if quantities are shared between shops of the group
if ($group_shop->share_stock) if ($shop_group->share_stock)
{ {
$params['id_group_shop'] = (int)$group_shop->id; $params['id_shop_group'] = (int)$shop_group->id;
$params['id_shop'] = 0; $params['id_shop'] = 0;
$group_ok = true; $group_ok = true;
} }
else else
$params['id_group_shop'] = 0; $params['id_shop_group'] = 0;
// if no group specific restriction, set simple shop restriction // if no group specific restriction, set simple shop restriction
if (!$group_ok) if (!$group_ok)
@@ -650,7 +650,7 @@ class StockAvailableCore extends ObjectModel
id_product, id_product,
id_product_attribute, id_product_attribute,
id_shop, id_shop,
id_group_shop, id_shop_group,
quantity, quantity,
depends_on_stock, depends_on_stock,
out_of_stock out_of_stock
+2
View File
@@ -592,7 +592,9 @@ class StockManagerCore implements StockManagerInterface
FROM `'._DB_PREFIX_.'stock_mvt` sm FROM `'._DB_PREFIX_.'stock_mvt` sm
LEFT JOIN `'._DB_PREFIX_.'stock` s ON (sm.`id_stock` = s.`id_stock`) LEFT JOIN `'._DB_PREFIX_.'stock` s ON (sm.`id_stock` = s.`id_stock`)
LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product` = s.`id_product`) LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product` = s.`id_product`)
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product`) LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product`)
'.Shop::addSqlAssociation('product_attribute', 'pa').'
WHERE sm.`sign` = -1 WHERE sm.`sign` = -1
AND sm.`id_stock_mvt_reason` != '.Configuration::get('PS_STOCK_MVT_TRANSFER_FROM').' AND sm.`id_stock_mvt_reason` != '.Configuration::get('PS_STOCK_MVT_TRANSFER_FROM').'
AND TO_DAYS(NOW()) - TO_DAYS(sm.`date_add`) <= '.(int)$coverage.' AND TO_DAYS(NOW()) - TO_DAYS(sm.`date_add`) <= '.(int)$coverage.'
+1 -1
View File
@@ -263,7 +263,7 @@ class WebserviceRequestCore
'search' => array('description' => 'Search', 'specific_management' => true, 'forbidden_method' => array('PUT', 'POST', 'DELETE')), 'search' => array('description' => 'Search', 'specific_management' => true, 'forbidden_method' => array('PUT', 'POST', 'DELETE')),
'content_management_system' => array('description' => 'Content management system', 'class' => 'CMS'), 'content_management_system' => array('description' => 'Content management system', 'class' => 'CMS'),
'shops' => array('description' => 'Shops from multi-shop feature', 'class' => 'Shop'), 'shops' => array('description' => 'Shops from multi-shop feature', 'class' => 'Shop'),
'shop_groups' => array('description' => 'Shop groups from multi-shop feature', 'class' => 'GroupShop'), 'shop_groups' => array('description' => 'Shop groups from multi-shop feature', 'class' => 'ShopGroup'),
'taxes' => array('description' => 'The tax rate', 'class' => 'Tax'), 'taxes' => array('description' => 'The tax rate', 'class' => 'Tax'),
'stock_movements' => array('description' => 'Stock movements', 'class' => 'StockMvtWS', 'forbidden_method' => array('PUT', 'POST', 'DELETE')), 'stock_movements' => array('description' => 'Stock movements', 'class' => 'StockMvtWS', 'forbidden_method' => array('PUT', 'POST', 'DELETE')),
'stock_movement_reasons' => array('description' => 'Stock movement reason', 'class' => 'StockMvtReason'), 'stock_movement_reasons' => array('description' => 'Stock movement reason', 'class' => 'StockMvtReason'),
@@ -486,7 +486,7 @@ class AdminAccountingExportControllerCore extends AdminController
odt.`total_amount` AS tax_total_amount, odt.`total_amount` AS tax_total_amount,
od.`product_id` AS id_product, od.`product_id` AS id_product,
od.`product_attribute_id` as id_product_attribute, od.`product_attribute_id` as id_product_attribute,
p.`advanced_stock_management` product_shop.`advanced_stock_management`
FROM `'._DB_PREFIX_.'orders` o FROM `'._DB_PREFIX_.'orders` o
LEFT JOIN `'._DB_PREFIX_.'customer` customer ON customer.`id_customer` = o.`id_customer` LEFT JOIN `'._DB_PREFIX_.'customer` customer ON customer.`id_customer` = o.`id_customer`
LEFT JOIN `'._DB_PREFIX_.'address` a ON a.`id_customer` = o.`id_customer` LEFT JOIN `'._DB_PREFIX_.'address` a ON a.`id_customer` = o.`id_customer`
@@ -497,6 +497,7 @@ class AdminAccountingExportControllerCore extends AdminController
LEFT JOIN `'._DB_PREFIX_.'tax` t ON t.`id_tax` = odt.`id_tax` LEFT JOIN `'._DB_PREFIX_.'tax` t ON t.`id_tax` = odt.`id_tax`
LEFT JOIN `'._DB_PREFIX_.'country` country ON country.`id_country` = a.`id_country` LEFT JOIN `'._DB_PREFIX_.'country` country ON country.`id_country` = a.`id_country`
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = od.`product_id` LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = od.`product_id`
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'accounting_product_zone_shop` acc_pzs LEFT JOIN `'._DB_PREFIX_.'accounting_product_zone_shop` acc_pzs
ON (acc_pzs.`id_shop` = o.`id_shop` ON (acc_pzs.`id_shop` = o.`id_shop`
AND acc_pzs.`id_zone` = country.`id_zone` AND acc_pzs.`id_zone` = country.`id_zone`
@@ -232,8 +232,8 @@ class AdminAttributesGroupsControllerCore extends AdminController
if (Shop::isFeatureActive()) if (Shop::isFeatureActive())
{ {
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'group_shop', 'type' => 'shop',
'label' => $this->l('Group Shop association:'), 'label' => $this->l('Shop association:'),
'name' => 'checkBoxShopAsso', 'name' => 'checkBoxShopAsso',
); );
} }
@@ -290,14 +290,14 @@ class AdminAttributesGroupsControllerCore extends AdminController
{ {
// We get all associated shops for all attribute groups, because we will disable group shops // We get all associated shops for all attribute groups, because we will disable group shops
// for attributes that the selected attribute group don't support // for attributes that the selected attribute group don't support
$sql = 'SELECT id_attribute_group, id_group_shop FROM '._DB_PREFIX_.'attribute_group_group_shop'; $sql = 'SELECT id_attribute_group, id_shop FROM '._DB_PREFIX_.'attribute_group_shop';
$associations = array(); $associations = array();
foreach (Db::getInstance()->executeS($sql) as $row) foreach (Db::getInstance()->executeS($sql) as $row)
$associations[$row['id_attribute_group']][] = $row['id_group_shop']; $associations[$row['id_attribute_group']][] = $row['id_shop_group'];
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'group_shop', 'type' => 'shop',
'label' => $this->l('Group Shop association:'), 'label' => $this->l('Shop association:'),
'name' => 'checkBoxShopAsso', 'name' => 'checkBoxShopAsso',
'values' => Shop::getTree() 'values' => Shop::getTree()
); );
+1 -1
View File
@@ -585,7 +585,7 @@ class AdminCartsControllerCore extends AdminController
$specific_price = new SpecificPrice(); $specific_price = new SpecificPrice();
$specific_price->id_cart = (int)$this->context->cart->id; $specific_price->id_cart = (int)$this->context->cart->id;
$specific_price->id_shop = 0; $specific_price->id_shop = 0;
$specific_price->id_group_shop = 0; $specific_price->id_shop_group = 0;
$specific_price->id_currency = 0; $specific_price->id_currency = 0;
$specific_price->id_country = 0; $specific_price->id_country = 0;
$specific_price->id_group = 0; $specific_price->id_group = 0;
@@ -195,8 +195,8 @@ class AdminFeaturesControllerCore extends AdminController
if (Shop::isFeatureActive()) if (Shop::isFeatureActive())
{ {
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'group_shop', 'type' => 'shop',
'label' => $this->l('GroupShop association:'), 'label' => $this->l('Shop association:'),
'name' => 'checkBoxShopAsso', 'name' => 'checkBoxShopAsso',
); );
} }
+2 -2
View File
@@ -264,8 +264,8 @@ class AdminGroupsControllerCore extends AdminController
if (Shop::isFeatureActive()) if (Shop::isFeatureActive())
{ {
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'group_shop', 'type' => 'shop',
'label' => $this->l('Group Shop association:'), 'label' => $this->l('Shop association:'),
'name' => 'checkBoxShopAsso', 'name' => 'checkBoxShopAsso',
); );
} }
+16 -11
View File
@@ -963,7 +963,6 @@ class AdminImportControllerCore extends AdminController
{ {
if (Validate::isLoadedObject(new TaxRulesGroup($product->id_tax_rules_group))) if (Validate::isLoadedObject(new TaxRulesGroup($product->id_tax_rules_group)))
{ {
$product->setTaxRulesGroup((int)$product->id_tax_rules_group, true);
$address = $this->context->shop->getAddress(); $address = $this->context->shop->getAddress();
$tax_manager = TaxManagerFactory::getManager($address, $product->id_tax_rules_group); $tax_manager = TaxManagerFactory::getManager($address, $product->id_tax_rules_group);
$product_tax_calculator = $tax_manager->getTaxCalculator(); $product_tax_calculator = $tax_manager->getTaxCalculator();
@@ -1123,9 +1122,10 @@ class AdminImportControllerCore extends AdminController
if (Tools::getValue('match_ref') == 1 && $product->reference && Product::existsRefInDatabase($product->reference)) if (Tools::getValue('match_ref') == 1 && $product->reference && Product::existsRefInDatabase($product->reference))
{ {
$datas = Db::getInstance()->getRow(' $datas = Db::getInstance()->getRow('
SELECT `date_add`, `id_product` SELECT product_shop.`date_add`, p.`id_product`
FROM `'._DB_PREFIX_.'product` FROM `'._DB_PREFIX_.'product` p
WHERE `reference` = "'.$product->reference.'" '.Shop::addSqlAssociation('product', 'p').'
WHERE p.`reference` = "'.$product->reference.'"
'); ');
$product->id = (int)$datas['id_product']; $product->id = (int)$datas['id_product'];
$product->date_add = pSQL($datas['date_add']); $product->date_add = pSQL($datas['date_add']);
@@ -1133,7 +1133,11 @@ class AdminImportControllerCore extends AdminController
} // Else If id product && id product already in base, trying to update } // Else If id product && id product already in base, trying to update
else if ($product->id && Product::existsInDatabase((int)$product->id, 'product')) else if ($product->id && Product::existsInDatabase((int)$product->id, 'product'))
{ {
$datas = Db::getInstance()->getRow('SELECT `date_add` FROM `'._DB_PREFIX_.'product` WHERE `id_product` = '.(int)$product->id); $datas = Db::getInstance()->getRow('
SELECT product_shop.`date_add`
FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').'
WHERE p.`id_product` = '.(int)$product->id);
$product->date_add = pSQL($datas['date_add']); $product->date_add = pSQL($datas['date_add']);
$res = $product->update(); $res = $product->update();
} }
@@ -1167,7 +1171,6 @@ class AdminImportControllerCore extends AdminController
$shop = trim($shop); $shop = trim($shop);
if (!is_numeric($shop)) if (!is_numeric($shop))
$shop = Shop::getIdByName($shop); $shop = Shop::getIdByName($shop);
$product->updateCategoryDefault(new Shop($shop));
$shops[] = $shop; $shops[] = $shop;
} }
$product->associateTo($shops); $product->associateTo($shops);
@@ -1587,7 +1590,7 @@ class AdminImportControllerCore extends AdminController
if (($field_error = $customer->validateFields(UNFRIENDLY_ERROR, true)) === true && if (($field_error = $customer->validateFields(UNFRIENDLY_ERROR, true)) === true &&
($lang_field_error = $customer->validateFieldsLang(UNFRIENDLY_ERROR, true)) === true) ($lang_field_error = $customer->validateFieldsLang(UNFRIENDLY_ERROR, true)) === true)
{ {
$customer->id_group_shop = Shop::getGroupFromShop($customer->id_shop); $customer->id_shop_group = Shop::getGroupFromShop($customer->id_shop);
if ($customer->id && $customer->customerIdExists($customer->id)) if ($customer->id && $customer->customerIdExists($customer->id))
$res = $customer->update(); $res = $customer->update();
@@ -1791,10 +1794,10 @@ class AdminImportControllerCore extends AdminController
{ {
$shop = trim($shop); $shop = trim($shop);
if (!is_numeric($shop)) if (!is_numeric($shop))
$shop = GroupShop::getIdByName($shop); $shop = ShopGroup::getIdByName($shop);
$shops[] = $shop; $shops[] = $shop;
} }
$manufacturer->associateTo($shops, 'group_shop'); $manufacturer->associateTo($shops);
} }
} }
} }
@@ -1852,10 +1855,10 @@ class AdminImportControllerCore extends AdminController
{ {
$shop = trim($shop); $shop = trim($shop);
if (!is_numeric($shop)) if (!is_numeric($shop))
$shop = GroupShop::getIdByName($shop); $shop = ShopGroup::getIdByName($shop);
$shops[] = $shop; $shops[] = $shop;
} }
$supplier->associateTo($shops, 'group_shop'); $supplier->associateTo($shops);
} }
} }
} }
@@ -2156,6 +2159,7 @@ class AdminImportControllerCore extends AdminController
break; break;
case $this->entities[$this->l('Products')]: case $this->entities[$this->l('Products')]:
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product');
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_shop');
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'feature_product'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'feature_product');
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_lang'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_lang');
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'category_product'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'category_product');
@@ -2177,6 +2181,7 @@ class AdminImportControllerCore extends AdminController
case $this->entities[$this->l('Combinations')]: case $this->entities[$this->l('Combinations')]:
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_impact'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_impact');
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute`');
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_shop`');
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_combination`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_combination`');
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_image`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_attribute_image`');
Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_group`'); Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'attribute_group`');
@@ -324,8 +324,8 @@ class AdminManufacturersControllerCore extends AdminController
if (Shop::isFeatureActive()) if (Shop::isFeatureActive())
{ {
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'group_shop', 'type' => 'shop',
'label' => $this->l('GroupShop association:'), 'label' => $this->l('Shop association:'),
'name' => 'checkBoxShopAsso', 'name' => 'checkBoxShopAsso',
); );
} }
+2 -2
View File
@@ -1392,7 +1392,7 @@ class AdminOrdersControllerCore extends AdminController
// Create new cart // Create new cart
$cart = new Cart(); $cart = new Cart();
$cart->id_group_shop = $order->id_group_shop; $cart->id_shop_group = $order->id_shop_group;
$cart->id_shop = $order->id_shop; $cart->id_shop = $order->id_shop;
$cart->id_customer = $order->id_customer; $cart->id_customer = $order->id_customer;
$cart->id_carrier = $order->id_carrier; $cart->id_carrier = $order->id_carrier;
@@ -1421,7 +1421,7 @@ class AdminOrdersControllerCore extends AdminController
{ {
$specific_price = new SpecificPrice(); $specific_price = new SpecificPrice();
$specific_price->id_shop = 0; $specific_price->id_shop = 0;
$specific_price->id_group_shop = 0; $specific_price->id_shop_group = 0;
$specific_price->id_currency = 0; $specific_price->id_currency = 0;
$specific_price->id_country = 0; $specific_price->id_country = 0;
$specific_price->id_group = 0; $specific_price->id_group = 0;
@@ -246,10 +246,7 @@ class AdminPPreferencesControllerCore extends AdminController
if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') == 1 && if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') == 1 &&
(int)Tools::getValue('PS_ADVANCED_STOCK_MANAGEMENT') == 0) (int)Tools::getValue('PS_ADVANCED_STOCK_MANAGEMENT') == 0)
{ {
Db::getInstance()->execute( ObjectModel::updateMultishopTable('Product', array('advanced_stock_management' => 0), '`advanced_stock_management` = 1');
'UPDATE `'._DB_PREFIX_.'product`
SET `advanced_stock_management` = 0
WHERE `advanced_stock_management` = 1');
Db::getInstance()->execute( Db::getInstance()->execute(
'UPDATE `'._DB_PREFIX_.'stock_available` 'UPDATE `'._DB_PREFIX_.'stock_available`
@@ -268,12 +265,15 @@ class AdminPPreferencesControllerCore extends AdminController
$advanced_stock_management = (int)Tools::getValue('UPDATE_ASM_PRODUCTS'); $advanced_stock_management = (int)Tools::getValue('UPDATE_ASM_PRODUCTS');
// updates product table // updates product table
Db::getInstance()->execute( ObjectModel::updateMultishopTable(
'UPDATE `'._DB_PREFIX_.'product` 'Product',
SET `advanced_stock_management` = '.$advanced_stock_management.' array(
WHERE `advanced_stock_management` = '.($advanced_stock_management == 1 ? 0 : 1).' 'advanced_stock_management' => $advanced_stock_management
),
'`advanced_stock_management` = '.($advanced_stock_management == 1 ? 0 : 1).'
AND `cache_is_pack` = 0 AND `cache_is_pack` = 0
AND `is_virtual` = 0'); AND `is_virtual` = 0'
);
// updates stock available table // updates stock available table
Db::getInstance()->execute( Db::getInstance()->execute(
@@ -283,9 +283,14 @@ class AdminPPreferencesControllerCore extends AdminController
ON ON
( (
p.`id_product` = s.`id_product` p.`id_product` = s.`id_product`
AND p.`cache_is_pack` = 0 )
AND p.`is_virtual` = 0 LEFT JOIN
AND p.`advanced_stock_management` = '.$advanced_stock_management.' `'._DB_PREFIX_.'product_shop` product_shop
ON
(
product_shop.`cache_is_pack` = 0
AND product_shop.`is_virtual` = 0
AND product_shop.`advanced_stock_management` = '.$advanced_stock_management.'
) )
SET s.`depends_on_stock` = '.$advanced_stock_management.', SET s.`depends_on_stock` = '.$advanced_stock_management.',
s.`quantity` = 0 s.`quantity` = 0
+130 -81
View File
@@ -198,13 +198,11 @@ class AdminProductsControllerCore extends AdminController
else else
$this->_category = new Category(); $this->_category = new Category();
$this->_join = ' $this->_join = Shop::addSqlAssociation('product', 'a').'
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (a.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang`) LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (a.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang`)
LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = a.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = a.`id_product` AND i.`cover` = 1)
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_product` = a.`id_product`) LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_product` = a.`id_product`)
LEFT JOIN `'._DB_PREFIX_.'product_tax_rules_group_shop` ptrgs ON (a.`id_product` = ptrgs.`id_product` LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (product_shop.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND ptrgs.id_shop='.(int)$this->context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (ptrgs.`id_tax_rules_group` = tr.`id_tax_rules_group`
AND tr.`id_country` = '.(int)$this->context->country->id.' AND tr.`id_state` = 0) AND tr.`id_country` = '.(int)$this->context->country->id.' AND tr.`id_state` = 0)
LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`)
LEFT JOIN `'._DB_PREFIX_.'stock_available` sav ON (sav.`id_product` = a.`id_product` AND sav.`id_product_attribute` = 0 LEFT JOIN `'._DB_PREFIX_.'stock_available` sav ON (sav.`id_product` = a.`id_product` AND sav.`id_product_attribute` = 0
@@ -444,10 +442,7 @@ class AdminProductsControllerCore extends AdminController
&& Pack::duplicate($id_product_old, $product->id) && Pack::duplicate($id_product_old, $product->id)
&& Product::duplicateCustomizationFields($id_product_old, $product->id) && Product::duplicateCustomizationFields($id_product_old, $product->id)
&& Product::duplicateTags($id_product_old, $product->id) && Product::duplicateTags($id_product_old, $product->id)
&& Product::duplicateDownload($id_product_old, $product->id) && Product::duplicateDownload($id_product_old, $product->id))
&& Product::duplicateTaxRulesGroup((int)$id_product_old, (int)$product->id)
&& Product::duplicateAttachments((int)$id_product_old, (int)$product->id)
&& $product->duplicateShops($id_product_old))
{ {
if ($product->hasAttributes()) if ($product->hasAttributes())
Product::updateDefaultAttribute($product->id); Product::updateDefaultAttribute($product->id);
@@ -1452,11 +1447,9 @@ class AdminProductsControllerCore extends AdminController
if ($this->object->add()) if ($this->object->add())
{ {
$this->addCarriers(); $this->addCarriers();
$this->updateAssoShop((int)$this->object->id);
$this->updateAccessories($this->object); $this->updateAccessories($this->object);
$this->updatePackItems($this->object); $this->updatePackItems($this->object);
$this->updateDownloadProduct($this->object); $this->updateDownloadProduct($this->object);
$this->object->setTaxRulesGroup((int)Tools::getValue('id_tax_rules_group'), true);
if (empty($this->errors)) if (empty($this->errors))
{ {
@@ -1551,6 +1544,9 @@ class AdminProductsControllerCore extends AdminController
$this->copyFromPost($object, $this->table); $this->copyFromPost($object, $this->table);
$object->indexed = 0; $object->indexed = 0;
if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_SHOP)
$object->setFieldsToUpdate((array)Tools::getValue('multishop_check'));
if ($object->update()) if ($object->update())
{ {
if ($this->isTabSubmitted('Shipping')) if ($this->isTabSubmitted('Shipping'))
@@ -1558,7 +1554,6 @@ class AdminProductsControllerCore extends AdminController
if ($this->isTabSubmitted('Associations')) if ($this->isTabSubmitted('Associations'))
{ {
$this->updateAccessories($object); $this->updateAccessories($object);
$this->updateAssoShop((int)$object->id);
} }
if ($this->isTabSubmitted('Accounting')) if ($this->isTabSubmitted('Accounting'))
@@ -1646,74 +1641,123 @@ class AdminProductsControllerCore extends AdminController
$default_language = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $default_language = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
$languages = Language::getLanguages(false); $languages = Language::getLanguages(false);
/* Check required fields */ // Check required fields
foreach ($rules['required'] as $field) foreach ($rules['required'] as $field)
{
if (!$this->isProductFieldUpdated($field))
continue;
if (($value = Tools::getValue($field)) == false && $value != '0') if (($value = Tools::getValue($field)) == false && $value != '0')
{ {
if (Tools::getValue('id_'.$this->table) && $field == 'passwd') if (Tools::getValue('id_'.$this->table) && $field == 'passwd')
continue; continue;
$this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $field, $className).'</b> '.$this->l('is required'); $this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $field, $className).'</b> '.$this->l('is required');
} }
}
/* Check multilingual required fields */ // Check multilingual required fields
foreach ($rules['requiredLang'] as $fieldLang) foreach ($rules['requiredLang'] as $fieldLang)
if (!Tools::getValue($fieldLang.'_'.$default_language->id)) if ($this->isProductFieldUpdated($fieldLang, $default_language->id) && !Tools::getValue($fieldLang.'_'.$default_language->id))
$this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).'</b> '.$this->l('is required at least in').' '.$default_language->name; $this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).'</b> '.$this->l('is required at least in').' '.$default_language->name;
/* Check fields sizes */ // Check fields sizes
foreach ($rules['size'] as $field => $maxLength) foreach ($rules['size'] as $field => $maxLength)
if ($value = Tools::getValue($field) && Tools::strlen($value) > $maxLength) if ($this->isProductFieldUpdated($field) && ($value = Tools::getValue($field)) && Tools::strlen($value) > $maxLength)
$this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $field, $className).'</b> '.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max').')'; $this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $field, $className).'</b> '.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max').')';
if (Tools::getIsset('description_short')) if (Tools::getIsset('description_short') && $this->isProductFieldUpdated('description_short'))
{ {
$saveShort = Tools::getValue('description_short'); $saveShort = Tools::getValue('description_short');
$_POST['description_short'] = strip_tags(Tools::getValue('description_short')); $_POST['description_short'] = strip_tags(Tools::getValue('description_short'));
} }
/* Check description short size without html */ // Check description short size without html
$limit = (int)Configuration::get('PS_PRODUCT_SHORT_DESC_LIMIT'); $limit = (int)Configuration::get('PS_PRODUCT_SHORT_DESC_LIMIT');
if ($limit <= 0) $limit = 400; if ($limit <= 0) $limit = 400;
foreach ($languages as $language) foreach ($languages as $language)
if ($value = Tools::getValue('description_short_'.$language['id_lang'])) if ($this->isProductFieldUpdated('description_short', $language['id_lang']) && ($value = Tools::getValue('description_short_'.$language['id_lang'])))
if (Tools::strlen(strip_tags($value)) > $limit) if (Tools::strlen(strip_tags($value)) > $limit)
$this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), 'description_short').' ('.$language['name'].')</b> '.$this->l('is too long').' : '.$limit.' '.$this->l('chars max').' ('.$this->l('count now').' '.Tools::strlen(strip_tags($value)).')'; $this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), 'description_short').' ('.$language['name'].')</b> '.$this->l('is too long').' : '.$limit.' '.$this->l('chars max').' ('.$this->l('count now').' '.Tools::strlen(strip_tags($value)).')';
/* Check multilingual fields sizes */
// Check multilingual fields sizes
foreach ($rules['sizeLang'] as $fieldLang => $maxLength) foreach ($rules['sizeLang'] as $fieldLang => $maxLength)
foreach ($languages as $language) foreach ($languages as $language)
if ($value = Tools::getValue($fieldLang.'_'.$language['id_lang']) && Tools::strlen($value) > $maxLength) if ($value = Tools::getValue($fieldLang.'_'.$language['id_lang']) && Tools::strlen($value) > $maxLength)
$this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].')</b> '.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max').')'; $this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].')</b> '.$this->l('is too long').' ('.$maxLength.' '.$this->l('chars max').')';
if (isset($_POST['description_short'])) if ($this->isProductFieldUpdated('description_short') && isset($_POST['description_short']))
$_POST['description_short'] = $saveShort; $_POST['description_short'] = $saveShort;
/* Check fields validity */ // Check fields validity
foreach ($rules['validate'] as $field => $function) foreach ($rules['validate'] as $field => $function)
if ($value = Tools::getValue($field)) if ($this->isProductFieldUpdated($field) && ($value = Tools::getValue($field)))
if (!Validate::$function($value)) if (!Validate::$function($value))
$this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $field, $className).'</b> '.$this->l('is invalid'); $this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $field, $className).'</b> '.$this->l('is invalid');
/* Check multilingual fields validity */ // Check multilingual fields validity
foreach ($rules['validateLang'] as $fieldLang => $function) foreach ($rules['validateLang'] as $fieldLang => $function)
foreach ($languages as $language) foreach ($languages as $language)
if ($value = Tools::getValue($fieldLang.'_'.$language['id_lang'])) if ($this->isProductFieldUpdated('description_short', $language['id_lang']) && ($value = Tools::getValue($fieldLang.'_'.$language['id_lang'])))
if (!Validate::$function($value)) if (!Validate::$function($value))
$this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].')</b> '.$this->l('is invalid'); $this->errors[] = $this->l('this field').' <b>'.call_user_func(array($className, 'displayFieldName'), $fieldLang, $className).' ('.$language['name'].')</b> '.$this->l('is invalid');
/* Categories */ // Categories
$productCats = '';
if (!Tools::isSubmit('categoryBox') || !count(Tools::getValue('categoryBox'))) if (!Tools::isSubmit('categoryBox') || !count(Tools::getValue('categoryBox')))
$this->errors[] = $this->l('product must be in at least one Category'); $this->errors[] = $this->l('product must be in at least one Category');
if (!is_array(Tools::getValue('categoryBox')) || !in_array(Tools::getValue('id_category_default'), Tools::getValue('categoryBox'))) if (!is_array(Tools::getValue('categoryBox')) || !in_array(Tools::getValue('id_category_default'), Tools::getValue('categoryBox')))
$this->errors[] = $this->l('product must be in the default category'); $this->errors[] = $this->l('product must be in the default category');
/* Tags */ // Tags
foreach ($languages as $language) foreach ($languages as $language)
if ($value = Tools::getValue('tags_'.$language['id_lang'])) if ($value = Tools::getValue('tags_'.$language['id_lang']))
if (!Validate::isTagsList($value)) if (!Validate::isTagsList($value))
$this->errors[] = $this->l('Tags list').' ('.$language['name'].') '.$this->l('is invalid'); $this->errors[] = $this->l('Tags list').' ('.$language['name'].') '.$this->l('is invalid');
} }
/**
* Check if a field is edited (if the checkbox is checked)
* This method will do something only for multishop with a context all / group
*
* @param string $field Name of field
* @param int $id_lang
* @return bool
*/
protected function isProductFieldUpdated($field, $id_lang = null)
{
// Cache this condition to improve performances
static $is_activated = null;
if (is_null($is_activated))
$is_activated = Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_SHOP;
if (!$is_activated)
return true;
if (is_null($id_lang))
return !empty($_POST['multishop_check'][$field]);
else
return !empty($_POST['multishop_check'][$field][$id_lang]);
}
/**
* If multishop is activated and context is all / group, set to empty all fields values not checked
*/
protected function cleanMultishopFields()
{
if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_SHOP && $this->display == 'edit')
{
$this->object = $this->loadObject();
foreach (Product::$definition['fields'] as $field => $data)
if (!empty($data['shop']) || !empty($data['lang']))
{
if (is_array($this->object->$field))
foreach ($this->object->$field as $k => $v)
$this->object->{$field}[$k] = '';
else
$this->object->$field = '';
}
}
}
protected function _removeTaxFromEcotax() protected function _removeTaxFromEcotax()
{ {
$ecotaxTaxRate = Tax::getProductEcotaxRate(); $ecotaxTaxRate = Tax::getProductEcotaxRate();
@@ -2171,9 +2215,9 @@ class AdminProductsControllerCore extends AdminController
public function initToolbarTitle() public function initToolbarTitle()
{ {
parent::initToolbarTitle(); parent::initToolbarTitle();
if ($product = $this->loadObject(true)) if ($product = $this->loadObject(true))
if ((bool)$product->id && $this->display != 'list') if ((bool)$product->id && $this->display != 'list')
$this->toolbar_title[2] = $this->toolbar_title[2].' ('.$product->name[$this->context->language->id].')'; $this->toolbar_title[2] = $this->toolbar_title[2].' ('.$this->product_name.')';
} }
/** /**
@@ -2183,11 +2227,34 @@ class AdminProductsControllerCore extends AdminController
*/ */
public function renderForm() public function renderForm()
{ {
// This nice code (irony) is here to store the product name, because the row after will erase product name in multishop context
$this->product_name = $this->object->name[$this->context->language->id];
$this->cleanMultishopFields();
if (!method_exists($this, 'initForm'.$this->tab_display)) if (!method_exists($this, 'initForm'.$this->tab_display))
return; return;
$product = $this->object; $product = $this->object;
// Product for multishop
$this->context->smarty->assign('bullet_common_field', '');
if (Shop::isFeatureActive() && $this->display == 'edit')
{
if (Shop::getContext() != Shop::CONTEXT_SHOP)
{
$this->context->smarty->assign(array(
'display_multishop_checkboxes' => true,
'multishop_check' => Tools::getValue('multishop_check'),
));
}
if (Shop::getContext() != Shop::CONTEXT_ALL)
{
$this->context->smarty->assign('bullet_common_field', '<img src="themes/'.$this->context->employee->bo_theme.'/img/bullet_orange.png" style="vertical-align: bottom" />');
$this->context->smarty->assign('display_common_field', true);
}
}
// Sort the tabs that need to be preloaded by their priority number // Sort the tabs that need to be preloaded by their priority number
asort($this->available_tabs, SORT_NUMERIC); asort($this->available_tabs, SORT_NUMERIC);
$this->tpl_form_vars['tabs_preloaded'] = $this->available_tabs; $this->tpl_form_vars['tabs_preloaded'] = $this->available_tabs;
@@ -2199,6 +2266,7 @@ class AdminProductsControllerCore extends AdminController
$this->tpl_form_vars['defaultLanguage'] = Language::getLanguage(Configuration::get('PS_LANG_DEFAULT')); $this->tpl_form_vars['defaultLanguage'] = Language::getLanguage(Configuration::get('PS_LANG_DEFAULT'));
$this->tpl_form_vars['currentIndex'] = self::$currentIndex; $this->tpl_form_vars['currentIndex'] = self::$currentIndex;
$this->tpl_form_vars['display_multishop_checkboxes'] = (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_SHOP && $this->display == 'edit');
$this->fields_form = array(''); $this->fields_form = array('');
$this->display = 'edit'; $this->display = 'edit';
$this->tpl_form_vars['token'] = $this->token; $this->tpl_form_vars['token'] = $this->token;
@@ -2407,14 +2475,14 @@ class AdminProductsControllerCore extends AdminController
{ {
if ((int)$attribute['id_product_attribute'] > 0) if ((int)$attribute['id_product_attribute'] > 0)
{ {
Db::getInstance()->execute(' $data = array(
UPDATE '._DB_PREFIX_.'product_attribute 'supplier_reference' => pSQL($reference),
SET supplier_reference = "'.pSQL($reference).'", 'wholesale_price' => (float)Tools::convertPrice($price, $id_currency)
wholesale_price = '.(float)Tools::convertPrice($price, $id_currency).' );
WHERE id_product = '.(int)$product->id.' $where = '
AND id_product_attribute = '.(int)$attribute['id_product_attribute'].' id_product = '.(int)$product->id.'
LIMIT 1 AND id_product_attribute = '.(int)$attribute['id_product_attribute'];
'); ObjectModel::updateMultishopTable('product_attribute', $data, $where);
} }
else else
{ {
@@ -2608,8 +2676,6 @@ class AdminProductsControllerCore extends AdminController
$helper->table = $this->table; $helper->table = $this->table;
$helper->identifier = $this->identifier; $helper->identifier = $this->identifier;
$data->assign('displayAssoShop', $helper->renderAssoShop());
// Accessories block // Accessories block
$accessories = Product::getAccessoriesLight($this->context->language->id, $product->id); $accessories = Product::getAccessoriesLight($this->context->language->id, $product->id);
@@ -3234,12 +3300,18 @@ class AdminProductsControllerCore extends AdminController
$data->assign('product_type', (int)Tools::getValue('type_product', $product->getType())); $data->assign('product_type', (int)Tools::getValue('type_product', $product->getType()));
$check_product_association_ajax = false;
if (Shop::isFeatureActive() && Shop::getContext() != Shop::CONTEXT_ALL)
$check_product_association_ajax = true;
// TinyMCE // TinyMCE
$iso_tiny_mce = $this->context->language->iso_code; $iso_tiny_mce = $this->context->language->iso_code;
$iso_tiny_mce = (file_exists(_PS_JS_DIR_.'tiny_mce/langs/'.$iso_tiny_mce.'.js') ? $iso_tiny_mce : 'en'); $iso_tiny_mce = (file_exists(_PS_JS_DIR_.'tiny_mce/langs/'.$iso_tiny_mce.'.js') ? $iso_tiny_mce : 'en');
$data->assign('ad', dirname($_SERVER['PHP_SELF'])); $data->assign('ad', dirname($_SERVER['PHP_SELF']));
$data->assign('iso_tiny_mce', $iso_tiny_mce); $data->assign('iso_tiny_mce', $iso_tiny_mce);
$category_box = Tools::getValue('categoryBox', array()); $category_box = Tools::getValue('categoryBox', array());
$data->assign('check_product_association_ajax', $check_product_association_ajax);
$data->assign('id_lang', $this->context->language->id);
$data->assign('product', $product); $data->assign('product', $product);
$data->assign('token', $this->token); $data->assign('token', $this->token);
$data->assign('currency', $currency); $data->assign('currency', $currency);
@@ -3583,7 +3655,7 @@ class AdminProductsControllerCore extends AdminController
$show_quantities = true; $show_quantities = true;
$shop_context = Shop::getContext(); $shop_context = Shop::getContext();
$group_shop = $this->context->shop->getGroup(); $shop_group = $this->context->shop->getGroup();
// if we are in all shops context, it's not possible to manage quantities at this level // if we are in all shops context, it's not possible to manage quantities at this level
if ($shop_context == Shop::CONTEXT_ALL) if ($shop_context == Shop::CONTEXT_ALL)
@@ -3592,14 +3664,14 @@ class AdminProductsControllerCore extends AdminController
elseif ($shop_context == Shop::CONTEXT_GROUP) elseif ($shop_context == Shop::CONTEXT_GROUP)
{ {
// if quantities are not shared between shops of the group, it's not possible to manage them at group level // if quantities are not shared between shops of the group, it's not possible to manage them at group level
if (!$group_shop->share_stock) if (!$shop_group->share_stock)
$show_quantities = false; $show_quantities = false;
} }
// if we are in shop context // if we are in shop context
else else
{ {
// if quantities are shared between shops of the group, it's not possible to manage them for a given shop // if quantities are shared between shops of the group, it's not possible to manage them for a given shop
if ($group_shop->share_stock) if ($shop_group->share_stock)
$show_quantities = false; $show_quantities = false;
} }
@@ -4047,7 +4119,7 @@ class AdminProductsControllerCore extends AdminController
_PS_JS_DIR_.'jquery/plugins/treeview/jquery.treeview.async.js', _PS_JS_DIR_.'jquery/plugins/treeview/jquery.treeview.async.js',
_PS_JS_DIR_.'jquery/plugins/treeview/jquery.treeview.edit.js', _PS_JS_DIR_.'jquery/plugins/treeview/jquery.treeview.edit.js',
_PS_JS_DIR_.'admin-categories-tree.js', _PS_JS_DIR_.'admin-categories-tree.js',
_PS_JS_DIR_.'/jquery/ui/jquery.ui.progressbar.min.js', _PS_JS_DIR_.'jquery/ui/jquery.ui.progressbar.min.js',
_PS_JS_DIR_.'jquery/plugins/timepicker/jquery-ui-timepicker-addon.js' _PS_JS_DIR_.'jquery/plugins/timepicker/jquery-ui-timepicker-addon.js'
)); ));
@@ -4074,42 +4146,19 @@ class AdminProductsControllerCore extends AdminController
$this->tpl_form_vars['warning_unavailable_product'] = $content; $this->tpl_form_vars['warning_unavailable_product'] = $content;
} }
protected function updateAssoShop($id_object = false, $new_id_object = false) public function ajaxProcessCheckProductName()
{ {
$assos_data = $this->getAssoShop($this->table, $id_object); $search = Tools::getValue('q');
$assos = $assos_data[0]; $id_lang = Tools::getValue('id_lang');
$type = $assos_data[1]; $limit = Tools::getValue('limit');
$result = Db::getInstance()->executeS('
$product_shop = Product::getShopsByProduct($id_object); SELECT DISTINCT pl.`name`, p.`id_product`, pl.`id_shop`
FROM `'._DB_PREFIX_.'product` p
if (!$type) LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
return; ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = '.(int)$id_lang.')
WHERE pl.`name` LIKE "%'.pSQL($search).'%"
if ($new_id_object) GROUP BY pl.`id_product`
$object = new Product($new_id_object); LIMIT '.(int)$limit);
else die(Tools::jsonEncode($result));
$object = new Product($id_object);
$delete = $insert = '';
foreach ($assos as $asso)
{
$passed = false;
$delete .= (int)$asso['id_'.$type].',';
foreach ($product_shop as $product)
if ($product['id_shop'] == $asso['id_'.$type])
$passed = true;
if (!$passed)
$insert .= '('.($new_id_object ? (int)$new_id_object : (int)$asso['id_object']).', '.(int)$asso['id_'.$type].', '.(int)$object->id_category_default.'),';
} }
$delete = rtrim($delete, ',');
$insert = rtrim($insert, ',');
if (!empty($delete))
Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.$this->table.'_'.$type.
($id_object ? ' WHERE `'.$this->identifier.'` = '.(int)$id_object.' AND `id_'.$type.'` NOT IN ('.$delete.')' : ''));
if (!empty($insert))
Db::getInstance()->execute('
INSERT INTO '._DB_PREFIX_.$this->table.'_'.$type.' (`'.pSQL($this->identifier).'`, `id_'.$type.'`, `id_category_default`)
VALUES '.pSQL($insert));
} }
}
@@ -58,7 +58,7 @@ class AdminSearchConfControllerCore extends AdminController
$cron_url = Tools::getHttpHost(true, true).__PS_BASE_URI__. $cron_url = Tools::getHttpHost(true, true).__PS_BASE_URI__.
substr($_SERVER['SCRIPT_NAME'], strlen(__PS_BASE_URI__), -strlen($current_file_name['0'])). substr($_SERVER['SCRIPT_NAME'], strlen(__PS_BASE_URI__), -strlen($current_file_name['0'])).
'searchcron.php?full=1&token='.substr(_COOKIE_KEY_, 34, 8); 'searchcron.php?full=1&token='.substr(_COOKIE_KEY_, 34, 8);
list($total, $indexed) = Db::getInstance()->getRow('SELECT COUNT(*) as "0", SUM(indexed) as "1" FROM '._DB_PREFIX_.'product'); list($total, $indexed) = Db::getInstance()->getRow('SELECT COUNT(*) as "0", SUM(product_shop.indexed) as "1" FROM '._DB_PREFIX_.'product p '.Shop::addSqlAssociation('product', 'p'));
$this->fields_options = array( $this->fields_options = array(
'indexation' => array( 'indexation' => array(
+18 -18
View File
@@ -47,7 +47,7 @@ class AdminShopControllerCore extends AdminController
'filter_key' => 'a!name', 'filter_key' => 'a!name',
'width' => 200, 'width' => 200,
), ),
'group_shop_name' => array( 'shop_group_name' => array(
'title' => $this->l('Group Shop'), 'title' => $this->l('Group Shop'),
'width' => 150, 'width' => 150,
'filter_key' => 'gs!name' 'filter_key' => 'gs!name'
@@ -154,10 +154,10 @@ class AdminShopControllerCore extends AdminController
$this->addRowAction('edit'); $this->addRowAction('edit');
$this->addRowAction('delete'); $this->addRowAction('delete');
$this->_select = 'gs.name group_shop_name, cl.name category_name, CONCAT(\'http://\', su.domain, su.physical_uri, su.virtual_uri) AS url'; $this->_select = 'gs.name shop_group_name, cl.name category_name, CONCAT(\'http://\', su.domain, su.physical_uri, su.virtual_uri) AS url';
$this->_join = ' $this->_join = '
LEFT JOIN `'._DB_PREFIX_.'group_shop` gs LEFT JOIN `'._DB_PREFIX_.'shop_group` gs
ON (a.id_group_shop = gs.id_group_shop) ON (a.id_shop_group = gs.id_shop_group)
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
ON (a.id_category = cl.id_category AND cl.id_lang='.(int)$this->context->language->id.') ON (a.id_category = cl.id_category AND cl.id_lang='.(int)$this->context->language->id.')
LEFT JOIN '._DB_PREFIX_.'shop_url su LEFT JOIN '._DB_PREFIX_.'shop_url su
@@ -237,7 +237,7 @@ class AdminShopControllerCore extends AdminController
public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false)
{ {
if (Shop::getContext() == Shop::CONTEXT_GROUP) if (Shop::getContext() == Shop::CONTEXT_GROUP)
$this->_where .= ' AND a.id_group_shop = '.(int)Shop::getContextGroupShopID(); $this->_where .= ' AND a.id_shop_group = '.(int)Shop::getContextShopGroupID();
parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop); parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop);
$shop_delete_list = array(); $shop_delete_list = array();
@@ -272,35 +272,35 @@ class AdminShopControllerCore extends AdminController
if (Shop::getTotalShops() > 1 && $obj->id) if (Shop::getTotalShops() > 1 && $obj->id)
{ {
$group_shop = new GroupShop($obj->id_group_shop); $shop_group = new ShopGroup($obj->id_shop_group);
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'hidden', 'type' => 'hidden',
'name' => 'id_group_shop', 'name' => 'id_shop_group',
'default' => $group_shop->name 'default' => $shop_group->name
); );
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'textGroupShop', 'type' => 'textShopGroup',
'label' => $this->l('Group Shop:'), 'label' => $this->l('Group Shop:'),
'name' => 'id_group_shop', 'name' => 'id_shop_group',
'value' => $group_shop->name 'value' => $shop_group->name
); );
} }
else else
{ {
$options = array(); $options = array();
foreach (GroupShop::getGroupShops() as $group) foreach (ShopGroup::getShopGroups() as $group)
$options[] = array( $options[] = array(
'id_group_shop' => $group->id, 'id_shop_group' => $group->id,
'name' => $group->name, 'name' => $group->name,
); );
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'select', 'type' => 'select',
'label' => $this->l('Group Shop:'), 'label' => $this->l('Group Shop:'),
'name' => 'id_group_shop', 'name' => 'id_shop_group',
'options' => array( 'options' => array(
'query' => $options, 'query' => $options,
'id' => 'id_group_shop', 'id' => 'id_shop_group',
'name' => 'name', 'name' => 'name',
), ),
); );
@@ -431,10 +431,10 @@ class AdminShopControllerCore extends AdminController
); );
$this->fields_value = array( $this->fields_value = array(
'id_group_shop' => (Tools::getValue('id_group_shop') ? Tools::getValue('id_group_shop') : 'id_shop_group' => (Tools::getValue('id_shop_group') ? Tools::getValue('id_shop_group') :
(isset($obj->id_group_shop)) ? $obj->id_group_shop : Shop::getContextGroupShopID()), (isset($obj->id_shop_group)) ? $obj->id_shop_group : Shop::getContextShopGroupID()),
'id_category' => (Tools::getValue('id_category') ? Tools::getValue('id_category') : 'id_category' => (Tools::getValue('id_category') ? Tools::getValue('id_category') :
(isset($obj->id_group_shop)) ? $obj->id_group_shop : Shop::getContextGroupShopID()), (isset($obj->id_shop_group)) ? $obj->id_shop_group : Shop::getContextShopGroupID()),
'id_theme_checked' => (isset($obj->id_theme) ? $obj->id_theme : $id_theme) 'id_theme_checked' => (isset($obj->id_theme) ? $obj->id_theme : $id_theme)
); );
@@ -25,12 +25,12 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*/ */
class AdminGroupShopControllerCore extends AdminController class AdminShopGroupControllerCore extends AdminController
{ {
public function __construct() public function __construct()
{ {
$this->table = 'group_shop'; $this->table = 'shop_group';
$this->className = 'GroupShop'; $this->className = 'ShopGroup';
$this->lang = false; $this->lang = false;
$this->requiredDatabase = true; $this->requiredDatabase = true;
$this->multishop_context = Shop::CONTEXT_ALL; $this->multishop_context = Shop::CONTEXT_ALL;
@@ -46,7 +46,7 @@ class AdminGroupShopControllerCore extends AdminController
$this->deleted = false; $this->deleted = false;
$this->fields_list = array( $this->fields_list = array(
'id_group_shop' => array( 'id_shop_group' => array(
'title' => $this->l('ID'), 'title' => $this->l('ID'),
'align' => 'center', 'align' => 'center',
'width' => 25, 'width' => 25,
@@ -74,12 +74,12 @@ class AdminGroupShopControllerCore extends AdminController
{ {
$this->fields_form = array( $this->fields_form = array(
'legend' => array( 'legend' => array(
'title' => $this->l('GroupShop') 'title' => $this->l('ShopGroup')
), ),
'input' => array( 'input' => array(
array( array(
'type' => 'text', 'type' => 'text',
'label' => $this->l('GroupShop name:'), 'label' => $this->l('Shop group name:'),
'name' => 'name', 'name' => 'name',
'required' => true 'required' => true
), ),
@@ -200,60 +200,32 @@ class AdminGroupShopControllerCore extends AdminController
'zone' => $this->l('Zones'), 'zone' => $this->l('Zones'),
); );
if (!$this->object->id)
$this->fields_import_form = array(
'legend' => array(
'title' => $this->l('Import data from another group shop')
),
'label' => $this->l('Duplicate data from group shop'),
'checkbox' => array(
'type' => 'checkbox',
'label' => $this->l('Duplicate data from group shop'),
'name' => 'useImportData',
'value' => 1
),
'select' => array(
'type' => 'select',
'name' => 'importFromShop',
'options' => array(
'query' => Shop::getTree(),
'name' => 'name'
)
),
'allcheckbox' => array(
'type' => 'checkbox',
'values' => $import_data
),
'desc' => $this->l('Use this option to associate data (products, modules, etc.) the same way as the selected shop')
);
$default_shop = new Shop(Configuration::get('PS_SHOP_DEFAULT')); $default_shop = new Shop(Configuration::get('PS_SHOP_DEFAULT'));
$this->tpl_form_vars = array( $this->tpl_form_vars = array(
'disabled' => $disabled, 'disabled' => $disabled,
'checked' => (Tools::getValue('addgroup_shop') !== false) ? true : false, 'checked' => (Tools::getValue('addshop_group') !== false) ? true : false,
'defaultGroup' => $default_shop->id_group_shop, 'defaultGroup' => $default_shop->id_shop_group,
); );
if (isset($this->fields_import_form))
$this->tpl_form_vars = array_merge($this->tpl_form_vars, array('form_import' => $this->fields_import_form));
$this->fields_value = array( $this->fields_value = array(
'active' => true 'active' => true
); );
return parent::renderForm(); return parent::renderForm();
} }
public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false) public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = null, $id_lang_shop = false)
{ {
parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop); parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop);
$group_shop_delete_list = array(); $shop_group_delete_list = array();
// test store authorized to remove // test store authorized to remove
foreach ($this->_list as $group_shop) foreach ($this->_list as $shop_group)
{ {
$shops = Shop::getShops(true, $group_shop['id_group_shop']); $shops = Shop::getShops(true, $shop_group['id_shop_group']);
if (!empty($shops)) if (!empty($shops))
$group_shop_delete_list[] = $group_shop['id_group_shop']; $shop_group_delete_list[] = $shop_group['id_shop_group'];
} }
$this->addRowActionSkipList('delete', $group_shop_delete_list); $this->addRowActionSkipList('delete', $shop_group_delete_list);
} }
public function postProcess() public function postProcess()
@@ -261,10 +233,10 @@ class AdminGroupShopControllerCore extends AdminController
if (Tools::isSubmit('delete'.$this->table) || Tools::isSubmit('status') || Tools::isSubmit('status'.$this->table)) if (Tools::isSubmit('delete'.$this->table) || Tools::isSubmit('status') || Tools::isSubmit('status'.$this->table))
{ {
$object = $this->loadObject(); $object = $this->loadObject();
if (GroupShop::getTotalGroupShops() == 1) if (ShopGroup::getTotalShopGroup() == 1)
$this->errors[] = Tools::displayError('You cannot delete or disable the last groupshop.'); $this->errors[] = Tools::displayError('You cannot delete or disable the last shop group.');
else if ($object->haveShops()) else if ($object->haveShops())
$this->errors[] = Tools::displayError('You cannot delete or disable a groupshop which has shops using it.'); $this->errors[] = Tools::displayError('You cannot delete or disable a shop group which has shops using it.');
if (count($this->errors)) if (count($this->errors))
return false; return false;
@@ -272,22 +244,16 @@ class AdminGroupShopControllerCore extends AdminController
return parent::postProcess(); return parent::postProcess();
} }
protected function afterAdd($new_group_shop) protected function afterAdd($new_shop_group)
{ {
if (Tools::getValue('useImportData') && ($import_data = Tools::getValue('importData')) && is_array($import_data))
$new_group_shop->copyGroupShopData(Tools::getValue('importFromShop'), $import_data);
//Reset available quantitites //Reset available quantitites
StockAvailable::resetProductFromStockAvailableByGroupShop($new_group_shop); StockAvailable::resetProductFromStockAvailableByShopGroup($new_shop_group);
} }
protected function afterUpdate($new_group_shop) protected function afterUpdate($new_shop_group)
{ {
if (Tools::getValue('useImportData') && ($import_data = Tools::getValue('importData')) && is_array($import_data))
$new_group_shop->copyGroupShopData(Tools::getValue('importFromShop'), $import_data);
//Reset available quantitites //Reset available quantitites
StockAvailable::resetProductFromStockAvailableByGroupShop($new_group_shop); StockAvailable::resetProductFromStockAvailableByShopGroup($new_shop_group);
} }
} }
@@ -189,6 +189,7 @@ class AdminStockCoverControllerCore extends AdminController
// query // query
$this->_select = 'a.id_product as id, COUNT(pa.id_product_attribute) as variations, SUM(s.usable_quantity) as stock'; $this->_select = 'a.id_product as id, COUNT(pa.id_product_attribute) as variations, SUM(s.usable_quantity) as stock';
$this->_join = 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pa.id_product = a.id_product) $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pa.id_product = a.id_product)
'.Shop::addSqlAssociation('product_attribute', 'pa').'
INNER JOIN `'._DB_PREFIX_.'stock` s ON (s.id_product = a.id_product)'; INNER JOIN `'._DB_PREFIX_.'stock` s ON (s.id_product = a.id_product)';
self::$currentIndex .= '&coverage_period='.(int)$this->getCurrentCoveragePeriod().'&warn_days='.(int)$this->getCurrentWarning(); self::$currentIndex .= '&coverage_period='.(int)$this->getCurrentCoveragePeriod().'&warn_days='.(int)$this->getCurrentWarning();
@@ -100,7 +100,7 @@ class AdminStockManagementControllerCore extends AdminController
// overrides query // overrides query
$this->_select = 'a.id_product as id, COUNT(pa.id_product_attribute) as variations'; $this->_select = 'a.id_product as id, COUNT(pa.id_product_attribute) as variations';
$this->_join = 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pa.id_product = a.id_product)'; $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pa.id_product = a.id_product)'.Shop::addSqlAssociation('product_attribute', 'pa');
$this->_where = 'AND a.cache_is_pack = 0 AND a.is_virtual = 0'; $this->_where = 'AND a.cache_is_pack = 0 AND a.is_virtual = 0';
$this->_group = 'GROUP BY a.id_product'; $this->_group = 'GROUP BY a.id_product';
@@ -244,7 +244,7 @@ class AdminSuppliersControllerCore extends AdminController
if (Shop::isFeatureActive()) if (Shop::isFeatureActive())
{ {
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'group_shop', 'type' => 'shop',
'label' => $this->l('Shop association:'), 'label' => $this->l('Shop association:'),
'name' => 'checkBoxShopAsso', 'name' => 'checkBoxShopAsso',
); );
+1 -1
View File
@@ -111,7 +111,7 @@ class AdminZonesControllerCore extends AdminController
if (Shop::isFeatureActive()) if (Shop::isFeatureActive())
{ {
$this->fields_form['input'][] = array( $this->fields_form['input'][] = array(
'type' => 'group_shop', 'type' => 'shop',
'label' => $this->l('Group shop association:'), 'label' => $this->l('Group shop association:'),
'name' => 'checkBoxShopAsso', 'name' => 'checkBoxShopAsso',
); );
+4 -4
View File
@@ -53,7 +53,7 @@ class ManufacturerControllerCore extends FrontController
if ($id_manufacturer = Tools::getValue('id_manufacturer')) if ($id_manufacturer = Tools::getValue('id_manufacturer'))
{ {
$this->manufacturer = new Manufacturer((int)$id_manufacturer, $this->context->language->id); $this->manufacturer = new Manufacturer((int)$id_manufacturer, $this->context->language->id);
if (!Validate::isLoadedObject($this->manufacturer) || !$this->manufacturer->active || !$this->manufacturer->isAssociatedToGroupShop()) if (!Validate::isLoadedObject($this->manufacturer) || !$this->manufacturer->active || !$this->manufacturer->isAssociatedToShop())
{ {
header('HTTP/1.1 404 Not Found'); header('HTTP/1.1 404 Not Found');
header('Status: 404 Not Found'); header('Status: 404 Not Found');
@@ -72,7 +72,7 @@ class ManufacturerControllerCore extends FrontController
{ {
parent::initContent(); parent::initContent();
if (Validate::isLoadedObject($this->manufacturer) && $this->manufacturer->active && $this->manufacturer->isAssociatedToGroupShop()) if (Validate::isLoadedObject($this->manufacturer) && $this->manufacturer->active && $this->manufacturer->isAssociatedToShop())
{ {
$this->productSort(); $this->productSort();
$this->assignOne(); $this->assignOne();
@@ -106,8 +106,8 @@ class ManufacturerControllerCore extends FrontController
{ {
if (Configuration::get('PS_DISPLAY_SUPPLIERS')) if (Configuration::get('PS_DISPLAY_SUPPLIERS'))
{ {
$id_current_group_shop = Shop::getContextGroupShopID(); $id_current_shop_group = Shop::getContextShopGroupID();
$data = Manufacturer::getManufacturers(true, $this->context->language->id, true, false, false, false, $id_current_group_shop); $data = Manufacturer::getManufacturers(true, $this->context->language->id, true, false, false, false, $id_current_shop_group);
$nbProducts = count($data); $nbProducts = count($data);
$this->pagination($nbProducts); $this->pagination($nbProducts);
+1 -1
View File
@@ -74,7 +74,7 @@ class SupplierControllerCore extends FrontController
{ {
parent::initContent(); parent::initContent();
if (Validate::isLoadedObject($this->supplier) && $this->supplier->active && $this->supplier->isAssociatedToGroupShop()) if (Validate::isLoadedObject($this->supplier) && $this->supplier->active && $this->supplier->isAssociatedToShop())
{ {
$this->productSort(); // productSort must be called before assignOne $this->productSort(); // productSort must be called before assignOne
$this->assignOne(); $this->assignOne();
+11 -13
View File
@@ -1730,6 +1730,10 @@ a.blue:hover {
width: 200px; width: 200px;
} }
.multishop_product_checkbox{
position: absolute;
}
a.action_module_delete { a.action_module_delete {
color: #CB1C00; color: #CB1C00;
text-decoration: underline; text-decoration: underline;
@@ -1796,19 +1800,9 @@ p.preference_description .light-warning {
} }
.preference_default_multishop{ .preference_default_multishop{
float: right; float: left;
margin-right: 40px; padding-right: 5px;
} margin-top: 4px;
.preference_default_multishop input{
margin-top: -3px;
}
.preference_default_multishop label{
float: none;
font-size: 12px;
color: #666666;
font-style: italic;
} }
.multishop_warning, .warning_mod_rewrite{ .multishop_warning, .warning_mod_rewrite{
@@ -1820,6 +1814,10 @@ p.preference_description .light-warning {
padding-top: 1px; padding-top: 1px;
} }
label.conf_title{
width: 235px;
}
.isDisabled{ .isDisabled{
} }
+1 -1
View File
@@ -661,7 +661,7 @@ class InstallXmlLoader
{ {
$table = current($row); $table = current($row);
if (preg_match('#^'._DB_PREFIX_.'(.+?)(_lang)?$#i', $table, $m)) if (preg_match('#^'._DB_PREFIX_.'(.+?)(_lang)?$#i', $table, $m))
if (preg_match('#^'._DB_PREFIX_.'(.+?)(_group_shop|_shop)$#i', $table, $m2) && !isset($tables[$m2[1]])) if (preg_match('#^'._DB_PREFIX_.'(.+?)_shop$#i', $table, $m2) && !isset($tables[$m2[1]]))
$tables[$m[1]] = (isset($m[2]) && $m[2]) ? true : false; $tables[$m[1]] = (isset($m[2]) && $m[2]) ? true : false;
else else
$tables[$m[1]] = (isset($m[2]) && $m[2]) ? true : false; $tables[$m[1]] = (isset($m[2]) && $m[2]) ? true : false;
+97 -75
View File
@@ -167,7 +167,7 @@ CREATE TABLE `PREFIX_carrier_zone` (
CREATE TABLE `PREFIX_cart` ( CREATE TABLE `PREFIX_cart` (
`id_cart` int(10) unsigned NOT NULL auto_increment, `id_cart` int(10) unsigned NOT NULL auto_increment,
`id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_shop_group` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_carrier` int(10) unsigned NOT NULL, `id_carrier` int(10) unsigned NOT NULL,
`delivery_option` varchar(100), `delivery_option` varchar(100),
@@ -192,7 +192,7 @@ CREATE TABLE `PREFIX_cart` (
KEY `id_lang` (`id_lang`), KEY `id_lang` (`id_lang`),
KEY `id_currency` (`id_currency`), KEY `id_currency` (`id_currency`),
KEY `id_guest` (`id_guest`), KEY `id_guest` (`id_guest`),
KEY `id_group_shop` (`id_group_shop`), KEY `id_shop_group` (`id_shop_group`),
KEY `id_shop` (`id_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
@@ -414,7 +414,7 @@ CREATE TABLE `PREFIX_compare_product` (
CREATE TABLE `PREFIX_configuration` ( CREATE TABLE `PREFIX_configuration` (
`id_configuration` int(10) unsigned NOT NULL auto_increment, `id_configuration` int(10) unsigned NOT NULL auto_increment,
`id_group_shop` INT(11) UNSIGNED DEFAULT NULL, `id_shop_group` INT(11) UNSIGNED DEFAULT NULL,
`id_shop` INT(11) UNSIGNED DEFAULT NULL, `id_shop` INT(11) UNSIGNED DEFAULT NULL,
`name` varchar(32) NOT NULL, `name` varchar(32) NOT NULL,
`value` text, `value` text,
@@ -423,7 +423,7 @@ CREATE TABLE `PREFIX_configuration` (
PRIMARY KEY (`id_configuration`), PRIMARY KEY (`id_configuration`),
KEY `name` (`name`), KEY `name` (`name`),
KEY `id_shop` (`id_shop`), KEY `id_shop` (`id_shop`),
KEY `id_group_shop` (`id_group_shop`) KEY `id_shop_group` (`id_shop_group`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_configuration_lang` ( CREATE TABLE `PREFIX_configuration_lang` (
@@ -436,7 +436,7 @@ CREATE TABLE `PREFIX_configuration_lang` (
CREATE TABLE `PREFIX_connections` ( CREATE TABLE `PREFIX_connections` (
`id_connections` int(10) unsigned NOT NULL auto_increment, `id_connections` int(10) unsigned NOT NULL auto_increment,
`id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_shop_group` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_guest` int(10) unsigned NOT NULL, `id_guest` int(10) unsigned NOT NULL,
`id_page` int(10) unsigned NOT NULL, `id_page` int(10) unsigned NOT NULL,
@@ -528,7 +528,7 @@ CREATE TABLE `PREFIX_currency` (
CREATE TABLE `PREFIX_customer` ( CREATE TABLE `PREFIX_customer` (
`id_customer` int(10) unsigned NOT NULL auto_increment, `id_customer` int(10) unsigned NOT NULL auto_increment,
`id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_shop_group` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_gender` int(10) unsigned NOT NULL, `id_gender` int(10) unsigned NOT NULL,
`id_default_group` int(10) unsigned NOT NULL DEFAULT '1', `id_default_group` int(10) unsigned NOT NULL DEFAULT '1',
@@ -563,7 +563,7 @@ CREATE TABLE `PREFIX_customer` (
KEY `customer_login` (`email`,`passwd`), KEY `customer_login` (`email`,`passwd`),
KEY `id_customer_passwd` (`id_customer`,`passwd`), KEY `id_customer_passwd` (`id_customer`,`passwd`),
KEY `id_gender` (`id_gender`), KEY `id_gender` (`id_gender`),
KEY `id_group_shop` (`id_group_shop`), KEY `id_shop_group` (`id_shop_group`),
KEY `id_shop` (`id_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
@@ -667,7 +667,7 @@ CREATE TABLE `PREFIX_date_range` (
CREATE TABLE `PREFIX_delivery` ( CREATE TABLE `PREFIX_delivery` (
`id_delivery` int(10) unsigned NOT NULL auto_increment, `id_delivery` int(10) unsigned NOT NULL auto_increment,
`id_shop` INT UNSIGNED NULL DEFAULT NULL, `id_shop` INT UNSIGNED NULL DEFAULT NULL,
`id_group_shop` INT UNSIGNED NULL DEFAULT NULL, `id_shop_group` INT UNSIGNED NULL DEFAULT NULL,
`id_carrier` int(10) unsigned NOT NULL, `id_carrier` int(10) unsigned NOT NULL,
`id_range_price` int(10) unsigned default NULL, `id_range_price` int(10) unsigned default NULL,
`id_range_weight` int(10) unsigned default NULL, `id_range_weight` int(10) unsigned default NULL,
@@ -1022,7 +1022,7 @@ CREATE TABLE `PREFIX_operating_system` (
CREATE TABLE `PREFIX_orders` ( CREATE TABLE `PREFIX_orders` (
`id_order` int(10) unsigned NOT NULL auto_increment, `id_order` int(10) unsigned NOT NULL auto_increment,
`reference` VARCHAR(9), `reference` VARCHAR(9),
`id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_shop_group` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_carrier` int(10) unsigned NOT NULL, `id_carrier` int(10) unsigned NOT NULL,
`id_lang` int(10) unsigned NOT NULL, `id_lang` int(10) unsigned NOT NULL,
@@ -1072,7 +1072,7 @@ CREATE TABLE `PREFIX_orders` (
KEY `id_currency` (`id_currency`), KEY `id_currency` (`id_currency`),
KEY `id_address_delivery` (`id_address_delivery`), KEY `id_address_delivery` (`id_address_delivery`),
KEY `id_address_invoice` (`id_address_invoice`), KEY `id_address_invoice` (`id_address_invoice`),
KEY `id_group_shop` (`id_group_shop`), KEY `id_shop_group` (`id_shop_group`),
KEY `id_shop` (`id_shop`), KEY `id_shop` (`id_shop`),
INDEX `date_add`(`date_add`) INDEX `date_add`(`date_add`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
@@ -1308,7 +1308,7 @@ CREATE TABLE `PREFIX_page_type` (
CREATE TABLE `PREFIX_page_viewed` ( CREATE TABLE `PREFIX_page_viewed` (
`id_page` int(10) unsigned NOT NULL, `id_page` int(10) unsigned NOT NULL,
`id_group_shop` INT UNSIGNED NOT NULL DEFAULT '1', `id_shop_group` INT UNSIGNED NOT NULL DEFAULT '1',
`id_shop` INT UNSIGNED NOT NULL DEFAULT '1', `id_shop` INT UNSIGNED NOT NULL DEFAULT '1',
`id_date_range` int(10) unsigned NOT NULL, `id_date_range` int(10) unsigned NOT NULL,
`counter` int(10) unsigned NOT NULL, `counter` int(10) unsigned NOT NULL,
@@ -1338,6 +1338,7 @@ CREATE TABLE `PREFIX_product` (
`id_supplier` int(10) unsigned default NULL, `id_supplier` int(10) unsigned default NULL,
`id_manufacturer` int(10) unsigned default NULL, `id_manufacturer` int(10) unsigned default NULL,
`id_category_default` int(10) unsigned default NULL, `id_category_default` int(10) unsigned default NULL,
`id_tax_rules_group` INT(11) UNSIGNED NOT NULL,
`on_sale` tinyint(1) unsigned NOT NULL default '0', `on_sale` tinyint(1) unsigned NOT NULL default '0',
`online_only` tinyint(1) unsigned NOT NULL default '0', `online_only` tinyint(1) unsigned NOT NULL default '0',
`ean13` varchar(13) default NULL, `ean13` varchar(13) default NULL,
@@ -1383,6 +1384,38 @@ CREATE TABLE `PREFIX_product` (
KEY `date_add` (`date_add`) KEY `date_add` (`date_add`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `PREFIX_product_shop` (
`id_product` int(10) unsigned NOT NULL,
`id_shop` int(10) unsigned NOT NULL,
`id_category_default` int(10) unsigned DEFAULT NULL,
`id_tax_rules_group` INT(11) UNSIGNED NOT NULL,
`on_sale` tinyint(1) unsigned NOT NULL DEFAULT '0',
`online_only` tinyint(1) unsigned NOT NULL DEFAULT '0',
`ecotax` decimal(17,6) NOT NULL DEFAULT '0.000000',
`minimal_quantity` int(10) unsigned NOT NULL DEFAULT '1',
`price` decimal(20,6) NOT NULL DEFAULT '0.000000',
`wholesale_price` decimal(20,6) NOT NULL DEFAULT '0.000000',
`unity` varchar(255) DEFAULT NULL,
`unit_price_ratio` decimal(20,6) NOT NULL DEFAULT '0.000000',
`additional_shipping_cost` decimal(20,2) NOT NULL DEFAULT '0.00',
`customizable` tinyint(2) NOT NULL DEFAULT '0',
`text_fields` tinyint(4) NOT NULL DEFAULT '0',
`active` tinyint(1) unsigned NOT NULL DEFAULT '0',
`available_for_order` tinyint(1) NOT NULL DEFAULT '1',
`available_date` date NOT NULL,
`condition` enum('new','used','refurbished') NOT NULL DEFAULT 'new',
`show_price` tinyint(1) NOT NULL DEFAULT '1',
`indexed` tinyint(1) NOT NULL DEFAULT '0',
`visibility` enum('both','catalog','search','none') NOT NULL DEFAULT 'both',
`cache_default_attribute` int(10) unsigned DEFAULT NULL,
`advanced_stock_management` tinyint(1) default '0' NOT NULL,
`date_add` datetime NOT NULL,
`date_upd` datetime NOT NULL,
PRIMARY KEY (`id_product`, `id_shop`),
KEY `id_category_default` (`id_category_default`),
KEY `date_add` (`date_add`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_product_attribute` ( CREATE TABLE `PREFIX_product_attribute` (
`id_product_attribute` int(10) unsigned NOT NULL auto_increment, `id_product_attribute` int(10) unsigned NOT NULL auto_increment,
`id_product` int(10) unsigned NOT NULL, `id_product` int(10) unsigned NOT NULL,
@@ -1408,6 +1441,19 @@ CREATE TABLE `PREFIX_product_attribute` (
KEY `id_product_id_product_attribute` (`id_product_attribute` , `id_product`) KEY `id_product_id_product_attribute` (`id_product_attribute` , `id_product`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_product_attribute_shop` (
`id_product_attribute` int(10) unsigned NOT NULL,
`id_shop` int(10) unsigned NOT NULL,
`wholesale_price` decimal(20,6) NOT NULL default '0.000000',
`price` decimal(20,6) NOT NULL default '0.000000',
`ecotax` decimal(17,6) NOT NULL default '0.00',
`unit_price_impact` decimal(17,2) NOT NULL default '0.00',
`default_on` tinyint(1) unsigned NOT NULL default '0',
`minimal_quantity` int(10) unsigned NOT NULL DEFAULT '1',
`available_date` date NOT NULL,
PRIMARY KEY (`id_product_attribute`, `id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_product_attribute_combination` ( CREATE TABLE `PREFIX_product_attribute_combination` (
`id_attribute` int(10) unsigned NOT NULL, `id_attribute` int(10) unsigned NOT NULL,
`id_product_attribute` int(10) unsigned NOT NULL, `id_product_attribute` int(10) unsigned NOT NULL,
@@ -1620,7 +1666,7 @@ CREATE TABLE `PREFIX_specific_price` (
`id_cart` INT(11) UNSIGNED NOT NULL, `id_cart` INT(11) UNSIGNED NOT NULL,
`id_product` INT UNSIGNED NOT NULL, `id_product` INT UNSIGNED NOT NULL,
`id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_group_shop` INT(11) UNSIGNED NOT NULL, `id_shop_group` INT(11) UNSIGNED NOT NULL,
`id_currency` INT UNSIGNED NOT NULL, `id_currency` INT UNSIGNED NOT NULL,
`id_country` INT UNSIGNED NOT NULL, `id_country` INT UNSIGNED NOT NULL,
`id_group` INT UNSIGNED NOT NULL, `id_group` INT UNSIGNED NOT NULL,
@@ -1866,27 +1912,27 @@ CREATE TABLE `PREFIX_import_match` (
PRIMARY KEY (`id_import_match`) PRIMARY KEY (`id_import_match`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `PREFIX_group_shop` ( CREATE TABLE IF NOT EXISTS `PREFIX_shop_group` (
`id_group_shop` int(11) unsigned NOT NULL AUTO_INCREMENT, `id_shop_group` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET utf8 NOT NULL, `name` varchar(64) CHARACTER SET utf8 NOT NULL,
`share_customer` TINYINT(1) NOT NULL, `share_customer` TINYINT(1) NOT NULL,
`share_order` TINYINT(1) NOT NULL, `share_order` TINYINT(1) NOT NULL,
`share_stock` TINYINT(1) NOT NULL, `share_stock` TINYINT(1) NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1', `active` tinyint(1) NOT NULL DEFAULT '1',
`deleted` tinyint(1) NOT NULL DEFAULT '0', `deleted` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_group_shop`) PRIMARY KEY (`id_shop_group`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `PREFIX_shop` ( CREATE TABLE IF NOT EXISTS `PREFIX_shop` (
`id_shop` int(11) unsigned NOT NULL AUTO_INCREMENT, `id_shop` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_group_shop` int(11) unsigned NOT NULL, `id_shop_group` int(11) unsigned NOT NULL,
`name` varchar(64) CHARACTER SET utf8 NOT NULL, `name` varchar(64) CHARACTER SET utf8 NOT NULL,
`id_category` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_category` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_theme` INT(1) UNSIGNED NOT NULL, `id_theme` INT(1) UNSIGNED NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1', `active` tinyint(1) NOT NULL DEFAULT '1',
`deleted` tinyint(1) NOT NULL DEFAULT '0', `deleted` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_shop`), PRIMARY KEY (`id_shop`),
KEY `id_group_shop` (`id_group_shop`), KEY `id_shop_group` (`id_shop_group`),
KEY `id_category` (`id_category`), KEY `id_category` (`id_category`),
KEY `id_theme` (`id_theme`) KEY `id_theme` (`id_theme`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
@@ -1976,60 +2022,60 @@ CREATE TABLE `PREFIX_image_shop` (
KEY `id_shop` (`id_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_attribute_group_shop` ( CREATE TABLE `PREFIX_attribute_shop` (
`id_attribute` INT(11) UNSIGNED NOT NULL, `id_attribute` INT(11) UNSIGNED NOT NULL,
`id_group_shop` INT(11) UNSIGNED NOT NULL, `id_shop` INT(11) UNSIGNED NOT NULL,
PRIMARY KEY (`id_attribute`, `id_group_shop`), PRIMARY KEY (`id_attribute`, `id_shop`),
KEY `id_group_shop` (`id_group_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_feature_group_shop` ( CREATE TABLE `PREFIX_feature_shop` (
`id_feature` INT(11) UNSIGNED NOT NULL, `id_feature` INT(11) UNSIGNED NOT NULL,
`id_group_shop` INT(11) UNSIGNED NOT NULL , `id_shop` INT(11) UNSIGNED NOT NULL ,
PRIMARY KEY (`id_feature`, `id_group_shop`), PRIMARY KEY (`id_feature`, `id_shop`),
KEY `id_group_shop` (`id_group_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_group_group_shop` ( CREATE TABLE `PREFIX_group_shop` (
`id_group` INT( 11 ) UNSIGNED NOT NULL, `id_group` INT( 11 ) UNSIGNED NOT NULL,
`id_group_shop` INT( 11 ) UNSIGNED NOT NULL, `id_shop` INT( 11 ) UNSIGNED NOT NULL,
PRIMARY KEY (`id_group`, `id_group_shop`), PRIMARY KEY (`id_group`, `id_shop`),
KEY `id_group_shop` (`id_group_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_attribute_group_group_shop` ( CREATE TABLE `PREFIX_attribute_group_shop` (
`id_attribute_group` INT( 11 ) UNSIGNED NOT NULL , `id_attribute_group` INT( 11 ) UNSIGNED NOT NULL ,
`id_group_shop` INT( 11 ) UNSIGNED NOT NULL , `id_shop` INT( 11 ) UNSIGNED NOT NULL ,
PRIMARY KEY (`id_attribute_group`, `id_group_shop`), PRIMARY KEY (`id_attribute_group`, `id_shop`),
KEY `id_group_shop` (`id_group_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_tax_rules_group_group_shop` ( CREATE TABLE `PREFIX_tax_rules_group_shop` (
`id_tax_rules_group` INT( 11 ) UNSIGNED NOT NULL, `id_tax_rules_group` INT( 11 ) UNSIGNED NOT NULL,
`id_group_shop` INT( 11 ) UNSIGNED NOT NULL, `id_shop` INT( 11 ) UNSIGNED NOT NULL,
PRIMARY KEY (`id_tax_rules_group`, `id_group_shop`), PRIMARY KEY (`id_tax_rules_group`, `id_shop`),
KEY `id_group_shop` (`id_group_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_zone_group_shop` ( CREATE TABLE `PREFIX_zone_shop` (
`id_zone` INT( 11 ) UNSIGNED NOT NULL , `id_zone` INT( 11 ) UNSIGNED NOT NULL ,
`id_group_shop` INT( 11 ) UNSIGNED NOT NULL , `id_shop` INT( 11 ) UNSIGNED NOT NULL ,
PRIMARY KEY (`id_zone`, `id_group_shop`), PRIMARY KEY (`id_zone`, `id_shop`),
KEY `id_group_shop` (`id_group_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_manufacturer_group_shop` ( CREATE TABLE `PREFIX_manufacturer_shop` (
`id_manufacturer` INT( 11 ) UNSIGNED NOT NULL , `id_manufacturer` INT( 11 ) UNSIGNED NOT NULL ,
`id_group_shop` INT( 11 ) UNSIGNED NOT NULL , `id_shop` INT( 11 ) UNSIGNED NOT NULL ,
PRIMARY KEY (`id_manufacturer`, `id_group_shop`), PRIMARY KEY (`id_manufacturer`, `id_shop`),
KEY `id_group_shop` (`id_group_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_supplier_group_shop` ( CREATE TABLE `PREFIX_supplier_shop` (
`id_supplier` INT( 11 ) UNSIGNED NOT NULL, `id_supplier` INT( 11 ) UNSIGNED NOT NULL,
`id_group_shop` INT( 11 ) UNSIGNED NOT NULL, `id_shop` INT( 11 ) UNSIGNED NOT NULL,
PRIMARY KEY (`id_supplier`, `id_group_shop`), PRIMARY KEY (`id_supplier`, `id_shop`),
KEY `id_group_shop` (`id_group_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_store_shop` ( CREATE TABLE `PREFIX_store_shop` (
@@ -2039,14 +2085,6 @@ PRIMARY KEY (`id_store`, `id_shop`),
KEY `id_shop` (`id_shop`) KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_product_shop` (
`id_product` INT( 11 ) UNSIGNED NOT NULL,
`id_shop` INT( 11 ) UNSIGNED NOT NULL,
`id_category_default` INT( 11 ) UNSIGNED DEFAULT NULL,
PRIMARY KEY ( `id_shop` , `id_product` ),
KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_module_shop` ( CREATE TABLE `PREFIX_module_shop` (
`id_module` INT( 11 ) UNSIGNED NOT NULL, `id_module` INT( 11 ) UNSIGNED NOT NULL,
`id_shop` INT( 11 ) UNSIGNED NOT NULL, `id_shop` INT( 11 ) UNSIGNED NOT NULL,
@@ -2165,13 +2203,13 @@ CREATE TABLE `PREFIX_stock_available` (
`id_product` INT(11) UNSIGNED NOT NULL, `id_product` INT(11) UNSIGNED NOT NULL,
`id_product_attribute` INT(11) UNSIGNED NOT NULL, `id_product_attribute` INT(11) UNSIGNED NOT NULL,
`id_shop` INT(11) UNSIGNED NOT NULL, `id_shop` INT(11) UNSIGNED NOT NULL,
`id_group_shop` INT(11) UNSIGNED NOT NULL, `id_shop_group` INT(11) UNSIGNED NOT NULL,
`quantity` INT(10) NOT NULL DEFAULT '0', `quantity` INT(10) NOT NULL DEFAULT '0',
`depends_on_stock` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', `depends_on_stock` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`out_of_stock` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0', `out_of_stock` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id_stock_available`), PRIMARY KEY (`id_stock_available`),
KEY `id_shop` (`id_shop`), KEY `id_shop` (`id_shop`),
KEY `id_group_shop` (`id_group_shop`), KEY `id_shop_group` (`id_shop_group`),
KEY `id_product` (`id_product`), KEY `id_product` (`id_product`),
KEY `id_product_attribute` (`id_product_attribute`) KEY `id_product_attribute` (`id_product_attribute`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
@@ -2291,15 +2329,6 @@ CREATE TABLE `PREFIX_product_supplier` (
UNIQUE KEY `id_product` (`id_product`,`id_product_attribute`,`id_supplier`) UNIQUE KEY `id_product` (`id_product`,`id_product_attribute`,`id_supplier`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_supplier_rates` (
`id_product_supplier` INT(11) UNSIGNED NOT NULL,
`id_currency` INT(11) UNSIGNED NOT NULL,
`quantity_min` INT(11) UNSIGNED NOT NULL,
`quantity_max` INT(11) UNSIGNED NOT NULL,
`price_te` DECIMAL(20,6) DEFAULT '0.000000',
PRIMARY KEY (`id_product_supplier`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `PREFIX_accounting_export` ( CREATE TABLE IF NOT EXISTS `PREFIX_accounting_export` (
`id_accounting_export` int(11) NOT NULL AUTO_INCREMENT, `id_accounting_export` int(11) NOT NULL AUTO_INCREMENT,
`begin_to` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `begin_to` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -2410,13 +2439,6 @@ CREATE TABLE `PREFIX_module_preference` (
UNIQUE KEY `employee_module` (`id_employee`, `module`) UNIQUE KEY `employee_module` (`id_employee`, `module`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_product_tax_rules_group_shop` (
`id_product` INT(11) UNSIGNED NOT NULL,
`id_tax_rules_group` INT(11) UNSIGNED NOT NULL,
`id_shop` INT( 11 ) UNSIGNED NOT NULL,
PRIMARY KEY ( `id_product` , `id_tax_rules_group` , `id_shop` )
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
CREATE TABLE `PREFIX_carrier_tax_rules_group_shop` ( CREATE TABLE `PREFIX_carrier_tax_rules_group_shop` (
`id_carrier` int( 11 ) unsigned NOT NULL, `id_carrier` int( 11 ) unsigned NOT NULL,
`id_tax_rules_group` int(11) unsigned NOT NULL, `id_tax_rules_group` int(11) unsigned NOT NULL,
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<entity_configuration> <entity_configuration>
<fields id="name" sql="a.name &lt;&gt; 'PS_LANG_DEFAULT' AND a.id_shop IS NULL AND a.id_group_shop IS NULL" null="1"> <fields id="name" sql="a.name &lt;&gt; 'PS_LANG_DEFAULT' AND a.id_shop IS NULL AND a.id_shop_group IS NULL" null="1">
<field name="name"/> <field name="name"/>
<field name="value"/> <field name="value"/>
</fields> </fields>
+1 -1
View File
@@ -2,7 +2,7 @@
<entity_delivery> <entity_delivery>
<fields class="Delivery" sql="a.id_carrier = 1"> <fields class="Delivery" sql="a.id_carrier = 1">
<field name="id_shop"/> <field name="id_shop"/>
<field name="id_group_shop"/> <field name="id_shop_group"/>
<field name="id_carrier" relation="carrier"/> <field name="id_carrier" relation="carrier"/>
<field name="id_range_price" relation="range_price"/> <field name="id_range_price" relation="range_price"/>
<field name="id_range_weight" relation="range_weight"/> <field name="id_range_weight" relation="range_weight"/>
+1 -1
View File
@@ -295,7 +295,7 @@
<class_name>AdminShop</class_name> <class_name>AdminShop</class_name>
</tab> </tab>
<tab id="Group_Shops" id_parent="Shops" active="1"> <tab id="Group_Shops" id_parent="Shops" active="1">
<class_name>AdminGroupShop</class_name> <class_name>AdminShopGroup</class_name>
</tab> </tab>
<tab id="Shop_Urls" id_parent="Shops" active="1"> <tab id="Shop_Urls" id_parent="Shops" active="1">
<class_name>AdminShopUrl</class_name> <class_name>AdminShopUrl</class_name>
+5 -5
View File
@@ -2,7 +2,7 @@
<entity_delivery> <entity_delivery>
<fields class="Delivery" sql="a.id_carrier &gt; 1" null="1"> <fields class="Delivery" sql="a.id_carrier &gt; 1" null="1">
<field name="id_shop"/> <field name="id_shop"/>
<field name="id_group_shop"/> <field name="id_shop_group"/>
<field name="id_carrier" relation="carrier"/> <field name="id_carrier" relation="carrier"/>
<field name="id_range_price" relation="range_price"/> <field name="id_range_price" relation="range_price"/>
<field name="id_range_weight" relation="range_weight"/> <field name="id_range_weight" relation="range_weight"/>
@@ -10,9 +10,9 @@
<field name="price"/> <field name="price"/>
</fields> </fields>
<entities> <entities>
<delivery id="delivery_1" id_shop="" id_group_shop="" id_carrier="My_carrier" id_range_price="" id_range_weight="range_weight_1" id_zone="Europe" price="5.000000"/> <delivery id="delivery_1" id_shop="" id_shop_group="" id_carrier="My_carrier" id_range_price="" id_range_weight="range_weight_1" id_zone="Europe" price="5.000000"/>
<delivery id="delivery_2" id_shop="" id_group_shop="" id_carrier="My_carrier" id_range_price="" id_range_weight="range_weight_1" id_zone="North_America" price="5.000000"/> <delivery id="delivery_2" id_shop="" id_shop_group="" id_carrier="My_carrier" id_range_price="" id_range_weight="range_weight_1" id_zone="North_America" price="5.000000"/>
<delivery id="delivery_4" id_shop="" id_group_shop="" id_carrier="My_carrier" id_range_price="range_price_1" id_range_weight="" id_zone="Europe" price="5.000000"/> <delivery id="delivery_4" id_shop="" id_shop_group="" id_carrier="My_carrier" id_range_price="range_price_1" id_range_weight="" id_zone="Europe" price="5.000000"/>
<delivery id="delivery_5" id_shop="" id_group_shop="" id_carrier="My_carrier" id_range_price="range_price_1" id_range_weight="" id_zone="North_America" price="5.000000"/> <delivery id="delivery_5" id_shop="" id_shop_group="" id_carrier="My_carrier" id_range_price="range_price_1" id_range_weight="" id_zone="North_America" price="5.000000"/>
</entities> </entities>
</entity_delivery> </entity_delivery>
+2 -2
View File
@@ -2,7 +2,7 @@
<entity_orders> <entity_orders>
<fields primary="id_order" class="Order"> <fields primary="id_order" class="Order">
<field name="reference"/> <field name="reference"/>
<field name="id_group_shop"/> <field name="id_shop_group"/>
<field name="id_shop"/> <field name="id_shop"/>
<field name="id_carrier" relation="carrier"/> <field name="id_carrier" relation="carrier"/>
<field name="id_customer" relation="customer"/> <field name="id_customer" relation="customer"/>
@@ -41,7 +41,7 @@
<field name="valid"/> <field name="valid"/>
</fields> </fields>
<entities> <entities>
<orders id="orders_1" reference="XKBKNABJ" id_group_shop="1" id_shop="1" id_carrier="My_carrier" id_customer="John" id_cart="cart_1" id_currency="1" id_address_delivery="Mon_adresse" id_address_invoice="Mon_adresse" current_state="1" secure_key="47ce86627c1f3c792a80773c5d2deaf8" conversion_rate="1.000000" recyclable="0" gift="0" shipping_number="" total_discounts="0.00" total_discounts_tax_incl="0.00" total_paid="626.37" total_paid_tax_incl="626.37" total_paid_tax_excl="523.72" total_paid_real="626.37" total_products="516.72" total_products_wt="618.00" total_shipping="7.98" total_shipping_tax_incl="8.37" total_shipping_tax_excl="7.00" carrier_tax_rate="19.600" total_wrapping="0.00" total_wrapping_tax_incl="0.00" total_wrapping_tax_excl="0.00" invoice_number="0" delivery_number="0" invoice_date="0000-00-00 00:00:00" delivery_date="0000-00-00 00:00:00" valid="0"> <orders id="orders_1" reference="XKBKNABJ" id_shop_group="1" id_shop="1" id_carrier="My_carrier" id_customer="John" id_cart="cart_1" id_currency="1" id_address_delivery="Mon_adresse" id_address_invoice="Mon_adresse" current_state="1" secure_key="47ce86627c1f3c792a80773c5d2deaf8" conversion_rate="1.000000" recyclable="0" gift="0" shipping_number="" total_discounts="0.00" total_discounts_tax_incl="0.00" total_paid="626.37" total_paid_tax_incl="626.37" total_paid_tax_excl="523.72" total_paid_real="626.37" total_products="516.72" total_products_wt="618.00" total_shipping="7.98" total_shipping_tax_incl="8.37" total_shipping_tax_excl="7.00" carrier_tax_rate="19.600" total_wrapping="0.00" total_wrapping_tax_incl="0.00" total_wrapping_tax_excl="0.00" invoice_number="0" delivery_number="0" invoice_date="0000-00-00 00:00:00" delivery_date="0000-00-00 00:00:00" valid="0">
<payment>Chèque</payment> <payment>Chèque</payment>
<module>cheque</module> <module>cheque</module>
<gift_message/> <gift_message/>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<entity_product_attribute> <entity_product_attribute>
<fields> <fields class="Combination">
<field name="id_product" relation="product"/> <field name="id_product" relation="product"/>
<field name="reference"/> <field name="reference"/>
<field name="supplier_reference"/> <field name="supplier_reference"/>
@@ -1,17 +0,0 @@
<?xml version="1.0"?>
<entity_product_tax_rules_group_shop>
<fields primary="id_product,id_tax_rules_group,id_shop">
<field name="id_product" relation="product"/>
<field name="id_tax_rules_group"/>
<field name="id_shop"/>
</fields>
<entities>
<product_tax_rules_group_shop id="product_tax_rules_group_shop_1_1_1" id_product="iPod_Nano" id_tax_rules_group="1" id_shop="1"/>
<product_tax_rules_group_shop id="product_tax_rules_group_shop_2_1_1" id_product="iPod_shuffle" id_tax_rules_group="1" id_shop="1"/>
<product_tax_rules_group_shop id="product_tax_rules_group_shop_3_1_1" id_product="MacBook_Air" id_tax_rules_group="1" id_shop="1"/>
<product_tax_rules_group_shop id="product_tax_rules_group_shop_4_1_1" id_product="MacBook" id_tax_rules_group="1" id_shop="1"/>
<product_tax_rules_group_shop id="product_tax_rules_group_shop_5_1_1" id_product="iPod_touch" id_tax_rules_group="1" id_shop="1"/>
<product_tax_rules_group_shop id="product_tax_rules_group_shop_6_1_1" id_product="Belkin_Leather_Folio_for_iPod_nano_-_Black_Chocolate" id_tax_rules_group="1" id_shop="1"/>
<product_tax_rules_group_shop id="product_tax_rules_group_shop_7_1_1" id_product="Shure_SE210_Sound-Isolating_Earphones_for_iPod_and_iPhone" id_tax_rules_group="1" id_shop="1"/>
</entities>
</entity_product_tax_rules_group_shop>
@@ -4,7 +4,7 @@
<field name="id_cart" relation="cart"/> <field name="id_cart" relation="cart"/>
<field name="id_product" relation="product"/> <field name="id_product" relation="product"/>
<field name="id_shop"/> <field name="id_shop"/>
<field name="id_group_shop"/> <field name="id_shop_group"/>
<field name="id_currency"/> <field name="id_currency"/>
<field name="id_country" relation="country"/> <field name="id_country" relation="country"/>
<field name="id_group" relation="group"/> <field name="id_group" relation="group"/>
@@ -18,6 +18,6 @@
<field name="to"/> <field name="to"/>
</fields> </fields>
<entities> <entities>
<specific_price id="specific_price_1" id_cart="" id_product="iPod_Nano" id_shop="0" id_group_shop="0" id_currency="0" id_country="" id_group="" id_customer="" id_product_attribute="" price="0.000000" from_quantity="1" reduction="0.050000" reduction_type="percentage" from="0000-00-00 00:00:00" to="0000-00-00 00:00:00"/> <specific_price id="specific_price_1" id_cart="" id_product="iPod_Nano" id_shop="0" id_shop_group="0" id_currency="0" id_country="" id_group="" id_customer="" id_product_attribute="" price="0.000000" from_quantity="1" reduction="0.050000" reduction_type="percentage" from="0000-00-00 00:00:00" to="0000-00-00 00:00:00"/>
</entities> </entities>
</entity_specific_price> </entity_specific_price>
@@ -4,45 +4,45 @@
<field name="id_product" relation="product"/> <field name="id_product" relation="product"/>
<field name="id_product_attribute" relation="product_attribute"/> <field name="id_product_attribute" relation="product_attribute"/>
<field name="id_shop"/> <field name="id_shop"/>
<field name="id_group_shop"/> <field name="id_shop_group"/>
<field name="quantity"/> <field name="quantity"/>
<field name="depends_on_stock"/> <field name="depends_on_stock"/>
<field name="out_of_stock"/> <field name="out_of_stock"/>
</fields> </fields>
<entities> <entities>
<stock_available id="stock_available_2" id_product="iPod_Nano" id_product_attribute="" id_shop="1" id_group_shop="0" quantity="160" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_2" id_product="iPod_Nano" id_product_attribute="" id_shop="1" id_shop_group="0" quantity="160" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_1" id_product="iPod_Nano" id_product_attribute="product_attribute_25" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_1" id_product="iPod_Nano" id_product_attribute="product_attribute_25" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_3" id_product="iPod_Nano" id_product_attribute="product_attribute_26" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_3" id_product="iPod_Nano" id_product_attribute="product_attribute_26" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_4" id_product="iPod_Nano" id_product_attribute="product_attribute_27" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_4" id_product="iPod_Nano" id_product_attribute="product_attribute_27" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_5" id_product="iPod_Nano" id_product_attribute="product_attribute_28" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_5" id_product="iPod_Nano" id_product_attribute="product_attribute_28" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_6" id_product="iPod_Nano" id_product_attribute="product_attribute_29" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_6" id_product="iPod_Nano" id_product_attribute="product_attribute_29" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_7" id_product="iPod_Nano" id_product_attribute="product_attribute_30" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_7" id_product="iPod_Nano" id_product_attribute="product_attribute_30" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_8" id_product="iPod_Nano" id_product_attribute="product_attribute_31" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_8" id_product="iPod_Nano" id_product_attribute="product_attribute_31" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_9" id_product="iPod_Nano" id_product_attribute="product_attribute_32" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_9" id_product="iPod_Nano" id_product_attribute="product_attribute_32" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_10" id_product="iPod_Nano" id_product_attribute="product_attribute_33" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_10" id_product="iPod_Nano" id_product_attribute="product_attribute_33" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_11" id_product="iPod_Nano" id_product_attribute="product_attribute_34" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_11" id_product="iPod_Nano" id_product_attribute="product_attribute_34" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_12" id_product="iPod_Nano" id_product_attribute="product_attribute_35" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_12" id_product="iPod_Nano" id_product_attribute="product_attribute_35" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_13" id_product="iPod_Nano" id_product_attribute="product_attribute_36" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_13" id_product="iPod_Nano" id_product_attribute="product_attribute_36" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_14" id_product="iPod_Nano" id_product_attribute="product_attribute_39" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_14" id_product="iPod_Nano" id_product_attribute="product_attribute_39" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_15" id_product="iPod_Nano" id_product_attribute="product_attribute_40" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_15" id_product="iPod_Nano" id_product_attribute="product_attribute_40" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_16" id_product="iPod_Nano" id_product_attribute="product_attribute_41" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_16" id_product="iPod_Nano" id_product_attribute="product_attribute_41" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_17" id_product="iPod_Nano" id_product_attribute="product_attribute_42" id_shop="1" id_group_shop="0" quantity="10" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_17" id_product="iPod_Nano" id_product_attribute="product_attribute_42" id_shop="1" id_shop_group="0" quantity="10" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_19" id_product="MacBook_Air" id_product_attribute="" id_shop="1" id_group_shop="0" quantity="400" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_19" id_product="MacBook_Air" id_product_attribute="" id_shop="1" id_shop_group="0" quantity="400" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_18" id_product="MacBook_Air" id_product_attribute="product_attribute_12" id_shop="1" id_group_shop="0" quantity="100" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_18" id_product="MacBook_Air" id_product_attribute="product_attribute_12" id_shop="1" id_shop_group="0" quantity="100" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_20" id_product="MacBook_Air" id_product_attribute="product_attribute_13" id_shop="1" id_group_shop="0" quantity="100" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_20" id_product="MacBook_Air" id_product_attribute="product_attribute_13" id_shop="1" id_shop_group="0" quantity="100" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_21" id_product="MacBook_Air" id_product_attribute="product_attribute_14" id_shop="1" id_group_shop="0" quantity="100" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_21" id_product="MacBook_Air" id_product_attribute="product_attribute_14" id_shop="1" id_shop_group="0" quantity="100" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_22" id_product="MacBook_Air" id_product_attribute="product_attribute_15" id_shop="1" id_group_shop="0" quantity="100" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_22" id_product="MacBook_Air" id_product_attribute="product_attribute_15" id_shop="1" id_shop_group="0" quantity="100" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_23" id_product="Belkin_Leather_Folio_for_iPod_nano_-_Black_Chocolate" id_product_attribute="" id_shop="1" id_group_shop="0" quantity="25" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_23" id_product="Belkin_Leather_Folio_for_iPod_nano_-_Black_Chocolate" id_product_attribute="" id_shop="1" id_shop_group="0" quantity="25" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_25" id_product="iPod_shuffle" id_product_attribute="" id_shop="1" id_group_shop="0" quantity="120" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_25" id_product="iPod_shuffle" id_product_attribute="" id_shop="1" id_shop_group="0" quantity="120" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_24" id_product="iPod_shuffle" id_product_attribute="product_attribute_7" id_shop="1" id_group_shop="0" quantity="30" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_24" id_product="iPod_shuffle" id_product_attribute="product_attribute_7" id_shop="1" id_shop_group="0" quantity="30" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_26" id_product="iPod_shuffle" id_product_attribute="product_attribute_8" id_shop="1" id_group_shop="0" quantity="30" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_26" id_product="iPod_shuffle" id_product_attribute="product_attribute_8" id_shop="1" id_shop_group="0" quantity="30" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_27" id_product="iPod_shuffle" id_product_attribute="product_attribute_9" id_shop="1" id_group_shop="0" quantity="30" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_27" id_product="iPod_shuffle" id_product_attribute="product_attribute_9" id_shop="1" id_shop_group="0" quantity="30" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_28" id_product="iPod_shuffle" id_product_attribute="product_attribute_10" id_shop="1" id_group_shop="0" quantity="30" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_28" id_product="iPod_shuffle" id_product_attribute="product_attribute_10" id_shop="1" id_shop_group="0" quantity="30" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_29" id_product="Shure_SE210_Sound-Isolating_Earphones_for_iPod_and_iPhone" id_product_attribute="" id_shop="1" id_group_shop="0" quantity="15" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_29" id_product="Shure_SE210_Sound-Isolating_Earphones_for_iPod_and_iPhone" id_product_attribute="" id_shop="1" id_shop_group="0" quantity="15" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_30" id_product="MacBook" id_product_attribute="" id_shop="1" id_group_shop="0" quantity="75" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_30" id_product="MacBook" id_product_attribute="" id_shop="1" id_shop_group="0" quantity="75" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_32" id_product="iPod_touch" id_product_attribute="" id_shop="1" id_group_shop="0" quantity="120" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_32" id_product="iPod_touch" id_product_attribute="" id_shop="1" id_shop_group="0" quantity="120" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_31" id_product="iPod_touch" id_product_attribute="product_attribute_19" id_shop="1" id_group_shop="0" quantity="40" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_31" id_product="iPod_touch" id_product_attribute="product_attribute_19" id_shop="1" id_shop_group="0" quantity="40" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_33" id_product="iPod_touch" id_product_attribute="product_attribute_22" id_shop="1" id_group_shop="0" quantity="40" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_33" id_product="iPod_touch" id_product_attribute="product_attribute_22" id_shop="1" id_shop_group="0" quantity="40" depends_on_stock="0" out_of_stock="0"/>
<stock_available id="stock_available_34" id_product="iPod_touch" id_product_attribute="product_attribute_23" id_shop="1" id_group_shop="0" quantity="40" depends_on_stock="0" out_of_stock="0"/> <stock_available id="stock_available_34" id_product="iPod_touch" id_product_attribute="product_attribute_23" id_shop="1" id_shop_group="0" quantity="40" depends_on_stock="0" out_of_stock="0"/>
</entities> </entities>
</entity_stock_available> </entity_stock_available>
+5 -5
View File
@@ -223,10 +223,10 @@ class InstallModelInstall extends InstallAbstractModel
public function createShop($shop_name) public function createShop($shop_name)
{ {
// Create default group shop // Create default group shop
$group_shop = new GroupShop(); $shop_group = new ShopGroup();
$group_shop->name = 'Default'; $shop_group->name = 'Default';
$group_shop->active = true; $shop_group->active = true;
if (!$group_shop->add()) if (!$shop_group->add())
{ {
$this->setError($this->language->l('Cannot create group shop')); $this->setError($this->language->l('Cannot create group shop'));
return false; return false;
@@ -235,7 +235,7 @@ class InstallModelInstall extends InstallAbstractModel
// Create default shop // Create default shop
$shop = new Shop(); $shop = new Shop();
$shop->active = true; $shop->active = true;
$shop->id_group_shop = $group_shop->id; $shop->id_shop_group = $shop_group->id;
$shop->id_category = 2; $shop->id_category = 2;
$shop->id_theme = 1; $shop->id_theme = 1;
$shop->name = $shop_name; $shop->name = $shop_name;
@@ -54,17 +54,17 @@ function create_multistore()
VALUES(1, \''.pSQL($shop_domain).'\', \''.pSQL($shop_domain_ssl).'\', \''.pSQL($_PS_DIRECTORY_).'\', \'\', 1, 1)'); VALUES(1, \''.pSQL($shop_domain).'\', \''.pSQL($shop_domain_ssl).'\', \''.pSQL($_PS_DIRECTORY_).'\', \'\', 1, 1)');
// Stock conversion // Stock conversion
$sql = 'INSERT INTO `'._DB_PREFIX_.'.stock` (`id_product`, `id_product_attribute`, `id_group_shop`, `id_shop`, `quantity`) $sql = 'INSERT INTO `'._DB_PREFIX_.'.stock` (`id_product`, `id_product_attribute`, `id_shop_group`, `id_shop`, `quantity`)
VALUES (SELECT `p.id_product`, 0, 1, 1, `p.quantity` FROM `'._DB_PREFIX_.'.product` p);'; VALUES (SELECT `p.id_product`, 0, 1, 1, `p.quantity` FROM `'._DB_PREFIX_.'.product` p);';
$res &= Db::getInstance()->execute($sql); $res &= Db::getInstance()->execute($sql);
$sql = 'INSERT INTO `'._DB_PREFIX_.'.stock` (`id_product`, `id_product_attribute`, `id_group_shop`, `id_shop`, `quantity`) $sql = 'INSERT INTO `'._DB_PREFIX_.'.stock` (`id_product`, `id_product_attribute`, `id_shop_group`, `id_shop`, `quantity`)
VALUES (SELECT `id_product`, `id_product_attribute`, 1, 1, `quantity` FROM `'._DB_PREFIX_.'product_attribute` p);'; VALUES (SELECT `id_product`, `id_product_attribute`, 1, 1, `quantity` FROM `'._DB_PREFIX_.'product_attribute` p);';
$res &= Db::getInstance()->execute($sql); $res &= Db::getInstance()->execute($sql);
// Add admin tabs // Add admin tabs
$shopTabId = add_new_tab('AdminShop', 'it:Shops|es:Shops|fr:Boutiques|de:Shops|en:Shops', 0, true); $shopTabId = add_new_tab('AdminShop', 'it:Shops|es:Shops|fr:Boutiques|de:Shops|en:Shops', 0, true);
add_new_tab('AdminGroupShop', 'it:Group Shops|es:Group Shops|fr:Groupes de boutique|de:Group Shops|en:Group Shops', $shopTabId); add_new_tab('AdminShopGroup', 'it:Group Shops|es:Group Shops|fr:Groupes de boutique|de:Group Shops|en:Group Shops', $shopTabId);
add_new_tab('AdminShopUrl', 'it:Shop Urls|es:Shop Urls|fr:URLs de boutique|de:Shop Urls|en:Shop Urls', $shopTabId); add_new_tab('AdminShopUrl', 'it:Shop Urls|es:Shop Urls|fr:URLs de boutique|de:Shop Urls|en:Shop Urls', $shopTabId);
return $res; return $res;
@@ -32,7 +32,7 @@ function module_blockwishlist_multishop()
{ {
$res = Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'wishlist` $res = Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'wishlist`
ADD `id_shop` INTEGER NOT NULL default \'1\' AFTER `counter`, ADD `id_shop` INTEGER NOT NULL default \'1\' AFTER `counter`,
ADD `id_group_shop` INTEGER NOT NULL default \'1\' AFTER `id_shop`'); ADD `id_shop_group` INTEGER NOT NULL default \'1\' AFTER `id_shop`');
return $res; return $res;
} }
@@ -28,7 +28,7 @@ function set_stock_available()
//add stock available for attributes //add stock available for attributes
Db::getInstance()->execute(' Db::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'stock_available` INSERT INTO `'._DB_PREFIX_.'stock_available`
(`id_product`, `id_product_attribute`, `id_shop`, `id_group_shop`, `quantity`, `depends_on_stock`, `out_of_stock`) (`id_product`, `id_product_attribute`, `id_shop`, `id_shop_group`, `quantity`, `depends_on_stock`, `out_of_stock`)
VALUES VALUES
("'.(int)$row['id_product'].'", "'.(int)$attribute['id_product_attribute'].'", "1", "0", "'.(int)$attribute['quantity'].'", "0", "'.(int)$row['out_of_stock'].'") ("'.(int)$row['id_product'].'", "'.(int)$attribute['id_product_attribute'].'", "1", "0", "'.(int)$attribute['quantity'].'", "0", "'.(int)$row['out_of_stock'].'")
'); ');
@@ -43,7 +43,7 @@ function set_stock_available()
//Add stock available for product //Add stock available for product
Db::getInstance()->execute(' Db::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'stock_available` INSERT INTO `'._DB_PREFIX_.'stock_available`
(`id_product`, `id_product_attribute`, `id_shop`, `id_group_shop`, `quantity`, `depends_on_stock`, `out_of_stock`) (`id_product`, `id_product_attribute`, `id_shop`, `id_shop_group`, `quantity`, `depends_on_stock`, `out_of_stock`)
VALUES VALUES
("'.(int)$row['id_product'].'", "0", "1", "0", "'.(int)$quantity.'", "0", "'.(int)$row['out_of_stock'].'") ("'.(int)$row['id_product'].'", "0", "1", "0", "'.(int)$quantity.'", "0", "'.(int)$row['out_of_stock'].'")
'); ');
+10 -10
View File
@@ -1,38 +1,38 @@
SET NAMES 'utf8'; SET NAMES 'utf8';
CREATE TABLE IF NOT EXISTS `PREFIX_group_shop` ( CREATE TABLE IF NOT EXISTS `PREFIX_group_shop` (
`id_group_shop` int(11) unsigned NOT NULL AUTO_INCREMENT, `id_shop_group` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET utf8 NOT NULL, `name` varchar(64) CHARACTER SET utf8 NOT NULL,
`share_customer` TINYINT(1) NOT NULL, `share_customer` TINYINT(1) NOT NULL,
`share_order` TINYINT(1) NOT NULL, `share_order` TINYINT(1) NOT NULL,
`share_stock` TINYINT(1) NOT NULL, `share_stock` TINYINT(1) NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1', `active` tinyint(1) NOT NULL DEFAULT '1',
`deleted` tinyint(1) NOT NULL DEFAULT '0', `deleted` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_group_shop`) PRIMARY KEY (`id_shop_group`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
INSERT INTO `PREFIX_group_shop` (`id_group_shop`, `name`, `active`, `deleted`, `share_stock`, `share_customer`, `share_order`) VALUES (1, 'Default', 1, 0, 0, 0, 0); INSERT INTO `PREFIX_group_shop` (`id_shop_group`, `name`, `active`, `deleted`, `share_stock`, `share_customer`, `share_order`) VALUES (1, 'Default', 1, 0, 0, 0, 0);
CREATE TABLE IF NOT EXISTS `PREFIX_shop` ( CREATE TABLE IF NOT EXISTS `PREFIX_shop` (
`id_shop` int(11) unsigned NOT NULL AUTO_INCREMENT, `id_shop` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_group_shop` int(11) unsigned NOT NULL, `id_shop_group` int(11) unsigned NOT NULL,
`name` varchar(64) CHARACTER SET utf8 NOT NULL, `name` varchar(64) CHARACTER SET utf8 NOT NULL,
`id_category` INT(11) UNSIGNED NOT NULL DEFAULT '1', `id_category` INT(11) UNSIGNED NOT NULL DEFAULT '1',
`id_theme` INT(1) UNSIGNED NOT NULL, `id_theme` INT(1) UNSIGNED NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1', `active` tinyint(1) NOT NULL DEFAULT '1',
`deleted` tinyint(1) NOT NULL DEFAULT '0', `deleted` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_shop`), PRIMARY KEY (`id_shop`),
KEY `id_group_shop` (`id_group_shop`), KEY `id_shop_group` (`id_shop_group`),
KEY `id_category` (`id_category`), KEY `id_category` (`id_category`),
KEY `id_theme` (`id_theme`) KEY `id_theme` (`id_theme`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
INSERT INTO `PREFIX_shop` INSERT INTO `PREFIX_shop`
(`id_shop`, `id_group_shop`, `name`, `id_category`, `id_theme`, `active`, `deleted`) (`id_shop`, `id_shop_group`, `name`, `id_category`, `id_theme`, `active`, `deleted`)
VALUES VALUES
(1, 1, (SELECT value FROM `PREFIX_configuration` WHERE name = 'PS_SHOP_NAME'), 1, 1, 1, 0); (1, 1, (SELECT value FROM `PREFIX_configuration` WHERE name = 'PS_SHOP_NAME'), 1, 1, 1, 0);
ALTER TABLE `PREFIX_configuration` ADD `id_group_shop` INT(11) UNSIGNED DEFAULT NULL AFTER `id_configuration` , ADD `id_shop` INT(11) UNSIGNED DEFAULT NULL AFTER `id_group_shop`; ALTER TABLE `PREFIX_configuration` ADD `id_shop_group` INT(11) UNSIGNED DEFAULT NULL AFTER `id_configuration` , ADD `id_shop` INT(11) UNSIGNED DEFAULT NULL AFTER `id_shop_group`;
ALTER TABLE `PREFIX_configuration` DROP INDEX `name` , ADD INDEX `name` ( `name` ) ; ALTER TABLE `PREFIX_configuration` DROP INDEX `name` , ADD INDEX `name` ( `name` ) ;
ALTER TABLE `PREFIX_configuration` ADD INDEX (`id_group_shop`); ALTER TABLE `PREFIX_configuration` ADD INDEX (`id_shop_group`);
ALTER TABLE `PREFIX_configuration` ADD INDEX (`id_shop`); ALTER TABLE `PREFIX_configuration` ADD INDEX (`id_shop`);
INSERT INTO `PREFIX_configuration` (`id_configuration`, `name`, `value`, `date_add`, `date_upd`) VALUES (NULL, 'PS_SHOP_DEFAULT', '1', NOW(), NOW()); INSERT INTO `PREFIX_configuration` (`id_configuration`, `name`, `value`, `date_add`, `date_upd`) VALUES (NULL, 'PS_SHOP_DEFAULT', '1', NOW(), NOW());
@@ -123,9 +123,9 @@ CREATE TABLE `PREFIX_currency_shop` (
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8; ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
INSERT INTO `PREFIX_currency_shop` (id_shop, id_currency) (SELECT 1, id_currency FROM PREFIX_currency); INSERT INTO `PREFIX_currency_shop` (id_shop, id_currency) (SELECT 1, id_currency FROM PREFIX_currency);
ALTER TABLE `PREFIX_cart` ADD `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_cart` , ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_group_shop`, ADD INDEX `id_group_shop` (`id_group_shop`), ADD INDEX `id_shop` (`id_shop`); ALTER TABLE `PREFIX_cart` ADD `id_shop_group` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_cart` , ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_shop_group`, ADD INDEX `id_shop_group` (`id_shop_group`), ADD INDEX `id_shop` (`id_shop`);
ALTER TABLE `PREFIX_customer` ADD `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_customer` , ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_group_shop`, ADD INDEX `id_group_shop` (`id_group_shop`), ADD INDEX `id_shop` (`id_shop`); ALTER TABLE `PREFIX_customer` ADD `id_shop_group` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_customer` , ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_shop_group`, ADD INDEX `id_shop_group` (`id_group_shop`), ADD INDEX `id_shop` (`id_shop`);
ALTER TABLE `PREFIX_orders` ADD `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_order` , ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_group_shop`, ADD INDEX `id_group_shop` (`id_group_shop`), ADD INDEX `id_shop` (`id_shop`); ALTER TABLE `PREFIX_orders` ADD `id_group_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_order` , ADD `id_shop` INT(11) UNSIGNED NOT NULL DEFAULT '1' AFTER `id_group_shop`, ADD INDEX `id_group_shop` (`id_group_shop`), ADD INDEX `id_shop` (`id_shop`);
+138 -1
View File
@@ -2,4 +2,141 @@
ALTER TABLE `PREFIX_supplier` DROP `id_address`; ALTER TABLE `PREFIX_supplier` DROP `id_address`;
UPDATE `PREFIX_meta` SET `page` = 'contact' WHERE `page` = 'contact-form'; UPDATE `PREFIX_meta` SET `page` = 'contact' WHERE `page` = 'contact-form';
RENAME TABLE `PREFIX_group_shop` TO `PREFIX_shop_group`;
ALTER TABLE `PREFIX_shop_group` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE `PREFIX_shop` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_stock_available` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_cart` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_configuration` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_connections` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_customer` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_delivery` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_orders` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_page_viewed` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_specific_price` CHANGE `id_group_shop` `id_shop_group` INT( 11 ) UNSIGNED NOT NULL;
ALTER TABLE `PREFIX_product` ADD `id_tax_rules_group` int(10) unsigned NOT NULL;
CREATE TABLE IF NOT EXISTS `PREFIX_product_shop_TMP` (
`id_product` int(10) unsigned NOT NULL,
`id_shop` int(10) unsigned NOT NULL,
`id_category_default` int(10) unsigned DEFAULT NULL,
`id_tax_rules_group` INT(11) UNSIGNED NOT NULL,
`on_sale` tinyint(1) unsigned NOT NULL DEFAULT '0',
`online_only` tinyint(1) unsigned NOT NULL DEFAULT '0',
`ecotax` decimal(17,6) NOT NULL DEFAULT '0.000000',
`minimal_quantity` int(10) unsigned NOT NULL DEFAULT '1',
`price` decimal(20,6) NOT NULL DEFAULT '0.000000',
`wholesale_price` decimal(20,6) NOT NULL DEFAULT '0.000000',
`unity` varchar(255) DEFAULT NULL,
`unit_price_ratio` decimal(20,6) NOT NULL DEFAULT '0.000000',
`additional_shipping_cost` decimal(20,2) NOT NULL DEFAULT '0.00',
`customizable` tinyint(2) NOT NULL DEFAULT '0',
`text_fields` tinyint(4) NOT NULL DEFAULT '0',
`active` tinyint(1) unsigned NOT NULL DEFAULT '0',
`available_for_order` tinyint(1) NOT NULL DEFAULT '1',
`available_date` date NOT NULL,
`condition` enum('new','used','refurbished') NOT NULL DEFAULT 'new',
`show_price` tinyint(1) NOT NULL DEFAULT '1',
`indexed` tinyint(1) NOT NULL DEFAULT '0',
`visibility` enum('both','catalog','search','none') NOT NULL DEFAULT 'both',
`cache_default_attribute` int(10) unsigned DEFAULT NULL,
`advanced_stock_management` tinyint(1) default '0' NOT NULL,
`date_add` datetime NOT NULL,
`date_upd` datetime NOT NULL,
PRIMARY KEY (`id_product`, `id_shop`),
KEY `id_category_default` (`id_category_default`),
KEY `date_add` (`date_add`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
INSERT INTO `PREFIX_product_shop_TMP` (`id_product`, `id_shop`, `id_category_default`, `on_sale`, `online_only`, `ecotax`, `minimal_quantity`, `price`, `wholesale_price`, `unity`, `unit_price_ratio`, `additional_shipping_cost`, `customizable`, `text_fields`, `active`, `available_for_order`, `available_date`, `condition`, `show_price`, `indexed`, `visibility`, `cache_default_attribute`, `advanced_stock_management`, `date_add`, `date_upd`, `id_tax_rules_group`)
(SELECT a.`id_product`, a.`id_shop`, b.`id_category_default`, b.`on_sale`, b.`online_only`, b.`ecotax`, b.`minimal_quantity`, b.`price`, b.`wholesale_price`, b.`unity`, b.`unit_price_ratio`, b.`additional_shipping_cost`, b.`customizable`, b.`text_fields`, b.`active`, b.`available_for_order`, b.`available_date`, b.`condition`, b.`show_price`, b.`indexed`, b.`visibility`, b.`cache_default_attribute`, b.`advanced_stock_management`, b.`date_add`, b.`date_upd`, c.`id_tax_rules_group` FROM `PREFIX_product_shop` a INNER JOIN `PREFIX_product` b ON a.id_product = b.id_product LEFT JOIN `PREFIX_product_tax_rules_group_shop` c ON b.id_product = c.id_product AND a.id_shop = c.id_shop);
DROP TABLE `PREFIX_product_shop`;
DROP TABLE `PREFIX_product_tax_rules_group_shop`;
RENAME TABLE `PREFIX_product_shop_TMP` TO `PREFIX_product_shop`;
CREATE TABLE `PREFIX_product_attribute_shop` (
`id_product_attribute` int(10) unsigned NOT NULL,
`id_shop` int(10) unsigned NOT NULL,
`wholesale_price` decimal(20,6) NOT NULL default '0.000000',
`price` decimal(20,6) NOT NULL default '0.000000',
`ecotax` decimal(17,6) NOT NULL default '0.00',
`unit_price_impact` decimal(17,2) NOT NULL default '0.00',
`default_on` tinyint(1) unsigned NOT NULL default '0',
`minimal_quantity` int(10) unsigned NOT NULL DEFAULT '1',
`available_date` date NOT NULL,
PRIMARY KEY (`id_product_attribute`, `id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
INSERT INTO `PREFIX_product_attribute_shop` (`id_product_attribute`, `id_shop`, `wholesale_price`, `price`, `ecotax`, `unit_price_impact`, `default_on`, `minimal_quantity`, `available_date`) (SELECT `id_product_attribute`, (SELECT `value` FROM `PREFIX_configuration` WHERE `name` = 'PS_SHOP_DEFAULT'), `wholesale_price`, `price`, `ecotax`, `unit_price_impact`, `default_on`, `minimal_quantity`, `available_date` FROM `PREFIX_product_attribute`);
INSERT INTO `PREFIX_attribute_shop` (`id_attribute`, `id_shop`) (SELECT a.id_attribute, c.id_shop FROM PREFIX_attribute_group_shop a LEFT JOIN PREFIX_shop_group b ON a.id_group_shop = b.id_shop_group INNER JOIN PREFIX_shop c ON b.id_shop_group = c.id_shop_group);
CREATE TABLE `PREFIX_attribute_shop` (
`id_attribute` INT(11) UNSIGNED NOT NULL,
`id_shop` INT(11) UNSIGNED NOT NULL,
PRIMARY KEY (`id_attribute`, `id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
DROP TABLE `PREFIX_attribute_group_shop`;
INSERT INTO `PREFIX_feature_shop` (`id_feature`, `id_shop`) (SELECT a.id_feature, c.id_shop FROM PREFIX_feature_group_shop a LEFT JOIN PREFIX_shop_group b ON a.id_group_shop = b.id_shop_group INNER JOIN PREFIX_shop c ON b.id_shop_group = c.id_shop_group);
CREATE TABLE `PREFIX_feature_shop` (
`id_feature` INT(11) UNSIGNED NOT NULL,
`id_shop` INT(11) UNSIGNED NOT NULL ,
PRIMARY KEY (`id_feature`, `id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
DROP TABLE `PREFIX_feature_group_shop`;
INSERT INTO `PREFIX_group_shop` (`id_group`, `id_shop`) (SELECT a.id_group, c.id_shop FROM PREFIX_group_group_shop a LEFT JOIN PREFIX_shop_group b ON a.id_group_shop = b.id_shop_group INNER JOIN PREFIX_shop c ON b.id_shop_group = c.id_shop_group);
CREATE TABLE `PREFIX_group_shop` (
`id_group` INT( 11 ) UNSIGNED NOT NULL,
`id_shop` INT( 11 ) UNSIGNED NOT NULL,
PRIMARY KEY (`id_group`, `id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
DROP TABLE `PREFIX_group_group_shop`;
INSERT INTO `PREFIX_attribute_group_shop` (`id_attribute_group`, `id_shop`) (SELECT a.id_attribute_group, c.id_shop FROM PREFIX_attribute_group_group_shop a LEFT JOIN PREFIX_shop_group b ON a.id_group_shop = b.id_shop_group INNER JOIN PREFIX_shop c ON b.id_shop_group = c.id_shop_group);
CREATE TABLE `PREFIX_attribute_group_shop` (
`id_attribute_group` INT( 11 ) UNSIGNED NOT NULL ,
`id_shop` INT( 11 ) UNSIGNED NOT NULL ,
PRIMARY KEY (`id_attribute_group`, `id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
DROP TABLE `PREFIX_attribute_group_group_shop`;
INSERT INTO `PREFIX_tax_rules_group_shop` (`id_tax_rules_group`, `id_shop`) (SELECT a.id_tax_rules_group, c.id_shop FROM PREFIX_tax_rules_group_group_shop a LEFT JOIN PREFIX_shop_group b ON a.id_group_shop = b.id_shop_group INNER JOIN PREFIX_shop c ON b.id_shop_group = c.id_shop_group);
CREATE TABLE `PREFIX_tax_rules_group_shop` (
`id_tax_rules_group` INT( 11 ) UNSIGNED NOT NULL,
`id_shop` INT( 11 ) UNSIGNED NOT NULL,
PRIMARY KEY (`id_tax_rules_group`, `id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
DROP TABLE `PREFIX_tax_rules_group_group_shop`;
INSERT INTO `PREFIX_zone_shop` (`id_zone`, `id_shop`) (SELECT a.id_zone, c.id_shop FROM PREFIX_zone_group_shop a LEFT JOIN PREFIX_shop_group b ON a.id_group_shop = b.id_shop_group INNER JOIN PREFIX_shop c ON b.id_shop_group = c.id_shop_group);
CREATE TABLE `PREFIX_zone_shop` (
`id_zone` INT( 11 ) UNSIGNED NOT NULL ,
`id_shop` INT( 11 ) UNSIGNED NOT NULL ,
PRIMARY KEY (`id_zone`, `id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
DROP TABLE `PREFIX_zone_group_shop`;
INSERT INTO `PREFIX_manufacturer_shop` (`id_manufacturer`, `id_shop`) (SELECT a.id_manufacturer, c.id_shop FROM PREFIX_manufacturer_group_shop a LEFT JOIN PREFIX_shop_group b ON a.id_group_shop = b.id_shop_group INNER JOIN PREFIX_shop c ON b.id_shop_group = c.id_shop_group);
CREATE TABLE `PREFIX_manufacturer_shop` (
`id_manufacturer` INT( 11 ) UNSIGNED NOT NULL ,
`id_shop` INT( 11 ) UNSIGNED NOT NULL ,
PRIMARY KEY (`id_manufacturer`, `id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
DROP TABLE `PREFIX_manufacturer_group_shop`;
INSERT INTO `PREFIX_supplier_shop` (`id_supplier`, `id_shop`) (SELECT a.id_supplier, c.id_shop FROM PREFIX_supplier_group_shop a LEFT JOIN PREFIX_shop_group b ON a.id_group_shop = b.id_shop_group INNER JOIN PREFIX_shop c ON b.id_shop_group = c.id_shop_group);
CREATE TABLE `PREFIX_supplier_shop` (
`id_supplier` INT( 11 ) UNSIGNED NOT NULL,
`id_shop` INT( 11 ) UNSIGNED NOT NULL,
PRIMARY KEY (`id_supplier`, `id_shop`),
KEY `id_shop` (`id_shop`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
DROP TABLE `PREFIX_supplier_group_shop`;

Some files were not shown because too many files have changed in this diff Show More