如何增强 SuiteCRM REST API 以处理案例更新事务

分享于 

11分钟阅读

Web开发

  繁體 雙語

介绍

最近几个月,我为SuiteCRM设计和开发了几个客户门户项目。 这些应用程序是基于 SuiteCRM REST API的。 但是 SuiteCRM API中存在一个严重的缺陷,这是我们所需要的。

所以,正如你所知道的,每个通用客户门户最重要的部分是让用户在它的票证或者情况下更新。 但是,不幸的是,SuiteCRM中没有 REST API 方法允许开发人员选择案例的现有更新或者将新更新。

使用代码

在本文中,我将向你展示如何向SuiteCRM添加两个新的api。

首先,你应该了解 SuiteCRM API服务的结构。 SuiteCRM有一个核心和几个增强版本。 因此,最新版本的SuiteCRM API是 4.2. 要查看版本的每个特性,你可以访问SugarCRM网站。

如果打开这里 SuiteCRM 根目录 上的'服务'文件夹,则将看到如下结构:

https://www.codeproject.com/KB/PHP/1147772/suitecrm_service_folder.jpg

因此,它们以'v'开头的文件夹是不同版本的SuiteCRM api。 这是非常重要的,知道每个版本的所有先前版本的功能,也是每个扩展类的最后版本。

在每个版本文件夹中,你将看到这里公共结构:

https://www.codeproject.com/KB/PHP/1147772/suitecrm_API_files.jpg

为了创建和开发自己的SuiteCRM API版本,你应该更改所有文件中的一些代码。 你可以从 SuiteCRM API的最新版本( v 4.1 ) 扩展 SuiteCRM API版本,这是非常合理和实用的。 开始吧。

  • 为了创建自己的服务,克隆 v4_1 文件夹并将它的重命名为你的版本名。 我把它改名为 fcc。
  • 因此,将两个文件重命名为( ,,,。),并将 v4_1 短语替换为你的版本名。 例如我将它们重命名为 SugarWebServiceImplfcc.php and SugarWebServiceUtilfcc.php。 你的扩展版本的主要代码将写在这两个文件中。
  • 现在打开 rest.php 文件。 在 rest.php 文件中,应该使用 register 并包含所有的API版本。 所以,这很简单而且不复杂。 如前所述,我的API名称是 fcc。 你可以看到 rest.php的代码,例如 fcc fcc:
require_once('SugarWebServiceImplfcc.php');$webservice_class = 'SugarRestService';$webservice_path = 'service/core/SugarRestService.php';$webservice_impl_class = 'SugarWebServiceImplfcc';$registry_class = 'registry';$location = '/service/fcc/rest.php';$registry_path = 'service/fcc/registry.php';
require_once('service/core/webservice.php');

你应该对 soap.php 文件重复这里步骤。

因此,我们讨论的下一个文件是 SugarWebServiceUtilfcc.php。 SugarWebServiceUtil包含了在主API方法中使用的所有实用程序和 helper 函数。 这个文件包含从最新版本中扩展的类。 前面提到过,最好从最新版本的SuiteCRM API服务扩展,这是一个面向服务的。 因此,类结构将如下所示:

因此,根据你的API函数需要,你可以在这个类中编写自己的函数。 同样,你也可以看到,你需要在脚本中包含 SugarWebServicecUtilv4_1.php。 它指向你扩展API的版本。

require_once('service/v4_1/SugarWebServiceUtilv4_1.php');class SugarWebServiceUtilfcc extends SugarWebServiceUtilv4_1
{
 // Your functiions}

在这一步中,我们开始编写自己的API方法函数。 主API方法和函数是在 SugarWebServiceImpl [Version Name] 中编写的。 因此,我们要添加两个新的API方法( 我想你已经熟悉了 SuiteCRM 常用函数)

  • set_case_update
  • get_case_updates

首先,我们编写两个新函数的Prototype:

function get_case_updates($session, $module_name, $name_value_list) {
 // API code}
And
function set_case_update($session, $module_name, $name_value_list) {
 // API code}

两个新函数具有相同的参数:

  • $session: 所有 SuiteCRM API方法的公共参数。 此参数包含登录函数返回并显示该请求具有足够凭据的会话 Id。
  • $module_name: 此参数属于所有模块,如 get_entry_listset_entry 和。 它包含请求已经完成它的数据的模块的名称。 本例中,这里参数不是必需的,因为两种方法都在 Case_Updates 模块上工作。 但是我没有从方法Prototype中删除这个参数。
  • $name_value_list: 这个参数是一个 array,它包含来自客户端的所有发送数据,如查询。字段值等。

我们成功地编写了API方法 Prototype,现在让我们开始编写方法。

显示,set_case_update 方法有责任在案例记录中插入或者更新 case_update。 因此,该方法将类似于:

$case_update = new AOP_Case_Updates();
$GLOBALS['log']->info('Begin: SugarWebServiceImpl->set_case_update');if (!self::$helperObject->checkSessionAndModuleAccess
 ($session, 'invalid_session',
 "AOP_Case_Updates", 'read', 'no_access', $error)) {
 return;
}foreach ($name_value_list as &$value) {
 $name = $value['name'];
 $case_update->$name = $value['value'];
}
$case_update->save();
$GLOBALS['log']->info('End: SugarWebServiceImpl->set_case_update');return array('id'=> $case_update->id);

在第一行,我们从 AOP_Case_Update 创建一个新实例。 例如在 SuiteCRM 中插入或者更新新记录时,只需要从模块类中获取新的实例。 当调用 Save 方法时,如果id字段为空,那么新记录将被创建,并且该方法将更新 id,该记录将更新标识所属的记录。

接下来的代码行只在 SuiteCRM 日志文件中写入一个新行。

$GLOBALS['log']->info('Begin: SugarWebServiceImpl->set_case_update');

下一个条件语句用于检查凭据和用户访问。 如果会话Id为空或者有错误的值,则该方法返回。 在另一种情况下,如果用户没有足够的访问模块的权限,则方法也返回。 在下一个语句中,有一个 foreach 循环循环遍历 $anem_value_list array 并填充 $case_update 参数。

最后,我们将调用 case_update 实例的Save 方法。 如下面所述,这里方法基于 Id 属性的值。 在 Id 为空时,方法将添加新记录,如果 Id 属性具有正确的标识值,则该方法将更新该记录。

方法的最后一行返回新记录或者已经更新记录的Id。 所有 insert 或者 update 方法的一个必要部分是返回调用它的代码的Id 值。

这个API的下一个方法是 get_case_updates。 这里方法获取一个案例id并返回它的所有 Case_Updates。 所以这个方法很简单:

 function get_case_updates($session, $module_name, $name_value_list){
 $caseUpdateBean = BeanFactory::getBean('AOP_Case_Updates');
 $caseUpdate = $caseUpdateBean->get_full_list
 ('date_entered desc',"case_id = '". 
 $name_value_list[0]['value']. "'");
 $counter = 0;
 foreach ($caseUpdate as &$value) {
 $item = array();
 $i = 1;
 foreach ($value as$key => $val)
 {
 try {
 if ($i <22)
 {
 array_push($item, array
 ("name" => $key, "value" => $val));
 }
 }
 catch (Exception $e) {
 }
 $i++;
 }
 if ($counter == 0)
 $items = array($item);
 else array_push($items, $item);
 $counter++;
 }
 $result = array("count" => $i, "items" => $items);
 return array('entry_list'=> $result);
}

在第一行,我们创建了一个新的case_update。 已经使用 BeanFactory::getBean 方法进行了。 因此,在下一行中,我们调用 get_full_list 方法。 这里方法获取两个 string 参数,排序顺序和查询语句,并返回与查询匹配的记录的列表。

在下一步中循环根据客户端可以处理的适当返回值填充新的array。

在最后一行,该方法将 array 返回给客户端。

现在,我们编写了两个新的API方法。 但是对于客户端来说,这些是不可访问的。 因为我们应该将这些新方法作为rest方法。 因此,为了完成这个任务,我们应该在 registry.php 编写一些新代码行。 这个文件有两种注册当前API版本的函数和类型的方法。 我必须提到这些新方法非常简单。 有一些复杂的api需要新的变量类型和。

因此,我编写了一个示例,说明如何在 registry.php 中使用一个 API:

$this->serviceClass->registerFunction(
 'set_case_update',
 array('session'=>'xsd:string', 'module_name'=>'xsd:string',
 'name_value_list'=>'tns:name_value_list'),
 array('return'=>'tns:new_set_entry_result'));

Points of Interest

在这个项目中,我增强了 SuiteCRM API,帮助我扩展 3rd的SuiteCRM 应用程序。 在api中创建 SuiteCRM 并可以创建自己的api是非常重要的。


API  REST  CAS  Suite  CASE  transaction  
相关文章