Вход • Регистрация

Дубли заказов

  • 08 декабря 2017 г. , редакция: 08 декабря 2017 г.
  • Если товаров в корзине много (в данном случае один покупатель может набрать и до 300-400 строк с товарами), то при нажатии на "Оформить заказ" происходит торможение, когда на секунду, когда на 5-6.
    Нетерпеливые покупатели начинают нажимать на кнопку несколько раз подряд. В итоге получаются дубли заказов с одними и теми же номерами, что не есть хорошо.

    Спросил в ТП. Подсказали:
    Код
    echo '<input class="btn btn-warning btn-sm" type="submit" value="'.$this->diafan->_('Оформить заказ', false).'" onClick="this.disabled=true;">';

    т.е. добавить onClick="this.disabled=true;" в код кнопки.
    Работает, но только в Мозилле. В ИЕ и хромоподобных браузерах заказ вообще невозможно оформить.

    К сожалению, в ТП меня послали повышать квалификацию, ну и дали вот такую ссылку.
    Увы, я слишком стар чтобы такое понять, хотя честно вникал больше часа.
    Поэтому прошу у народа помощи как сделать так, чтобы у кнопки "Оформить заказ" была нормальная защита "от дурака", чтобы во всех популярных браузерах не получались дубли заказов.
  • 08 декабря 2017 г.
  • Конечно, наверно в ТП правы, сказав что:
    Цитата
    Подобных жалоб у нас не было, как и предложений, соответственно, просто так мы подобные обновления не выпускаем.

    но рано или поздно любой может столкнуться в похожей проблемой.
    • 08 декабря 2017 г.
    • У меня такое иногда бывало и при 2-3 заказах. Но я всегда это связывал с локальной тачкой.
      • 08 декабря 2017 г. , редакция: 08 декабря 2017 г.
      • при 2-3 наименований товаров срабатывает быстро, проверял, при всем желании не успеваешь повторно нажать
  • 08 декабря 2017 г.
  • По ссылке выше, данной ТП, там вообще ничего про onClick не нашел. даже слова такого нет. на что там обратить то внимание!
    • 08 декабря 2017 г.
    • onClick, это просто сценарий js, который выполняется после клика.
      Этот код:
      Код
      onClick="this.disabled=true;"

      Значит, после нажатия на кнопку, в данном случае это input или button, добавить этой кнопке атрибут disabled, а когда есть этот атрибут, нажать на кнопку уже нельзя. По идее этот код должен работать везде правильно.
      • 08 декабря 2017 г.
      • Благодарю за понятные разъяснения принципа действия!
        Увы, и у меня, и у других работает только в Мозилле, к сожалению.

        ТП не отказывается от проблемы:
        Цитата
        Вы можете этот вопрос погуглить самостоятельно или улучшить свою квалификацию, например, здесь. Мы навскидку не знаем, а если мы будем гуглить за Вас долгосрочную пользу это Вам не принесет.

        Понять бы, хоть что гуглить, какой запрос?
        • 08 декабря 2017 г. , редакция: 09 декабря 2017 г.
        • Валерий Викторович, а при чём тут ТП? Что, кнопка что ли не работает? Кнопка работает,
          Дело-то в том, что
          Цитата
          Увы, я слишком стар чтобы такое понять
          Вопрос - а зачем Вы тогда сайтостроением вообще занимаетесь, если элементарная вещь такие затруднения вызывает? Ну я так спрашиваю, чисто поговнить, следуя вашему примеру.

          Запрос OnClick - первая же ссылка в Google.

          Вам в ТП сказали, что нужно атрибут у кнопки сменить - disabled. Там же дали ссылку на этот же (очень хороший, кстати) сайт. На статью об атрибутах.

          Там прямо по тексту есть готовый код:
          Код
          div.setAttribute('order-state', 'canceled');
          или
          Код
          this.setAttribute('hidden', value);
          Допустим, вы всё-равно ничего не поняли (ну сложно автор пишет). Идём в Google снова (ищем setAttribute). Первая ссылка на Mozilla (MDN), очень хороший источник. Далее опять сложный автор, который нас заставил повторно идти в Google. Затем форум javascript.ru, где у всех или руки из низа спины или ЧСВ заоблачный. Пропускаем тоже. Четвёртый результат - ждекпот! - w3schools.com. И покажут и расскажут и даже потрогать дадут.

          Опять не вышло? Ну JS он сложный. Поэтому написали Jquery. Он тоже JS, но простой. Идём в справочник Jquery. Нажатие на кнопку - это же целое событие. Смотрим раздел "События". Вот он и onclick. Там код приведён даже проще, чем Степан выше указал:
          Код
          $('#foo').click(function(){
          alert('Вы нажали на элемент "foo"');
          });
          Но нам alert же не нужен. Нам надо атрибут сменить. Идём в раздел "Атрибуты". Первая же ссылка. Берём код из примера на странице:
          Код
          $("div").attr("class", "divEl")
          и вставляем в предыдущий:
          Код
          $('#foo').click(function(){
          $("div").attr("class", "divEl");
          });
          И правим на свой
          Код
          $('.btn-not-double').click(function(){
          $(this).attr("disabled", "disabled");
          });

          И, Валерий Викторович, это не программирование. Это копипаста. Для этого надо только уметь читать, делать запросы в Google и уметь нажимать Ctrl+C и Ctrl+V.

          Решайте сами - чего из этого вы не умеете и в чём именно вам нужно поднять квалификацию.



          • 08 декабря 2017 г. , редакция: 10 декабря 2017 г.
          • Благодарю Вас, Павел!
            Напористость и не сдержанность в эмоциях - первые признаки молодости. Но это не в обиду Вам, а наоборот, в белую зависть (а чего еще нам, старикам, остается?). Рад что Вы молоды и мысли ваши стремительны аки Буря!
            Счас попробую.
  • 08 декабря 2017 г.
  • Увы, и снова не работает
    Код
    $('.btn-not-double').click(function(){
    $(this).attr("disabled", "disabled")
    });
    • 08 декабря 2017 г. , редакция: 08 декабря 2017 г.
    • Потому что этот код делает точно тоже самое что я и привел.
      Так быстро и мыслей не появляется почему не работает, он обязан работать...

      Вы КЭШ чистите перед тестированием?
      Мозила он с кэшем проще работает, быстрее очищается сам.

      Вставьте вместо этого кода этот:

      Код

      $('.btn-not-double').mousedown(function(){
      $(this).attr("disabled", "disabled");
      console.log('Я родился');
      });


      Это для того чтобы я проверил действительно ли он не работает в других браузерах, без отправки заказа.
      • 08 декабря 2017 г.
      • Заменил код вашим новым.

        Да, само собой, каждый раз чищу кеш как на сайте, так и в браузере.
        • 08 декабря 2017 г. , редакция: 08 декабря 2017 г.
        • Скрипт работает, проверил в гугл,яндекс и мозиле.

          Можете вернуть тот обратно.

          Скрин из гугл бразуера
          • 08 декабря 2017 г.
          • Вернул, но увы, заказать невозможно. Даже специально только что установил яндекс.браузер, то же самое..
            • 08 декабря 2017 г.
            • Всмысле заказать нельзя?
              Заказ не приходит в админку?
              • 08 декабря 2017 г.
              • да, не заказывается, в админке нет заказов.
                Похоже, все, кроме Мозиллы не любят "disabled".

                Решили пока не трогать. Вставил надпись:
                Код
                (просьба не нажимать повторно)
                возле кнопки.
            • 08 декабря 2017 г. , редакция: 08 декабря 2017 г.
            • Валерий Викторович, у вас там частный случай. Весь код рабочий. Что-то конкретно на вашем сайте не так. И показания ваши путанные. Степан вон вообще "нить потерял".
              В ЛС адрес страницы киньте, надо на месте смотреть. У нас всё 100% работать будет. Этот код кроссбраузерный.
              • 10 декабря 2017 г.
              • Ссылку на клон сайта кинул ниже, секретов нет. Ссылку на оригинальный сайт удалил, чтобы не мешать реальным покупателям.
                Пробуйте заказывать товар. У меня и владелицы сайта не получается.

                Сайт не мой. И не я делал дизайн. Но доступ к сайту и хостингу у меня полный, т.к. на моем сервере стоит.
        • 08 декабря 2017 г. , редакция: 08 декабря 2017 г.
        • попробуйте вместо attr использовать prop

          но, в целом, конкретно в этом случае может быть и можно это использовать, но не в любом подобном.
          правильнее (если форма отправляется через $.ajax() использовать еще и success для последующего снятия блокировки после ответа с бэкэнда

          Код

          $(document).on('click', '.btn-not-double', function(){
          $(this).prop('disabled', true);
          });
  • 09 декабря 2017 г.
  • Валерий Викторович, еще по хорошему прелоадер воткните чтобы люди понимали, что "сайт думает"

    Для штатных аякс форм диафана (а корзина как раз одна из них) очень неплохо использовать родные методы

    Код

    diafan_ajax.before['метка_формы'] = function(form){}
    и
    diafan_ajax.success['метка_формы'] = function(form, response){}


    т.е. before - перед отправкой формы повесили прелоадер и заблокировали кнопку "отправить", а по success - сняли прелоадер и разблочили кнопку.


    см тутhttps://www.diafan.ru/dokument/full-manual/developers/architecture/module/js/
  • 10 декабря 2017 г. , редакция: 10 декабря 2017 г.
  • В общем, сдел на поддомене http://opt.grandhobby.ru клон сайта. Почта уведомления - моя. Т.е можно заказывать все что хотите и пробовать.

    1. Сейчас вставил код Горопашный Степан (stepanych):
    Код
    $(document).on('click', '.btn-not-double', function(){
    $(this).prop('disabled', true);
    });


    Все точно так же как с кодом Степан (idxdoc) и кодом Любимов Павел (webnavigator)
    2. т.е. в Мозилле можно заказать (дублей нет, все норм). В админке новый заказ есть, на почту уведомление приходит (пишу так, чтобы Любимов Павел понял в чем дело).
    3. Но в других браузерах, например в Хроме заказать нельзя, кнопку "Оформить заказ" нажимаем, и все, больше ее не нажать, но и заказ не оформляется, на той же странице торчит вечно и ничего не происходит (в админке новых заказов нет, на почте ничего не приходит).

    Народ, попробуйте заказывать товар! Напомню, сайт для тестов (уведомления о заказах сыплются мне), оригинальному сайту никак не мешает.
    Может кто-то поймет в чем дело?
    • 10 декабря 2017 г.
    • Внесу свои 5 коп.

      В ИЕ отправляется заказ, в Хроме действительно не получилось.
      Причину такого поведения рассматривать не буду, ибо не хватает знаний в данном вопросе.
      Думаю, что придется в корне поменять подход к проблеме, т.к. данное решение ведет к возникновению еще бОльших проблем, чем есть сейчас.

      Привожу пример (предположим, я клиент): назаказывала я кучу всяких штук, которые долго отбирала, перехожу в корзину и вот досада - неверно указала номер телефона (кстати, маски телефона там нет). Жму "оформить заказ", мне выпадает ошибка, я ее исправляю (меняю номер телефона на правильный) и упс! а кнопочка "оформить" уже не работает.
      Что делать?
      Варианта два:
      1. Попробовать перезагрузить страницу (не каждый клиент до этого додумается). Могут испугаться, что все набранные товары потеряются.
      2. Плюнуть и закрыть сайт.

      Не лучше ли смириться с дублями заказов, которые можно проигнорировать и удалять одинаковые одним щелчком мыши, чем терять клиентов в принципе?
  • 10 декабря 2017 г. , редакция: 10 декабря 2017 г.
  • Не отправляется форма, потому что у кнопки отправки класс "btn-not-double". Уберите и всё прекрасно отправится.
    При этом не будет блокироваться кнопка.
    • 10 декабря 2017 г.
    • А в чем тогда смысл вставки скрипта?
      Или я что-то пропустила?
      • 10 декабря 2017 г.
      • Ничего не пропустили. Смысл пропадает, но зато форма отправляется.
        Я разобрался в чём там проблема, сейчас выложу решение.
        Там несколько причин.
  • 10 декабря 2017 г. , редакция: 10 декабря 2017 г.
  • Начнём с того, что кнопка отправки формы находится за пределами самой формы (что само по себе уже косяк).
    Это чревато тем, что когда сервер будет обновлять форму при ответе (а форма отправляется при любом раскладе, т.к. поля проверяются на сервере), она (кнопка) не обновляется. Любой клик по кнопке и всё, кнопка сдохла. А пользователь может не так поле заполнить, например.



    Сначала возвращаем кнопку внутрь формы. Далее убираем класс btn-not-double, чтобы не мешал процессу.
    При добавлении кода прямо в кнопку, она успешно блочится. Но блочится мгновенно.
    При этом Chrome такую форму с блокированной кнопкой отправлять не хочет по соображениям некошерности ситуации, видимо.
    Поэтому в Firefox работает, а в Web-Kit`ах - нет.
    Друзья, не используйте говнософт.

    Исправляем ситуацию и обходим баг Web-Kit`а. Переносим код в форму с атрибутом onsubmit:
    Код
    <form method="POST" action="" class="cart_form ajax " enctype="multipart/form-data" onsubmit="document.getElementById('knopka').setAttribute('disabled', 'disabled');">
    чтобы не писать лишнего и максимально упростить, определяем кнопку по ID, его же ей и присваиваем:
    Код
    <input class="btn btn-warning btn-sm" type="submit" value="Оформить заказ" id="knopka">
    Теперь кнопка блочится только после того, как запрос с формы уехал на сервер. И блочится до той поры, пока не придёт ответ с проверками полей и не обновит форму. У меня это около полусекунды, но у кого роутер Ростелекома, как писал Валерий Викторович, можно успеть чаю попить.



    В итоге, кнопка неактивна пока не пришёл ответ с сервера с полями, либо пока не пришёл ответ с success.
    В последнем случае получим "Заказ оформлен".
    • 10 декабря 2017 г. , редакция: 10 декабря 2017 г.
    • Прошу посмотреть содержимое файла cart.view.form.php, а то не понял фразу
      Цитата
      кнопка отправки формы находится за пределами самой формы

      На мой взгляд она внутри формы, или что-то не так понимаю?

      Спасибо, ближе к вечеру попробую.
      • 10 декабря 2017 г.
      • Валерий, а файлец-то не тот.
        Код
        echo '<h5>(просьба не нажимать повторно)</h5>';

        Где эта фраза на сайте? Я не вижу. А в файле она есть.
        • 10 декабря 2017 г.
        • На сайте она закомментирована:
          Код
          //echo '<h5>(просьба не нажимать повторно)</h5>';

          не обращайте внимание.
      • 10 декабря 2017 г. , редакция: 10 декабря 2017 г.
      • Цитата
        На мой взгляд она внутри формы, если что-то не так понимаю?
        Это "на глазок"? Открываете код страницы в любом нормальном обозревателе и там видите все ошибки, подсвеченные красным. На фото ниже как раз видно хвост от блока </div>, который закрыт неправильно и поэтому структурно отрубает закрывающий тег формы </form> :



        Браузеры по доброте душевной исправляют как могут. Поэтому в коде страницы видно то, что выше, а в консоли браузеров разметка, которую они построили после переваривания этого кода то, что ниже:



        Если браузер не нормальный, а "какой есть", то открываете код страницы (Ctrl+U), копируете содержимое и вставляете вот в этот сервис. Получаем:



        Если опять же не совсем понятно, то вспоминаем базовые правила разметки HTML, про блочные, строчны элементы и обязательные и необязательные для закрытия теги и их взаимоотношения друг с другом:

    • 10 декабря 2017 г.
    • Добрался до сайта...

      Кнопку оставил там же где была, т.к. согласно моему разумению, она внутри формы.

      Вот теперь, последний вариант Павла сработал как в Мозилле, Сафари, и Хроме - заказ оформился, и пока он оформлялся, повторно нажать на кнопку нельзя было .

      На мой взгляд все отлично. Еще посмотрит владелица сайта. Если ее устроит, перенесу на ее сайт.

      Благодарю Вас, Павел!
      • 10 декабря 2017 г. , редакция: 10 декабря 2017 г.
      • По разметке я отписал выше. Кнопка-то на месте. Ошибки в вёрстке (и немало), поэтому при построении DOM браузер отстраивает вёрстку по-новой и из-за ошибок закрывает форму раньше, чем она закрывается у вас по коду.

        Нельзя открыть форму в одном блоке, а закрыть совершенно в другом. Форма должна целиком входить в один блок, а если внутри неё есть разметка, то она опять же должна быть вся закрыта, т.е. нельзя открыть блок внутри формы, а закрыть его за её пределами.

        Валерий Викторович, а как же тесты?!

        Вы заполните форму не полностью, не укажите имя, например.
        1. Форма отправится.
        2. Кнопка заблокируется.
        3. Ответ придёт что поле не заполнено.
        4. Посетитель заполнит поле.
        5. А дальше будет в магазин звонить, потому что кнопка не нажимается и форма не отправляется.
        И в форме ссылка на условия обработки информации битая (http://opt.grandhobby.ru/privacy/).

        В общем, надо выполнить рекомендации выше в полной мере. А то я время потратил, а в итоге

        • 10 декабря 2017 г.
        • Да, исходном коде кнопка действительно выскочила из формы. Как-нить найду время, ради интереса поищу ошибку (скорее всего лишний div впаян). Сейчас глянул, быстро не найти. Да и работа у меня есть - еще осталось 54 сайта перенести на другой сервер, весь в этом.
        • 10 декабря 2017 г.
        • Павел, у меня есть предложение. Может поговорите с владелицей (думаю, она обратится к Вам, ей уже написал) этого сайта и договоритесь с ней об исправлении ошибок в ее шаблоне? У меня нет времени, а также в некоторых вопросах не силен, а у Вас это быстро получится?
          Конечно, верстка это мой конёк, но просто нет времени ковыряться в чужом шаблоне. Своей работы по горло. В проектах владелица не хочет выкладывать.
          Возьметесь? А об оплате уже сами меж собой договоритесь. И Вам польза, и мне польза - одна головная боль отпадет.
          • 10 декабря 2017 г. , редакция: 28 декабря 2017 г.
          • Пусть напишет, прямо вот сейчас не сделаю, но на той неделе исправлю. Если конечно стоимость устроит.
            • 10 декабря 2017 г.
            • Хорошо. Она еще не ответила. Передам ей что Вы согласны на общение. Благодарю Вас
              Кстати, в форме корзины ошибку нашел,
              Было так:
              Код
              echo '
              <div class="row"><div class="carts col-md-6">
              <form method="POST" action="" class="cart_form ajax " enctype="multipart/form-data" onsubmit="document.getElementById(\'knopka\').setAttribute(\'disabled\', \'disabled\');">
              <input type="hidden" name="module" value="cart">
              <input type="hidden" name="action" value="order">
              <input type="hidden" name="tmpcode" value="'.md5(mt_rand(0, 9999)).'">
              ';


              Сделал так, теперь кнопка внутри формы:
              Код
              echo '
              <form method="POST" action="" class="cart_form ajax " enctype="multipart/form-data" onsubmit="document.getElementById(\'knopka\').setAttribute(\'disabled\', \'disabled\');">
              <input type="hidden" name="module" value="cart">
              <input type="hidden" name="action" value="order">
              <input type="hidden" name="tmpcode" value="'.md5(mt_rand(0, 9999)).'">
              <div class="row"><div class="carts col-md-6">';


              т.е. <div class="row"><div class="carts col-md-6"> был впаян не там где надо.
        • 10 декабря 2017 г. , редакция: 10 декабря 2017 г.
        • Кстати, после исправления расположения кнопки в форме, после исправления ошибки, допустим, если неверно вписан ящик, то дает исправить, и потом можно отправить заказ. Наверно об этом говорили выше?
  • 10 декабря 2017 г.
  • Цитата
    Вы заполните форму не полностью, не укажите имя, например. Форма отправится.Кнопка заблокируется.Ответ придёт что поле не заполнено.Посетитель заполнит поле.А дальше будет в магазин звонить, потому что кнопка не нажимается и форма не отправляется.

    да да.. именно так
    Павел дело говорит!
    • 10 декабря 2017 г.
    • Ну, я когда копипастил название ящика, нечаянно прихватил пробел спереди. Ну, заметил, исправил.
      Дальше можно только обновить страницу иначе ступор, мне то это несложно, а 99% покупателей просто не догадаются.

      Я про это. А Вы про что?
  • 10 декабря 2017 г. , редакция: 10 декабря 2017 г.
  • http://opt.grandhobby.ru/privacy/ - нет на этом сайте такой страницы, вот и ошибка 404, неужели сложно догадаться?
    Предугадывая дальнейшее ваше словоизлияния на эту тему, скажу, что на оригинальном сайте страница есть, вот она и делал ее я, и все ошибки там точно мои.

    Ну, найду свободное время, ради интереса гляну какие ошибки могут быть в файле cart.view.form.php (да и вообще все файлы шаблона надо бы полностью проверить на предмет ошибок, кроме названной, если серьезные глюки).
    А так то автор шаблона Laraweb (bright-point), шишки прошу кидать в него, если это Вам доставляет удовольствие.
    Код
    А то я время потратил, а в итоге

    а я что не трачу время что ли? Странный Вы какой-то. Точно так же как Вы трачу время и точно также бесплатно как и Вы.

    Сознаюсь, что-то на этом сайте делал за небольшие деньги (в основном стили), но уже точно не на этой странице, которой Вы меня все "тычете".
    Павел, хватит уже нравоучений, ладно? Вроде отличный молодой человек, всегда и всем помогает (за что ему огромный респект), но все впечатление о себе портите занудством.
    • 10 декабря 2017 г. , редакция: 10 декабря 2017 г.
    • Валерий Викторович, при чём тут занудство? Это вообще-то ваша тема. Как вы и почему кому-то другому помогаете - это дело ваше. Тут (в этой теме) я помогаю вам. "Назвался груздем - полезай в кузов" (с), - не я придумал.
      Цитата
      Предугадывая дальнейшее ваше словоизлияния на эту тему
      Вы сказали, что сделали копию сайта, я заметил 404, сообщил вам. Зануда.
      Цитата
      а я что не трачу время что ли? Странный Вы какой-то.
      Я тут трачу время на вас, потому что вы автор темы и вы попросили помощи в решении проблемы. А теперь выходит, что "мопед не мой".
      Цитата
      но все впечатление о себе портите занудством
      Ну я не червонец, чтобы всем нравиться. Могу, кстати, вам, Валерий Викторович, эту фразу вернуть прям без изменений. Сами попросили помощи, вам выложили готовое решение с макимально прозрачной и понятной инструкцией, вы сделали половину, заработало наполовину, и теперь и вовсе "А, да ну его нафиг, других дел что ли нет? Сайт вообще не мой...". Процитирую вас же.
      Цитата
      Странный Вы какой-то.

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум