不能在sugarcrm 8.0中调用自定义api

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不能在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”,其功能是,它检查firstname和lastname是否为空,并显示错误消息以填充字段,然后将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有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。 qazxsw poi

以上是关于不能在sugarcrm 8.0中调用自定义api的主要内容,如果未能解决你的问题,请参考以下文章

SugarCRM - 数据库故障 - 行大小太大?

SAP Integration Suite用API Management组件发布SugarCRM SOAP API

SAP Integration Suite用API Management组件发布SugarCRM SOAP API

SAP Integration Suite用API Management组件发布SugarCRM SOAP API

使用sugar crm rest api 创建联系人时有概率返回被删除的联系人的id

如何添加微信自定义菜单