[*] BO : #PSFV-94 - added AdminAttributeGeneratorController
This commit is contained in:
@@ -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>';
|
||||
}
|
||||
}
|
||||
@@ -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:' '}</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'}
|
||||
<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'}" /> {l s='Product combinations generator'}</a>
|
||||
<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'}" /> {l s='Product combinations generator'}</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Reference in New Issue
Block a user