无法在 sugarcrm 8.0 中调用自定义 api

Can't call custom api in sugarcrm 8.0

你好,我正在尝试通过 sugarcrm 中的这段代码调用自定义 api:

({
    extendsFrom: 'RowactionField',

    defaultFirsName: 'first_name',
    defaultLastName: 'last_name',

    initialize: function (options) {
        this._super('initialize', [options]);

        this.def.first_name = _.isEmpty(this.def.first_name) ? this.defaultFirsName : this.def.first_name;
        this.def.last_name = _.isEmpty(this.def.last_name) ? this.defaultLastName : this.def.last_name;
    },
    /**     * Rowaction fields have a default event which calls rowActionSelect     */
    rowActionSelect: function () {
        this.upper_name();
    },

    upper_name: function () {
        var first = this.model.get(this.def.first_name);
        var last = this.model.get(this.def.last_name);
        var fullName = first + last;

        if (fullName) {
            app.alert.show('name-check-msg', {
                level: 'success',
                messages: 'Firstname and Lastname filled.',
                autoClose: true
            });
        }
        else {
            app.alert.show('name-check-msg', {
                level: 'error',
                messages: 'First name and last name must be filled.',
                autoClose: false
            });


        }

        var self = this;
        url = app.api.buildURL('Leads', 'UpperName', null, {
            record: this.model.get('id')
        });

        app.api.call('GET', url, {
            success: function (data) {
                app.alert.show('itsdone', {
                    level: 'success',
                    messages: 'Confirmed to uppercase name.',
                    autoClose: true
                });
            },
            error: function (error) {
                app.alert.show('err', {
                    level: 'error',
                    title: app.lang.getAppString('ERR_INTERNAL_ERR_MSG'),
                    messages: err
                });
            },
        });
    }
})

名字是"uppernamebutton.js"它的功能是,它检查名字和姓氏是否为空,并会显示错误消息来填写字段,然后调用api将首字母大写的名字。

这是自定义 api 的代码,我将其命名为 "UpperNameApi.php":

<?php

class UpperNameApi extends SugarApi
{
    public function registerApiRest()
    {
        return array(
            'UpperNameRequest' => array(
                //request type
                'reqType' => 'POST',

                //endpoint path
                'path' => array('Leads', 'UpperName'),

                //endpoint variables
                'pathVars' => array('module',''),

                //method to call
                'method' => 'UpperNameMethod',

                //short help string to be displayed in the help documentation
                'shortHelp' => 'Example endpoint',

                //long help to be displayed in the help documentation
                'longHelp' => 'custom/clients/base/api/help/MyEndPoint_MyGetEndPoint_help.html',
            ),
        );
    }

    public function UpperNameMethod($api, $args)
    {
        if (isset($args['record']) && !empty($args['record'])) {
            $bean = BeanFactory::getBean('Leads', $args['record']);

            if (!empty($bean->id)) {
                $first = $bean->first_name;
                $first = ucwords($first);
                $bean->first_name = $first;

                $last = $bean->last_name;
                $last = ucwords($last);
                $bean->last_name = $last;
                $bean->save();
            }

            return 'success';
        }


        return 'failed';

    }

}

请帮助那些天才编码员。

据我所知,您的 app.api.call 有两个问题:

  • 你弄错了第一个参数:
    它应该永远不会'GET',而应该是
    • 'read' 用于 GET 请求,
    • 'update' 用于 PUT 请求,
    • 'delete' 用于 DELETE 请求和
    • 'create' 用于 POST 请求。
    正如您指定的 reqType => 'POST' 您应该使用 app.api.call('create', url,
  • 如果我没记错的话,回调会进入 forth 参数,而不是 third 参数(那个参数用于负载数据), 所以你应该添加一个空对象作为第三个参数并在第四个参数中传递回调,你的结果行应该如下所示:app.api.call('create', url, {}, {

编辑:

我还注意到您在函数中使用了 $args['record']。 您当前正在使用 buildURL 传递该值,这意味着您通过 URL 的查询字符串设置它,这可能(?)适用于 GET 以外的请求,但通常是以下 2 种方式用于非 GET 调用,例如POST:

通过端点路径传递记录 ID:
单个ID推荐方式

'path' => array('Leads', '?' 'UpperName'),
'pathVars' => array('module','record',''),

备注:

  • path 包含占位符 ?,调用者将用记录 ID 填充该占位符。
  • pathVars 在与路径中的占位符相同的(第二个)位置有 record,这导致 URL 的那部分被保存到 $args['record'] (类似于第一部分被保存到 $args['module'],对于这个 API,它总是 'Leads')。

在 javascript 中,您必须相应地调整 API 调用 URL:

url = app.api.buildURL('/Leads/' + this.model.get('id') + '/UpperName');

注意 ID 如何进入 URL 的第二部分(占位符在 API 中定义)

通过请求负载传递记录 ID
一次传递多个 ID 或传递记录 ID 以外的其他参数的推荐方法

将记录 ID 放入 app.api.call 的数据对象中,以便将其写入 $args。 app.api.call('create', url, {record: this.model.get('id')}, {