首页 > 解决方案 > 无法在 sugarcrm 8.0 中调用自定义 api

问题描述

您好,我试图通过 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';

    }

}

请帮助那些天才编码员。

标签: phprestapibackbone.jssugarcrm

解决方案


据我所知,您的 app.api.call 存在 2 个问题:

  • 你的第一个论点是错误的:
    它不应该'GET'而是应该是
    • 'read'对于 GET 请求,
    • 'update'对于 PUT 请求,
    • 'delete'对于 DELETE 请求和
    • 'create'对于 POST 请求。
    正如您所指定reqType => 'POST'的,您应该使用app.api.call('create', url,
  • 如果我没记错回调在第四个参数中,而不是第三个参数(那个是有效负载数据),所以你应该添加一个空对象作为第三个参数并在第四个参数中传递回调,你的结果行应该看起来像这样:app.api.call('create', url, {}, {

编辑:

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

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

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

笔记:

  • path包含一个占位符?,调用者将使用记录 ID 填充该占位符。
  • pathVarsrecord路径中的占位符位于相同(第二个)位置,这会导致 URL 的该部分被保存到$args['record'](类似于第一部分被保存到$args['module'],这将始终'Leads'用于此 API)。

在 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')}, {


推荐阅读