Перейти к содержимому


Правила форума

Внимание!!! Если не можете скачать, пожалуйста ознакомьтесь с условиями получения доступа с файлам форума. Правила форума


Редактирование характеристик товара в таблице товаров


Сообщений в теме: 7

#1 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 06 ноября 2014 - 19:42

Как я понимаю, заказчик пропал и больше не проявится :).

Модуль предназначен для редактирования характеристик товара прямо в таблице товаров.

Чем-то он сродни моему модулю OptionSet.
Там у товара можно менять сразу все характеристки скопом, но только варианты.
Тут редактирование происходит в рамках одной выбранной характеристики, но доступны и варианты, и произвольная строка.

Появляется еще одна колонка, где в заголовке колонки селект с выбором характеристики, а в поле у каждого товара
(при выбранной характеристике) два селекта - тип характеристики и значение характеристики.
Типов четыре: Нет/Стр/Вар/Мул.
Нет - характеристика не присвоена
Стр - характеристика в виде произвольной строки
Вар - характеристика в виде одного варианта из нескольких
Мул - характеристика содержит несколько вариантов (мультиселект)
Прикрепленный файл  1.JPG   139,37К   90 Количество загрузок:
.
Прикрепленный файл  2.JPG   140,27К   97 Количество загрузок:
Применение:
- выбираем характеристику, задаем каждому товару нужный вариант (либо варианты, либо строку), нажимаем кнопку "Сохранить".

Ограничения относительно штатного выбора вариантов (в модальном окне):
- нельзя задать дефолтовый вариант при выборе нескольких вариантов.
- нельзя задать изменение цены для выбранных вариантов.


Установка:


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}&amp;optionID={$smarty.get.optionID}{/if}' method="POST" name="form" id="form">
{* END изменение характеристик прямо в таблице товаров *}

2.2. перед строкой

<td align="right"><a href='{$urlToSort}&amp;sort=product_code&amp;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?'&amp;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"
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#2 r-instrument

    Пользователь

  • Assistent vsupport.ru
  • PipPip
  • 11 сообщений
Репутация: 0
Начинающий
  • ГородКрасноярск

Отправлено 20 декабря 2014 - 06:32

Просмотр сообщенияbadisoft (06 ноября 2014 - 19:42) писал:


2.4. меняем нижерасположенные (их обычно три) colspan="xx" на colspan="xx+1"

Это как? можно чуть чуть по подробнее...

#3 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 20 декабря 2014 - 11:41

Просмотр сообщенияr-instrument сказал:

можно чуть чуть по подробнее...
Куда подробнее-то? Если стоит colspan="12", то меняем на colspan="13". Менять надо там, где число двузначное.
Если не выполнять этот пункт, то ничего страшного не случится, просто разделительная синяя горизонтальная полоска будет на одно поле таблицы короче. Точнее, останется ровно той же длины, но мы-то добавили одно поле.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#4 r-instrument

    Пользователь

  • Assistent vsupport.ru
  • PipPip
  • 11 сообщений
Репутация: 0
Начинающий
  • ГородКрасноярск

Отправлено 20 декабря 2014 - 14:13

Значит правильно... так и сделал

#5 r-instrument

    Пользователь

  • Assistent vsupport.ru
  • PipPip
  • 11 сообщений
Репутация: 0
Начинающий
  • ГородКрасноярск

Отправлено 05 марта 2015 - 14:29

Кеш почистил. Ничего не изменилось. Каталог без изменений ;)

#6 badisoft

    Продвинутый пользователь

  • VIP
  • 5 042 сообщений
Репутация: 774
Мастер

Отправлено 05 марта 2015 - 14:54

Просмотр сообщенияr-instrument сказал:

Кеш почистил. Ничего не изменилось. Каталог без изменений
Еще раз выполните п.2.
Я сравнил с имеющейся у меня инструкцией и обнаружил отсутствие одного из пунктов.
Видимо, когда-то при установке клиенту я это отсутствие обнаружил и у себя исправил, а на форуме - нет.
Сейчас инструкция полная.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#7 r-instrument

    Пользователь

  • Assistent vsupport.ru
  • PipPip
  • 11 сообщений
Репутация: 0
Начинающий
  • ГородКрасноярск

Отправлено 09 марта 2015 - 09:56

Спасибо. Заработало

#8 Sergeyzoo

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений
Репутация: 0
Начинающий
  • ГородМосква

Отправлено 14 апреля 2018 - 21:02

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