【问题标题】:How can I post my form to a custom php script in addition to MailChimp除了 MailChimp 之外,我如何将表单发布到自定义 php 脚本
【发布时间】:2012-08-29 11:15:04
【问题描述】:

谁能给我任何帮助或建议来调试这个问题?

我有一个表格,POST's to MailChimp:

<form id="mailchimp_signup" action="http://MY_MC_ACCT.us2.list-manage.com/subscribe/post" method="POST">
...
<input type="submit" class="button" name="submit" value="Subscribe to list">
...

但如果满足某些条件(选中的复选框),我需要此表单发送额外的电子邮件:

$('input[type=submit]').click(function(e){
    if( $('input[name="more_info"]:checked').val() && !$('#mailchimp_signup').hasClass('success') ){
        e.preventDefault();
        $.post("../process_email_form.php", $('#mailchimp_signup').serialize(), function(){
            alert('posted');
            $('#mailchimp_signup').submit();
        });
    }            
});

发生了什么:

  • process_email_form.php 工作正常,正在发送电子邮件。

  • alert('posted') 正在触发。

  • 很遗憾,我似乎无法将表单提交给 MailChimp。警报触发,但随后什么也没有……我在控制台中看不到任何错误。

  • 由于某种原因,直接在控制台中输入 $('#mailchimp_signup').submit(); 甚至不会将表单 POST 到 MailChimp

更多背景

这实际上是我写的关于这个问题的第三个问题。起初我试图用 cURL 解决它,但这似乎是错误的方法。供参考:

  1. How can I execute php before posting to someone elses script from a form?
  2. Using cURL to POST form to two places

【问题讨论】:

    标签: php jquery forms post mailchimp


    【解决方案1】:

    您可以在第一个请求完成后务实地提交表单。

    $('input[type=submit]').click(function(e){
            if( $('input[name="more_info"]:checked').val() && !$('#mailchimp_signup').hasClass('success') ){
                e.preventDefault();
                $.post("../process_email_form.php", $('#mailchimp_signup').serialize(), function(){
                    alert('posted');
                    $.post($('#mailchimp_signup').attr('action'),$('#mailchimp_signup').serialize(),function(html){
                        //do something with the result eg. $(document).html(html);
                    });
                });
            }            
        });
    

    或者你可以在没有异步的情况下运行第一个请求,这将锁定浏览器,直到 ajax 请求完成。

    $('input[type=submit]').click(function(e){
        if( $('input[name="more_info"]:checked').val() && !$('#mailchimp_signup').hasClass('success') ){
            $.ajax({
                url:"../process_email_form.php", 
                data:$('#mailchimp_signup').serialize(),
                type:'POST',
                async:false
            });
        }            
    });
    

    【讨论】:

    • 谢谢!那么,第一个选项看起来会在幕后提交给 MailChimp 吗?我需要它去他们的成功(或验证)页面。我尝试了第二个选项,它似乎有效——除了某些原因,POST 数据不会像我的原始代码那样进入 email_form。它现在向我发送一封空白电子邮件。
    • 你是对的。众所周知,您必须使用第二个。它会在处理第一个请求时锁定浏览器。我会在第一个请求运行时显示某种加载对话框。
    • 由于我上面的代码损坏,process_email_form 已正确填写(只是没有发布到 MC)。使用您的代码(第二个),它确实会转到 MC 和我的脚本,但我的脚本看不到 POST 数据(print_r($_POST, TRUE); 返回array())。
    • 尝试在那里扔一个 e.preventDefault 看看它是否仍然没有发布数据。据我所知,它应该起作用。也许尝试为 serialize()、var data=$('#mailchimp_signup').serialize(); 设置一个变量,然后在 $.ajax 调用中设置它。还要对序列化执行 console.log 并确保它实际上正在序列化数据。
    • 我的错,我看到了问题,将method更改为type。我在上面的答案中修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2015-08-14
    • 2017-05-18
    相关资源
    最近更新 更多