Bitrix24 批处理请求 - 如何通过外部函数(延迟动态函数)在下一个查询中使用上一个查询的结果

bitrix24 batch requests - how to use the results of the previous query in the next one via an external function (deferred dynamic function)

提问人:Alexander 提问时间:11/9/2023 最后编辑:Alexander 更新时间:11/11/2023 访问量:75

问:

有这样一个代码(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
...
评估 php-8.2

评论


答: 暂无答案