[*] BO : #PSFV-94 - added AdminAttributeGeneratorController

This commit is contained in:
tDidierjean
2011-11-08 10:09:57 +00:00
parent 499658e005
commit da02f290b7
10 changed files with 401 additions and 342 deletions
-319
View File
@@ -1,319 +0,0 @@
<?php
/*
* 2007-2011 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-2011 PrestaShop SA
* @version Release: $Revision: 6844 $
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
@ini_set('max_execution_time', 3600);
include_once(_PS_ADMIN_DIR_.'/../classes/AdminTab.php');
class AdminAttributeGenerator extends AdminTab
{
private $combinations = array();
private $product;
private function addAttribute($arr, $price = 0, $weight = 0)
{
foreach ($arr AS $attr)
{
$price += (float)($_POST['price_impact_'.(int)($attr)]);
$weight += (float)($_POST['weight_impact'][(int)($attr)]);
}
if ($this->product->id)
{
return (array(
'id_product' => (int)($this->product->id),
'price' => (float)($price),
'weight' => (float)($weight),
'ecotax' => 0,
'quantity' => (int)($_POST['quantity']),
'reference' => pSQL($_POST['reference']),
'default_on' => 0));
}
return array();
}
static private function createCombinations($list)
{
if (sizeof($list) <= 1)
return sizeof($list) ? array_map(create_function('$v', 'return (array($v));'), $list[0]) : $list;
$res = array();
$first = array_pop($list);
foreach ($first AS $attribute)
{
$tab = self::createCombinations($list);
foreach ($tab AS $toAdd)
$res[] = is_array($toAdd) ? array_merge($toAdd, array($attribute)) : array($toAdd, $attribute);
}
return $res;
}
public function postProcess()
{
$this->product = new Product((int)(Tools::getValue('id_product')));
if (isset($_POST['generate']))
{
if (!is_array(Tools::getValue('options')))
$this->_errors[] = Tools::displayError('Please choose at least 1 attribute.');
else
{
$tab = array_values($_POST['options']);
if (sizeof($tab) AND Validate::isLoadedObject($this->product))
{
self::setAttributesImpacts($this->product->id, $tab);
$this->combinations = array_values(self::createCombinations($tab));
$values = array_values(array_map(array($this, 'addAttribute'), $this->combinations));
$this->product->deleteProductAttributes();
$res = $this->product->addProductAttributeMultiple($values);
$this->product->addAttributeCombinationMultiple($res, $this->combinations);
$this->product->updateQuantityProductWithAttributeQuantity();
}
else
$this->_errors[] = Tools::displayError('Unable to initialize parameters, combination is missing or object cannot be loaded.');
}
}
elseif (isset($_POST['back']))
Tools::redirectAdmin(self::$currentIndex.'&id_product='.(int)(Tools::getValue('id_product')).'&id_category='.(int)(Tools::getValue('id_category')).'&addproduct'.'&tabs=3&token='.Tools::getValue('token'));
parent::postProcess();
}
private static function displayAndReturnAttributeJs()
{
$attributes = Attribute::getAttributes(Context::getContext()->language->id, true);
$attributeJs = array();
foreach ($attributes AS $k => $attribute)
$attributeJs[$attribute['id_attribute_group']][$attribute['id_attribute']] = $attribute['name'];
echo '
<script type="text/javascript">
var attrs = new Array();
attrs[0] = new Array(0, \'---\');';
foreach ($attributeJs AS $idgrp => $group)
{
echo '
attrs['.$idgrp.'] = new Array(0, \'---\' ';
foreach ($group AS $idattr => $attrname)
echo ', '.$idattr.', \''.addslashes(($attrname)).'\'';
echo ');';
}
echo '
</script>';
return $attributeJs;
}
private function displayGroupSelect($attributeJs, $attributesGroups)
{
echo ' <div>
<select multiple name="attributes[]" id="attribute_group" style="width: 200px; height: 350px; margin-bottom: 10px;">';
foreach ($attributesGroups AS $k => $attributeGroup)
{
$idGroup = (int)$attributeGroup['id_attribute_group'];
if (isset($attributeJs[$idGroup]))
{
echo ' <optgroup name="'.$idGroup.'" id="'.$idGroup.'" label="'.htmlspecialchars(stripslashes($attributeGroup['name'])).'">';
foreach ($attributeJs[$idGroup] AS $k => $v)
echo ' <option name="'.$k.'" id="attr_'.$k.'" value="'.htmlspecialchars($v, ENT_QUOTES).'" title="'.htmlspecialchars($v, ENT_QUOTES).'"">'.$v.'</option>';
echo ' </optgroup>';
}
}
echo ' </select>
</div>';
}
private static function setAttributesImpacts($id_product, $tab)
{
$attributes = array();
foreach ($tab AS $group)
foreach ($group AS $attribute)
$attributes[] = '('.(int)($id_product).', '.(int)($attribute).', '.(float)($_POST['price_impact_'.(int)($attribute)]).', '.(float)($_POST['weight_impact'][(int)($attribute)]).')';
return Db::getInstance()->execute(
'INSERT INTO `'._DB_PREFIX_.'attribute_impact` (`id_product`, `id_attribute`, `price`, `weight`)
VALUES '.implode(',', $attributes).'
ON DUPLICATE KEY UPDATE `price`=VALUES(price), `weight`=VALUES(weight)'
);
}
private static function getAttributesImpacts($id_product)
{
$tab = array();
$result = Db::getInstance()->executeS(
'SELECT ai.`id_attribute`, ai.`price`, ai.`weight`
FROM `'._DB_PREFIX_.'attribute_impact` ai
WHERE ai.`id_product` = '.(int)($id_product));
if (!$result)
return array();
foreach ($result AS $impact)
{
$tab[$impact['id_attribute']]['price'] = (float)($impact['price']);
$tab[$impact['id_attribute']]['weight'] = (float)($impact['weight']);
}
return $tab;
}
private function displayGroupeTable($attributeJs, $attributesGroups)
{
$combinationsGroups = $this->product->getAttributesGroups($this->context->language->id);
$attributes = array();
$impacts = self::getAttributesImpacts($this->product->id);
foreach ($combinationsGroups AS &$combination)
{
$target = &$attributes[$combination['id_attribute_group']][$combination['id_attribute']];
$target = $combination;
if (isset($impacts[$combination['id_attribute']]))
{
$target['price'] = $impacts[$combination['id_attribute']]['price'];
$target['weight'] = $impacts[$combination['id_attribute']]['weight'];
}
}
foreach ($attributesGroups AS $k => $attributeGroup)
{
$idGroup = $attributeGroup['id_attribute_group'];
if (isset($attributeJs[$idGroup]))
{
echo '
<br class="clear"/>
<table class="table" cellpadding="0" cellspacing="0" align="left" style="margin-bottom: 10px; display: none;">
<thead>
<tr>
<th id="tab_h1" style="width: 150px">'.htmlspecialchars(stripslashes($attributeGroup['name'])).'</th>
<th id="tab_h2" style="width: 350px" colspan="2">'.$this->l('Price impact').' ('.$this->context->currency->sign.')'.'</th>
<th style="width: 150px">'.$this->l('Weight impact').' ('.Configuration::get('PS_WEIGHT_UNIT').')'.'</th>
</tr>
</thead>
<tbody id="table_'.$idGroup.'" name="result_table">
</tbody>
</table>';
if (isset($attributes[$idGroup]))
foreach ($attributes[$idGroup] AS $k => $attribute)
echo '<script type="text/javascript">$(\'#table_'.$idGroup.'\').append(create_attribute_row('.$k.', '.$idGroup.', \''.addslashes($attribute['attribute_name']).'\', '.$attribute['price'].', '.$attribute['weight'].'));toggle(getE(\'table_\' + '.$idGroup.').parentNode, true);</script>';
}
}
}
public function displayForm($isMainTab = true)
{
if (!Combination::isFeatureActive())
{
$this->displayWarning($this->l('This feature has been disabled, you can active this feature at this page:').' <a href="index.php?tab=AdminPerformance&token='.Tools::getAdminTokenLite('AdminPerformance').'#featuresDetachables">'.$this->l('Performances').'</a>');
return;
}
parent::displayForm();
$jsAttributes = self::displayAndReturnAttributeJs();
$attributesGroups = AttributeGroup::getAttributesGroups($this->context->language->id);
$this->product = new Product((int)(Tools::getValue('id_product')));
// JS Init
echo
'<script type="text/javascript">
i18n_tax_exc = "'.$this->l('Tax Excl.:').'";
i18n_tax_inc = "'.$this->l('Tax Incl.:').'";
var product_tax = "'.$this->product->getTaxesRate().'";
function calcPrice(element, element_has_tax)
{
name = element.attr("name");
var element_price = element.val().replace(/,/g, ".");
var other_element_price = "0";
if (!isNaN(element_price) && element_price > 0)
{
if (element_has_tax)
other_element_price = parseFloat(element_price / ((product_tax / 100) + 1));
else
other_element_price = ps_round(parseFloat(element_price * ((product_tax / 100) + 1)), 2);
}
$("#related_to_"+name).val(other_element_price);
}
$(document).ready(function()
{
$(".price_impact").each(function()
{
calcPrice($(this), false);
});
});
</script>';
if (isset($_POST['generate']) AND !sizeof($this->_errors))
echo '
<div class="module_confirmation conf confirm">
<img src="../img/admin/ok.gif" alt="" title="" style="margin-right:5px; float:left;" />
'.sizeof($this->combinations).' '.$this->l('product(s) successfully created.').'
</div>';
echo '
<script type="text/javascript" src="../js/attributesBack.js"></script>
<form enctype="multipart/form-data" method="post" id="generator" action="'.self::$currentIndex.'&&id_product='.(int)(Tools::getValue('id_product')).'&id_category='.(int)(Tools::getValue('id_category')).'&attributegenerator&token='.Tools::getValue('token').'">
<fieldset style="margin-bottom: 35px;"><legend><img src="../img/admin/asterisk.gif" />'.$this->l('Attributes generator').'</legend>'.
$this->l('Add or modify attributes for product:').' <b>'.$this->product->name[$this->context->language->id].'</b>
<br /><br />
';
echo '
<div style="padding-top:10px; float: left; width: 570px;">
<div style="float:left;">
<label>'.$this->l('Quantity').'</label>
<div class="margin-form">
<input type="text" size="20" name="quantity" value="0"/>
</div>
<label>'.$this->l('Reference').'</label>
<div class="margin-form">
<input type="text" size="20" name="reference" value="'.$this->product->reference.'"/>
</div>
</div>
<div style="float:left; text-align:center; margin-left:20px;">
<input type="submit" class="button" style="margin-bottom:5px;" name="generate" value="'.$this->l('Generate').'" /><br />
<input type="submit" class="button" name="back" value="'.$this->l('Back to product').'" />
</div>
<br style="clear:both;" />
<div style="margin-top: 15px;">';
self::displayGroupeTable($jsAttributes, $attributesGroups);
echo '
</div>
</div>
<div style="float: left; margin-left: 60px;">
';
self::displayGroupSelect($jsAttributes, $attributesGroups);
echo '
<div>
<p style="text-align: center;">
<input class="button" type="button" style="margin: 0 0 10px 20px;" value="'.$this->l('Add').'" class="button" onclick="add_attr_multiple();" />
<input class="button" type="button" style="margin: 0 0 10px 20px;" value="'.$this->l('Delete').'" class="button" onclick="del_attr_multiple();" /><br />
<input type="submit" class="button" name="back" value="'.$this->l('Back to product').'" />
</p>
</div>
</div>
<br />
</fieldset>
</form>';
}
}
+1
View File
@@ -156,6 +156,7 @@ a.module_toggle_all{color: #268CCD;}
.toolbarBox .process-icon-save { background-image: url(process-icon-save.png);}
.toolbarBox .process-icon-save-and-stay { background-image: url(process-icon-save-and-stay.png);}
.toolbarBox .process-icon-edit { background-image: url(process-icon-edit.png);}
.toolbarBox .process-icon-back { background-image: url(process-icon-back.png);}
/*leadin*/
.leadin { padding:10px;}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,146 @@
{*
* 2007-2011 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-2011 PrestaShop SA
* @version Release: $Revision$
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<script type="text/javascript">
i18n_tax_exc = "{l s='Tax Excl.:'}";
i18n_tax_inc = "{l s='Tax Incl.:'}";
var product_tax = "{$tax_rates}";
function calcPrice(element, element_has_tax)
{
name = element.attr("name");
var element_price = element.val().replace(/,/g, ".");
var other_element_price = "0";
if (!isNaN(element_price) && element_price > 0)
{
if (element_has_tax)
other_element_price = parseFloat(element_price / ((product_tax / 100) + 1));
else
other_element_price = ps_round(parseFloat(element_price * ((product_tax / 100) + 1)), 2);
}
$("#related_to_"+name).val(other_element_price);
}
$(document).ready(function()
{
$(".price_impact").each(function()
{
calcPrice($(this), false);
});
});
</script>
<div class="toolbarBox">
{include file="toolbar.tpl" toolbar_btn=$toolbar_btn}
<div class="pageTitle">
<h3>
<span id="current_obj" style="font-weight: normal;">{$title|default:'&nbsp;'}</span>
</h3>
</div>
</div>
{if $generate}
<div class="module_confirmation conf confirm">
<img src="../img/admin/ok.gif" alt="" title="" style="margin-right:5px; float:left;" />
{$combinations_size} {l s='product(s) successfully created.'}
</div>
{/if}
<script type="text/javascript" src="../js/attributesBack.js"></script>
<form enctype="multipart/form-data" method="post" id="generator" action="{$url_generator}">
<fieldset style="margin-bottom: 35px;">
<legend><img src="../img/admin/asterisk.gif" />{l s='Attributes generator'}</legend>
{l s='Add or modify attributes for product:'} <b>{$product_name}</b>
<br /><br />
<div style="padding-top:10px; float: left; width: 570px;">
<div style="float:left;">
<label>{l s='Quantity'}</label>
<div class="margin-form">
<input type="text" size="20" name="quantity" value="0"/>
</div>
<label>{l s='Reference'}</label>
<div class="margin-form">
<input type="text" size="20" name="reference" value="{$product_reference}"/>
</div>
</div>
<div style="float:left; text-align:center; margin-left:20px;">
<input type="submit" class="button" style="margin-bottom:5px;" name="generate" value="{l s='Generate'}" /><br />
</div>
<br style="clear:both;" />
<div style="margin-top: 15px;">
{foreach $attribute_groups as $k => $attribute_group}
{if isset($attribute_js[$attribute_group['id_attribute_group']])}
<br class="clear"/>
<table class="table" cellpadding="0" cellspacing="0" align="left" style="margin-bottom: 10px; display: none;">
<thead>
<tr>
<th id="tab_h1" style="width: 150px">{$attribute_group['name']|escape:'htmlall':'UTF-8'}</th>
<th id="tab_h2" style="width: 350px" colspan="2">{l s='Price impact'} {$currency_sign}</th>
<th style="width: 150px">{l s='Weight impact'} ({$weight_unit})</th>
</tr>
</thead>
<tbody id="table_{$attribute_group['id_attribute_group']}" name="result_table">
</tbody>
</table>
{if isset($attributes[$attribute_group['id_attribute_group']])}
{foreach $attributes[$attribute_group['id_attribute_group']] AS $k => $attribute}
<script type="text/javascript">
$('#table_{$attribute_group['id_attribute_group']}').append(create_attribute_row({$k}, {$attribute_group['id_attribute_group']}, '{$attribute['attribute_name']|addslashes}', {$attribute['price']}, {$attribute['weight']}));
toggle(getE('table_' + {$attribute_group['id_attribute_group']}).parentNode, true);
</script>
{/foreach}
{/if}
{/if}
{/foreach}
</div>
</div>
<div style="float: left; margin-left: 60px;">
<div>
<select multiple name="attributes[]" id="attribute_group" style="width: 200px; height: 350px; margin-bottom: 10px;">';
{$attribute_groups|@var_dump}
{foreach $attribute_groups as $k => $attribute_group}
{if isset($attribute_js[$attribute_group['id_attribute_group']])}
<optgroup name="{$attribute_group['id_attribute_group']}" id="{$attribute_group['id_attribute_group']}" label="{$attribute_group['name']|escape:'htmlall':'UTF-8'}">';
{foreach $attribute_js[$attribute_group['id_attribute_group']] as $k => $v}
<option name="{$k}" id="attr_{$k}" value="{$v|escape:'quotes':'UTF-8'}" title="{$v|escape:'quotes':'UTF-8'}">{$v|escape:'quotes':'UTF-8'}</option>
{/foreach}
</optgroup>
{/if}
{/foreach}
</select>
</div>
<div>
<p style="text-align: center;">
<input class="button" type="button" style="margin: 0 0 10px 20px;" value="{l s='Add'}" class="button" onclick="add_attr_multiple();" />
<input class="button" type="button" style="margin: 0 0 10px 20px;" value="{l s='Delete'}" class="button" onclick="del_attr_multiple();" /><br />
</p>
</div>
</div>
<br />
</fieldset>
</form>
@@ -49,7 +49,7 @@
<table cellpadding="5">
<tr>
<td colspan="2"><b>{l s='Add or modify combinations for this product'}</b> {l s='or go to'}
&nbsp;<a href="index.php?tab=AdminProducts&id_product={$id_product}&id_category={$id_category}&attributegenerator&token={$token}" onclick="return confirm('{l s='Are you sure you want to delete entered product information?'}');"><img src="../img/admin/appearance.gif" alt="combinations_generator" class="middle" title="{l s='Product combinations generator'}" />&nbsp;{l s='Product combinations generator'}</a>
&nbsp;<a href="index.php?tab=AdminAttributeGenerator&id_product={$id_product}&attributegenerator&token={$token_generator}" onclick="return confirm('{l s='Are you sure you want to delete entered product information?'}');"><img src="../img/admin/appearance.gif" alt="combinations_generator" class="middle" title="{l s='Product combinations generator'}" />&nbsp;{l s='Product combinations generator'}</a>
</td>
</tr>
</table>
+1 -1
View File
@@ -893,7 +893,7 @@ class ProductCore extends ObjectModel
/**
* addProductAttribute is deprecated
* @deprecated
* @deprecated
*/
public function addProductAttribute($price, $weight, $unit_impact, $ecotax, $quantity, $id_images, $reference, $supplier_reference, $ean13, $default, $location = NULL, $upc = NULL)
{
@@ -0,0 +1,224 @@
<?php
/*
* 2007-2011 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-2011 PrestaShop SA
* @version Release: $Revision: 6844 $
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
@ini_set('max_execution_time', 3600);
class AdminAttributeGeneratorControllerCore extends AdminController
{
private $combinations = array();
private $product;
public function __construct()
{
$this->table = 'product_attribute';
$this->className = 'Product';
parent::__construct();
}
private function addAttribute($arr, $price = 0, $weight = 0)
{
foreach ($arr AS $attr)
{
$price += (float)($_POST['price_impact_'.(int)($attr)]);
$weight += (float)($_POST['weight_impact'][(int)($attr)]);
}
if ($this->product->id)
{
return (array(
'id_product' => (int)($this->product->id),
'price' => (float)($price),
'weight' => (float)($weight),
'ecotax' => 0,
'quantity' => (int)($_POST['quantity']),
'reference' => pSQL($_POST['reference']),
'default_on' => 0,
'available_date' => '0000-00-00'));
}
return array();
}
static private function createCombinations($list)
{
if (sizeof($list) <= 1)
return sizeof($list) ? array_map(create_function('$v', 'return (array($v));'), $list[0]) : $list;
$res = array();
$first = array_pop($list);
foreach ($first AS $attribute)
{
$tab = self::createCombinations($list);
foreach ($tab AS $toAdd)
$res[] = is_array($toAdd) ? array_merge($toAdd, array($attribute)) : array($toAdd, $attribute);
}
return $res;
}
public function postProcess()
{
$this->product = new Product((int)(Tools::getValue('id_product')));
if (isset($_POST['generate']))
{
if (!is_array(Tools::getValue('options')))
$this->_errors[] = Tools::displayError('Please choose at least 1 attribute.');
else
{
$tab = array_values($_POST['options']);
if (sizeof($tab) AND Validate::isLoadedObject($this->product))
{
self::setAttributesImpacts($this->product->id, $tab);
$this->combinations = array_values(self::createCombinations($tab));
$values = array_values(array_map(array($this, 'addAttribute'), $this->combinations));
$this->product->deleteProductAttributes();
$res = $this->product->addProductAttributeMultiple($values);
$this->product->addAttributeCombinationMultiple($res, $this->combinations);
$this->product->updateQuantityProductWithAttributeQuantity();
}
else
$this->_errors[] = Tools::displayError('Unable to initialize parameters, combination is missing or object cannot be loaded.');
}
}
elseif (isset($_POST['back']))
Tools::redirectAdmin(self::$currentIndex.'&id_product='.(int)(Tools::getValue('id_product')).'&addproduct'.'&tabs=3&token='.Tools::getValue('token'));
parent::postProcess();
}
private static function displayAndReturnAttributeJs()
{
$attributes = Attribute::getAttributes(Context::getContext()->language->id, true);
$attributeJs = array();
foreach ($attributes AS $k => $attribute)
$attributeJs[$attribute['id_attribute_group']][$attribute['id_attribute']] = $attribute['name'];
echo '
<script type="text/javascript">
var attrs = new Array();
attrs[0] = new Array(0, \'---\');';
foreach ($attributeJs AS $idgrp => $group)
{
echo '
attrs['.$idgrp.'] = new Array(0, \'---\' ';
foreach ($group AS $idattr => $attrname)
echo ', '.$idattr.', \''.addslashes(($attrname)).'\'';
echo ');';
}
echo '
</script>';
return $attributeJs;
}
private static function setAttributesImpacts($id_product, $tab)
{
$attributes = array();
foreach ($tab AS $group)
foreach ($group AS $attribute)
$attributes[] = '('.(int)($id_product).', '.(int)($attribute).', '.(float)($_POST['price_impact_'.(int)($attribute)]).', '.(float)($_POST['weight_impact'][(int)($attribute)]).')';
return Db::getInstance()->execute(
'INSERT INTO `'._DB_PREFIX_.'attribute_impact` (`id_product`, `id_attribute`, `price`, `weight`)
VALUES '.implode(',', $attributes).'
ON DUPLICATE KEY UPDATE `price`=VALUES(price), `weight`=VALUES(weight)'
);
}
private static function getAttributesImpacts($id_product)
{
$tab = array();
$result = Db::getInstance()->executeS(
'SELECT ai.`id_attribute`, ai.`price`, ai.`weight`
FROM `'._DB_PREFIX_.'attribute_impact` ai
WHERE ai.`id_product` = '.(int)($id_product));
if (!$result)
return array();
foreach ($result AS $impact)
{
$tab[$impact['id_attribute']]['price'] = (float)($impact['price']);
$tab[$impact['id_attribute']]['weight'] = (float)($impact['weight']);
}
return $tab;
}
public function initGroupTable()
{
$combinationsGroups = $this->product->getAttributesGroups($this->context->language->id);
$attributes = array();
$impacts = self::getAttributesImpacts($this->product->id);
foreach ($combinationsGroups as &$combination)
{
$target = &$attributes[$combination['id_attribute_group']][$combination['id_attribute']];
$target = $combination;
if (isset($impacts[$combination['id_attribute']]))
{
$target['price'] = $impacts[$combination['id_attribute']]['price'];
$target['weight'] = $impacts[$combination['id_attribute']]['weight'];
}
}
$this->context->smarty->assign(array(
'currency_sign' => $this->context->currency->sign,
'weight_unit' => Configuration::get('PS_WEIGHT_UNIT'),
'attributes' => $attributes,
));
}
public function initToolbar()
{
$this->toolbar_btn['back'] = array(
'href' => $this->context->link->getAdminLink('AdminProducts').'&id_product='.(int)Tools::getValue('id_product'),
'desc' => $this->l('Back to product')
);
}
public function initContent()
{
if (!Combination::isFeatureActive())
{
$this->displayWarning($this->l('This feature has been disabled, you can active this feature at this page:').' <a href="index.php?tab=AdminPerformance&token='.Tools::getAdminTokenLite('AdminPerformance').'#featuresDetachables">'.$this->l('Performances').'</a>');
return;
}
// Init toolbar
$this->initToolbarTitle();
$this->initToolbar();
$this->initGroupTable();
$js_attributes = self::displayAndReturnAttributeJs();
$attribute_groups = AttributeGroup::getAttributesGroups($this->context->language->id);
$this->product = new Product((int)(Tools::getValue('id_product')));
$this->context->smarty->assign(array(
'tax_rates' => $this->product->getTaxesRate(),
'generate' => isset($_POST['generate']) AND !sizeof($this->_errors),
'combinations_size' => count($this->combinations),
'product_name' => $this->product->name[$this->context->language->id],
'product_reference' => $this->product->reference,
'url_generator' => self::$currentIndex.'&id_product='.(int)(Tools::getValue('id_product')).'&attributegenerator&token='.Tools::getValue('token'),
'attribute_groups' => $attribute_groups,
'attribute_js' => $js_attributes,
'toolbar_btn' => $this->toolbar_btn,
'title' => $this->toolbar_title,
));
}
}
+11 -12
View File
@@ -1913,7 +1913,7 @@ switch ($this->action)
$countries = Country::getCountries($this->context->language->id);
$groups = Group::getGroups($this->context->language->id);
$currencies = Currency::getCurrencies();
$currency =
$currency =
$attributes = $obj->getAttributesGroups((int)$this->context->language->id);
$combinations = array();
foreach($attributes as $attribute)
@@ -1922,7 +1922,7 @@ switch ($this->action)
if (!isset($combinations[$attribute['id_product_attribute']]['attributes']))
$combinations[$attribute['id_product_attribute']]['attributes'] = '';
$combinations[$attribute['id_product_attribute']]['attributes'] .= $attribute['attribute_name'].' - ';
$combinations[$attribute['id_product_attribute']]['price'] = Tools::displayPrice(Tools::convertPrice(Product::getPriceStatic((int)$obj->id, false, $attribute['id_product_attribute']), $this->context->currency), $this->context->currency);
}
foreach ($combinations as &$combination)
@@ -3481,9 +3481,7 @@ $product->supplier_name = Supplier::getNameById($product->id_supplier);
<th>'.$this->l('Weight').'</th>
<th>'.$this->l('Reference').'</th>
<th>'.$this->l('EAN13').'</th>
<th>'.$this->l('UPC').'</th>
<th class="center">'.$this->l('Quantity').'</th>';
<th>'.$this->l('UPC').'</th>';
if ($id_product_download && !empty($productDownload->display_filename))
{
@@ -3517,7 +3515,6 @@ $product->supplier_name = Supplier::getNameById($product->id_supplier);
$combArray[$combinaison['id_product_attribute']]['minimal_quantity'] = $combinaison['minimal_quantity'];
$combArray[$combinaison['id_product_attribute']]['available_date'] = strftime($combinaison['available_date']);
$combArray[$combinaison['id_product_attribute']]['location'] = $combinaison['location'];
$combArray[$combinaison['id_product_attribute']]['quantity'] = $combinaison['quantity'];
$combArray[$combinaison['id_product_attribute']]['id_image'] = isset($combinationImages[$combinaison['id_product_attribute']][0]['id_image']) ? $combinationImages[$combinaison['id_product_attribute']][0]['id_image'] : 0;
$combArray[$combinaison['id_product_attribute']]['default_on'] = $combinaison['default_on'];
$combArray[$combinaison['id_product_attribute']]['ecotax'] = $combinaison['ecotax'];
@@ -3568,8 +3565,7 @@ $product->supplier_name = Supplier::getNameById($product->id_supplier);
<td class="right">'.$product_attribute['weight'].Configuration::get('PS_WEIGHT_UNIT').'</td>
<td class="right">'.$product_attribute['reference'].'</td>
<td class="right">'.$product_attribute['ean13'].'</td>
<td class="right">'.$product_attribute['upc'].'</td>
<td class="center">'.$product_attribute['quantity'].'</td>';
<td class="right">'.$product_attribute['upc'].'</td>';
if ($id_product_download && !empty($product->productDownload->display_filename))
{
@@ -3590,7 +3586,7 @@ $product->supplier_name = Supplier::getNameById($product->id_supplier);
<a style="cursor: pointer;">
<img src="../img/admin/edit.gif" alt="'.$this->l('Modify this combination').'"
onclick="javascript:fillCombinaison(\''.$product_attribute['wholesale_price'].'\', \''.$product_attribute['price'].'\', \''.$product_attribute['weight'].'\', \''.$product_attribute['unit_impact'].'\', \''.$product_attribute['reference'].'\', \''.$product_attribute['supplier_reference'].'\', \''.$product_attribute['ean13'].'\',
\''.$product_attribute['quantity'].'\', \''.($attrImage ? $attrImage->id : 0).'\', Array('.$jsList.'), \''.$id_product_attribute.'\', \''.$product_attribute['default_on'].'\', \''.$product_attribute['ecotax'].'\', \''.$product_attribute['location'].'\', \''.$product_attribute['upc'].'\', \''.$product_attribute['minimal_quantity'].'\', \''.$available_date.'\',
\''.($attrImage ? $attrImage->id : 0).'\', Array('.$jsList.'), \''.$id_product_attribute.'\', \''.$product_attribute['default_on'].'\', \''.$product_attribute['ecotax'].'\', \''.$product_attribute['location'].'\', \''.$product_attribute['upc'].'\', \''.$product_attribute['minimal_quantity'].'\', \''.$available_date.'\',
\''.$product->productDownload->display_filename.'\', \''.$filename.'\', \''.$product->productDownload->nb_downloadable.'\', \''.$available_date_attribute.'\', \''.$product->productDownload->nb_days_accessible.'\', \''.$product->productDownload->is_shareable.'\'); calcImpactPriceTI();" /></a>&nbsp;
'.(!$product_attribute['default_on'] ? '<a href="'.self::$currentIndex.'&defaultProductAttribute&id_product_attribute='.$id_product_attribute.'&id_product='.$product->id.'&'.(Tools::isSubmit('id_category') ? 'id_category='.(int)(Tools::getValue('id_category')).'&' : '&').'token='.Tools::getAdminToken('AdminProducts'.(int)(Tab::getIdFromClassName('AdminProducts')).$this->context->employee->id).'">
<img src="../img/admin/asterisk.gif" alt="'.$this->l('Make this the default combination').'" title="'.$this->l('Make this combination the default one').'"></a>' : '').'
@@ -3628,9 +3624,12 @@ $product->supplier_name = Supplier::getNameById($product->id_supplier);
$this->content .= $content;
// @todo
$smarty->assign('up_filename', strval(Tools::getValue('virtual_product_filename_attribute')));
$this->context->smarty->assign('content', $content);
$this->context->smarty->assign('product', $product);
$this->context->smarty->assign('id_category', $product->id_category_default);
$this->context->smarty->assign(array(
'content' => $content,
'product' => $product,
'id_category' => $product->id_category_default,
'token_generator' => Tools::getAdminTokenLite('AdminAttributeGenerator')
));
$this->content = $this->context->smarty->fetch('products/combinations.tpl');
}
+15 -9
View File
@@ -360,8 +360,8 @@ INSERT INTO `PREFIX_category_lang` (`id_category`, `id_lang`, `name`, `descripti
(1, 1, 'Home', '', 'home', NULL, NULL, NULL),(1, 2, 'Accueil', '', 'home', NULL, NULL, NULL),(1, 3, 'Inicio', '', 'home', NULL, NULL, NULL),(1, 4, 'Start', '', 'home', NULL, NULL, NULL),(1, 5, 'Home page', '', 'home', NULL, NULL, NULL);
INSERT INTO `PREFIX_order_state` (`id_order_state`, `invoice`, `send_email`, `color`, `unremovable`, `logable`, `delivery`, `shipped`) VALUES
(1, 0, 1, 'lightblue', 1, 0, 0, 0),(2, 1, 1, '#DDEEFF', 1, 1, 0, 0),(3, 1, 1, '#FFDD99', 1, 1, 1, 0),(4, 1, 1, '#EEDDFF', 1, 1, 1, 1),(5, 1, 0, '#DDFFAA', 1, 1, 1, 1),
(6, 0, 1, '#DADADA', 1, 0, 0, 0),(7, 1, 1, '#FFFFBB', 1, 0, 0, 0),(8, 0, 1, '#FFDFDF', 1, 0, 0, 0),(9, 1, 1, '#FFD3D3', 1, 0, 0, 0),(10, 0, 1, 'lightblue', 1, 0, 0, 0),(11, 0, 0, 'lightblue', 1, 0, 0, 0),(12, 1, 0, '#DDEEFF', 1, 1, 0, 0);
(1, 0, 1, 'RoyalBlue', 1, 0, 0, 0),(2, 1, 1, 'LimeGreen', 1, 1, 0, 0),(3, 1, 1, 'DarkOrange', 1, 1, 1, 0),(4, 1, 1, 'BlueViolet', 1, 1, 1, 1),(5, 1, 0, 'Crimson', 1, 1, 1, 1),
(6, 0, 1, '#999999', 1, 0, 0, 0),(7, 1, 1, 'Orange', 1, 0, 0, 0),(8, 0, 1, 'DarkOrange', 1, 0, 0, 0),(9, 1, 1, 'HotPink', 1, 0, 0, 0),(10, 0, 1, 'RoyalBlue', 1, 0, 0, 0),(11, 0, 0, 'RoyalBlue', 1, 0, 0, 0),(12, 1, 0, 'LimeGreen', 1, 1, 0, 0);
INSERT INTO `PREFIX_order_state_lang` (`id_order_state`, `id_lang`, `name`, `template`) VALUES
(1, 1, 'Awaiting cheque payment', 'cheque'),
@@ -949,7 +949,8 @@ INSERT INTO `PREFIX_tab` (`id_tab`, `class_name`, `id_parent`, `position`) VALUE
(97, 'AdminStockManagement', 95, 2),
(98, 'AdminStockInstantState', 95, 4),
(99, 'AdminStockCover', 95, 5),
(100, 'AdminSupplierOrders', 95, 6);
(100, 'AdminSupplierOrders', 95, 6),
(101, 'AdminAttributeGenerator', -1, 0);
INSERT INTO `PREFIX_access` (`id_profile`, `id_tab`, `view`, `add`, `edit`, `delete`) (SELECT 1, id_tab, 1, 1, 1, 1 FROM `PREFIX_tab`);
@@ -974,7 +975,8 @@ INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES
(1, 97, 'Stock Management'),
(1, 98, 'Stock instant state'),
(1, 99, 'Stock cover'),
(1, 100, 'Supplier orders');
(1, 100, 'Supplier orders'),
(1, 101, 'Combinations generator');
INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES
(2, 1, 'Catalogue'),(2, 2, 'Clients'),(2, 3, 'Commandes'),(2, 4, 'Paiement'),(2, 5, 'Transport'),
@@ -997,7 +999,8 @@ INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES
(2, 97, 'Gestion du stock'),
(2, 98, 'Etat instantané du stock'),
(2, 99, 'Couverture de stock'),
(2, 100, 'Commandes fournisseurs');
(2, 100, 'Commandes fournisseurs'),
(2, 101, 'Générateur de combinaisons');
INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES
(3, 1, 'Catálogo'),(3, 2, 'Clientes'),(3, 3, 'Pedidos'),(3, 4, 'Pago'),(3, 5, 'Transporte'),
@@ -1019,7 +1022,8 @@ INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES
(3, 97, 'Stock Management'),
(3, 98, 'Stock instant state'),
(3, 99, 'Stock cover'),
(3, 100, 'Supplier orders');
(3, 100, 'Supplier orders'),
(3, 101, 'Combinations generator');
INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES
(4, 1, 'Katalog'),(4, 2, 'Kunden'),(4, 3, 'Bestellungen'),(4, 4, 'Zahlung'),
@@ -1042,7 +1046,8 @@ INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES
(4, 97, 'Stock Management'),
(4, 98, 'Stock instant state'),
(4, 99, 'Stock cover'),
(4, 100, 'Supplier orders');
(4, 100, 'Supplier orders'),
(4, 101, 'Combinations generator');
INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES
(5, 1, 'Catalogo'),(5, 2, 'Clienti'),(5, 3, 'Ordini'),(5, 4, 'Pagamento'),
@@ -1065,7 +1070,8 @@ INSERT INTO `PREFIX_tab_lang` (`id_lang`, `id_tab`, `name`) VALUES
(5, 97, 'Stock Management'),
(5, 98, 'Stock instant state'),
(5, 99, 'Stock cover'),
(5, 100, 'Supplier orders');
(5, 100, 'Supplier orders'),
(5, 101, 'Combinations generator');
INSERT IGNORE INTO `PREFIX_tab_lang` (`id_tab`, `id_lang`, `name`)
(SELECT `id_tab`, id_lang, (SELECT tl.`name`
@@ -1085,7 +1091,7 @@ INSERT INTO `PREFIX_quick_access_lang` (`id_quick_access`, `id_lang`, `name`) VA
(4, 1, 'New product'),(4, 2, 'Nouveau produit'),(4, 3, 'Nuevo producto'),(4, 4, 'Neues Produkt'),(4, 5, 'Nuovo prodotto'),
(5, 1, 'New voucher'),(5, 2, 'Nouveau bon de réduction'),(5, 3, 'Nuevo cupón'),(5, 4, 'Neuer Ermäßigungsgutschein'),(5, 5, 'Nuovo buono sconto');
INSERT INTO `PREFIX_order_return_state` (`id_order_return_state`, `color`) VALUES (1, '#ADD8E6'),(2, '#EEDDFF'),(3, '#DDFFAA'),(4, '#FFD3D3'),(5, '#FFFFBB');
INSERT INTO `PREFIX_order_return_state` (`id_order_return_state`, `color`) VALUES (1, '#ADD8E6'),(2, 'BlueViolet'),(3, 'Crimson'),(4, 'HotPink'),(5, 'Orange');
INSERT INTO `PREFIX_order_return_state_lang` (`id_order_return_state`, `id_lang`, `name`) VALUES
(1, 1, 'Waiting for confirmation'),(2, 1, 'Waiting for package'),(3, 1, 'Package received'),(4, 1, 'Return denied'),(5, 1, 'Return completed'),
+2
View File
@@ -471,3 +471,5 @@ UPDATE `PREFIX_hook` SET `name` = 'actionTaxManager' WHERE `name` = 'taxManager'
ALTER TABLE `PREFIX_specific_price` ADD `id_product_attribute` INT UNSIGNED NOT NULL AFTER `id_product`;
ALTER TABLE `PREFIX_specific_price` DROP INDEX `id_product`;
ALTER TABLE `PREFIX_specific_price` ADD INDEX `id_product` (`id_product`, `id_product_attribute`, `id_shop`, `id_currency`, `id_country`, `id_group`, `from_quantity`, `from`, `to`);
/* PHP:add_new_tab(AdminAttributeGenerator, fr:Générateur de combinaisons|es:Combinations generator|en:Combinations generator|de:Combinations generator|it:Combinations generator, 1); */;