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


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

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


Модуль "Подарки к заказу"


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

#1 badisoft

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

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

Отправлено 21 мая 2014 - 12:04

Модуль Подарки к заказу позволяет прямо в корзине добавлять к заказу некоторые товары по нулевой или сниженной цене.

Спонсор модуля: paramosha

Список доступных для добавления товаров и условия их добавления формируются в админке и выглядят как таблица вида:
Сумма_заказа|Цена_товара|Лимит|Название_товара
4000	    |200	    |1    |Кружка
4000	    |0		  |2    |Стакан
5000	    |100	    |0    |Кружка
6000	    |0		  |3    |Кружка

[3] Общий лимит
Т.е. при заказе в 4000руб (или какая там у кого дефолтовая валюта) можно прихалявить стакан либо прикупить кружку за 200руб,
при заказе в 5000руб кружку можно будет добавить уже за 100руб, а при заказе в 6000руб - бесплатно.
Но в количестве для каждого товара не более, чем лимит и суммарно не более, чем общий лимит.
Если лимит 0, то количество не ограничено (точнее, ограничено количеством товара на складе, если учет по складу включен).

Другими словами, можно создать список подарков и товаров со скидкой, доступность которых будет плясать от суммы товара в корзине.
При изменении средствами корзины количества товара, удалении товара и добавлении "подарка" список доступных товаров перерасчитывается.
Перерасчитывается и список уже добавленных товаров, так что набрать товара на 100500руб, добавить к нему мешок подарков, а затем удалить товар не получится :).

Добавление товара в список "подарков" происходит так же, как и в "Спецпредложения".

Установка:
----------

1. копируем файлы

modules_present.php -> core/includes/admin/sub/
modules_present.tpl.html -> core/tpl/admin/
shopping_cart_present.tpl.html -> core/tpl/user/[шаблон]/


2. в файле default.tpl.html перед строкой

<div class="marg"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&amp;sub=yandex">{$smarty.const.ADMIN_STRING_YANDEX}</a></div>

вставляем

{* BEGIN present *}
<div class="marg"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&amp;sub=present">Подарки к заказу</a></div>
{* END present *}


3. в файле core/tpl/admin/menu.tpl.html перед строкой

<table class="adn topj"><tr><td><img src="data/admin/drs.gif" alt=""></td><td width="100%"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&amp;sub=yandex">{$smarty.const.ADMIN_STRING_YANDEX}</a></td></tr></table>

вставляем

{* BEGIN present *}
<table class="adn topj"><tr><td><img src="data/admin/drs.gif" alt=""></td><td width="100%"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&amp;sub=present">Подарки к заказу</a></td></tr></table>
{* END present *}


4. в файле core/includes/admin/modules.php перед строкой

array("id"=>"yandex", "name"=>"Яндекс.Маркет" )


вставляем

# BEGIN present
array("id"=>"present", "name"=>"Подарки к заказу"),
# END present



5. в файле catalog_products_categories.tpl.html

5.1. после

<td align="center">{$smarty.const.ADMIN_SPECIAL}</td>

вставляем

{* BEGIN presents *}
<td align="center">Present</td>
{* END presents *}

5.2. после

<td align="center">{if $products[i].picture_count ne 0}<a href="{$smarty.const.ADMIN_FILE}?dpt=catalog&amp;sub=special&amp;new_offer={$products[i].productID}" title="{$smarty.const.ADMIN_ADMIN_MENUNEW7}" {if !$products[i].enabled}class="greyy"{/if}>+</a>{else}&nbsp;{/if}</td>

вставляем

{* BEGIN presents *}
<td align="center"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&amp;sub=present&amp;new={$products[i].productID}" title="Отправить в подарки к заказу" {if !$products[i].enabled}class="greyy"{/if}>+</a></td>
{* END presents *}


6. в файле shopping_cart.tpl.html

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

<input type="text" name="count_{$cart_content[i].id}" size=5 value="{$cart_content[i].quantity}">

вставляем

{* BEGIN Present *}
{if $cart_content[i].presentID}{$cart_content[i].quantity}{else}
{* END Present *}

а после нее

{* BEGIN Present *}
{/if}
{* END Present *}

6.2. перед строками

{if $this_is_a_popup_cart_window}
{* корректировка высоты окна корзины *}

вставляем

{* BEGIN Present *}
{include file="shopping_cart_present.tpl.html"}
{* END Present *}


7. в файле shopping_cart.php

после строки

$resCart = cartGetCartContent();


вставляем

# BEGIN Present
$presents_base = $resCart['saled_total'] - $resCart['presents_total'];
if (isset($_GET['present']))
    {
    $present = db_fetch_assoc(db_query("SELECT * FROM ".DB_PRFX."presents WHERE presentID=".(int)$_GET["present"]));
    if ($present['total'] <= $presents_base) cartAddToCart($present['productID'], array(-1,$present['presentID']));
    Redirect( $cart_reguest."&shopping_cart=yes" );
    }
$qty_all_presents = 0;
foreach ($resCart["cart_content"] as $product)
    if ($product['presentID'] > 0)
	    $qty_all_presents += $product['quantity'];
$presents = array();
$data = db_query("SELECT * FROM ".DB_PRFX."presents WHERE enable=1 ORDER BY total");
while ($row = db_fetch_assoc($data))
    {
    $row['addon'] = show_price($row['total'] - $presents_base);
    $row['price'] = show_price($row['price']);
    $prod = db_fetch_assoc(db_query("SELECT name, in_stock, default_picture FROM ".PRODUCTS_TABLE." WHERE productID=".$row['productID']." LIMIT 1"));
    $row['name'] = $prod['name'];
    if ($prod['default_picture'])
	    {
	    $pic = db_fetch_assoc(db_query("SELECT filename FROM ".PRODUCT_PICTURES." WHERE photoID=".$prod['default_picture']." LIMIT 1"));
	    $row['picture'] = "data/small/".$pic['filename'];
	    }
    else $row['picture'] = 'data/empty.gif';
    $qty_total = 0;
    $qty_present = 0;
    foreach ($resCart["cart_content"] as $product)
	    {
	    if ($product['productID'] == $row['productID'])
		    {
		    $qty_total += $product['quantity'];
		    if ($product['presentID'] == $row['presentID']) $qty_present += $product['quantity'];
		    }
	    }
    $row['closetype'] = 0;
    if (CONF_CHECKSTOCK && $qty_total >= $prod['in_stock'])					  $row['closetype'] = 4;
    elseif ($row['lim'] > 0 && $qty_present >= $row['lim'])					  $row['closetype'] = 3;
    elseif (CONF_PRESENTS_LIMIT > 0 && $qty_all_presents >= CONF_PRESENTS_LIMIT) $row['closetype'] = 2;
    elseif ($row['total'] > $presents_base)									  $row['closetype'] = 1;
    if (   (CONF_PRESENTS_SHOW1 || $row['closetype'] != 1)
	    && (CONF_PRESENTS_SHOW2 || $row['closetype'] != 2)
	    && (CONF_PRESENTS_SHOW3 || $row['closetype'] != 3)
	    && (CONF_PRESENTS_SHOW4 || $row['closetype'] != 4))
	    $presents[] = $row;
    }
$smarty->assign("presents", $presents );
# END Present



8. в файле cart.php

вместо строк

$t = db_query("select Price FROM ".PRODUCTS_TABLE." WHERE productID=".( int ) $_SESSION["gids"][$i]);
$rr = db_fetch_row($t);
$sum = $rr["Price"];
// $rr["Price"]
foreach ( $_SESSION["configurations"][$i] as $varconf ) {
    $q1 = db_query("select price_surplus from ".PRODUCTS_OPTIONS_SET_TABLE." where variantID=".( int ) $varconf." AND productID=".( int ) $_SESSION["gids"][$i]);
    $r1 = db_fetch_row($q1);
    $sum += $r1["price_surplus"];
}


вставляем

# BEGIN Present
/*
$t = db_query("select Price FROM ".PRODUCTS_TABLE." WHERE productID=".( int ) $_SESSION["gids"][$i]);
$rr = db_fetch_row($t);
$sum = $rr["Price"];
// $rr["Price"]
foreach ( $_SESSION["configurations"][$i] as $varconf ) {
    $q1 = db_query("select price_surplus from ".PRODUCTS_OPTIONS_SET_TABLE." where variantID=".( int ) $varconf." AND productID=".( int ) $_SESSION["gids"][$i]);
    $r1 = db_fetch_row($q1);
    $sum += $r1["price_surplus"];
}
*/
$sum = GetPriceProductWithOption($_SESSION["configurations"][$i],$_SESSION["gids"][$i]);
# END Present



9. в файле shopping_cart_info.php

вместо строк

$t = db_query("select Price FROM ".PRODUCTS_TABLE." WHERE productID=".(int)$_SESSION["gids"][$i]);
$rr = db_fetch_row($t);
$sum=$rr["Price"];
// $rr["Price"]
foreach( $_SESSION["configurations"][$i] as $vars )
    {
    $q1=db_query("select price_surplus from ".PRODUCTS_OPTIONS_SET_TABLE.
	    " where variantID=".(int)$vars." AND productID=".(int)$_SESSION["gids"][$i]);
    $r1=db_fetch_row($q1);
    $sum+=$r1["price_surplus"];
    }


вставляем

# BEGIN Present
/*
$t = db_query("select Price FROM ".PRODUCTS_TABLE." WHERE productID=".(int)$_SESSION["gids"][$i]);
$rr = db_fetch_row($t);
$sum=$rr["Price"];
// $rr["Price"]
foreach( $_SESSION["configurations"][$i] as $vars )
    {
    $q1=db_query("select price_surplus from ".PRODUCTS_OPTIONS_SET_TABLE.
	    " where variantID=".(int)$vars." AND productID=".(int)$_SESSION["gids"][$i]);
    $r1=db_fetch_row($q1);
    $sum+=$r1["price_surplus"];
    }
*/
$sum = GetPriceProductWithOption($_SESSION["configurations"][$i],$_SESSION["gids"][$i]);
# END Present



10. в файле cart_functions.php

10.0. в функции GetConfigurationByItemId вместо

SHOPPING_CART_ITEMS_CONTENT_TABLE." where itemID=".(int)$itemID);


вставляем

# BEGIN Present
#SHOPPING_CART_ITEMS_CONTENT_TABLE." where itemID=".(int)$itemID);
SHOPPING_CART_ITEMS_CONTENT_TABLE." where itemID=".(int)$itemID." ORDER BY variantID");
# END Present



10.1. в функции GetStrOptions в самое начало вставляем

# BEGIN Present
if (isset($variants[0]) && $variants[0] == -1)
    {
    $present = db_fetch_assoc(db_query("SELECT price FROM ".DB_PRFX."presents WHERE presentID=".$variants[1]));
    return $present['price']?'снижение цены':'подарок';
    }
# END Present


10.2. в функции GetPriceProductWithOption в самое начало вставляем

# BEGIN Present
if (isset($variants[0]) && $variants[0] == -1)
    {
    $present = db_fetch_assoc(db_query("SELECT price FROM ".DB_PRFX."presents WHERE presentID=".$variants[1]));
    return $present['price'];
    }
# END Present


10.3. в функции cartGetCartContent

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

$q = db_query("select itemID, Quantity FROM ".SHOPPING_CARTS_TABLE.


вставляем

# BEGIN Present
$customerID=regGetIdByLogin($_SESSION["log"]);
$data = db_fetch_assoc(db_query("SELECT COUNT(*) AS count FROM ".SHOPPING_CARTS_TABLE." WHERE customerID=$customerID"));
if ($data['count'])
    {
// удалим презенты, если клиент увеличивает количество товара в заказе больше, чем есть на складе
// (один и тот же товар есть и в заказах, и в презентах).
    if (CONF_CHECKSTOCK)
	    {
	    $data = db_query("SELECT itemID, Quantity, productID FROM ".SHOPPING_CARTS_TABLE.
							    " JOIN ".SHOPPING_CART_ITEMS_TABLE." USING (itemID)".
							    " WHERE customerID=$customerID");
	    while ($row = db_fetch_assoc($data))
		    {
		    $row['present'] = in_array(-1,GetConfigurationByItemId($row['itemID']));
		    $prds[$row['productID']]['in_order'] += $row['Quantity'];
		    $prds[$row['productID']]['item'][] = $row;
		    }
	    foreach ($prds as $prdID => $prd)
		    {
		    $overstock = $prd['in_order'] - max(0,GetProductInStockCount($prdID));
		    if ($overstock > 0)
			    {
			    uksort($prd['item'],'PresentsCMP');
			    foreach($prd['item'] as $item)
				    {
				    if ($item['Quantity'] <= $overstock)
					    {
					    db_query("DELETE FROM ".SHOPPING_CARTS_TABLE." WHERE itemID=".$item['itemID']);
					    db_query("DELETE FROM ".SHOPPING_CART_ITEMS_TABLE." WHERE itemID=".$item['itemID']);
					    db_query("DELETE FROM ".SHOPPING_CART_ITEMS_CONTENT_TABLE." WHERE itemID=".$item['itemID']);
					    $overstock -= $item['Quantity'];
					    if ($overstock = 0) break;
					    }
				    else
					    {
					    db_query("UPDATE ".SHOPPING_CARTS_TABLE." SET Quantity=Quantity-$overstock WHERE itemID=".$item['itemID']);
					    break;
					    }
				    }
			    }
		    }
	    }

// удалим презенты, превышающие "норматив", если хитрый клиент набрал презентов,
// а затем удалил нормальный товар или уменьшил его количество.
    $saled_total = 0;
    $presents_total = 0;
    $pID = array();

    $data = db_query("SELECT itemID, Quantity, productID, variantID FROM ".SHOPPING_CARTS_TABLE.
							    " JOIN ".SHOPPING_CART_ITEMS_TABLE." USING (itemID)".
							    " JOIN ".SHOPPING_CART_ITEMS_CONTENT_TABLE." USING (itemID)".
							    " WHERE customerID=$customerID GROUP BY itemID");

    while ($prd = db_fetch_assoc($data))
	    {
	    if ($prd['variantID'] < 0)
		    {
		    $variants=GetConfigurationByItemId($prd['itemID']);
		    $present = db_fetch_assoc(db_query("SELECT total FROM ".DB_PRFX."presents WHERE presentID=".$variants[1]));
		    $presents_total += $present['total'] * $prd['Quantity'];
		    $pID[] = $variants[1];
		    }
	    else $saled_total += GetPriceProductWithOption(GetConfigurationByItemId($prd['itemID']), $prd['productID']) * $prd['Quantity'];
	    }

    while ($presents_total > $saled_total)
	    {
	    $presents = db_fetch_assoc(db_query("SELECT presentID, total FROM ".DB_PRFX."presents WHERE presentID IN(".implode(',',$pID).") ORDER BY total LIMIT 1"));
	    $data = db_query("SELECT itemID, Quantity FROM ".SHOPPING_CARTS_TABLE." WHERE customerID=$customerID");
	    while ($prd = db_fetch_assoc($data))
		    {
		    $variants=GetConfigurationByItemId($prd['itemID']);
		    if (isset($variants[0]) && $variants[0] == -1 && $variants[1] == $presents['presentID'])
			    {
			    if ($prd['Quantity']>1) db_query("UPDATE ".SHOPPING_CARTS_TABLE." SET Quantity=Quantity-1 WHERE itemID=".$prd['itemID']);
			    else
				    {
				    db_query("DELETE FROM ".SHOPPING_CARTS_TABLE." WHERE itemID=".$prd['itemID']);
				    db_query("DELETE FROM ".SHOPPING_CART_ITEMS_TABLE." WHERE itemID=".$prd['itemID']);
				    db_query("DELETE FROM ".SHOPPING_CART_ITEMS_CONTENT_TABLE." WHERE itemID=".$prd['itemID']);
				    $tmp = $pID;
				    $pID = array();
				    foreach($tmp as $val) if ($val != $presents['presentID']) $pID[] = $val;
				    }
			    $presents_total -= $presents['total'];
			    }
		    }
	    }
    }
# END Present



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

"productID" =>  $product["productID"],


вставляем

# BEGIN Present
"presentID" => (isset($variants[0]) && $variants[0] == -1)?$variants[1]:0,
# END Present


10.3.3. перед строками

//shopping cart items count
if ( isset($_SESSION["gids"]) )


вставляем

# BEGIN Present
$saled_total = 0;
$presents_total = 0;
if (isset ($_SESSION["gids"]))
    {
// удалим презенты, если клиент увеличивает количество товара в заказе больше, чем есть на складе
// (один и тот же товар есть и в заказах, и в презентах).
    if (CONF_CHECKSTOCK)
	    {
	    foreach ($_SESSION["gids"] as $key => $prdID)
		    {
		    if ($prdID) // насколько я помню, в каком-то случае элемент массива может быть равен нулю. Штатное удаление строки в корзине?
			    {
			    $prds[$prdID]['in_order'] += $_SESSION["counts"][$key];
			    $prds[$prdID]['item'][] = array('present'   => in_array(-1,$_SESSION["configurations"][$key]),
											    'key'	   => $key,
											    'Quantity'  => $_SESSION["counts"][$key]);
			    }
		    }
	    foreach ($prds as $prdID => $prd)
		    {
		    $overstock = $prd['in_order'] - max(0,GetProductInStockCount($prdID));
		    if ($overstock > 0)
			    {
			    uksort($prd['item'],'PresentsCMP');
			    foreach($prd['item'] as $item)
				    {
				    if ($item['Quantity'] <= $overstock)
					    {
					    array_splice($_SESSION["gids"],$item['key'],1);
					    array_splice($_SESSION["counts"],$item['key'],1);
					    array_splice($_SESSION["configurations"],$item['key'],1);
					    $overstock -= $item['Quantity'];
					    if ($overstock = 0) break;
					    }
				    else
					    {
					    $_SESSION["counts"][$item['key']] -= $overstock;
					    break;
					    }
				    }
			    }
		    }
	    }

// удалим презенты, превышающие "норматив", если хитрый клиент набрал презентов,
// а затем удалил нормальный товар или уменьшил его количество.
    foreach ($_SESSION["gids"] as $key => $prdID)
	    {
	    if ($prdID)
		    {
		    if (isset($_SESSION["configurations"][$key][0]) && $_SESSION["configurations"][$key][0] == -1)
			    {
			    $row = db_fetch_assoc(db_query("SELECT total FROM ".DB_PRFX."presents WHERE presentID=".$_SESSION["configurations"][$key][1]." LIMIT 1"));
			    $presents_total += $row['total']*$_SESSION["counts"][$key];
			    }
		    else
			    {
			    $saled_total += GetPriceProductWithOption($_SESSION["configurations"][$key],$_SESSION["gids"][$key])*$_SESSION["counts"][$key];
			    }
		    }
	    }
    while ($presents_total > $saled_total)
	    {
	    $pID = array();
	    foreach ($_SESSION["configurations"] as $key => $var)
		    if (isset($var[0]) && $var[0] == -1)
			    $pID[$key] = $var[1];

	    $row = db_fetch_assoc(db_query("SELECT presentID, total FROM ".DB_PRFX."presents WHERE presentID IN(".implode(',',$pID).") ORDER BY total LIMIT 1"));
	    foreach ($pID as $key => $presentID)
		    {
		    if ($presentID == $row['presentID'])
			    {
			    if ($_SESSION["counts"][$key]>1) $_SESSION["counts"][$key]--; // уменьшаем количество презентов на единицу
			    else // стираем презент из массивов
				    {
				    array_splice($_SESSION["gids"],$key,1);
				    array_splice($_SESSION["counts"],$key,1);
				    array_splice($_SESSION["configurations"],$key,1);
				    }
			    $presents_total -= $row['total'];
			    }
		    }
	    }
    }
# END Present


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

"productID"	    =>  $_SESSION["gids"][$j],


вставляем

# BEGIN Present
"presentID" => (isset($_SESSION["configurations"][$j][0]) && $_SESSION["configurations"][$j][0] == -1)?$_SESSION["configurations"][$j][1]:0,
# END Present


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

"cart_content"	    => $cart_content,


вставляем

# BEGIN Present
"saled_total" => $saled_total,
"presents_total" => $presents_total,
# END Present


10.4. куда-нибудь в конец вставляем

# BEGIN Present
function PresentsCMP($a, $B)
{
	   return $a['presents'] == $b['presents']?0:($a['presents'] > $b['presents']?-1:1);
}
# END Present

------------------

После всего этого в админке в разделе "Модули" появится новый модуль "Подарки к заказу".
Уровень доступа к этому модулю "Общие настройки" (это для тех, у кого кроме админов с полным доступом и клиентов есть еще пользователи с разными уровнями доступа в админке).

Прикрепленные файлы

  • Прикрепленный файл  1.JPG   79,22К   135 Количество загрузок:
  • Прикрепленный файл  2.JPG   55,01К   139 Количество загрузок:
  • Прикрепленный файл  Presents.zip   97,41К   27 Количество загрузок:

http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#2 sborka96

    Новичок

  • Download User
  • Pip
  • 5 сообщений
Репутация: 0
Начинающий

Отправлено 21 мая 2014 - 17:15

Модуль шикарный! Но у меня почему то происходит следующее:
Задаю Сумму заказа в модуле - 3000 руб
Ставлю Цену товара в модуле - 10000 руб
Лимит - 2
Иду тестировать -> делаю заказ на сумму 4000 рублей -> пишет следующее: Для получения этого товара по цене 10 000.0руб. в корзине не хватает 3 000.0руб.
И так на любой заказ, хоть 100 рублей, хоть 47 000 рублей. Пишет, что ему не хватает заданной суммы в модуле в любом случае

#3 badisoft

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

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

Отправлено 21 мая 2014 - 19:03

 sborka96 сказал:

Модуль шикарный! Но у меня почему то происходит следующее:
Как всегда, тут два варианта - либо у меня где-то ошибка, либо Вы что-то не так сделали. Обычно вносят не все требуемые правки.
Вариант, что ЭТА ошибка у меня маловероятен. Хотя всякое бывает :).

Алгоритм написания моих модулей следующий:
1. пишется модуль на тестовом сайте А.
2. пишется инструкция по установке модуля исходя из написанного.
3. модуль по инструкции устанавливается на сайт Б и проверяется на работоспособность.
4. модуль по инструкции устанавливается заказчику.

Этот модуль в описанной Вами ситуации совершенно нормально работает на сайте Б (собственно, скриншоты с него и взяты) и на сайте заказчика.

Предлагаю логичную, на мой взгляд, схему решения проблемы. Вы даете мне (в личку) ftp-доступ к сайту, где этот модуль не работает, а я разбираюсь почему это происходит. Если это моя ошибка, то решение будет бесплатным. Если это Ваша ошибка, то решение проблемы обойдется Вам в 500руб.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#4 sborka96

    Новичок

  • Download User
  • Pip
  • 5 сообщений
Репутация: 0
Начинающий

Отправлено 22 мая 2014 - 08:29

И как всегда все оказалось просто - Браузер-кеш. Проверил на других браузерах и устройствах (PC и телефоны) - все работает отлично!

#5 GiantCherry

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

  • Assistent vsupport.ru
  • PipPipPip
  • 67 сообщений
Репутация: 1
Начинающий
  • ГородСанкт-Петербург

Отправлено 13 ноября 2014 - 17:30

Огромное спасибо за модуль. Весьма интересная идея.

#6 badisoft

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

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

Отправлено 13 ноября 2014 - 18:07

В текущей версии есть ошибка - при попытке удаления товара из корзины не зарегистрированным клиентом возникает замкнутый цикл, ведущий к вылету сайта по таймауту (нет ответа). Все никак не доходят руки выложить исправление, которое давно сделано.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#7 GiantCherry

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

  • Assistent vsupport.ru
  • PipPipPip
  • 67 сообщений
Репутация: 1
Начинающий
  • ГородСанкт-Петербург

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

 badisoft (13 ноября 2014 - 18:07) писал:

В текущей версии есть ошибка - при попытке удаления товара из корзины не зарегистрированным клиентом возникает замкнутый цикл, ведущий к вылету сайта по таймауту (нет ответа). Все никак не доходят руки выложить исправление, которое давно сделано.

Выложите пожалуйста фикс данной баги.

Подскажите, данный модуль совместим с этим: http://vsupport.ru/f...BA%D0%BD%D0%B5/ ?

#8 badisoft

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

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

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

 GiantCherry сказал:

Выложите пожалуйста фикс данной баги.
Выложил. В чем отличие от исходной инструкции (в чем исправление ошибки) я уже не помню, а искать надобности не вижу. Кому надо - найдет.

 GiantCherry сказал:

Подскажите, данный модуль совместим с этим: http://vsupport.ru/f...BA%D0%BD%D0%B5/ ?
Не знаю. Никогда не ставил этот модуль. Не представляю, как он там устроен и работает, что меняется.

Прикрепленные файлы

  • Прикрепленный файл  install.txt   19,14К   8 Количество загрузок:

http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#9 GiantCherry

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

  • Assistent vsupport.ru
  • PipPipPip
  • 67 сообщений
Репутация: 1
Начинающий
  • ГородСанкт-Петербург

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

Ну отличия найти не очень сложно. :) Я нашел за 2 секунды.

#10 badisoft

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

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

Отправлено 13 ноября 2014 - 21:17

 GiantCherry сказал:

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

#11 GiantCherry

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

  • Assistent vsupport.ru
  • PipPipPip
  • 67 сообщений
Репутация: 1
Начинающий
  • ГородСанкт-Петербург

Отправлено 14 ноября 2014 - 09:32

Найти:
if (isset ($_SESSION["gids"]))
    {
// удалим презенты, если клиент увеличивает количество товара в заказе больше, чем есть на складе
// (один и тот же товар есть и в заказах, и в презентах).
    if (CONF_CHECKSTOCK)
	    {
	    foreach ($_SESSION["gids"] as $key => $prdID)
		    $qty[$prdID]['in_order'] += $_SESSION["counts"][$key];

Заменить на:
if (isset ($_SESSION["gids"]))
    {
// удалим презенты, если клиент увеличивает количество товара в заказе больше, чем есть на складе
// (один и тот же товар есть и в заказах, и в презентах).
    if (CONF_CHECKSTOCK)
	    {
	    foreach ($_SESSION["gids"] as $key => $prdID)
		    if ($prdID)
			    $qty[$prdID]['in_order'] += $_SESSION["counts"][$key];

Найти:
// удалим презенты, превышающие "норматив", если хитрый клиент набрал презентов,
// а затем удалил нормальный товар или уменьшил его количество.
    foreach ($_SESSION["gids"] as $key => $prdID)
	    {
	    if ($_SESSION["gids"][$key])
		    {

Заменить на:
// удалим презенты, превышающие "норматив", если хитрый клиент набрал презентов,
// а затем удалил нормальный товар или уменьшил его количество.
    foreach ($_SESSION["gids"] as $key => $prdID)
	    {
	    if ($prdID)
		    {


#12 badisoft

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

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

Отправлено 16 ноября 2014 - 16:48

Спасибо! Кому-то может помочь.

PS. Благодаря Вашим "Найти/Заменить" я вспомнил, в чем там суть ошибки была.
Реально нужно только первое ""Найти/Заменить", оно и исправляет ошибку.
Второе - оно так, для красоты, т.к. в контексте
foreach ($_SESSION["gids"] as $key => $prdID)

строки
if ($_SESSION["gids"][$key])

и
if ($prdID)

практически идентичны.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#13 etdnepr

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

  • Download User
  • PipPipPip
  • 101 сообщений
Репутация: 0
Начинающий

Отправлено 30 декабря 2014 - 23:53

Спасибо за модуль!
Подскажите пожалуйста, у меня такой баг вылез:
если покупатель незарегистрированный - все ОК, а если зарегистрированный - не работает. Сумма, необходимая для получения презента (она же указана в адимнке), не изменяется независимо от суммы заказа.

#14 badisoft

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

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

Отправлено 31 декабря 2014 - 02:17

 etdnepr сказал:

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

Может, Вы не совсем верно произвели инсталляцию модуля.
Может, Ваш сайт уже настолько далек от дефолтового, что инструкция по инсталляции модуля уже не подходит.
Может, действительно, вылезла еще одна ошибка, которая проявляется в какой-то специфической конфигурации, которая не складывалась пока ни у одного пользователя модуля.

Я как автор модуля могу подсказать только одно - велком в личку. Скорее всего, я решу вашу проблему, но это будет за деньги.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#15 etdnepr

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

  • Download User
  • PipPipPip
  • 101 сообщений
Репутация: 0
Начинающий

Отправлено 01 января 2015 - 21:32

Сумма и на самом деле меняется, но только пока пользователь не авторизован. Попробую переинсталлить вначале ))

Переинсталил... Таки не помогло

#16 Salp

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

  • Assistent vsupport.ru
  • PipPipPip
  • 207 сообщений
Репутация: 54
Продвинутый

Отправлено 16 февраля 2015 - 20:13

 GiantCherry (13 ноября 2014 - 19:27) писал:

Подскажите, данный модуль совместим с этим: http://vsupport.ru/f...BA%D0%BD%D0%B5/ ?
Попробую совместить, хотя у меня это модальное окошко уже порядком переписано.

#17 Salp

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

  • Assistent vsupport.ru
  • PipPipPip
  • 207 сообщений
Репутация: 54
Продвинутый

Отправлено 16 февраля 2015 - 22:42

Итак, совместно с модальной корзиной работает.
Интеграция в саму плавающую корзину тоже работает. Не совсем так, как хотелось, но работает (при добавлении подарка происходит переход в стандартную корзину).
Но модуль все еще сыроват.
При тестировании в определенный момент:
1) периодически происходит зацикливание и подвисание процесса;
2) подарок часто добавляется в корзину без скидки либо не добавляется вообще.

#18 Salp

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

  • Assistent vsupport.ru
  • PipPipPip
  • 207 сообщений
Репутация: 54
Продвинутый

Отправлено 18 февраля 2015 - 20:59

Дано:
  • в корзине уже есть товар без скидки
  • добавляем подарок - все корректно срабатывает
  • удаляем подарок и сразу же добавляем его обратно - он уже без скидки и виден как обычный товар
Причина - в таблице cguy_shopping_cart_items_content записи, которые обрабатываются как $variants[0] и $variants[1] в cart_functions.php поменялись местами... Вместо $variants[0] == -1, теперь $variants[1] == -1 и товар не видится как подарок.

Исправление - в cart_functions.php:
function GetConfigurationByItemId($itemID)
{
		$q=db_query("select variantID from ".
				SHOPPING_CART_ITEMS_CONTENT_TABLE." where itemID=".(int)$itemID);
		$variants=array();
		while( $r=db_fetch_row( $q ) ) $variants[]=$r["variantID"];
		return $variants;
}
заменить на:
function GetConfigurationByItemId($itemID)
{
		$q=db_query("select variantID from ".
				SHOPPING_CART_ITEMS_CONTENT_TABLE." where itemID=".(int)$itemID." order by variantID");
		$variants=array();
		while( $r=db_fetch_row( $q ) ) $variants[]=$r["variantID"];
		return $variants;
}

Заметил вот это еще через раз срабатывает:
// удалим презенты, превышающие "норматив", если хитрый клиент набрал презентов,
// а затем удалил нормальный товар или уменьшил его количество.


#19 badisoft

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

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

Отправлено 22 марта 2015 - 18:28

update:
1. добавлен п. 10.1.0 - см. выше про:

Цитата

Дано:
  • в корзине уже есть товар без скидки
  • добавляем подарок - все корректно срабатывает
  • удаляем подарок и сразу же добавляем его обратно - он уже без скидки и виден как обычный товар
Причина - в таблице cguy_shopping_cart_items_content записи, которые обрабатываются как $variants[0] и $variants[1] в cart_functions.php поменялись местами... Вместо $variants[0] == -1, теперь $variants[1] == -1 и товар не видится как подарок.

2.Изменены п. 10.3.1 и 10.3.3 (для регистрированных и не регистрированных), т.к. была ошибка в пересчете количества товара в корзине. Если задать количество товара БОЛЬШЕ чем есть на складе, то при определенном стечении обстоятельств (лень описывать) корзина виснет, т.к. некий цикл становится бесконечным по выполнению (условие выхода никогда не удовлетворяется). Переписано нафиг, убран дурацкий цикл, да и вообще алгоритм напрочь изменен. Как я мог написать такую хрень (очень не рационально) не понятно, однако написал как-то...
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#20 badisoft

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

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

Отправлено 23 марта 2015 - 13:07

update (ошибка в предыдущем апдейте):
- изменены п.10.3.1 и 10.3.3
- добавлен п.10.4
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)