1

背景和背景

我正在尝试在 SugarCRM 8.0 中创建一个自定义 REST 模块,该模块在链接字段上连接两个模块。这两个模块是;

  • 帐户(OOTB 模块)
  • ConsumerLeads(自定义模块)

这两个模块是一个名为w002_consumerleads_accounts_1的链接字段,因此当我调用以下端点时,我会收到一个 JSON 响应,其中包含与该特定帐户 uuid 关联的所有 ConsumerLead 数据。

/rest/v11_4/Accounts/{ account_uuid }/link/w002_consumerleads_accounts_1

但是,我的自定义模块不是基于帐户 uuid 返回连接结果,而是基于唯一标识帐户的不同帐户属性返回连接结果。

/rest/v11_4/customer/{ customer_id }/leads

我试图为此构建一个自定义模块(而不是使用上面列出的预定义的 rest api)的原因是由于调用此调用的系统不知道糖帐户 uuid,而是知道唯一的业务密钥标识帐户(并且是帐户模块上的一个属性)。

问题

当我在自定义休息模块中使用 SugarQuery 来加入 Accounts 和 ConsumerLeads 时,我的结果与第一个休息 api(预定义的休息 api)中指定的结果不匹配。结果只返回Accounts模块,不加入ConsumerLeads模块。

问题在于链接字段上的两个模块的连接;该问题与使用客户 uuid v. 帐户 uuid 无关

参考实现

根据 SugarCRM 开发人员指南,我编写了以下代码。

    public function GetLinkLeads($api, $args) {

        try {

            $query = new SugarQuery();
            $query->from(BeanFactory::getBean('Accounts'));
            $query->join('w002_consumerleads_accounts_1');
            $query->limit(10);
            $results = $query->execute();

            return $results;

        }  catch ( Exception $e ) {
            return $e->getCode();
        }

        return 1;
    }

根据我能收集到的所有信息,此函数应返回与其 ConsumerLeads 连接的前 10 个帐户记录。但是,响应只包含 Accounts 模块数据,它不加入 ConsumerLeads 数据。

此外,我还尝试了以下方式。

public function GetLinkLeads($api, $args) {

    try {

        $account = BeanFactory::getBean('Accounts', '4606e963-9213-7764-d83f-4cc050c8473d');

        if ( $account->load_relationship('w002_consumerleads_accounts_1') ) {

            $lead = $account->w002_consumerleads_accounts_1->getBeans();

            return $lead;
        }

    }  catch ( Exception $e ) {
        return $e->getCode();
    }

    return 1;
}

与 ConsumerLeads 关联的帐户 uuid在哪里4606e963-9213-7764-d83f-4cc050c8473d,但我仍然无法让 ConsumerLeads 数据返回。

问题

我想:

  • 使用 SugarQuery() 基于链接字段连接这两个模块
  • 使用默认的rest api基于Accounts模块上的一个属性加入两个模块(不是账户uuid)

我在 Stack Overflow 上找到了这个确切的问题,上面的实现是基于该帖子的建议。但是,它仍然没有加入记录。

4

2 回答 2

1

您想要实现的目标应该是使用过滤器 API 并在请求过滤器定义中指定必填字段的内容来实现 OOTB。然后你应该收到你想要的链接记录。

它应该类似于https://stackoverflow.com/a/50608304/4068476

作为快速测试,您可以尝试在浏览器或程序中调用它(这里:GET,这就是我在查询字符串中传递过滤器的原因)

/rest/v11_4/w002_ConsumerLeads?filter[0][w002_consumerleads_accounts_1.consumer_id]={ customer_id }

备注

  • 我猜到了 URL 中模块名称的拼写,确保大小写正确。
  • 如果您想在一个请求中同时接收 Accounts 和 ConsumerLeads - 只需使用 /bulk API 将两个请求包装成一个。
于 2019-06-09T02:42:12.843 回答
1

试试下面的代码:

function outright_load_relationship( $left_bean, $rel_name,$return_beans = 0 ) {
    $rel_obj =  $left_bean->load_relationship( $rel_name );

    if ( !$rel_obj ){
        $rel_name =outright_get_bean_fields( $rel_name );
        $rel_obj =  $left_bean->load_relationship( $rel_name );
    }

    if( $return_beans ){
        $relatedBeans = $left_bean->$rel_name->getBeans();
        return $relatedBeans;
    }

    return $left_bean->$rel_name;

}

function outright_get_bean_fields( $left_bean, $fld_name = false, $fld_key = false ) {
    if( !$fld_name && !$fld_key ) {
        return $left_bean->field_defs;
    } else {
        foreach( $left_bean->field_defs as $key=>$value ) {
            if( $fld_name && $key == $fld_name ) {
                return $left_bean->field_defs[$key];

            } else if( $fld_key && $value[$fld_key] == $fld_name ){
                return $left_bean->field_defs[$key];
            }
        }
    }
}

您需要$rel_name在上述函数中正确传递。如果这不起作用,请告诉我。

于 2019-06-09T02:48:00.800 回答