Решил таки оформить отдельным сообщением, а то как-то некузяво.
но лучше вообще обновить модуль, в старой версии таракан на таракане
Модуль "Учет товаров по дополнительным характеристикам".
Мне надоело копаться с исходным авторским кодом, я его причесал для удобства и понятности, а также сделал в виде инструкции.
Надеюсь, ничего не забыл
.
Отличия:
- После инсталляции учет выключен (галка "УчДХ" у товаров снята). Т.е. если ее не включать, то все работает как и раньше.
- исправлена ошибка в configurator.php, из-за которой криво работало модальное окно выбора вариантов при выключенном УчДХ.
- синтаксис <?bla-bla-bla?> заменен на <?php bla-bla-bla ?>.
- добавлена отправка емейла админу об окончании ОДНОГО ИЗ вариантов товара.
- убраны авторские шаблоны краткого и полного описания. Вместо них добавлены правки штатных шаблонов, скрывающие варианты с нулевым количеством на складе.
- многократно повторяющийся код проверки состояния галки УчДХ вынесен в отдельную функцию.
- убрано некоторое количество лишнего (на мой взгляд) кода.
1. копируем файлы
configurator.php -> /core/includes/processor/
cisfo_functions.php -> /core/functons/
2. в файле catalog_products_categories.php
2.1. после строки
} else {
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if (!db_fetch_row(db_query("SHOW COLUMNS FROM ".PRODUCTS_TABLE." LIKE 'check_in_stock_from_options'"))) db_query("ALTER TABLE ".PRODUCTS_TABLE." ADD check_in_stock_from_options TINYINT(1) NOT NULL DEFAULT 0");
if (!db_fetch_row(db_query("SHOW COLUMNS FROM ".PRODUCTS_OPTIONS_SET_TABLE." LIKE 'qty'"))) db_query("ALTER TABLE ".PRODUCTS_OPTIONS_SET_TABLE." ADD qty INT(11) NOT NULL DEFAULT 0");
if (!db_fetch_row(db_query("SHOW COLUMNS FROM ".ORDERED_CARTS_TABLE." LIKE 'variantID'"))) db_query("ALTER TABLE ".ORDERED_CARTS_TABLE." ADD variantID INT( 11 ) NULL");
#END Учет количества товара по дополнительным характеристикам
2.2. строку
$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", "check_in_stock_from_options" ) );
#END Учет количества товара по дополнительным характеристикам
2.3. чуть ниже после строк (строк!)
foreach( $data as $key => $val )
{
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if ( isset($val["check_in_stock_from_options"]) ) db_query( "UPDATE ".PRODUCTS_TABLE." SET check_in_stock_from_options=".(int)$val["check_in_stock_from_options"]." WHERE productID=".(int)$key );
#END Учет количества товара по дополнительным характеристикам
3. в файле catalog_products_categories.tpl.html
3.1. перед строкой
<td align="left" width="100%"><a href='{$urlToSort}&sort=name&sort_dir=ASC' title="{$smarty.const.ADMIN_ADMIN_MENUNEW11}" class="liv">{$smarty.const.ADMIN_PRODUCT_NAME}</a></td>
вставляем
{* BEGIN Учет количества товара по дополнительным характеристикам *}
<td align="center">УчДХ</td>
{* END Учет количества товара по дополнительным характеристикам *}
3.2. перед строкой
<td align="left"><a href="{$smarty.const.ADMIN_FILE}?productID={$products[i].productID}&eaction=prod" title="{$smarty.const.ADMIN_ADMIN_MENUNEW9}" {if !$products[i].enabled}class="greyy"{/if}>{$products[i].name}</a></td>
вставляем
{* BEGIN Учет количества товара по дополнительным характеристикам *}
<td align="center">
<input type="hidden" name="check_in_stock_from_options_{$products[i].productID}" id="check_in_stock_from_options_{$products[i].productID}" {if $products[i].check_in_stock_from_options}value='1'{else}value='0'{/if} >
<input type="checkbox" class="round" name="checkbo_check_in_stock_from_options_{$products[i].productID}" id="checkbo_check_in_stock_from_options_{$products[i].productID}" {if $products[i].check_in_stock_from_options eq 1}checked{/if} onclick='CheckBoxHandler_check_in_stock_from_options({$products[i].productID})' title="{$smarty.const.ADMIN_ADMIN_MENUNEW6}">
</td>
{* END Учет количества товара по дополнительным характеристикам *}
3.3. вместо строки
<td align="right">{if $products[i].in_stock <= 0}<input type="text" name="left_{$products[i].productID}" value="{$products[i].in_stock}" class="prc prcss{if !$products[i].enabled} gryy{/if}">{else}<input type="text" name="left_{$products[i].productID}" value="{$products[i].in_stock}" class="prc prcss {if !$products[i].enabled}gryy{/if}">{/if}</td>
вставляем
{* BEGIN Учет количества товара по дополнительным характеристикам *}
{*<td align="right">{if $products[i].in_stock <= 0}<input type="text" name="left_{$products[i].productID}" value="{$products[i].in_stock}" class="prc prcss{if !$products[i].enabled} gryy{/if}">{else}<input type="text" name="left_{$products[i].productID}" value="{$products[i].in_stock}" class="prc prcss {if !$products[i].enabled}gryy{/if}">{/if}</td>*}
<td align="right"><input type="text" name="left_{$products[i].productID}" value="{$products[i].in_stock}" class="prc prcss{if !$products[i].enabled} gryy{/if}"{if $products[i].check_in_stock_from_options} disabled{/if}></td>
{* END Учет количества товара по дополнительным характеристикам *}
3.4. после строк (строк!)
document.getElementById('enable_' + id).value = '0';
{literal}}{/literal}
вставляем
// BEGIN Учет количества товара по дополнительным характеристикам
function CheckBoxHandler_check_in_stock_from_options(id){literal}{{/literal}
if ( document.getElementById('checkbo_check_in_stock_from_options_' + id).checked )
document.getElementById('check_in_stock_from_options_' + id).value = '1';
else
document.getElementById('check_in_stock_from_options_' + id).value = '0';
{literal}}{/literal}
// END Учет количества товара по дополнительным характеристикам
3.4. заменяем везде colspan="15" на colspan="16"
4. в файле shopping_cart.php
4.1. перед строкой
$is=GetProductInStockCount( $productID );
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($productID))
{
$variants = GetConfigurationByItemId(str_replace("count_","",$key));
$is=GetProductInStockCount( $productID, $variants[0]);
}
else
#END Учет количества товара по дополнительным характеристикам
4.2. перед строкой
$is=GetProductInStockCount( $res["productID"] );
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($res["productID"])) $is=GetProductInStockCount( $res["productID"], $res["variants"][0] );
else
#END Учет количества товара по дополнительным характеристикам
5. в файле cart_functions.php
5.1. в функции GetProductInStockCount вместо строк
function GetProductInStockCount($productID)
{
$q=db_query("select in_stock from ".PRODUCTS_TABLE." where productID=".(int)$productID);
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
#function GetProductInStockCount($productID)
#{
#$q=db_query("select in_stock from ".PRODUCTS_TABLE." where productID=".(int)$productID);
function GetProductInStockCount($productID, $variantID = false)
{
if($variantID !== false) $q = db_query("SELECT qty FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=".(int)$productID." AND variantID=".$variantID);
else $q = db_query("SELECT in_stock FROM ".PRODUCTS_TABLE." WHERE productID=".(int)$productID);
#END Учет количества товара по дополнительным характеристикам
5.2. в функции cartMoveContentFromShoppingCartsToOrderedCarts
5.2.1 перед строками
db_query("INSERT INTO ".ORDERED_CARTS_TABLE.
"( itemID, orderID, name, ".
" Price, Quantity, tax ) ".
" VALUES ".
" (".(int)$item["itemID"].",".(int)$orderID.", '".xEscSQL($productComplexName)."', ".xEscSQL($price).
", ".(int)$item["Quantity"].", ".xEscSQL($tax)." )");
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if($cisfo = cisfo($productID)) db_query("INSERT INTO ".ORDERED_CARTS_TABLE."(itemID, orderID, name, Price, Quantity, tax, variantID ) VALUES (".(int)$item["itemID"].",".(int)$orderID.", '".xEscSQL($productComplexName)."', ".xEscSQL($price).", ".(int)$item["Quantity"].", ".xEscSQL($tax).", ".(int)$variants[0]." )");
else
#END Учет количества товара по дополнительным характеристикам
5.2.2 перед строкой
db_query( "update ".PRODUCTS_TABLE." set in_stock = in_stock - ".(int)$item["Quantity"].
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if($cisfo)
{
db_query("UPDATE ".PRODUCTS_OPTIONS_SET_TABLE." SET qty = qty - ".(int)$item["Quantity"]." WHERE productID=".(int)$productID." AND variantID=".(int)$variants[0] );
$in_stock = db_fetch_row(db_query("SELECT SUM(qty) FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=".(int)$productID));
db_query("UPDATE ".PRODUCTS_TABLE." SET in_stock=".(int)$in_stock[0]." WHERE productID=".(int)$productID);
# BEGIN email-on-qty-patch
if (CONF_NOTIFY_STOCKADMIN)
{
$qty = db_fetch_assoc(db_query("SELECT qty FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=".(int)$productID." AND variantID=".(int)$variants[0]));
if ($qty['qty'] < 1)
{
$name = db_fetch_row(db_query("SELECT option_value FROM ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." WHERE variantID=".(int)$variants[0]));
$smarty_mail->assign( "option_value", $name["option_value"] );
$productsta = db_fetch_row(db_query("SELECT name FROM ".PRODUCTS_TABLE." WHERE productID=".(int)$productID));
$smarty_mail->assign( "productstaname", $productsta["name"] );
$smarty_mail->assign( "productstid", $productID );
$stockadmin = $smarty_mail->fetch( "notify_stockadmin.tpl.html" );
xMailTxtHTMLDATA(CONF_ORDERS_EMAIL,CUSTOMER_ACTIVATE_99,$stockadmin);
}
}
# END email-on-qty-patch
}
else
#END Учет количества товара по дополнительным характеристикам
5.3. в функции cartAddToCart перед строкой
ё
$is = GetProductInStockCount( $productID );
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($productID)) $is = GetProductInStockCount( $productID, $variants[0] );
else
#END Учет количества товара по дополнительным характеристикам
6. в файле configurator_functions.php в функции UpdateConfiguriableProductOption
6.1. перед строкой
db_query("update ".PRODUCTS_OPTIONS_SET_TABLE." set price_surplus='".
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($productID)) db_query("UPDATE ".PRODUCTS_OPTIONS_SET_TABLE." SET price_surplus=".(float)$setting[$key]["price_surplus"].", qty=".(int)$setting[$key]["qty"].$where_clause );
else
#END Учет количества товара по дополнительным характеристикам
6.2. перед строкой
db_query("insert into ".PRODUCTS_OPTIONS_SET_TABLE.
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($productID)) db_query("INSERT INTO ".PRODUCTS_OPTIONS_SET_TABLE."(productID, optionID, variantID, price_surplus, qty) VALUES ( '".(int)$productID."', '".(int)$optionID."', '".(int)$key."', '".(float)$setting[$key]["price_surplus"]."', '".(int)$setting[$key]["qty"]."')");
else
#END Учет количества товара по дополнительным характеристикам
7. в файле order_functions.php
7.1. в функции _moveSessionCartContentToOrderedCart
перед строкой
db_query( "insert into ".ORDERED_CARTS_TABLE." ( itemID, orderID, name, Price, Quantity, tax ) ".
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($productID)) db_query( "INSERT INTO ".ORDERED_CARTS_TABLE." ( itemID, orderID, name, Price, Quantity, tax, variantID ) VALUES ( ".(int)$itemID.", ".(int)$orderID.", '".xEscSQL($productComplexName)."', '".xEscSQL($price)."', ".(int)$quantity.", ".xEscSQL($tax).", ".(int)$variants[0]." ) " );
else
#END Учет количества товара по дополнительным характеристикам
7.2. в функции ordOrderProcessing
7.2.1. вместо строки
$q1 = db_query("select itemID, Quantity FROM ".ORDERED_CARTS_TABLE." WHERE orderID=".(int)$orderID);
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
#$q1 = db_query("select itemID, Quantity FROM ".ORDERED_CARTS_TABLE." WHERE orderID=".(int)$orderID);
$q1 = db_query("select itemID, Quantity, variantID FROM ".ORDERED_CARTS_TABLE." WHERE orderID=".(int)$orderID);
#END Учет количества товара по дополнительным характеристикам
7.2.2. перед строкой
db_query( "update ".PRODUCTS_TABLE." set in_stock = in_stock - ".(int)$item["Quantity"].
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($pr[0]))
{
db_query("UPDATE ".PRODUCTS_OPTIONS_SET_TABLE." SET qty = qty - ".(int)$item["Quantity"]." WHERE productID=".(int)$pr[0]." AND variantID=".(int)$item["variantID"] );
$in_stock = db_fetch_row(db_query("SELECT SUM(qty) FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=".(int)$pr[0]));
db_query("UPDATE ".PRODUCTS_TABLE." SET in_stock=".(int)$in_stock[0]." WHERE productID=".(int)$pr[0]);
# BEGIN email-on-qty-patch
if (CONF_NOTIFY_STOCKADMIN)
{
$qty = db_fetch_assoc(db_query("SELECT qty FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=".(int)$pr[0]." AND variantID=".(int)$item["variantID"]));
if ($qty['qty'] < 1)
{
$name = db_fetch_row(db_query("SELECT option_value FROM ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." WHERE variantID=".(int)$item["variantID"]));
$smarty_mail->assign( "option_value", $name["option_value"] );
$productsta = db_fetch_row(db_query("SELECT name FROM ".PRODUCTS_TABLE." WHERE productID=".(int)$pr[0]));
$smarty_mail->assign( "productstaname", $productsta["name"] );
$smarty_mail->assign( "productstid", $pr[0] );
$stockadmin = $smarty_mail->fetch( "notify_stockadmin.tpl.html" );
xMailTxtHTMLDATA(CONF_ORDERS_EMAIL,CUSTOMER_ACTIVATE_99,$stockadmin);
}
}
# END email-on-qty-patch
}
else
#END Учет количества товара по дополнительным характеристикам
8. в файле order_status_functions.php в функции _changeIn_stock
8.1. вместо строки
$q = db_query( "select itemID, Quantity from ".ORDERED_CARTS_TABLE.
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
#$q = db_query( "select itemID, Quantity from ".ORDERED_CARTS_TABLE.
$q = db_query( "select itemID, Quantity, variantID from ".ORDERED_CARTS_TABLE.
#END Учет количества товара по дополнительным характеристикам
8.2. перед строкой
db_query( "update ".PRODUCTS_TABLE." set in_stock=in_stock + ".(int)$Quantity.
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($product['productID']))
{
db_query("UPDATE ".PRODUCTS_OPTIONS_SET_TABLE." SET qty = qty + ".(int)$Quantity." WHERE productID=".(int)$product["productID"]." AND variantID=".(int)$item["variantID"] );
$in_stock = db_fetch_row(db_query("SELECT SUM(qty) FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=".(int)$product["productID"]));
db_query("UPDATE ".PRODUCTS_TABLE." SET in_stock=".(int)$in_stock[0]." WHERE productID=".(int)$product["productID"]);
}
else
#END Учет количества товара по дополнительным характеристикам
8.3. перед строкой
db_query( "update ".PRODUCTS_TABLE." set in_stock=in_stock - ".(int)$Quantity.
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($product['productID']))
{
db_query("UPDATE ".PRODUCTS_OPTIONS_SET_TABLE." SET qty = qty - ".(int)$Quantity." WHERE productID=".(int)$product["productID"]." AND variantID=".(int)$item["variantID"] );
$in_stock = db_fetch_row(db_query("SELECT SUM(qty) FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=".(int)$product["productID"]));
db_query("UPDATE ".PRODUCTS_TABLE." SET in_stock=".(int)$in_stock[0]." WHERE productID=".(int)$product["productID"]);
}
else
#END Учет количества товара по дополнительным характеристикам
9. в файле product_functions.php
9.1. в функции UpdateProduct перед строкой
db_query("delete from ".CATEGORIY_PRODUCT_TABLE." where productID = ".(int)$productID." and categoryID = ".(int)$categoryID);
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if(cisfo($productID))
{
$in_stock = db_fetch_row(db_query("SELECT SUM(`qty`) FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=$productID AND qty>0"));
db_query("UPDATE ".PRODUCTS_TABLE." SET in_stock=".(int)$in_stock[0]." WHERE productID=".(int)$productID);
}
#END Учет количества товара по дополнительным характеристикам
9.2. в функции GetExtraParametrs
9.2.1. вместо строки
$sql = 'select povvt.option_value, povvt.variantID, post.price_surplus
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
#$sql = 'select povvt.option_value, povvt.variantID, post.price_surplus
$sql = 'select povvt.option_value, povvt.variantID, post.price_surplus, post.qty
9.2.2. перед строкой
while( $_Rowue = db_fetch_assoc($q2) ){
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
$variant_count = 0;
#END Учет количества товара по дополнительным характеристикам
9.2.3. перед строкой
$_Row['values_to_select'][$i]['variantID']=$_Rowue['variantID'];
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if($cisfo = cisfo($_Row['productID']))
{
$_Row['values_to_select'][$i]['qty'] = $_Rowue['qty'];
$variant_count += $_Rowue['qty'];
}
#END Учет количества товара по дополнительным характеристикам
9.2.4. перед строкой
$ProductsExtras[$_Row['productID']][] = $_Row;
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
if($cisfo) $_Row['values_to_select_variant_count'] = $variant_count;
#END Учет количества товара по дополнительным характеристикам
9.3. в функциях prdSearchProductByTemplateAdmin и prdSearchProductByTemplate вместо строки
" product_code, description, shipping_freight, viewed_times, min_order_amount from ".PRODUCTS_TABLE." ".
вставляем
#BEGIN Учет количества товара по дополнительным характеристикам
#" product_code, description, shipping_freight, viewed_times, min_order_amount from ".PRODUCTS_TABLE." ".
" product_code, description, shipping_freight, viewed_times, min_order_amount, check_in_stock_from_options from ".PRODUCTS_TABLE." ".
#END Учет количества товара по дополнительным характеристикам
10. в файле notify_stockadmin.tpl.html
после строки
{$productstaname}<br>
вставляем
{* BEGIN Учет количества товара по дополнительным характеристикам email-on-qty-patch *}
{if $option_value}({$option_value})<br>{/if}
{* END Учет количества товара по дополнительным характеристикам email-on-qty-patch *}
11. в файле product_brief.tpl.html
вместо строки
вставляем
{* BEGIN Учет количества товара по дополнительным характеристикам *}
{* штатное *}
{*<option value='{$product_info.product_extra[i].values_to_select[j].price_surplus}:{$product_info.product_extra[i].values_to_select[j].variantID}' {if $product_info.product_extra[i].values_to_select[j].variantID eq $product_info.product_extra[i].variantID}selected{/if}>{$product_info.product_extra[i].values_to_select[j].option_value}</option>*}
{* отсутствующий на складе вариант показывается, но задизаблен *}
{*<option value='{$product_info.product_extra[i].values_to_select[j].price_surplus}:{$product_info.product_extra[i].values_to_select[j].variantID}' {if $product_info.product_extra[i].values_to_select[j].variantID eq $product_info.product_extra[i].variantID}selected{/if}{if $product_info.product_extra[i].values_to_select[j].qty == '0'} disabled{/if}>{$product_info.product_extra[i].values_to_select[j].option_value}{if $product_info.product_extra[i].values_to_select[j].qty == '0'} (нет на складе){/if}</option>*}
{* отсутствующие на складе варианты не показываются, но если нет вообще ни одного варианта на складе, то показываются все *}
{if $product_info.product_extra[i].values_to_select[j].qty != '0' || $product_info.in_stock < 1}<option value='{$product_info.product_extra[i].values_to_select[j].price_surplus}:{$product_info.product_extra[i].values_to_select[j].variantID}' {if $product_info.product_extra[i].values_to_select[j].variantID eq $product_info.product_extra[i].variantID}selected{/if}>{$product_info.product_extra[i].values_to_select[j].option_value}</option>{/if}
{* END Учет количества товара по дополнительным характеристикам *}
12. в файле product_detailed.tpl.html
вместо строки
<option value='{$product_extra[i].values_to_select[j].price_surplus}:{$product_extra[i].values_to_select[j].variantID}' {if $product_extra[i].values_to_select[j].variantID eq $product_extra[i].variantID}selected{/if}>{$product_extra[i].values_to_select[j].option_value}</option>
вставляем
{* BEGIN Учет количества товара по дополнительным характеристикам *}
{* штатное *}
{*<option value='{$product_extra[i].values_to_select[j].price_surplus}:{$product_extra[i].values_to_select[j].variantID}' {if $product_extra[i].values_to_select[j].variantID eq $product_extra[i].variantID}selected{/if}>{$product_extra[i].values_to_select[j].option_value}</option>*}
{* отсутствующий на складе вариант показывается, но задизаблен *}
{*<option value='{$product_extra[i].values_to_select[j].price_surplus}:{$product_extra[i].values_to_select[j].variantID}' {if $product_extra[i].values_to_select[j].variantID eq $product_extra[i].variantID}selected{/if}{if $product_extra[i].values_to_select[j].qty == '0'} disabled{/if}>{$product_extra[i].values_to_select[j].option_value}{if $product_extra[i].values_to_select[j].qty == '0'} (нет на складе){/if}</option>*}
{* отсутствующие на складе варианты не показываются, но если нет вообще ни одного варианта на складе, то показываются все *}
{if $product_extra[i].values_to_select[j].qty != '0' || $product_info.in_stock < 1}<option value='{$product_extra[i].values_to_select[j].price_surplus}:{$product_extra[i].values_to_select[j].variantID}' {if $product_extra[i].values_to_select[j].variantID eq $product_extra[i].variantID}selected{/if}>{$product_extra[i].values_to_select[j].option_value}</option>{/if}
{* END Учет количества товара по дополнительным характеристикам *}
13. Заходим в админке в "Каталог товаров". При этом создадутся новые поля в таблицах, необходимые для работы модуля.
-------------