[*] BO : #PSFV-94 - added AdminAttributeGeneratorController
This commit is contained in:
@@ -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,
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
'.(!$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');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user