【问题标题】:How do I post to a form and populate a select multiple?如何发布到表单并填充选择多个?
【发布时间】:2010-10-22 21:25:15
【问题描述】:

我在这里做了一些奇怪的事情,我正在从本地数据库中查询数据并使用 cURL 将其发送到 Salesforce 表单。数据正确发布到 Salesforce。但是,选择倍数没有选择正确的值。在我的代码中查看下面的 $sd["location"]:

    //init curl
    $ch = curl_init();

    //setup the params
    $url = 'https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';
    $oid = "HIDDEN";

    //setup the superdelegate array
    $sd = array();
    $sd["oid"] = $oid;
    $sd["retURL"] = "";  
    $sd["first_name"] = "1144asdfsadf4"; 
    $sd["last_name"] = "SDFSD1111";
    $sd["state"] = "IL";
    $sd["location"] = '"Chicago","New York","California"'; //this is the value that submits to the select multiple

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($sd));

    //post to Salesforce and then close the connection 
    curl_exec($ch); 
    curl_close($ch);

选择多个已在 Salesforce 中设置,具有 30 个不同的位置。我正在尝试通过应该选择的城市(芝加哥、纽约、加利福尼亚)。您能帮我修复我的代码以使其正常工作吗?

【问题讨论】:

    标签: php select curl


    【解决方案1】:

    您尝试实现/复制的是非标准(或“实验性”,如果您愿意)application/x-www-form-urlencoded 格式。 mime 类型中的“x-”表示尚未正式标准化。

    我遇到的最常见的应用程序/x-www-form-urlencoded 格式是在 HTML 4(可能还有 HTML 5)规范 here 中指定的。其中,当简化时,states 表示每个successful control 都与它的名称和当前值配对,按照它在表单中出现的顺序,并用与号“&”分隔。这将转换为包含以下内容的 HTTP GET 或 POST 方法:

    name=test&desc=some%20description&option=1&option=2&option=3
    

    您还应该在表单名称和值上使用 PHP 的 urlencode 函数,然后再将其传递到 HTTP 请求的适当位置,以符合 RFC1738

    附带说明,虽然 PHP 可能并不孤单,但它在处理单个 post var 上的多个值方面是一个奇怪的球。它遵循 HTML 建议规范,但将其扩展为仅在名称包含 PHP array append operator 时才将 var 视为多重,例如 formname[]。如果您尝试在 PHP 脚本上遵循 HTML 建议(见下文),当通过 $_POST$_GET 超全局变量访问时,它将覆盖名称上的先前值。

    【讨论】:

      【解决方案2】:

      我想通了。这最终做到了:

      作为“value1;value2”发送不起作用。即 implode(";", $array) 或 join() 不起作用。

      奇怪的是,不得不在 POST 字符串中拆分这样的值:

      $post_string .= "&the_field=value1 $the_field=值2 $the_field=value3";

      现在可以正常工作了。

      【讨论】:

        【解决方案3】:

        $sd['location'] 应该是一个数组,如果它是一个倍数。例如:

        $location = str_replace('"', '', '"Chicago","New York","California"');
        $sd['location'] = explode(',', $location);
        

        但是,您需要确保不会将值与标签混淆。 Salesforce 将期望值而不是标签,因此如果 salesforce 是使用以下内容构建的:

        1 = Antwerp
        2 = California
        ...
        29 = Whatever
        

        然后您需要传递键值而不是实际的城市名称。我不知道你的销售人员是什么样的,所以你必须弄清楚:-)

        【讨论】:

        • 好吧,我试了一下,在 Salesforce 中没有选择任何位置。标签和值完全相同,所以这不应该是问题。嗯....还有其他想法吗?
        • 尝试使用散列而不是数字数组,所以使用上面的代码你可以在最后使用$sd['location'] = array_combine($sd['location'], $sd['location']);
        【解决方案4】:

        我还尝试向 Salesforce 发送多个选择值,但我的代码看起来略有不同,我不确定如何实施您的解决方案。这实际上是我在网上可以找到的唯一解决方案,所以我希望你能帮助我。这是我的字段数组的样子:

        //set POST variables
        $url = 'https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8';
        
        $fields = array(
        'oid'=>urlencode($oid),
        '00NE0000003yZ9B'=>urlencode($Lead_Source_Email),
        '00NE0000004hd4z'=>urlencode($Personal_Challenges),
        'recordType'=>urlencode($recordType),
        'retURL'=>urlencode($retURL),
        'first_name'=>urlencode($first_name),
        'last_name'=>urlencode($last_name),
        'email'=>urlencode($email),
        'phone'=>urlencode($phone),
        //'00NE0000003uZ4G'=>urlencode($Contact_By),
        '00NE0000003uZ9X'=>urlencode($Message)
        );
        

        $Personal_Challenges 是选择框中具有多个值的字段。老实说,我不明白所有的代码,但这是以下内容:

        //url-ify the data for the POST
        foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
        rtrim($fields_string,'&');
        
        //print_r($fields_string);
        
        //open connection
        $ch = curl_init();
        
        //set the url, number of POST vars, POST data
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_POST,count($fields));
        curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
        
        //execute post
        $result = curl_exec($ch);
        
        //close connection
        curl_close($ch);
        

        我希望你能给我任何帮助!很抱歉在回答中问这个问题,但显然我不能直接在 StackOverflow 上发消息。

        干杯!

        【讨论】:

          【解决方案5】:

          我看到这篇文章太旧了,但以防万一:

          我们必须为它准备字符串

          curl_setopt($ch, CURLOPT_POSTFIELDS, $str_fields);
          

          我们可以像这样准备数组:

          $fields = array('f1' => 'v1', f2 =>['v21', 'v22', 'v23'], 'f3' =>'v3' );
          $fields = http_build_query($fields);
          

          它给出:f1=v1&f2%5B0%5D=v21&f2%5B1%5D=v22&f2%5B2%5D=v23&f3=v3 我们需要清除像“%5B0%5D”这样的字符

          $str_fields=preg_replace("/(%5[A-F]\d{0,})/" ,"",$fields);
          

          我们得到 f1=v1&f2=v21&f2=v22&f2=v23&f3=v3

          就是这样。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-29
            • 1970-01-01
            • 2021-11-05
            • 1970-01-01
            • 1970-01-01
            • 2011-01-21
            相关资源
            最近更新 更多