我正在努力尝试从我将每个月收到的CSV文件中自动更新SugarCRM系统中的某些记录。
背景/引言
我正在使用Sugar提供的以下代码来通过REST更新/创建记录。
<?php
include_once('parsecsv.lib.php'); // Include the parsecsv-for-php library
$csv = new parseCSV('myCSV.csv'); // Parse through the CSV and store results in $csv
$url = "http://{site_url}/service/v4/rest.php";
$username = "admin";
$password = "password";
//function to make cURL request
function call($method, $parameters, $url)
{
ob_start();
$curl_request = curl_init();
curl_setopt($curl_request, CURLOPT_URL, $url);
curl_setopt($curl_request, CURLOPT_POST, 1);
curl_setopt($curl_request, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($curl_request, CURLOPT_HEADER, 1);
curl_setopt($curl_request, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_request, CURLOPT_FOLLOWLOCATION, 0);
$jsonEncodedData = json_encode($parameters);
$post = array(
"method" => $method,
"input_type" => "JSON",
"response_type" => "JSON",
"rest_data" => $jsonEncodedData
);
curl_setopt($curl_request, CURLOPT_POSTFIELDS, $post);
$result = curl_exec($curl_request);
curl_close($curl_request);
$result = explode("\r\n\r\n", $result, 2);
$response = json_decode($result[1]);
ob_end_flush();
return $response;
}
//login -----------------------------------------------
$login_parameters = array(
"user_auth"=>array(
"user_name"=>$username,
"password"=>md5($password),
"version"=>"1"
),
"application_name"=>"RestTest",
"name_value_list"=>array(),
);
$login_result = call("login", $login_parameters, $url);
/*
echo "<pre>";
print_r($login_result);
echo "</pre>";
*/
//get session id
$session_id = $login_result->id;
//create contacts ---------------------------------------
$set_entries_parameters = array(
//session id
"session" => $session_id,
//The name of the module from which to retrieve records.
"module_name" => "Accounts",
//Record attributes
"name_value_list" => array(
array(
//to update a record, you will nee to pass in a record id as commented below
array("name" => "id", "value" => "111111111"),
array("name" => "jan_field_1", "value" => "Sample Value 1"),
array("name" => "jan_field_2", "value" => "Sample Value 2"),
// more fields could be added here
),
array(
//to update a record, you will nee to pass in a record id as commented below
array("name" => "id", "value" => "222222222"),
array("name" => "jan_field_1", "value" => "Sample Value 1"),
array("name" => "jan_field_2", "value" => "Sample Value 2"),
// more fields could be added here
),
),
);
$set_entries_result = call("set_entries", $set_entries_parameters, $url);
echo "<pre>";
print_r($set_entries_result);
echo "</pre>";
?>
如果我对$ set_entries_parameters数组中的值进行硬编码,那么一切正常:
//Record attributes
"name_value_list" => array(
array(
//to update a record, you will need to pass in a record id as commented below
array("name" => "id", "value" => "111111111"),
array("name" => "jan_field_1", "value" => "Sample Value 1"),
array("name" => "jan_field_2", "value" => "Sample Value 2"),
),
array(
//to update a record, you will need to pass in a record id as commented below
array("name" => "id", "value" => "222222222"),
array("name" => "jan_field_1", "value" => "Sample Value 1"),
array("name" => "jan_field_2", "value" => "Sample Value 2"),
),
),
);
以下是print_r($set_entry_parameters['name_value_list'])
的打印输出,最终作为function call($method, $parameters, $url)
传递给$paramaters
- 一切正常,每条记录的记录都会正确更新。
Array
(
[0] => Array
(
[0] => Array
(
[name] => id
[value] => 111111111
)
[1] => Array
(
[name] => jan_field_1
[value] => Sample Value 1
)
[2] => Array
(
[name] => jan_field_2
[value] => Sample Value 2
)
)
[1] => Array
(
[0] => Array
(
[name] => id
[value] => 222222222
)
[1] => Array
(
[name] => jan_field_1
[value] => Sample Value 1
)
[2] => Array
(
[name] => jan_field_2
[value] => Sample Value 2
)
)
)
我正在使用的CSV文件采用以下格式:其中id是CRM中记录的ID,每个附加列标题都是将更新的字段以及应设置的值:
id,field_1,field_2,field_3,field_4,field_5,field_6
111111111,21,10,8,0,1,1
222222222,32,8,7,0,0,1
333333333,17,11,7,0,0,4
随着时间的推移,每个新月都会在电子表格中添加多个新列/标题。
我目前正在使用http://code.google.com/p/parsecsv-for-php/中的parsecsv-for-php库来解析CSV文件。该库通过$csv->data'
在$csv = new parseCSV('myCSV.csv');
创建以下数组:
Array
(
[0] => Array
(
[id] => 111111111
[field_1] => 21
[field_2] => 10
[field_3] => 8
[field_4] => 0
[field_5] => 1
[field_6] => 1
)
[1] => Array
(
[id] => 222222222
[field_1] => 32
[field_2] => 8
[field_3] => 7
[field_4] => 0
[field_5] => 0
[field_6] => 1
)
)
问题/问题
最后解决我正在努力解决的问题。
我需要找到一种方法来获取从parsecsv-for-php库中创建的数组,并使$ set_entry_paramaters ['name_value_list']最终传递到更新所有记录的函数中。
在上面的例子中,如果我需要使用记录的ID和需要更新的每个字段来更新需要更新的每个子数组,一切都正常。
但$csv->data
数组每个月都会更改需要更新的新记录以及需要更新的新字段。
我猜我需要以某种方式递归地将$csv->data
数组中的任何内容添加到$set_entry_parameters['name_value_list']
中,但$csv->data
的键/索引与需要的内容不匹配发送。
正如你所希望的那样,每个要更新的帐户都是它自己的数组:要更新的记录的id是一个子数组,每个要更新的字段是一个子数组同样,但是我解析的CSV数组并没有接近它。
所以在我看来,我有两个问题需要解决:
function call($method, $parameters, $url)
接受为$paramaters
的数组结构相匹配。function call($method, $parameters, $url)
一次。我考虑过尝试在PHP中使用array_walk
或call_user_func_array
方法,但我不确定这是否正确或我将如何进行。
我还在学习PHP,但我认为现在这已经超出了我的理解,但希望我能学会如何做到这一点。我希望我提供了足够的信息,希望有一个善良的灵魂可以帮助我。如果有帮助,我将很乐意提供任何其他信息。
提前非常感谢你!
答案 0 :(得分:1)
首先,为你写出这样一个很好的第一个问题的道具!
你的答案是正确的,你的问题的答案是将你的$csv->data
数组转换成你想要的格式,但它不必是递归的,因为你知道它的深度和一切。您可能只想与它并排构建自己的数组,因为基本上您需要将$name => $value
对从$csv->data
转换为自己的数组。
这是一个如何做到这一点的例子,在这里请耐心等待,因为我的php语法技能尽可能生锈,所以如果需要,请带上一些伪代码:
$params = array();
foreach ($csv->data as $i => $pairs) {
$csvline = array();
foreach ($pairs as $name => $value) {
$csvline[] = array('name' => $name,
'value' => $value)
}
$params[$i] = $csvline; // in your case you may also do $params[] =...
}
$set_entry_parameters['name_value_list'] = $params;
voilá,$params
符合您的预期格式:)
对于下面的注释中的附加功能,一个简单的方法是将上面的代码放入一个接收$start
参数的函数中,这样就可以限制要解析的行数,以及从哪儿开始。例如:
function parse($start) {
$params = array();
foreach ($csv->data as $i => $pairs) {
if($i < $start) continue; // skip it
if($i == $start+10000) break; // we reached our limit, stop here
$csvline = ...
...
}
return $params; // has at most 10000 entries
}
然后你会使用一个循环,如
for($i = 0; $i < (total_lines); $i = $i + 10000) {
$set_entry_parameters['name_value_list'] = parse($i);
// call update
}
但是,如果实际上您的初始CSV文件解析内存不足,您可能会发现只需手动(或以编程方式)将数据拆分为多个文件就更简单了。或者增加允许PHP使用的内存限制!