2010-10-22 27 views
1

我在这里做了一些奇怪的事情,我正在查询我的本地数据库中的数据,并使用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个不同位置中设置。我试图通过应该选择的城市(芝加哥,纽约,加利福尼亚州)。你能帮我修复我的代码,让这个工作正常吗?

回答

1

我想通了。最终这样做:

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

已在POST串分割这样的值,奇怪:

$ post_string = “& the_field =值1 $ the_field =值2 $ the_field =值3”。

现在工作正常。

0

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

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

但是,您需要确保您不会将值与标签混淆。 Salesforce的将期待值不是标签,所以如果Salesforce已有类似内置:

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

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

+0

那么,我给了一个镜头,并没有在Salesforce中选择的位置。标签和值完全相同,所以不应该是问题。嗯....任何其他想法? – mike 2010-10-22 21:46:21

+0

尝试使用散列而不是数组数组可能对于上面的代码您可以使用'$ sd ['location'] = array_combine($ sd ['location'],$ sd ['location']);'at the结束。 – prodigitalson 2010-10-23 00:23:39

7

你试图实现/重复的是非标准的(或者“实验性的”,如果你喜欢的话)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 

你也应该在HTTP请求中的适当位置,将它传递以与符合之前使用PHP的urlencode功能上形式的名称和值RFC1738。作为一个侧面说明,尽管PHP可能并不孤单,但它在如何处理单个post var中的多个值时是一个奇怪的现象。它遵循HTML建议的规范,但将其扩展为仅将var视为多个,如果其名称包含PHP array append operator,例如formname[]。如果您尝试遵循PHP脚本中的HTML建议(请参阅下文),那么当通过超文天线的$_POST$_GET访问时,它将覆盖名称上的以前的值。

0

我也在尝试向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上发送消息。

干杯!

0

我看到这个帖子太旧了,但以防万一:

我们必须为它

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

这就是所有。