提问人:Alexander 提问时间:11/9/2023 最后编辑:Alexander 更新时间:11/11/2023 访问量:75
Bitrix24 批处理请求 - 如何通过外部函数(延迟动态函数)在下一个查询中使用上一个查询的结果
bitrix24 batch requests - how to use the results of the previous query in the next one via an external function (deferred dynamic function)
问:
有这样一个代码(PHP 8)bitrix24
function show($res,$title=''){
echo '<pre>';
echo $title;
echo '<br/>';
print_r($res);
echo '</pre>';
}
//bath с формулой
/*
получить значение в элементе перечисления (enum)
$data массив вложенных ассоциативных массивов
$keyFind имя ключа поиска
$find значение ключа для поиска
$def значение ключа для поиска по умолчанию
$keyVal имя клююча результата/значения
пример
_getObjParam($data, 'NAME', 'Сайт www.cad.ru', 'Личный контакт', 'STATUS_ID');
*/
function _getObjParam(array $data, $keyFind, $find, $def, $keyVal) {
show (['inType'=>gettype($data),'data'=>$data,'keyFind'=> $keyFind,'find'=> $find, 'def'=> $def,'keyVal'=> $keyVal],'in');
$ret='';
$arrID=[];
if (!empty($find)) //если есть что искать
$arrID = array_column(array_filter($data, fn ($v) => array_key_exists($keyFind, $v) && $v[$keyFind] == $find),$keyVal);
if(empty($arrID) && !empty($def)) //если ничего не найдено но есть значение по умолчанию
$arrID = array_column(array_filter($data, fn ($v) => array_key_exists($keyFind, $v) && $v[$keyFind] == $def),$keyVal);
if(!empty($arrID)) //если что то нашли берем первое
$ret=$arrID[0];
// $ret=1;
show ($ret,'out');
return $ret;
};
$interpolate = "_getObjParam";
$previos_res_single='$result[crm_source_status][2][STATUS_ID]';
$previos_res_array='$result[crm_source_status]';
$leadID=18036;
$sourceDescription = 'Сайт www.cad.ru';
$arData = [
'crm_source_status' => [ //массив статусов
'method' => 'crm.status.list',
'params' => ['filter' => ["ENTITY_ID" => "SOURCE",]]
],
'1_crm_lead_const' => [ //одно значение из массива статусов напрямую
'method' => 'crm.lead.update',
'params' => ['ID'=>$leadID, 'fields' => ["SOURCE_ID" => '$result[crm_source_status][0][STATUS_ID]',]]
],
'2_crm_lead_const' => [ //одно значение из массива статусов через переменную
'method' => 'crm.lead.update',
'params' => ['ID'=>$leadID, 'fields' => ["SOURCE_ID" => $previos_res_single,]]
],
'3_crm_lead_const' => [ //одно значение из массива статусов просто числом
'method' => 'crm.lead.update',
'params' => ['ID'=>$leadID, 'fields' => ["SOURCE_ID" => 4,]]
],
'4_crm_lead_const' => [ //одно значение из массива статусов через внешнюю функцию
'method' => 'crm.lead.update',
'params' => ['ID'=>$leadID, 'fields' => [
"SOURCE_ID" => "{$interpolate($previos_res_array,'NAME', $sourceDescription, 'Личный контакт', 'STATUS_ID')}",
// 'SOURCE_ID'=>call_user_func_array('_getObjParam', array('$result[crm_source_status]', 'NAME', $sourceDescription, 'Личный контакт', 'STATUS_ID')),
]]
],
$result = CRest::callBatch($arData, $halt = 0);
show ($result);
第一个请求crm_source_status返回一个数组 ,则所有后续请求都通过“$result[crm_source_status]...”处理它,这是在批处理执行上下文中返回的上一个请求的响应
查询1_crm_lead_const和2_crm_lead_const在上下文中很好地处理值
但我需要对结果进行预处理......我调用一个外部函数,并希望在4_crm_lead_const请求中将第一个crm_source_status请求的结果传递到那里
根据日志,外部函数在批处理请求之前立即触发 - 因此接收的输入不是来自上下文的数组,而只是一个字符串......
留在上下文中(即等待上一个请求的执行) - 我可能需要为请求注册一个动态函数(字符串) 4_crm_lead_const - ....
'params' => ['ID'=>$leadID, 'fields' => [“SOURCE_ID” => eval('函数 (){...
但我不知道该怎么做......告诉我?
ps
上一个查询“$result[crm_source_status]”的结果以字符串格式(单引号)给出,而不是插值......
也许“$result”这个词被缝在他们的 api 中,并且有其他含义...... - 我不知道
Array
(
[result] => Array
(
[result] => Array
(
[crm_source_status] => Array
(
....
== '$result[crm_source_status]'
... 日志 CRest::callBatch 返回...
in
Array
(
[inType] => string
[data] => $result[crm_source_status]
[keyFind] => NAME
[find] => Сайт www.cad.ru
[def] => Личный контакт
[keyVal] => STATUS_ID
)
out
Array
(
[result] => Array
(
[result] => Array
(
[crm_source_status] => Array
(
[0] => Array
(
[ID] => 242
[ENTITY_ID] => SOURCE
[STATUS_ID] => 1
[NAME] => Контакт Lead
[NAME_INIT] =>
[SORT] => 10
[SYSTEM] => N
[CATEGORY_ID] => 0
[COLOR] => #D3EEF9
[SEMANTICS] =>
)
[1] => Array
(
[ID] => 240
[ENTITY_ID] => SOURCE
[STATUS_ID] => UC_YKLMC8
[NAME] => Личный контакт
[NAME_INIT] =>
[SORT] => 20
[SYSTEM] => N
[CATEGORY_ID] => 0
[COLOR] =>
[SEMANTICS] =>
)
[2] => Array
(
[ID] => 244
[ENTITY_ID] => SOURCE
[STATUS_ID] => 2
[NAME] => Сайт www.cad.ru
[NAME_INIT] =>
[SORT] => 30
[SYSTEM] => N
[CATEGORY_ID] => 0
[COLOR] => #D3EEF9
[SEMANTICS] =>
)
...
PPS
可以将其(批处理)拆分为多个查询并正常工作 - 但它并不漂亮 ))
$arData = [
'crm_source_status' => [ //массив статусов
'method' => 'crm.status.list',
'params' => ['filter' => ["ENTITY_ID" => "SOURCE",]]
],
];
$res = CRest::callBatch($arData, $halt = 0); //batch request
//show ($res);
echo _getObjParam($res['result']['result']['crm_source_status'], 'NAME', 'Сайт www.cad_.ru', 'Личный контакт', 'STATUS_ID');
$param = [
'ID'=>$leadID,
'fields' => ["SOURCE_ID" => _getObjParam($res['result']['result']['crm_source_status'], 'NAME', 'Сайт www.cad_.ru', 'Личный контакт', 'STATUS_ID')]
];
show($param);
$lead = CRest::call('crm.lead.update', $param); //single request
show($lead);
日志
UC_YKLMC8
Array
(
[ID] => 17906
[fields] => Array
(
[SOURCE_ID] => UC_YKLMC8
)
)
Array
(
[result] => 1
[time] => Array
(
[start] => 1699711672.4691
[finish] => 1699711672.7058
...
答: 暂无答案
评论