Спасибо, тоже очень пригодилось. Предложу несколько другой вариант, при котором в прайсе нет понятия "доступность", а все что в нем есть,подразумевает товар в наличии, товары же, которых в прайсе нет - подразумеваются, что в наличии нет, то есть, отключаются (легко переделать,чтобы не отключались, а становились "под заказ").
Также, если товар в базе не найден, выдается не ошибка, а заводится новый товар и кладется в соответствующую категорию. Для этого, чтобы это правильно работало, в прайсе категории не должны иметь цену (в большинстве случаях это именно так), все категории должны иметь уникальные имена, и существовать уже в базе данных (последнее также не сложно дополнить,чтобы новые категории создавались автоматически).
Разумеется, при такой схеме, прайс должен содержать наименования товаров и категорий.
В файле modules_xls_sync.php , заменим
if(!defined('CONF_XLS_SINCRO_STOCK'))
db_query("INSERT ".SETTINGS_TABLE." SET
settings_groupID=98,
settings_constant_name='CONF_XLS_SINCRO_STOCK',
settings_value='C',
settings_title='Колонка наличия товара',
settings_description='Укажите буквенное имя колонки с наличием товара (например, C) или оставьте это поле пустым.',
settings_html_function='setting_TEXT_BOX(0,',
sort_order=3");
на
if(!defined('CONF_XLS_SINCRO_NAME'))
db_query("INSERT ".SETTINGS_TABLE." SET
settings_groupID=98,
settings_constant_name='CONF_XLS_SINCRO_NAME',
settings_value='C',
settings_title='Колонка наименования товара',
settings_description='Укажите буквенное имя колонки с наименованием (например, C) или оставьте это поле пустым.',
settings_html_function='setting_TEXT_BOX(0,',
sort_order=3");
заменим
elseif (strlen($_POST['settingCONF_XLS_SINCRO_STOCK']) > 1) $result = '<span style="color:red">Ошибка! Имя колонки наличия товара должно содержать одну букву или быть пустым!"</span>';
на
elseif (strlen($_POST['settingCONF_XLS_SINCRO_NAME']) > 1) $result = '<span style="color:red">Ошибка! Колонка наименования должна содержать одну букву или быть пустой!"</span>';
заменим
{return !(strpos(strtoupper($_POST['settingCONF_XLS_SINCRO_CODE'].$_POST['settingCONF_XLS_SINCRO_PRICE'].$_POST['settingCONF_XLS_SINCRO_STOCK']),$column) === false);}
на
{return !(strpos(strtoupper($_POST['settingCONF_XLS_SINCRO_CODE'].$_POST['settingCONF_XLS_SINCRO_PRICE'].$_POST['settingCONF_XLS_SINCRO_NAME']),$column) === false);}
заменим
$stock = strtoupper($_POST['settingCONF_XLS_SINCRO_STOCK']);
на
$name = strtoupper($_POST['settingCONF_XLS_SINCRO_NAME']);
заменим
foreach ($xls as $row)
на
foreach ($xls as $key =>$row)
После строки
$row = array_map('u2w', $row);
Вставим :
$row[$code] = (int)$row[$code];
if ($row[$price] > 0) $in_price[]= $row[$code];
if ($row[$price] == '' && $row[$name] != '' && $xls[$key+1][CONF_XLS_SINCRO_PRICE] > 0) $category= $row[$name];
Строку :
if (!trim($row[$code])) $result .= '<span style="color:red">Ошибка! Пустой код товара</span><br>';
else
Заменим на :
if (!trim($row[$code])) $result .= '<span style="color:red">Ошибка! Пустой код товара</span><br>';
elseif ($row[$price] > 0 && $row[$name] != '')
Строку :
if (count($r) == 0)
$result .= '<span style="color:red">Ошибка! Товар с кодом </span><b>'.$row[$code].'</b><span style="color:red"> не найден!</span><br>';
Заменим на :
if (count($r) == 0 && $row[$price] > 0 && $row[$name] != '') {
$result .= '<span style="color:green">Новый товар! Товар с кодом </span><b>'.$row[$code].' ('.$row[$name].')</b><span style="color:green"> добавлен</span><br>';
if (!$_POST['settingCONF_XLS_SINCRO_TEST']) {
$cat = db_fetch_row(db_query("select categoryID from ".DB_PRFX."categories where name='".$category."'"));
$categoryID = $cat['categoryID'];
db_query("INSERT INTO ".PRODUCTS_TABLE.
" ( categoryID, name, description,".
" customers_rating, Price,".
" customer_votes, items_sold, enabled, ".
" list_price, ".
" product_code, sort_order, date_added, ".
" eproduct_filename, eproduct_available_days, ".
" eproduct_download_times, ".
" weight, meta_description, meta_keywords, ".
" free_shipping, min_order_amount, shipping_freight, classID, title ".
" ) ".
" VALUES (".
(int)$categoryID.",'".
xToText(trim($row[$name]))."','".
xEscSQL($description)."', ".
"0, '".
(double)$row[$price]."', ".
" 0, 0, 1, '".
(double)$row[$price]."', '".
xToText(trim($row[$code]))."', ".
(int)$sort_order.", '".
xEscSQL(get_current_time())."', '".
xEscSQL($eproduct_filename)."', ".
(int)$eproduct_available_days.", ".
(int)$eproduct_download_times.", ".
(float)$weight.", ".
"'".xToText(trim($meta_description))."', ".
"'".xToText(trim($meta_keywords))."', ".
(int)$free_shipping.", ".
(int)$min_order_amount.", ".
(double)$shipping_freight.", ".
(int)$classID.", '".
xToText(trim($row[$name]))."' ".
");" );
}
}
Строки
if ($stock)
{
if (trim($row[$stock]) == "Да" && $r[0]['enabled'] == 0)
{
if (!$_POST['settingCONF_XLS_SINCRO_TEST']) db_query("UPDATE ".PRODUCTS_TABLE." SET enabled=1 WHERE product_code='".trim($row[$code])."'");
$result .= '<span style="color:green">Изменение статуса! Товар с кодом </span><b>'.$row[$code].' ('.$r[0]['name'].')</b><span style="color:green"> включен</span><br>';
}
elseif (trim($row[$stock]) == "Нет" && $r[0]['enabled'] == 1)
{
if (!$_POST['settingCONF_XLS_SINCRO_TEST']) db_query("UPDATE ".PRODUCTS_TABLE." SET enabled=0 WHERE product_code='".trim($row[$code])."'");
$result .= '<span style="color:green">Изменение статуса! Товар с кодом </span><b>'.$row[$code].' ('.$r[0]['name'].')</b><span style="color:grey"> выключен</span><br>';
}
else
$result .= '<span style="color:grey">Товар с кодом </span><b>'.$row[$code].' ('.$r[0]['name'].')</b><span style="color:grey"> статус не изменил</span><br>';
}
Заменим на :
if ($r[0]['enabled'] == 0)
{
if (!$_POST['settingCONF_XLS_SINCRO_TEST']) db_query("UPDATE ".PRODUCTS_TABLE." SET enabled=1 WHERE product_code='".trim($row[$code])."'");
$result .= '<span style="color:green">Изменение статуса! Товар с кодом </span><b>'.$row[$code].' ('.$r[0]['name'].')</b><span style="color:green"> включен</span><br>';
}
else $result .= '<span style="color:grey">Товар с кодом </span><b>'.$row[$code].' ('.$r[0]['name'].')</b><span style="color:grey"> статус не изменил</span><br>';
Если я не ошибаюсь До четвертого закрывающего знака }, если считать снизу вверх (проще говоря, там где заканчивается цикл), вставляем :
$in_price = implode(",", $in_price);
if (!$_POST['settingCONF_XLS_SINCRO_TEST']) db_query("UPDATE ".PRODUCTS_TABLE." SET enabled=0 WHERE product_code NOT IN ($in_price)
");