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


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

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


[дополнение] Вывод цены товара сразу со скидкой


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

#1 badisoft

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

  • VIP
  • 4 986 сообщений
Репутация: 761
Мастер

Отправлено 14 октября 2014 - 19:47

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

Другими словами, клиент сразу видит именно свою цену на товар, а не как штатно сделано - общую,
вне зависимости от своих скидок и суммы уже уложенного в корзину.


1. в файле product_brief.tpl.html в JS-функции GetCurrentCurrency_{$product_info.productID}()

строку

_sum = Math.round(_sum*100)/100;

заменяем на

// BEGIN DiscountView
//_sum = Math.round(_sum*100)/100;
_sum = Math.round(_sum*(100{if $product_info.discount_percent}-{$product_info.discount_percent}{/if}))/100;
// END DiscountView


2. в файле product_detailed.tpl.html в JS-функции GetCurrentCurrency()

строку

_sum = Math.round(_sum*100)/100;

заменяем на

// BEGIN DiscountView
//_sum = Math.round(_sum*100)/100;
_sum = Math.round(_sum*(100{if $product_info.discount_percent}-{$product_info.discount_percent}{/if}))/100;
// END DiscountView


3. в файле category.php

строку

for($i=0; $i<$cc_products; $i++) $products[$i]["allow_products_comparison"] = $show_comparison;


заменяем на

# BEGIN DiscountView
#for($i=0; $i<$cc_products; $i++) $products[$i]["allow_products_comparison"] = $show_comparison;
for($i=0; $i<$cc_products; $i++)
  {
  $products[$i]["allow_products_comparison"] = $show_comparison;
  if (isset($_SESSION["log"]))
	{
	$resDiscount = dscCalculateDiscount($products[$i]["Price"],$_SESSION["log"]);
	$products[$i]["PriceWithUnit"] = addUnitToPrice( $resDiscount["rest_current_unit"]);
	$products[$i]["discount_percent"]= $resDiscount["discount_percent"];
	}
  }
# END DiscountView



4. в файле product_detailed.php

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

$a["PriceWithUnit"] = show_price( $a["Price"] );


вставляем

# BEGIN DiscountView
if (isset($_SESSION["log"]))
{
$resDiscount = dscCalculateDiscount($product["Price"], $_SESSION["log"]);
$a["PriceWithUnit"]= addUnitToPrice($resDiscount["rest_current_unit"]);
$a["discount_percent"]= $resDiscount["discount_percent"];
}
else
# END DiscountView


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

$r["Price"] = show_price($r["Price"]);


вставляем

# BEGIN DiscountView
if (isset($_SESSION["log"]))
{
$resDiscount = dscCalculateDiscount($r["Price"], $_SESSION["log"]);
$r["Price"]= show_price($resDiscount["rest_current_unit"]);
}
else
# END DiscountView



5. в файле pricelist.php

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

$cennik  = show_price($row1[2]);


вставляем

# BEGIN DiscountView
if (isset($_SESSION["log"]))
{
$resDiscount = dscCalculateDiscount($row1[2], $_SESSION["log"]);
$cennik = show_price($resDiscount["rest_current_unit"]);
}
else
# END DiscountView



6. в файле home.php

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

$row["Price"] = show_price($row[3]);


вставляем

# BEGIN DiscountView
if (isset($_SESSION["log"]))
{
$resDiscount = dscCalculateDiscount($row[3], $_SESSION["log"]);
$row["Price"] = show_price($resDiscount["rest_current_unit"]);
}
else
# END DiscountView



7. Ну и не забываем дополнение http://vsupport.ru/t...-учетом-скидки/, чтобы в боковом блоке "Корзина" цена была тоже со скидкой.


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

#2 jiykka

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

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

Отправлено 24 февраля 2017 - 19:44

А что то еще должно стоять в совокупности с этим дополнением?
После установки в прайс листе и в product_brief цена 0 на все товары.
Создавал группу покупателей и выбирал категорию со скидкой.

#3 badisoft

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

  • VIP
  • 4 986 сообщений
Репутация: 761
Мастер

Отправлено 24 февраля 2017 - 23:04

 jiykka сказал:

А что то еще должно стоять в совокупности с этим дополнением?
Ничего больше не нужно. Это ОЧЕНЬ простое дополнение.
Цена товара пересчитывается из старой (без скидки) в новую (со скидкой) с помощью штатной функции dscCalculateDiscount, аргументами которой является цена товара (старая) и логин клиента, а результатом - массив с новой ценой (в том числе).
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#4 etdnepr

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

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

Отправлено 25 февраля 2017 - 22:23

Никак не могу победить отображение цены каждой позиции в корзине. "Итого" показывает со скидкой, а в строке (возле каждой позиции) - без скидки((

#5 badisoft

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

  • VIP
  • 4 986 сообщений
Репутация: 761
Мастер

Отправлено 26 февраля 2017 - 14:02

 etdnepr сказал:

Никак не могу победить отображение цены каждой позиции в корзине. "Итого" показывает со скидкой, а в строке (возле каждой позиции) - без скидки
В корзине ШТАТНО показывается скидка, мое дополнение тут освершенно ни при чем.
Но логика показа скидки немного не та, которую Вы хотите.
Все товары показываются БЕЗ скидки, затем идет общая сумма заказа, затем скидка по общей сумме, затем общая сумма уже с учетом скидки. По другому и не получится, т.к. скидка в shopCMS рассчитывается не для отдельного товара, а для общей суммы заказа. Другими словами, скидка на отдельный товар (которую можно видеть с помощью этого дополнения) может получиться меньше, чем суммарная скидка по заказу. Поэтому показывать в корзине каждый товар со скидкой в общем случае бессмысленно.

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

#6 etdnepr

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

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

Отправлено 02 марта 2017 - 22:35

Да, Дмитрий, Вы правы. Наверное и так нормально))
А не помните навскидку какой файл отвечает за цену там - cart.php, shopping_cart.php или shopping_cart_info.php?

#7 badisoft

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

  • VIP
  • 4 986 сообщений
Репутация: 761
Мастер

Отправлено 03 марта 2017 - 10:07

 etdnepr сказал:

cart.php, shopping_cart.php или shopping_cart_info.php
cart.php - добавление товара в корзину
shopping_cart.php - сама корзина
shopping_cart_info.php - боковой блок "Корзина".
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#8 etdnepr

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

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

Отправлено 06 марта 2017 - 21:35

Отображение цен в корзине получилось победить таким способом.
В cart_functions.php функцию GetPriceProductWithOption переписал так
function GetPriceProductWithOption($variants, $productID)
{
$row=db_fetch_assoc(db_query("SELECT Price, list_price FROM ".PRODUCTS_TABLE." WHERE productID=$productID LIMIT 1"));
if (!$variants )
# тут добавлял условие для отображения скидки при включенном геомодуле
if(CONF_GEODETECT_ENABLE && isset($_SESSION['geo_discount']) && $row["Price"]==$row["list_price"] )
{
$resDiscount = dscCalculateDiscount($row["list_price"], $_SESSION["log"]);
$row["Price"] = show_price($resDiscount["rest_current_unit"]);
return $row['Price'];
}
else
{
return $row['Price'];
}

$row1=db_fetch_assoc(db_query("SELECT SUM(price_surplus) AS price_surplus FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=$productID AND variantID IN (".implode(',',$variants).")"));
return $row['Price']+$row1['price_surplus'];
}

Осталось победить в блоке корзина и на последнем шаге оформления. Понятно, что в блоке только отображение суммы, а на последнем шаге оформления там таки считается скидка на заказ. Не могу только найти где))

#9 etdnepr

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

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

Отправлено 14 марта 2017 - 22:32

 etdnepr (06 марта 2017 - 21:35) писал:

Отображение цен в корзине получилось победить таким способом.
В cart_functions.php функцию GetPriceProductWithOption переписал так
function GetPriceProductWithOption($variants, $productID)
{
$row=db_fetch_assoc(db_query("SELECT Price, list_price FROM ".PRODUCTS_TABLE." WHERE productID=$productID LIMIT 1"));
if (!$variants )
# тут добавлял условие для отображения скидки при включенном геомодуле
if(CONF_GEODETECT_ENABLE && isset($_SESSION['geo_discount']) && $row["Price"]==$row["list_price"] )
{
$resDiscount = dscCalculateDiscount($row["list_price"], $_SESSION["log"]);
$row["Price"] = show_price($resDiscount["rest_current_unit"]);
return $row['Price'];
}
else
{
return $row['Price'];
}

$row1=db_fetch_assoc(db_query("SELECT SUM(price_surplus) AS price_surplus FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=$productID AND variantID IN (".implode(',',$variants).")"));
return $row['Price']+$row1['price_surplus'];
}

Осталось победить в блоке корзина и на последнем шаге оформления. Понятно, что в блоке только отображение суммы, а на последнем шаге оформления там таки считается скидка на заказ. Не могу только найти где))
Как оказалось, работает этот вариант только для случая, когда для товара вручную указаны различные величины в поле Цена и Старая цена. Для тех вариантов, где обе цены одинаковые и скидка считается гео-модулем, то при добавлении в корзину в колонку цена почему-то из суммы например 9105грн попадает только цифра 9!!!)))

#10 badisoft

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

  • VIP
  • 4 986 сообщений
Репутация: 761
Мастер

Отправлено 15 марта 2017 - 00:39

 etdnepr сказал:

то при добавлении в корзину в колонку цена почему-то из суммы например 9105грн попадает только цифра 9
Практически на сто процентов где-то по дороге цена форматируется, т.е. тысячи отделяются от сотен пробелом. И выглядит это как строка 9_105, которая поле явного или неявного преобразования в int превращается в 9. А для товаров, цена которых меньше 1000 наверняка все нормально.

PS. Я не вникал в код, но вообще-то этот пробел вставляет функция show_price, которую вы используете.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)