Как правильно отправить форму с помощью JS и успешно опубликовать все данные формы? - PullRequest
0 голосов
/ 06 января 2019

Я работаю со встроенным приложением на нашем сайте разработчиков, и когда я нажимаю кнопку отправки внутри iframe, я запускаю событие ручной отправки в другой форме (не в iframe) на этой странице. Если я вручную нажимаю кнопку отправки формы, мои данные и все работает правильно. Однако я хочу исключить дополнительный щелчок пользователя и автоматически отправить внешнюю форму, когда пользователь отправляет другую форму внутри в фрейме.

У меня все работает правильно на базовом уровне. Когда пользователь нажимает кнопку отправки в iframe, я использую JQuery для получения значений изнутри iframe и установки значений в этой внешней форме. Используя событие jquery 'submit ()', я могу отправить эту внешнюю форму. Проблема в том, что страница обновляется, и данные никуда не уходят. Если я удаляю событие submit () и вручную нажимаю кнопку отправки, форма отправляет сообщения и в этом случае добавляет продукт с пользовательскими данными в корзину.

В качестве подтверждения концепции, это мой «iframed» HTML.

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <h1>Proof of Concept</h1>
        <p>Total cost: $<span id="cust_price">222.22</span> plus shipping.</p>
        <p>Quote number: <span id="quot_num">1546751962211</p>

        <form method="POST" enctype="multipart/form-data" id="newQuoteForm">
            <button type="submit" class="btn btn-primary" name="new-app-btn">Add to Cart</button>
        </form>
    </body>
    <footer>
    </footer>
</html>

Вот моя форма на странице вне ВРЕМЕНИ.

<form method="POST" enctype="multipart/form-data" id="outer-quote-form" action="/checkout/">
    <label class="quote_number">Quote Number: 
        <input type="text" id="quote_number" name="quote_number" value="">
    </label>
    <label class="custom_price">price:
        <input type="text" id="custom_price" name="custom_price" value="">
    </label>
    <button type="submit" class="btn btn-primary" name="ws-add-to-cart">Add to Cart</button>
</form>

Тогда у меня есть JQuery, работающий, чтобы получить значения iframed и поместить их во внешнюю форму. После этого в этой форме запускается событие submit ().

<script>    
    jQuery('#newQuoteApp').load(function() {
        var iFrameDOM = jQuery("iframe#newQuoteApp").contents();
        jQuery('#newQuoteApp').contents().find('#newQuoteForm').submit(function() { 
            jQuery("input#custom_price").val(jQuery('#newQuoteApp').contents().find('#cust_price').text()); // updated
            jQuery("input#quote_number").val(jQuery('#newQuoteApp').contents().find('#quot_num').text());

            jQuery("#outer-quote-form").submit();
            return true; //return false prevents submit
        });
    }); 
</script>

За исключением случаев, когда запускается событие jquery submit (), появляется форма для отправки, и страница обновляется, но данные не публикуются, как это происходит, когда я вручную отправляю форму. Есть ли здесь дополнительный шаг или лучший способ запустить отправку формы с почтовыми данными?

Редактировать: Добавление функции PHP, которая не запускается в jquery submit () для контекста.

if (isset($_POST['ws-add-to-cart'])) {
    add_action( 'init', 'add_product_to_cart' );
    function add_product_to_cart() {
        global $woocommerce;
        global $product;
        $product_id = 138;
        $woocommerce->cart->add_to_cart($product_id);
    }
    header("Location:https://www.devsite.com/checkout/");
}

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Причина, по которой форма не отправляется, потому что вы отправляете всю форму без кнопки отправки, которая является
<button type="submit" class="btn btn-primary" name="ws-add-to-cart">Add to Cart</button>
, которую вы объявили в php для получения запроса на публикацию, подобного этому

if (isset($_POST['ws-add-to-cart'])) {...

Когда вы звоните submit (); в форме через метод get вы видите
'/new-quote/?quote_number=1546751962211&custom_price=222.22'
но где ws-add-to-cart, это не отправка, и именно поэтому php не получает ваш запрос

Исправление будет заключаться в добавлении .click() на кнопку отправки вместо отправки формы

<script>
  function enterVals($val){
    var price = $val.price;
    document.getElementById("quote_number").value = $val.num
    document.getElementById("custom_price").value = $val.price
    document.getElementsByName("ws-add-to-cart").click();
  }
</script>

Или в вашем скрипте, если вы хотите использовать jquery, это исправление

<script>    
    jQuery('#newQuoteApp').load(function() {
        var iFrameDOM = jQuery("iframe#newQuoteApp").contents();
        jQuery('#newQuoteApp').contents().find('#newQuoteForm').submit(function() { 
            jQuery("input#custom_price").val(jQuery('#newQuoteApp').contents().find('#cust_price').text()); // updated
            jQuery("input#quote_number").val(jQuery('#newQuoteApp').contents().find('#quot_num').text());

            jQuery("button[name=ws-add-to-cart]").click();
            return true; //return false prevents submit
        });
    }); 
</script>

Это определенно ответ и извините за мою глупость, раньше я не обращал на это должного внимания

0 голосов
/ 07 января 2019

попробуйте удалить return true из вашего кода js
если это не сработает, попробуйте изменить <form method="POST" на <form method="GET", чтобы отладить значения в URL только для проверки того, что форма действительно запускается со значениями

Альтернативный метод: метод старой школы

код для страницы за пределами Iframe

<script>
  function enterVals($val){
    var price = $val.price;
    document.getElementById("quote_number").value = $val.num
    document.getElementById("custom_price").value = $val.price
    document.getElementById("outer-quote-form").submit();
  }
</script>

код для файла Iframe

<script type="text/javascript">
    $('#newQuoteForm').on('submit', function(event) {
        var Page = window.parent;
        var allVals = {
            price:$('#cust_price').text(),
            num:$('#quot_num').text()
        }
        Page.enterVals(allVals);
        event.preventDefault();
    });
</script>

Объяснение

window.parent относится к родительскому окну, в котором загружен iframe, со ссылкой на это мы можем запускать функции, которые находятся в родительском окне, поэтому мы создали переменную и добавили информацию, отправляемую функцией enterVals() к окну
Функция enterVals() просто помещает значения и отправляет форму без jQuery.

Как правильно отправить форму в JS?

Возможно, это не лучший способ отправки формы с помощью js, но это кросс-браузер, который хорош

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...