jQuery AJAX post只查找多行文本框的第一行


jQuery AJAX post only finds first line of mult line textbox

我在WordPress上有一个POST表单,我使用它通过它的API将数据传递给MailChimp。

在其本身(即不使用jQuery),它工作如预期。但是,当我尝试通过AJAX post操作传递数据而不是使用表单的操作来导航到新页面时,它只找到多行文本框的第一行。

<?php 
    // Template Name: MailChimp Form 
    get_header();
?>
<form id="mailchimp_actions" method="post" action="/ajax-curl-actions/">
    <select name="action" id="action">
        <option>Subscribe</option>
        <option>Unsubscribe</option>
        <option>Find</option>
    </select>
    <textarea name="import_data" id="import_data" placeholder="Email Address,First Name,Last Name"></textarea>
    <input type="submit">
</form>
<?php get_footer(); ?>

处理$_POST数据的页面

<?php 
    // Template: AJAX - cURL actions.
    ###############################################################################
    #                                                                             # 
    #   Available options:                                                        #
    #                                                                             #     
    #   Add New Subscriber - Create a new subscriber and add them to a list.      #
    #   Subscribe - Add an existing email to the specified list.                  #
    #   Unsubscribe - Completely unsubscribe an email from all mailers.           #
    #   Update - Change subscriber information.                                   #
    #                                                                             #
    ###############################################################################
    $subscribers = bfm_data_format($_POST);
    $final_report = array('successes'=>0,'failures'=>array());
    foreach($subscribers as $subscriber) :
        $post_data = array('email' => $subscriber[0], 'fname' =>  $subscriber[1], 'lname' =>  $subscriber[2]);
        $action = $_POST['action'];
        if(!bfm_subscriber_exists($subscriber[0]) && $action=='Subscribe') $action = 'Add New Subscriber';
        $report = bfm_curl_actions(bfm_list_id(),bfm_api_key(),$post_data,$action);     
        if($report['success']) :
            $final_report['successes']++;   
        else:
            $final_report['failures'][] = $report['error'];
        endif;
    endforeach;
?>

// Format data
    function bfm_data_format($data) {
        $import_data = $data['import_data'];
        $import_data_lines = explode("'n",$import_data);
        $i=0;
        foreach($import_data_lines as $import_data_line) :
            $import_data_lines[$i] = explode(',',$import_data_line);
            $i++;
        endforeach;
        return $import_data_lines;
    }
    // MailChimp data manipulation  
    function bfm_curl_actions($list_id,$api_key,$post_data,$action) {
        $auth = base64_encode( 'user:'.$api_key );
        $data = array(
            'apikey'        => $api_key,
            'email_address' => $post_data['email'],
            'merge_fields'  => array(
            'FNAME' => $post_data['fname'],
            'LNAME' => $post_data['lname'],
            )
        );
        if($action == 'Subscribe' || $action == 'Add New Subscriber') :
            $data['status']='subscribed';
        elseif($action == 'Unsubscribe'):
            $data['status']='unsubscribed';
        endif;
        $member_id = md5($post_data['email']);
        $json_data = json_encode($data);
        $ch = curl_init();
        $curlopt_url = "https://us7.api.mailchimp.com/3.0/lists/$list_id/members/";
        if($action!='Add New Subscriber') $curlopt_url.=$member_id; // Member ID needs to be excluded if adding an entirely new person.
        curl_setopt($ch, CURLOPT_URL, $curlopt_url);
        if($action == 'Subscribe' || $action == 'Unsubscribe' || $action == 'Update') : 
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
        endif;
        if($action == 'Find'):
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
        endif;
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json',
            'Authorization: Basic '.$auth));
        curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/3.0');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
        $result = curl_exec($ch);
        $status = "undefined";
        $msg = "";
        $myArray = json_decode($result, true);
        foreach($myArray as $key => $value)
        {
            if( $key == "status" )
            {
                $status=$value;             
            }
            else if ($key == "title")
            {
                $msg=$value;                
            }       
        }
        $email = $post_data['email'];
        if($action == 'Subscribe' || $action == 'Add New Subscriber'): 
            if($status == "subscribed") :
                $report = array ('success'=>true,'error'=>'');
            else: 
                $report = array('success'=>false,'error'=>array('email'=>$email,'message'=>$msg));
            endif;          
        endif;
        return $report;     
    }

    function bfm_subscriber_exists($email) {
        $api_key = bfm_api_key();
        $list_id = bfm_list_id();
        $auth = base64_encode( 'user:'.$api_key );
        $data = array(
            'apikey'        => $api_key,
            'email_address' => $email,
        );
        $member_id = md5($email);
        $json_data = json_encode($data);
        $ch = curl_init();
        $curlopt_url = "https://us7.api.mailchimp.com/3.0/lists/$list_id/members/$member_id";
        curl_setopt($ch, CURLOPT_URL, $curlopt_url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json',
            'Authorization: Basic '.$auth));
        curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/3.0');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
        $result = json_decode(curl_exec($ch),true);
        if ($result['status']=='404') return false;
        return true;
        die(' '); // Free up memory.
    }

这就像预期的那样工作。第二个页面将第一个页面的数据导入MailChimp。

然而,如果我尝试通过AJAX使用下面的jQuery做同样的事情,它仍然导入到MailChimp,但只包括多行文本框的第一行;所有其他行被忽略。

$(document).on("submit","#mailchimp_actions", 
        function(event) {
            event.preventDefault();
            var bfm_action = $('#action').val();
            var bfm_import = encodeURIComponent($('#import_data').val());
            console.log(bfm_action);
            console.log(bfm_import);
            $.post("/ajax-curl-actions/",
                {   
                    import_data: bfm_import,
                    action: bfm_action,
                },
                function () {
                    alert("Successful import.");    
                }
            );  
        }
    );

我错过了什么?如何让它识别文本框中的所有行?

似乎问题是由双转义变量引起的:一次由您,然后再次由jQuery发送键值对作为对象。

如果你向jQuery的ajax方法发送键值对,jQuery会为你处理转义,所以你可以删除encodeURIComponent:

$(document).on("submit","#mailchimp_actions", 
    function(event) {
        event.preventDefault();
        var bfm_action = $('#action').val();
        var bfm_import = $('#import_data').val();
                         ^^^^^^^^^^^^^^^^^^^^^^^ here
        console.log(bfm_action);
        console.log(bfm_import);
        ...

请尝试更改这几行代码

function bfm_data_format($data) {
  $import_data = nl2br(urldecode($data['import_data']));
  $import_data_lines = explode("'n", $import_data);
  $i = 0;
  foreach ($import_data_lines as $import_data_line) :
      $import_data_lines[$i] = explode(',', $import_data_line);
      $i++;
  endforeach;
  return $import_data_lines;
}