Стоимость товара для каждой позиции в корзине

Подскажите решение:

Нужно, чтобы в корзине считалось ИТОГО по каждой добавленной позиции, в зависимости от количества и общее ИТОГО.



Еще нужно, чтобы состав корзины выводился на странице оформления заказа. Если просто вставить туда корзину — то заказ не оформляется.

Помогите, пожалуйста.
adminixi
30 марта 2016, 08:32
6
3 619
-1

Комментарии: 62

Марат Марабар
30 марта 2016, 11:45
+1
[[+price:mpy=`[[+count]]`]]
    adminixi
    30 марта 2016, 12:14
    0
    Cпасибо.
    Но не срабатывает.
    <td ><span class="ms2_total_cost">[[+price:mpy=`[[+count]]`]] </span> [[%ms2_frontend_currency]]</td>
    в таком виде считается только общая сумма всей корзины, а нужная сумма меняется только после перезагрузки страницы. Если убрать класс — вообще не считается, при изменении количества
      Марат Марабар
      30 марта 2016, 12:23
      +1
      Должно быть так
      <td class="price"><span>[[+price:mpy=`[[+count]]`]]</span> [[%ms2_frontend_currency]]</td>
        adminixi
        30 марта 2016, 12:25
        0
        тоже самое…
Воеводский Михаил
30 марта 2016, 11:49
0
Сниппеты msOrder и msCart прекрасно уживаются на одной странице. Смотрите, какие ошибки падают в лог при попытке оформления.
Демо-сайт для minishop2: minishop2.com. Смотрите на нем, как правильно все настраивать.
    adminixi
    30 марта 2016, 12:05
    0
    А где смотреть эти ошибки?
      Воеводский Михаил
      30 марта 2016, 12:06
      +1
      1) Журнал ошибок в меню Управление — Отчеты
      2) Консоль сетевых запросов в браузере
      3) Консоль ошибок выполнения JS
    adminixi
    30 марта 2016, 12:19
    0
    Да, там я была.

    Но там корзина находится над формой заказа. А у меня внутри нее.
      Воеводский Михаил
      30 марта 2016, 12:23
      0
      Зачем так? Можно сделать оформление заказа выше корзины, но внутри ничего не должно быть.
        adminixi
        30 марта 2016, 12:25
        0
        Заказчик так хочет…
Семен Морозов
30 марта 2016, 12:23
0
Можно вывести сумму по строке [[+cost]] но без Ajax
    adminixi
    30 марта 2016, 12:27
    0
    <td >[[+cost]] </td>
    в таком виде тоже считается только общая сумма всей корзины, а нужная сумма меняется только после перезагрузки страницы.
      Марат Марабар
      30 марта 2016, 12:41
      2
      +1
      Естественно. Нужен скрипт.
      <td class="price"><span class="price-row">[[+price]]</span> [[%ms2_frontend_currency]][[+old_price]]</td>
      ....
      <td class="price"><span class="price-sum">[[+cost]]</span> [[%ms2_frontend_currency]]</td>
      И где-нибудь на странице этот скрипт
      <script>
      $( '#msCart input[name="count"]' ).change( function(){
                      var id = '#' + $( this ).closest( 'tr' ).attr( 'id' );
                      var count = parseInt($( this ).val()); 
                      var price = parseInt( $( id + ' .price-row' ).text().replace( /\s+/g, '' ) );
      
                      $( id + ' .price-sum' ).html( count * price );
              })
      </script>
        adminixi
        30 марта 2016, 12:51
        0
        Спасибо, большое!

        А по второму вопросу сможете помочь?
          Марат Марабар
          30 марта 2016, 13:03
          0
          У тебя там форма в форме — ты зачем так делаешь?
          Вынеси форму корзины из формы оформления и всё будет работать.
            adminixi
            30 марта 2016, 13:07
            0
            Заказчик хочет, чтобы внутри было…

            Стилями что ли ее туда сместить…
              Марат Марабар
              30 марта 2016, 13:59
              +1
              Как я понимаю, дело в комментарии к заказу и кнопки Оформить заказ. Можно попробовать такую разметку
              <!-- Форма заказа -->
              <form id="msOrder>
              ...
              ...
              </form>
              
              <!-- Корзина -->
              <table>
              ...
              ...
              </table>
              
              <!-- Очистить корзину -->
              <form>
              ...
              ...
              </form>
              А вот дальше попробовать использовать атрибут fieldset
              ...
              ...
              ...
              
              <fieldset form="msOrder">
              <textarea>.....</textarea>
              <button type="submit">....</button>
              </fieldset>
              Т.е. коммент и кнопку вынести из формы и попытаться связать их с формой через атрибут form в теге fieldset.
                adminixi
                31 марта 2016, 08:58
                0
                а в такой случае будет считаться общая сумма заказа с доставкой?
                  Марат Марабар
                  31 марта 2016, 09:16
                  0
                  Будет.
                  Тут другое дело, такой вариант может не поддерживаться броузерами, но можно пойти другим путём.
                adminixi
                31 марта 2016, 09:15
                0
                Сама себе отвечаю: общая сумма считается. Но заказ не оформляется…
                  Марат Марабар
                  31 марта 2016, 09:17
                  0
                  Сейчас расскажу про другой вариант, который будет работать.
                    adminixi
                    31 марта 2016, 09:18
                    0
                    ООО!

                    А я уже собралась стилями ее на нужное место просто сместить))

                    Спасибо
                    Марат Марабар
                    31 марта 2016, 09:36
                    +1
                    Нигде не сказано, что тег label должен находиться внутри form, поэтому делаем следующее:
                    <!-- Форма заказа -->
                    <form id="msOrder>
                    ...
                    ...
                    <input id="send-form-label" type="submit" name="ms2_action" value="order/submit" style="display:none" />
                    </form>
                    
                    <!-- Корзина -->
                    <table>
                    ...
                    ...
                    </table>
                    
                    <!-- Очистить корзину -->
                    <form>
                    ...
                    ...
                    </form>
                    Т.е. использовать input вместо button и скрыть его.
                    Добавляем
                    <div>
                    <textarea form="msOrder">...</textarea>
                    <label for="send-form-label">Оформить заказ</label>
                    </div>
                    Броузеры поддерживают атрибут form у textarea, кроме IE. Здесь или забить на IE, или переносить скриптом в скрытый textarea формы.

                    Сама форма сейчас должна отправляться — проверено.
                      adminixi
                      31 марта 2016, 10:15
                      0
                      Супер! Все работает!

                      Спасибо.
                      adminixi
                      31 марта 2016, 10:31
                      0
                      А как вставить сюда «итого»?

                      <div>
                      <textarea form="msOrder">...</textarea>
                      <label for="send-form-label">Оформить заказ</label>
                      </div>
                      Или сразу под корзину… Оно сейчас внутри формы оформления тоже.

                      <h3>
                          [[%ms2_frontend_order_cost]]: <span id="ms2_order_cost">[[+order_cost:default=`0`]]</span>
                          [[%ms2_frontend_currency]]</h3>
                      Марат Марабар
                      31 марта 2016, 10:41
                      0
                      Сейчас посмотрю.
                      Марат Марабар
                      31 марта 2016, 11:01
                      +1
                      Можно добавить в любое место на странице

                      <h3>[[%ms2_frontend_order_cost]]: <span id="ms2_order_cost" [[+order_cost:default=`0`]]</span> [[%ms2_frontend_currency]]</h3>

                      Ну и callbacks
                      <script>
                      miniShop2.Callbacks.Order.getcost.response.success = function( response ) {
                      	if( response['success'] == true ) {
                      		var cost = response['data']['cost'];
                                                      
                      		$( '#ms2_order_cost' ).text( cost );
                      	}
                      }
                      </script>
                      adminixi
                      31 марта 2016, 11:02
                      0
                      Ну вот сейчас под корзиной и сумма не считается
                      Марат Марабар
                      31 марта 2016, 12:09
                      0
                      Точно. Это же при выборе варианта доставки будет пересчитываться.
                      Гляну чуть позже, если никто не опередит.
                      adminixi
                      31 марта 2016, 12:42
                      0
                      Оно считается, но только после перезагрузки страницы
                      Марат Марабар
                      31 марта 2016, 12:51
                      1
                      +1
                      Здесь и здесь удали

                      , miniShop2.Order.order
                      Итоговая сумма итак имеет свой идентификатор — это лишнее))
                      Вынеси этот файл в свою директорию и в настройках укажи где его искать.
                      Тот callbacks — удали. Должно работать.
                      adminixi
                      31 марта 2016, 14:58
                      -1
                      Удалила случайно базу данных. После восстановления все изменения сегодняшние заново делала, но что-то упустила и, теперь ИТОГО С ДОСТАВКОЙ вообще не считается.
                      Марат Марабар
                      31 марта 2016, 15:07
                      0
                      Что-то с разметкой
                      <span id="ms2_order_cost" 1 350 руб.</span>
                      Нужно закрыть span или типа того.
                      adminixi
                      31 марта 2016, 15:09
                      -1
                      фуф
                      adminixi
                      01 апреля 2016, 13:30
                      0
                      А что это за файлы? Где их искать?
                      adminixi
                      02 апреля 2016, 21:50
                      0
                      А что это за файлы? Где их искать?
                      Марат Марабар
                      02 апреля 2016, 21:54
                      0
                      Это один файл — /assets/components/minishop2/js/web/default.js

                      Путь до него указывается в системных настройках minishop2.
                      adminixi
                      04 апреля 2016, 02:24
                      0
                      Да, помогло, огромное спасибо!
                      adminixi
                      05 апреля 2016, 09:44
                      0
                      Какой-то кошмар!!!

                      В одном месте вылечили, в другом сломалось.

                      Теперь не срабатывает кнопка «оформить заказ»
                      <form class="form-horizontal ms2_form count" id="msOrder" method="post">
                      ..........
                      </form>
                      [[!mscart?
                      &tplRow=`tpl.mscart.row.my`
                      &tplOuter=`tpl.mscart.outer.my`
                      ]]
                      
                      <h3 style="text-align: right;">Итого с доставкой: <span id="ms2_order_cost"></span> [[%ms2_frontend_currency]]</h3>
                      <div class="checkrow">			
                      <div style="margin: 30px 0px;">
                      <label for="comment">Ваши комментарии к заказу</label>
                      <textarea form="msOrder" name="comment" id="comment"  class="form-control [[+errors.comment]]">[[+comment]]</textarea>
                      </div>
                      <label for="send-form-label" style="cursor:pointer"><img  src="assets/images/b_checkout.png" alt=""></label>
                      </div>
                      adminixi
                      31 марта 2016, 11:06
                      0
                      Еще заметила, что заказ не приходит на мою почту… только заказчику
                      adminixi
                      31 марта 2016, 11:29
                      0
                      А где устанавливаются обязательные поля для заполнения?

                      Где-то уже прописаны обязательными ФИО и мыло, у них автоматом добавляется required.

                      Вручную ставлю required на другие поля, но оно «стирается» на странице и не срабатывает.
                      Марат Марабар
                      31 марта 2016, 12:13
                      0
                      Приложения/minisop2, таб Варианты доставки -> редактировать.
                      Там есть поле Обязательные поля.
                      adminixi
                      31 марта 2016, 12:24
                      0
                      Точно! Я же видела их там. Спасибо.
          Семен Морозов
          30 марта 2016, 14:55
          0
          Ничего не происходит нового. У меня у в корзине уже стоял [[+cost]] и выводил сумму по строке товара. В чанке tpl.msCart.row.
          Обернул его в вашу обертку и добавил на страницу скрипт. Тоже самое.
          А можно сделать обновление суммы по строке на ajax?
            Марат Марабар
            30 марта 2016, 15:14
            +1
            Не зная почему ничего не происходит, у девушки получилось, выше по ссылке можно убедиться.

            Зачем на ajax? В сессии хранится кол-во и цена за единицу товара — какая разница где получать произведение двух чисел. И то и другое требует подключенный JS в броузере, почему бы не сделать это на клиенте?
              Семен Морозов
              30 марта 2016, 15:32
              0
              Да, у меня тоже получилось. Спасибо!)

              Надо чтобы эта цена обновлялась на лету, так как клиент может в корзине изменить количество товара, и сумма по строке должна пересчитываться. Можно такое реализовать?
          adminixi
          13 января 2017, 01:40
          0
          Добрый день!

          <td class="price"><span class="price-row">[[+price]]</span> [[%ms2_frontend_currency]][[+old_price]]</td>
          ....
          <td class="price"><span class="price-sum">[[+cost]]</span> [[%ms2_frontend_currency]]</td>И где-нибудь на странице этот скрипт
          <script>
          $( '#msCart input[name="count"]' ).change( function(){
                          var id = '#' + $( this ).closest( 'tr' ).attr( 'id' );
                          var count = parseInt($( this ).val()); 
                          var price = parseInt( $( id + ' .price-row' ).text().replace( /\s+/g, '' ) );
          
                          $( id + ' .price-sum' ).html( count * price );
                  })
          </script>
          Подскажите, пожалуйста, как сделать тоже самое в новом минишопе?
          Sergey
          25 июля 2018, 12:00
          0
          .
          Sergey
          25 июля 2018, 12:01
          0
          подскажите, как правильно прописать что он не обрезал десятые и сотые от суммы?
            Марат Марабар
            25 июля 2018, 13:53
            1
            +1
            Вместо parseInt, parseFloat

            var price = parseFloat( $( id + ' .price-row' ).text().replace( /\s+/g, '' ) );
          Виталий
          11 декабря 2018, 18:40
          0
          Спасибо. Все сработало. А как сделать, чтобы был пробел суммы? Когда выбираешь кол-во кол-во итоговая сумма за отдельный товар получается в таком виде 20000 руб. если обновить страницу то становить как надо «20 000 руб.» как сделать, чтобы сразу сумма была 20 000 руб.?
    Семен Морозов
    30 марта 2016, 16:13
    +1
    <script>
    
    $( '.form-group input[name="count"]' ).change( function(){
                    var count = parseInt($( this ).val()); 
                    var near = $(this).closest('.wrap_product_info').find( '.price-row' )
       
                    var price =  $(near).text().replace( /\s+/g, '' )
           
                    var sum = $(this).closest('.wrap_product_info').find( '.price-sum' )
    
                    $(sum).html( count * price );
            })
    
    </script>
    Скрипт не привязанный к tr и td)
      adminixi
      01 апреля 2016, 23:49
      0
      Спасибо
      adminixi
      13 января 2017, 12:23
      0
      А как сделать такое в новом минишоп?
        Сергей
        06 сентября 2017, 01:56
        0
        а чем он отличается? ))) Названиями классов?
        Кстати, там еще разрядность надо добавлять
      adminixi
      12 января 2019, 23:16
      0
      Скажите, а что за wrap_product_info? Это откуда?