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

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

 
Посетитель
small user social cms
МедальАвторитет форума
Сообщений: 1154
Приветствую, всех. Накопилось три вопроса по корзине магазине.
Может кто переделывал оформление заказа и знает ответы?

Проблема 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
Редактировалось: 1 раз (Последний: 5 июля 2014 в 12:10)
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 2850
по первой проблемме я приводил запрос в строке 2514 файла \components\shop\model.php к виду
Код 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 к виду
Код PHP:
  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}')";
мне это помогло
Реклама
cms
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 2850
по второй проблеме можно в конце файла \templates\_default_(Или ваш шаблон)\components\com_inshop_cart_items.tpl
заменить строку
Код PHP:
  1. totalsumm = totalsumm - (totalsumm * (discount_size/100));
на
Код PHP:
  1. totalsumm = (totalsumm - (totalsumm * (discount_size/100))).toFixed(2);
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 2850
по третьей проблеме надо править файл \components\shop\frontend.php в разделе
Код PHP:
  1. if ($do=='view_cart'){ ... }
там в переменную $totalsumm сперва складываются суммы всех товаров, потом вычитается сумма скидки и результат передаётся в шаблон. Вам эти действия надо разделить и вывести на две переменные - только суммы товаров и общий итог или только сумма скидки. И передать эти переменные в шаблон. В файле шаблона \templates\_default_(Или ваш шаблон)\components\com_inshop_cart_items.tpl, соответственно указать место для их вывода.
Посетитель
small user social cms
Медаль
Сообщений: 177
Loadырь:

по первой проблемме я приводил запрос в строке 2514 файла \components\shop\model.php к виду
Код 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 к виду
Код PHP:
  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}')";
мне это помогло

Спасибо мне тоже помогло! но теперь напротив товара вот это / NULL
InstantShop. Корзина. Как сделать нормальный вывод?
Редактировалось: 3 раз (Последний: 10 марта 2015 в 07:00)
Сервис проверки позиций http://allpositions.ru/ - бонус 100 рублей !
Биржа вечный ссылок нового поколения. Новый инструмент- Трафиковые статьи
Посетитель
small user social cms
Сообщений: 35
traffs:
Спасибо мне тоже помогло! но теперь напротив товара вот это / NULL

А так попробуйте:
Код PHP:
  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}')";
Посетитель
small user social cms
Медаль
Сообщений: 313
Спрошу в этой теме, Нужно выводить все цены без копеек. Сейчас получается так, что в настройках стоит вывод без копеек, но когда делаю скидку на товар в % то в корзине появляются копейки, а стоимость товара идет без копеек. Как сделать что бы и в корзине и в итоге цены были без копеек?
Посетитель
no avatar
МедальАвторитет форума
Сообщений: 2625
и возможно ли запилить добавление товара в корзину на аяксе? этого очень сильно не хватает магазину, т.к иначе не информативно добавление происходит,люди не особо умудренные опытом не понимают что делать дольше и что вообще произошло
Надежный быстрый хостинг
Посетитель
small user social cms
Сообщений: 26
Когда ожидается компонент магазин для 2?
Владимир
Посетитель
small user social cms
Медаль
Сообщений: 779
Loadырь:

по первой проблемме я приводил запрос в строке 2514 файла \components\shop\model.php к виду
Код 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 к виду
Код PHP:
  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}')";
мне это помогло

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

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

Правка была такой
Код PHP:
  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х штук скажем.
Редактировалось: 4 раз (Последний: 10 апреля 2016 в 21:37)
Посетитель
small user social cms
Сообщений: 41
Юрий:
Как сделать что бы и в корзине и в итоге цены были без копеек?
можно в \components\shop\model.php в функции getCartItems() исправить строки 2375 и 2376
с:
Код PHP:
  1. $items[$key]['price'] = round($item['price'], 2);
  2. $items[$key]['totalprice'] = round($item['price']*$item['cart_qty'], 2);
на:
Код PHP:
  1. $items[$key]['price'] = round($item['price']);
  2. $items[$key]['totalprice'] = round($item['price']*$item['cart_qty']);
yury:
и возможно ли запилить добавление товара в корзину на аяксе?
к кнопке/ссылке "добавить в корзину" добавляем id:
Код PHP:
  1. <a href="#" id="item_{$item.id}">Добавить в корзину</a>
дальше создаем файл \components\shop\ajax.php:
Код 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):
Код 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():
Код PHP:
  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-заголовка:
Код PHP:
  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-код примерно такой:
Код PHP:
  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.  
не забываем добавлять в мета-теги:
Код PHP:
  1. <meta name="csrf-token" content="<?php echo cmsUser::getCsrfToken(); ?>">
Редактировалось: 11 раз (Последний: 16 апреля 2016 в 00:30)
Посетитель
small user social cms
Медаль
Сообщений: 779
taleh:
дальше создаем файл \components\shop\ajax.php:
Скажу за всех Спасибо! Надо попробовать прикрутить.
Посетитель
small user social cms
Медаль
Сообщений: 313
C копейками помогло, спасибо!
Посетитель
small user social cms
Медаль
Сообщений: 779
taleh:



Что-то не срабатывает ajax
Редактировалось: 1 раз (Последний: 15 апреля 2016 в 21:46)
Посетитель
small user social cms
Медаль
Сообщений: 779
Подогнал под себя, аякс работает, но теперь выводит
- Ошибка Некорректный запрос!
<meta csrf есть на странице

taleh need help
Редактировалось: 2 раз (Последний: 15 апреля 2016 в 22:50)
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.