Спонсор модуля: 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&sub=yandex">{$smarty.const.ADMIN_STRING_YANDEX}</a></div>
вставляем
{* BEGIN present *}
<div class="marg"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&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&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&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&sub=special&new_offer={$products[i].productID}" title="{$smarty.const.ADMIN_ADMIN_MENUNEW7}" {if !$products[i].enabled}class="greyy"{/if}>+</a>{else} {/if}</td>
вставляем
{* BEGIN presents *}
<td align="center"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&sub=present&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, $
{
return $a['presents'] == $b['presents']?0:($a['presents'] > $b['presents']?-1:1);
}
# END Present
------------------
После всего этого в админке в разделе "Модули" появится новый модуль "Подарки к заказу".
Уровень доступа к этому модулю "Общие настройки" (это для тех, у кого кроме админов с полным доступом и клиентов есть еще пользователи с разными уровнями доступа в админке).