
Модуль предназначен для редактирования характеристик товара прямо в таблице товаров.
Чем-то он сродни моему модулю OptionSet.
Там у товара можно менять сразу все характеристки скопом, но только варианты.
Тут редактирование происходит в рамках одной выбранной характеристики, но доступны и варианты, и произвольная строка.
Появляется еще одна колонка, где в заголовке колонки селект с выбором характеристики, а в поле у каждого товара
(при выбранной характеристике) два селекта - тип характеристики и значение характеристики.
Типов четыре: Нет/Стр/Вар/Мул.
Нет - характеристика не присвоена
Стр - характеристика в виде произвольной строки
Вар - характеристика в виде одного варианта из нескольких
Мул - характеристика содержит несколько вариантов (мультиселект)

.

Применение:
- выбираем характеристику, задаем каждому товару нужный вариант (либо варианты, либо строку), нажимаем кнопку "Сохранить".
Ограничения относительно штатного выбора вариантов (в модальном окне):
- нельзя задать дефолтовый вариант при выборе нескольких вариантов.
- нельзя задать изменение цены для выбранных вариантов.
Установка:
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"