InstantShop. Корзина. Как сделать нормальный вывод?

(склейка одинаковых товаров, лишние копейки, заметные скидки)

#1 5 июля 2014 в 12:04
Приветствую, всех. Накопилось три вопроса по корзине магазине.
Может кто переделывал оформление заказа и знает ответы?

Проблема 1

Если в корзину добавляется товар, который уже там есть, то количество не суммируется (как в других магазинах), а появляется новая позиция в списке покупок.
Кто-нибудь делал объединения этих товаров в одну строку?


Проблема 2 (мелкая)

Иногда на странице /shop/cart.html при корректировке заказчиком количества товара, если у цены есть копейки у суммы могут появляются 12 знаков после запятой, причем с ошибкой в одну миллиардную копейки hoho
Впринципе, не критично, просто не красиво.


Проблема 3

И третий вопрос все по той же корзине — для меня более важен.

Если есть скидка, хотелось бы видеть в корзине (/shop/cart.html) или при оформлении заказа (/shop/order.html)
— сначала сумму без скидки,
— ниже скидка столько % = столько-то рублей,
— а уже в самом низу итоговую сумму.

Сайчас это выглядит для покупателя не очень информативно, просто итого со скидкой, без расписываний
хотелось бы чтобы он видел сколько сэкономил scratch



Моих мелких знаний пока хватило только на то что бы понять что страница рисуется в шаблоне
\templates\имя\components\com_inshop_cart_items.tpl
а пересчет суммы идет в \components\shop\js\cart.js


Может кто уже делал себе подобное или просто знает как это поправить? zst
#2 8 июля 2014 в 13:34
по первой проблемме я приводил запрос в строке 2514 файла \components\shop\model.php к виду
  1. $exists_id = $this->inDB->get_field('cms_shop_cart', "session_id='{$session_id}' AND item_id='{$item_id}' AND var_art_no='{$var_art_no}' AND chars_hash = '{$chars_hash}'", 'id');
и строку 2539 к виду
  1. $sql = "INSERT INTO cms_shop_cart (`session_id`, `item_id`, `var_art_no`, `qty`, `pubdate`, `chars`, `chars_hash`)
  2. VALUES ('{$session_id}', '{$item_id}', '{$var_art_no}', '{$qty}', NOW(), '{$chars_info}', '{$chars_hash}')";
мне это помогло
#3 8 июля 2014 в 14:01
по второй проблеме можно в конце файла \templates\_default_(Или ваш шаблон)\components\com_inshop_cart_items.tpl
заменить строку
  1. totalsumm = totalsumm - (totalsumm * (discount_size/100));
на
  1. totalsumm = (totalsumm - (totalsumm * (discount_size/100))).toFixed(2);
#4 8 июля 2014 в 14:11
по третьей проблеме надо править файл \components\shop\frontend.php в разделе
  1. if ($do=='view_cart'){ ... }
там в переменную $totalsumm сперва складываются суммы всех товаров, потом вычитается сумма скидки и результат передаётся в шаблон. Вам эти действия надо разделить и вывести на две переменные — только суммы товаров и общий итог или только сумма скидки. И передать эти переменные в шаблон. В файле шаблона \templates\_default_(Или ваш шаблон)\components\com_inshop_cart_items.tpl, соответственно указать место для их вывода.
#5 10 марта 2015 в 06:55


по первой проблемме я приводил запрос в строке 2514 файла \components\shop\model.php к виду

  1. $exists_id = $this->inDB->get_field('cms_shop_cart', "session_id='{$session_id}' AND item_id='{$item_id}' AND var_art_no='{$var_art_no}' AND chars_hash = '{$chars_hash}'", 'id');
и строку 2539 к виду
  1. $sql = "INSERT INTO cms_shop_cart (`session_id`, `item_id`, `var_art_no`, `qty`, `pubdate`, `chars`, `chars_hash`)
  2. VALUES ('{$session_id}', '{$item_id}', '{$var_art_no}', '{$qty}', NOW(), '{$chars_info}', '{$chars_hash}')";
мне это помогло

Loadырь

Спасибо мне тоже помогло! но теперь напротив товара вот это / NULL
Иллюстрация
#6 22 мая 2015 в 14:08

Спасибо мне тоже помогло! но теперь напротив товара вот это / NULL

traffs

А так попробуйте:
  1. $sql = "INSERT INTO cms_shop_cart (`session_id`, `item_id`, `var_art_no`, `qty`, `pubdate`, `chars`, `chars_hash`)
  2. VALUES ('{$session_id}', '{$item_id}', '{$var_art_no}', '{$qty}', NOW(), {$chars_info}, '{$chars_hash}')";
#7 10 апреля 2016 в 12:02
Спрошу в этой теме, Нужно выводить все цены без копеек. Сейчас получается так, что в настройках стоит вывод без копеек, но когда делаю скидку на товар в % то в корзине появляются копейки, а стоимость товара идет без копеек. Как сделать что бы и в корзине и в итоге цены были без копеек?
#8 10 апреля 2016 в 14:26
и возможно ли запилить добавление товара в корзину на аяксе? этого очень сильно не хватает магазину, т.к иначе не информативно добавление происходит, люди не особо умудренные опытом не понимают что делать дольше и что вообще произошло
#9 10 апреля 2016 в 14:50
Когда ожидается компонент магазин для 2?
#10 10 апреля 2016 в 20:45


по первой проблемме я приводил запрос в строке 2514 файла \components\shop\model.php к виду

  1. $exists_id = $this->inDB->get_field('cms_shop_cart', "session_id='{$session_id}' AND item_id='{$item_id}' AND var_art_no='{$var_art_no}' AND chars_hash = '{$chars_hash}'", 'id');
и строку 2539 к виду
  1. $sql = "INSERT INTO cms_shop_cart (`session_id`, `item_id`, `var_art_no`, `qty`, `pubdate`, `chars`, `chars_hash`)
  2. VALUES ('{$session_id}', '{$item_id}', '{$var_art_no}', '{$qty}', NOW(), '{$chars_info}', '{$chars_hash}')";
мне это помогло

Loadырь

А это решение далее правильно работает? Что будет когда в корзину добавляется товара сверх наличия на остатках?

Почему спрашиваю потомучто с Владимиром (r2) данный вопрос пытались решить, оно работает, но сбрасывает кол-во товара в корзине до 1шт. при превышении кол-ва товара на остатке.

Правка была такой
  1.  
  2. $chars_hash_condition = is_array($chars) ? "= {$chars_hash}" : 'IS NULL';
  3.  
  4. $exists_id = $this->inDB->get_field('cms_shop_cart', "session_id='{$session_id}' AND item_id='{$item_id}' AND var_art_no='{$var_art_no}' AND chars_hash $chars_hash_condition", 'id');
  5.  
  6.  
Как удачно тему подняли. Те же проблемы.

Дополнено...

похоже в моем случае теже поправки надо вносить
chars_hash = '{$chars_hash_condition}'
проверим… а нет так вообще не обновляет количество

Дополнено...

Да в {'вашем'} примере работает именно так как я и боялся -
сбрасывает кол-во товара в корзине до 1шт. при превышении кол-ва товара на остатке и более добавить товара в корзину нельзя, висит 1шт в корзине и не обновляется при добавлении 2х штук скажем.
#11 11 апреля 2016 в 14:32

Как сделать что бы и в корзине и в итоге цены были без копеек?

Юрий
можно в \components\shop\model.php в функции getCartItems() исправить строки 2375 и 2376
с:
  1. $items[$key]['price'] = round($item['price'], 2);
  2. $items[$key]['totalprice'] = round($item['price']*$item['cart_qty'], 2);
на:
  1. $items[$key]['price'] = round($item['price']);
  2. $items[$key]['totalprice'] = round($item['price']*$item['cart_qty']);

и возможно ли запилить добавление товара в корзину на аяксе?

yury
к кнопке/ссылке "добавить в корзину" добавляем id:
  1. <a href="#" id="item_{$item.id}">Добавить в корзину</a>
дальше создаем файл \components\shop\ajax.php:
  1. <?php
  2.  
  3. define('PATH', $_SERVER['DOCUMENT_ROOT']);
  4. include(PATH.'/core/ajax/ajax_core.php');
  5.  
  6. $action = cmsCore::request('action', 'str', 'add_to_cart', 'post');
  7. $item_id = cmsCore::request('item_id', 'int', 0, 'post');
  8. $item_qty = cmsCore::request('item_qty', 'int', 0, 'post');
  9. $item_qty = (is_numeric($item_qty) && $item_qty > 0) ? $item_qty : 1;
  10. $var_art_no = cmsCore::request('var_art_no', 'str', '', 'post');
  11.  
  12. if(cmsUser::checkCsrfToken()) {
  13. if ($action != "") {
  14. $session_id = session_id();
  15. cmsCore::loadModel('shop');
  16. $model = new cms_model_shop();
  17.  
  18. // добавление в корзину
  19. if ($action == "add_to_cart" && $item_id != "") {
  20. if ($model->addToCart($item_id, $var_art_no, $item_qty)) {
  21. $cart_count = $model->getCartItemsCount($session_id);
  22. if ($cart_count !== false) {
  23. cmsCore::jsonOutput(array(
  24. 'status' => 'ok',
  25. 'count' => $cart_count,
  26. 'summ' => $model->getCartItemsSumm()
  27. ));
  28. } else {
  29. // не удалось получить колличество товаров в корзине
  30. cmsCore::jsonOutput(array('status' => 'error', 'c' => 3));
  31. }
  32. } else {
  33. // ошибка при добавлении товара в корзину
  34. cmsCore::jsonOutput(array('status' => 'error', 'c' => 2));
  35. }
  36. }
  37.  
  38.  
  39. } else {
  40. // неправильные параметры запроса
  41. cmsCore::jsonOutput(array('status' => 'error', 'c' => 1));
  42. }
  43. } else {
  44. cmsCore::jsonOutput(array('status' => 'error', 'c' => 4));
  45. }
функция getCartItemsCount() из примера выше (добавить в model.php):
  1. public function getCartItemsCount($session_id) {
  2. $res = $this->inDB->query("SELECT * FROM `cms_shop_cart` WHERE `session_id` = '".$session_id."'");
  3. $count = $this->inDB->num_rows($res);
  4. if($count != 0) {
  5. return $count;
  6. } else {
  7. return false;
  8. }
  9.  
  10. }
и getCartItemsSumm():
  1. public function getCartItemsSumm() {
  2. $items = $this->getCartItems();
  3. $totalsumm = 0;
  4. if ($items) {
  5. foreach ($items as $item) {
  6. $totalsumm += ($item['price'] * $item['cart_qty']);
  7. }
  8. }
  9. return floor($totalsumm);
  10. }
так же слегка подправляем функцию checkCsrfToken() в файле \core\classes\user.class.php, чтоб token брался не только из формы но и из http-заголовка:
  1.  
  2. public static function checkCsrfToken(){
  3.  
  4. if(isset($_POST['csrf_token'])) {
  5. $user_token = $_POST['csrf_token'];
  6. } else if(isset($_SERVER['HTTP_X_CSRF_TOKEN'])) {
  7. $user_token = $_SERVER['HTTP_X_CSRF_TOKEN'];
  8. }
  9.  
  10. if(isset($user_token)) {
  11. $tokens = self::sessionGet('csrf_tokens', 'security');
  12.  
  13. if (is_array($tokens)) {
  14.  
  15. $key = array_search($user_token, $tokens, true);
  16.  
  17. if ($key !== false) {
  18. //unset($tokens[$key]);
  19. //ksort($tokens);
  20. //self::sessionPut('csrf_tokens', $tokens, 'security');
  21. return true;
  22. }
  23.  
  24. }
  25. }
  26.  
  27. return false;
  28.  
  29. }
  30.  
js-код примерно такой:
  1.  
  2. // добавление товара в корзину
  3. $(".add_cartB a").click(function(e) {
  4. e.preventDefault();
  5.  
  6. var el = $(this);
  7. var variant_art = $("select[name=var_art_no]").val(); // разновидность товара
  8.  
  9. $.ajax({
  10. type: "POST",
  11. url: "/components/shop/ajax.php",
  12. data: {
  13. item_id: el.attr("id").replace("item_", ""),
  14. item_qty: el.parent().find(".qty_input input").val(), // количество товара
  15. var_art_no: variant_art,
  16. action: "add_to_cart"
  17. },
  18. beforeSend: function (request) {
  19. return request.setRequestHeader("X-CSRF-Token", $("meta[name='csrf-token']").attr('content'));
  20. }
  21.  
  22. }).done(function (res) {
  23. if (res["status"] == "ok") {
  24. console.log("Торар добавлен!");
  25. } else if (res["status"] == "error") {
  26. switch (res["c"]) {
  27. case 1:
  28. core.alert("Некорректные параметры запроса!","Ошибка");
  29. break;
  30. case 2:
  31. core.alert("Не удалось добавить товар в корзину!","Ошибка");
  32. break;
  33. case 3:
  34. core.alert("Не удалось получить колличество товаров в корзине!","Ошибка");
  35. break;
  36. case 4:
  37. core.alert("Некорректный запрос!","Ошибка");
  38. break;
  39. default:
  40. break;
  41. }
  42. } else {
  43. console.log("Произошла ошибка!");
  44. }
  45. });
  46.  
  47. });
  48.  
не забываем добавлять в мета-теги:
  1. <meta name="csrf-token" content="<?php echo cmsUser::getCsrfToken(); ?>">
#12 11 апреля 2016 в 22:21

дальше создаем файл \components\shop\ajax.php:

taleh
Скажу за всех Спасибо! Надо попробовать прикрутить.
#13 11 апреля 2016 в 22:34
C копейками помогло, спасибо!
#14 15 апреля 2016 в 21:46



taleh

Что-то не срабатывает ajax
#15 15 апреля 2016 в 22:26
Подогнал под себя, аякс работает, но теперь выводит
— Ошибка Некорректный запрос!
<meta csrf есть на странице

taleh need help
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.