Модуль предназначен для редактирования характеристик товара прямо в таблице товаров.
Чем-то он сродни моему модулю OptionSet.
Там у товара можно менять сразу все характеристки скопом, но только варианты.
Тут редактирование происходит в рамках одной выбранной характеристики, но доступны и варианты, и произвольная строка.
Появляется еще одна колонка, где в заголовке колонки селект с выбором характеристики, а в поле у каждого товара
(при выбранной характеристике) два селекта - тип характеристики и значение характеристики.
Типов четыре: Нет/Стр/Вар/Мул.
Нет - характеристика не присвоена
Стр - характеристика в виде произвольной строки
Вар - характеристика в виде одного варианта из нескольких
Мул - характеристика содержит несколько вариантов (мультиселект)
1.JPG 139.37К 99 Количество загрузок:
.
2.JPG 140.27К 107 Количество загрузок:
Применение:
- выбираем характеристику, задаем каждому товару нужный вариант (либо варианты, либо строку), нажимаем кнопку "Сохранить".
Ограничения относительно штатного выбора вариантов (в модальном окне):
- нельзя задать дефолтовый вариант при выборе нескольких вариантов.
- нельзя задать изменение цены для выбранных вариантов.
Установка:
11. в файле catalog_products_categories.php
1.1. вместо строки
$data = ScanPostVariableWithId( array( "price", "enable", "left", "sort_order" ) );
вставляем
# BEGIN изменение характеристик прямо в таблице товаров
#$data = ScanPostVariableWithId( array( "price", "enable", "left", "sort_order" ) );
$data = ScanPostVariableWithId( array( "price", "enable", "left", "sort_order", "type", "value" ) );
if (isset($_GET["optionID"])) $_SESSION['optionID'] = $_GET['optionID'];
# END изменение характеристик прямо в таблице товаров
1.2. чуть ниже после строк (строк!)
foreach( $data as $key => $val )
{
вставляем
# BEGIN изменение характеристик прямо в таблице товаров
if ( isset($val['type']) && isset($_GET['optionID']))
{
if ($val['type'] == 0)
{
db_query( "DELETE FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=$key AND optionID=".$_GET['optionID']);
db_query( "DELETE FROM ".PRODUCT_OPTIONS_VALUES_TABLE." WHERE productID=$key AND optionID=".$_GET['optionID']);
}
elseif ($val['type'] == 1)
{
db_query( "DELETE FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=$key AND optionID=".$_GET['optionID']);
if (mysql_result(mysql_query("SELECT COUNT(*) FROM ".PRODUCT_OPTIONS_VALUES_TABLE." WHERE productID=$key AND optionID=".$_GET['optionID']),0))
db_query( "UPDATE ".PRODUCT_OPTIONS_VALUES_TABLE." SET option_type=0,option_value='".xToText($val['value'])."' WHERE productID=$key AND optionID=".$_GET['optionID']);
else
db_query( "INSERT INTO ".PRODUCT_OPTIONS_VALUES_TABLE." SET optionID=".$_GET['optionID'].", productID=$key, option_type=0, option_value='".xToText($val['value'])."'");
}
elseif ($val['type'] >= 2)
{
if (mysql_result(mysql_query("SELECT COUNT(*) FROM ".PRODUCT_OPTIONS_VALUES_TABLE." WHERE productID=$key AND optionID=".$_GET['optionID']),0))
db_query( "UPDATE ".PRODUCT_OPTIONS_VALUES_TABLE." SET option_type=1 WHERE productID=$key AND optionID=".$_GET['optionID']);
else
db_query( "INSERT INTO ".PRODUCT_OPTIONS_VALUES_TABLE." SET optionID=".$_GET['optionID'].", productID=$key, option_type=1");
if (isset($val['value']))
{
db_query( "DELETE FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=$key AND optionID=".$_GET['optionID']." AND variantID NOT IN(".implode(',',$val['value']).")");
foreach ($val['value'] as $val1)
if ($val1 != 0 && !mysql_result(mysql_query("SELECT COUNT(*) FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=$key AND optionID=".$_GET['optionID']." AND variantID=$val1"), 0))
db_query( "INSERT INTO ".PRODUCTS_OPTIONS_SET_TABLE." SET optionID=".$_GET['optionID'].", productID=$key, variantID=$val1");
}
else
db_query( "DELETE FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=$key AND optionID=".$_GET['optionID']);
}
}
# END изменение характеристик прямо в таблице товаров
1.3. перед строками
//products list
$smarty->assign("products", $products );
вставляем
# BEGIN изменение характеристик прямо в таблице товаров
if (db_fetch_row(db_query("SHOW COLUMNS FROM ".CATEGORIES_TABLE." LIKE 'allowed_parameters'")))
{
$row = db_fetch_assoc(db_query("SELECT allowed_parameters FROM ".CATEGORIES_TABLE." WHERE categoryID=".$_GET['categoryID']));
$where = $row['allowed_parameters']?" WHERE optionID IN (".$row['allowed_parameters'].")":"";
}
else $where = "";
$data = db_query("SELECT optionID,name FROM ".PRODUCT_OPTIONS_TABLE.$where." ORDER BY sort_order,name");
while ($row = db_fetch_assoc($data)) $options[] = $row;
$smarty->assign("options",$options);
if (isset($_SESSION['optionID']))
{
$_GET['optionID'] = $_SESSION['optionID'];
unset($_SESSION['optionID']);
}
if (isset($_GET['optionID']) && ($optionID = (int)$_GET['optionID']) > 0 && isset($products) && count($products) > 0)
{
$data = db_query("SELECT variantID,option_value FROM ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." WHERE optionID=$optionID ORDER BY sort_order,option_value");
while ($row = db_fetch_assoc($data)) $variants[] = $row;
$smarty->assign("variants",$variants);
foreach ($products as $key => $product)
{
if ($row = db_fetch_assoc(db_query("SELECT option_value, option_type FROM ".PRODUCT_OPTIONS_VALUES_TABLE." WHERE optionID=$optionID AND productID=".$product['productID']." LIMIT 1")))
{
if ($row['option_type'] == 0)
{
if (empty($row['option_value'])) {$products[$key]['type'] = 0;continue;}
$products[$key]['type'] = 1;
$products[$key]['value'] = $row['option_value'];
}
else
{
$count = 0;
$products[$key]['value'] = $variants;
if (is_array($products[$key]['product_extra']))
{
$product_extra_key = -1;
foreach ($products[$key]['product_extra'] as $key1 => $val1)
if ($val1['optionID'] == $optionID) // в характеристиках товара нашлась заданная характеристика
$product_extra_key = $key1; // запомним номер этого элемента массива
$sets = array();
if ($product_extra_key > -1)
foreach ($products[$key]['product_extra'][$product_extra_key]['values_to_select'] as $key1 => $val1)
$sets[] = $val1['variantID']; // составим список вариантов этой хар-ки у этого товара
foreach ($products[$key]['value'] as $key1 => $val1)
if (in_array($val1['variantID'],$sets))
{
$products[$key]['value'][$key1]['select'] = ' selected';
$count++;
}
}
$products[$key]['type'] = $count>1?3:2;
}
}
else $products[$key]['type'] = 0;
}
}
# END изменение характеристик прямо в таблице товаров
2. в файле catalog_products_categories.tpl.html
2.1. вместо
<form action='{$urlToSubmit}' method="POST" name="form" id="form">
вставляем
{* BEGIN изменение характеристик прямо в таблице товаров *}
{*<form action='{$urlToSubmit}' method="POST" name="form" id="form">*}
<form action='{$urlToSubmit}{if $smarty.get.optionID}&optionID={$smarty.get.optionID}{/if}' method="POST" name="form" id="form">
{* END изменение характеристик прямо в таблице товаров *}
2.2. перед строкой
<td align="right"><a href='{$urlToSort}&sort=product_code&sort_dir=ASC' title="{$smarty.const.ADMIN_ADMIN_MENUNEW11}" class="liv">{$smarty.const.ADMIN_PRODUCT_CODE}</a></td>
вставляем
{* BEGIN изменение характеристик прямо в таблице товаров *}
<td>
<select name="optionID" onchange="window.location = '{$urlToSort}'+(this.value>0?'&optionID='+this.value:'');">
<option value="0">Хар-ка не выбрана</option>
{section name=o loop=$options}
<option value="{$options[o].optionID}"{if $smarty.get.optionID==$options[o].optionID} selected{/if}>{$options[o].name}</option>
{/section}
</select>
</td>
{* END изменение характеристик прямо в таблице товаров *}
2.3. перед строкой
<td align="right" {if !$products[i].enabled}class="toph3 gryy"{else}class="toph3{if !$products[i].product_code} bas{/if}"{/if}>{if $products[i].product_code}{$products[i].product_code}{else}{$smarty.const.ADMIN_NOCODE_PROD}{/if}</td>
вставляем
{* BEGIN изменение характеристик прямо в таблице товаров *}
<td>
{if $smarty.get.optionID}
<div style="display:inline;vertical-align:top;">
<select name="type_{$products[i].productID}" onchange="change_type_{$products[i].productID}(this.value)">
<option value="0"{if $products[i].type==0} selected{/if}>Нет</option>
<option value="1"{if $products[i].type==1} selected{/if}>Стр</option>
<option value="2"{if $products[i].type==2} selected{/if}>Вар</option>
<option value="3"{if $products[i].type==3} selected{/if}>Мул</option>
</select>
</div>
<div style="display:inline;" id="var_select_{$products[i].productID}">
{if $products[i].type==1}
<input type="text" name="value_{$products[i].productID}" value="{$products[i].value}">
{elseif $products[i].type>=2}
<select name="value_{$products[i].productID}[]"{if $products[i].type==3} multiple>{else}><option value="0">Не выбрано</option>{/if}
{section name=v loop=$products[i].value}
<option value="{$products[i].value[v].variantID}"{$products[i].value[v].select}>{$products[i].value[v].option_value}</option>
{/section}
</select>
{/if}
</div>
{/if}
</td>
<script type="text/javascript">
<!--
function change_type_{$products[i].productID}(type)
{literal}{{/literal}
if (type==0) html = '';
if (type==1) html = '<input type="text" name="value_{$products[i].productID}" value="{if $products[i].type==1}{$products[i].value}{/if}">';
if (type>=2) html = '<select name="value_{$products[i].productID}[]"'+((type==3)?' multiple>':'><option value="0">Не выбрано<\/option>')
{if $products[i].type>=2}
{section name=v loop=$products[i].value}
+'<option value="{$products[i].value[v].variantID}"{$products[i].value[v].select}>{$products[i].value[v].option_value}<\/option>'
{/section}
{else}
{section name=v loop=$variants}
+'<option value="{$variants[v].variantID}">{$variants[v].option_value}<\/option>'
{/section}
{/if}
+'<\/select>';
document.getElementById('var_select_{$products[i].productID}').innerHTML = html;
{literal}}{/literal}
//-->
</script>
{* END изменение характеристик прямо в таблице товаров *}
2.4. меняем нижерасположенные (их обычно три) colspan="xx" на colspan="xx+1"