Обращение к методу со стороны ajax

Кастомизирую форму обратной связи (которая site.send_email_form), хочу отправлять форму по ajax без перезагрузки страницы.

Скопировал метод sendEmail в wa-apps/shop/lib/classes/shopViewHelper.class.php, работаю с ним. Возникла проблема обращения к методу со стороны ajax.

Что мне написать в параметре url скрипта, чтобы по клику выполнился метод sendEmail? Это вообще возможно?

16 ответов

  • 1

    Отправляйте ваш ajax-запрос на адрес текущей страницы. Аналогично тому, как это делает стандартная форма site.send_email_form, указывая <form action="">.

    Идея в том, что в процессе рендеринга страницы выполняется код шаблона с формой. Этот код вызывает sendEmail(), если видит, что пришли данные в POST'е. Вот так и делайте.

    • +1
      Павел Соколов Павел Соколов 20 мая 2015 05:46 #

      Идея понятна, но не получается :(


      Вот такая простейшая форма

      {if $wa->post("send") and $wa->shop->sendEmail($wa->post("phone"))}

      {else}

      <form method="post" action="" id="callme_send_form">

      <input type="text" placeholder="Номер телефона" name="phone">

      <input type="submit" value="Перезвоните мне" name="send">

      </form>

      {/if}


      За ней скрипт

      $(document).ready(function() {

      $("#callme_send_form").submit(function(){

      var form = $(this);

      var data = form.serialize();

      $.ajax({

      type: 'POST',

      url: location.href,

      data: data

      });

      return false;

      });

      });


      Без скрипта письмо приходит, со скриптом - нет.

      • +1

        POST-запрос не отправляет поле с именем 'send' — посмотрите в консоли браузера. Как минимум, поэтому не срабатывает условие в первой строке кода. Причина:

        Only "successful controls" are serialized to the string. No submit button value is serialized since the form was not submitted using a button.

  • 1
    Кирилл Александрович 14 апреля 2016 06:16 #

    Добрый день. А не расскажете поподробнее откуда это скопировали?

    Скопировал метод sendEmail в wa-apps/shop/lib/classes/shopViewHelper.class.php,
    • +1
      Павел Соколов Павел Соколов 15 апреля 2016 04:44 #

      из /wa-apps/shop/lib/classes/shopNotifications.class.php

      • +1
        Red Cat Red Cat 27 августа 2016 20:50 #

        Павел, а можете пошагово расписать данную доработку, ну или по крайней мере выложить содержимое /wa-apps/shop/lib/classes/[AjaxNotification].class.php ?

        • +6
          Павел Соколов Павел Соколов 29 августа 2016 10:40 #

          Раз тема спусть столько времени актуальна, рассказываю как реализовать отправку формы по AJAX без перезагрузки страницы на примере формы быстрого заказа в один клик.

          Форма в шаблоне карточки товара:

          <div id="res_by_me">
              {if $wa->post("phone") and shopCustom::sendBuyMeEmail($wa->post("phone"), $wa->post("title"), $wa->post("url"), $wa->post("code"))}
                  {* ничего не делаем *}
              {else}
                  <form method="post" action="" id="buyme_send_form">
                      <label class="fs11 mb10">Оставьте номер телефона и Ваш заказ будет оформлен. Мы свяжемся с Вами для уточнения деталей доставки.</label>
          
          	    {* ниже размещаем скрытые дополнительные поля, которые мы хотим отправить на email *}
          	    {* например, Наименование товара, Урл откуда отправлена форма и ID товара *}
          	    {* эти же поля необходимо передать в метод shopCustom::sendBuyMeEmail() в качестве параметров *}
          	    <input type="hidden" name="title" value="{$product.name|escape}">
                      <input type="hidden" name="url" value="{$wa->currentUrl(true)}">
                      <input type="hidden" name="code" value="{$product.id}">
          
                      {* номер телефона *}
                      <input type="text" placeholder="Номер телефона" name="phone">
                      <button type="submit">Заказать</button>
                  </form>
              {/if}
          </div>

          Скрипт для отправки:

          $("#buyme_send_form").submit(function(){
              var form = $(this);
              var data = form.serialize();
              $.ajax({
                  type: 'POST',
                  url: location.href,
                  data: data,
                  success: function(response){
                      $('#res_by_me').html('Заказ уже у нас. Мы свяжемся с Вами.'); //вместо формы пишем сообщение
          	}
              });
              
              return false; //отключаем перезагрузку страницы
          });

          Теперь в соответствии с инструкцией https://support.webasyst.ru/170/custom-helper/ создаем класс shopCustom и метод sendBuyMeEmail(). Привожу полный код файла /wa-apps/shop/lib/classes/shopCustom.class.php

          Файл /wa-apps/shop/lib/classes/shopCustom.class.php

          <?php
          class shopCustom
          {
              public static function sendBuyMeEmail($phone, $title, $url, $code){
          
                  //не забудьте проверить данные!!!
          
                  $body = $phone ."\n". $title ."\n Код товара:". $code ."\n". $url; //формируем тело сообщения по вашему желанию
                  $subject = 'БЫСТРЫЙ ЗАКАЗ';
                  $mail_message = new waMailMessage($subject, $body, 'text/plain');
                  $mail_message->setFrom('email от кого отправляем', 'www.site.ru');
                  $mail_message->setTo('email кому отправляем', 'www.site.ru');
                  $mail_message->send();
          
                  return true;
              }
          }
          • +1
            Red Cat Red Cat 29 августа 2016 12:17 #

            Не приходят сообщения на Емейл.... В логах:

            Swift_RfcComplianceException: Address in mailbox given [email от кого отправляем] does not comply with RFC 2822, 3.6.2. in /public_html/wa-system/vendors/swift/classes/Swift/Mime/Headers/MailboxHeader.php:352

            В shopCustom.class.php перепроверил, в setFrom и в setTo указанны корректные адреса емейл...

            • +2
              Павел Соколов Павел Соколов 29 августа 2016 12:33 #

              Вместо 'email от кого отправляем' вставьте реальный адрес электронной почты, который позволит отправить письмо с Вашего сервера, а вместо www.site.ru адрес Вашего сайта.

              То же самое вместо 'email кому отправляем'.

  • 1
    Дмитрий Юрьевич 13 сентября 2017 10:35 #

    Крутая штука, но смс не хотят приходить как не бился, может подскажете в чем может быть проблема?
    Адреса сайта и мыла прописал

  • 1
    Дмитрий Юрьевич 13 сентября 2017 11:50 #

    Разобрался, письма с сайта вообще не приходили, поменял почту, заработало.
    А скажите пожалуйста есть ли возможность вставить в php файл адрес почты из настроек магазина, для заказчика так будет удобнее.

  • 1
    GrOObeR Абрамович 10 января 2018 18:45 #

    Сделал все по инструкции. Работает, но только на части страниц причем не понятно по какой причине. Методом проб и ошибок, как я понял на части страниц {if $wa->post("xxxx")} это условие банально не отрабатывает как будто не вытягивается пост. И в итоге получается работает отправка на страницах товара, страницах Магазина, на БЛОГЕ везде, ... и не работает в корзине, в категориях, на главной! Форма одинаково генериться проверял! Подскажите в чем может быть причина, а то получается с части страниц письмо приходит , а с части нет...?

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите