backbone.js 无法在sugarcrm 8.0中调用自定义API

eivgtgni  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(139)

你好,我正在尝试通过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';

    }

}

请帮助那些天才程序员。

snvhrwxg

snvhrwxg1#

据我所知,您的www.example.com有两个问题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的query-string来设置它,它可能(?)适用于GET以外的请求,但是通常以下两种方法之一用于非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放入www.example.com的数据对象中app.api.call,以便写入$args. app.api.call('create', url, {record: this.model.get('id')}, {

相关问题