php - 无法在 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';
}
}
请帮助那些天才编码员。
解决方案
据我所知,您的 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 填充该占位符。pathVars
与record
路径中的占位符位于相同(第二个)位置,这会导致 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')}, {
推荐阅读
- wordpress - Wordpress 插件可了解访问者从哪个平台访问我的网站
- css - 由空白引起的引导引导滑块布局问题
- c# - 使用 ReadOnlySpan 处理转义序列
- mysql - 如何查看 MySQL 中列的 utf8mbf 排序规则?
- php - Laravel 自定义商店方法无法正常工作
- c++ - 如何覆盖派生类中的虚函数?
- spring-security - Spring Security OAuth2 redirect_uri 回调导致 404
- c - 为什么字符串中包含的空格不起作用?
- android - 在listview android中快速滚动时崩溃
- android - 如何在保留在主屏幕上的小部件中打开另一个视图?