Не могу вызвать пользовательский API в sugarcrm 8.0 - PullRequest
0 голосов
/ 20 февраля 2019

Здравствуйте, я пытаюсь вызвать пользовательский API через этот код в sugarcrm:

({
    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 для Uppercase первых букв имен.

Вот код для пользовательского 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';

    }

}

Пожалуйста, помогите гениальному программисту.

1 Ответ

0 голосов
/ 20 февраля 2019

Из того, что я вижу, есть 2 проблемы с вашим app.api.call:

  • Вы ошиблись в первом аргументе:
    Он должен никогда быть 'GET', но вместо этого должно быть
    • 'read' для запросов GET,
    • 'update' для запросов PUT,
    • 'delete' для запросов DELETE и
    • 'create' для запросов POST.
    Как вы указали reqType => 'POST', вы должны использовать app.api.call('create', url,
  • Если я не ошибаюсь, обратные вызовы идут в вперед аргумент, а не третий один (тот, который предназначен для данных полезной нагрузки), поэтому вы должны добавить пустой объект в качестве третьего аргумента и передать обратные вызовы в 4-м, ваша результирующая строка должна выглядеть следующим образом:app.api.call('create', url, {}, {

РЕДАКТИРОВАТЬ:

Также я заметил, что вы используете $args['record'] в своей функции.В настоящее время вы используете buildURL для передачи этого значения, что означает, что вы устанавливаете его через строку запроса URL-адреса, которая, вероятно, (?) Работает для запросов, отличных от GET, однако обычно один из следующих двух способов используется для не-GETвызовы, например POST:

передача идентификатора записи через путь конечной точки:
рекомендуемый путь для одиночных идентификаторов

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

Примечания:

  • path содержит заполнитель ?, который будет заполнен вызывающим абонентом с идентификатором записи.
  • pathVars имеет record в то же время (секунду)позиционируется как заполнитель в пути, что приводит к сохранению этой части URL-адреса в $args['record'] (аналогично сохранению первой части в $args['module'], который всегда будет 'Leads' для этого API).

В javascript вы должны будете соответствующим образом изменить URL-адрес вызова API:

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

Обратите внимание, как идентификатор переходит во вторую часть URL-адреса (где в API определяется местозаполнитель)

передача идентификатора записи через рекest payload
рекомендуемый способ одновременной передачи нескольких идентификаторов или передачи аргументов, отличных от идентификатора записи

Установка идентификатора записи в объекте данных app.api.call, так что это будет записано в $ args.app.api.call('create', url, {record: this.model.get('id')}, {

...