使用 SugarCRM 连接器连接数据与外部世界

红薯 发布于 2010/03/19 17:00
阅读 2K+
收藏 2

SugarCRM 是世界领先的开源 Customer Relationship Management (CRM) 软件供应商,全世界拥有 5,000 位客户,SugarCRM 应用程序的总下载次数高达 500,000 次。很久以前,SugarCRM 就拥有了一个非常有用的 Web 服务框架,允许应用程序访问 SugarCRM 实例并使用其中的数据。但新的 SugarCRM 5.2 是一个用于从应用程序自身内部访问其他外部 Web 服务的框架。SugarCRM 5.2 默认提供一个使用这个框架的 LinkedIn 连接器。这样,SugarCRM 实例的用户就能够检查他们可能拥有的各种公司、联系人和领导的 LinkedIn 状态。本文通过构建一个示例连接器来展示如何在 Sugar 5.2 使用这个连接器框架,这个示例连接器允许用户查看与他们的 SugarCRM 实例中与公司相关的最新 Google News 条目。

对于任意应用程序(无论 Web 应用程序还是桌面应用程序),多数人有这样一个疑问:如何将其连接到一个已经存在的应用程序?典型的解决方案是提供某种 API,以常量编程接口(constant programmatic interface)的形式提供应用程序功能或数据,开发人员可以使用这个接口来连接到该应用程序。这个解决方案解决了如何连接到一个应用程序的问题,但 没有解决这个问题的另一半:如何将您的应用程序连接到另一个应用程序。对于 SugarCRM,这个问题通过连接器框架得以解决。

这个连接器框架提供一种标准方法,以通过 REST 或 SOAP Web 服务连接您的 SugarCRM 记录与另一个应用程序中的数据。SugarCRM 中默认提供的 LinkedIn Connector 就是这样一个例子,它提供 SugarCRM 细节记录中的 Accounts 和 Contacts 的 LinkedIn 查询。图 1 展示了应用程序中的交互情况。


图 1. SugarCRM 中的 LinkedIn Connector
SugarCRM 中的 LinkedIn Connector 的屏幕截图(列示了 3 个连接和一些链接)

图 1 展示了和 Accounts 模块的集成。要触发这个连接器,只需将鼠标光标悬停在 Accounts 旁边的 LinkedIn 图标上方,这个操作将执行一个快速 LinkedIn 搜索,查看给定公司有多少连接。作为这个小部件的一部分,它还提供到这些连接的概要页面的链接。

现在您已经看到了这个功能的用处,下面看看如何构建一个满足您需要的自定义连接器。

构建 Google News 连接器

在本文中,您将构建一个连接到 Google News 服务的连接器。Google News 是一个新闻聚合服务,它从全世界大量不同的新闻机构和在线网站抓取新闻,然后将这些新闻显示在一个便于搜索的统一站点中。连接到这个服务的连接器是非常有 用的 SugarCRM 附件:当 SugarCRM 用户检查一个 Account 记录时,可以快速查看关于该记录的最新新闻条目。

对于这个 Google News 连接器,您将使用 Google AJAX Search API 来连接到 Google News,这是一个非常方便、非常轻量级和简单易用的 API。为使 JavaScript 端更简单,我们将使用 iframe 集成,其中一个完全样式化的 HTML 小部件将包含在一个 iframe 中返回到客户机。这样,您就可以专注于需要添加到 SugarCRM 的代码段,从而使一切按计划进行。

首先,为您即将创建的连接器添加几个配置和映射文件,以及向用户显示连接器数据的显示模板。图 2 展示了添加这个新的 Google News 连接器所需的目录布局。(查看 图 2 的文本版本。)


图 2. Google News 连接器目录布局
Google News 连接器目录布局

为了使连接器 “升级安全”(即主 SugarCRM 应用程序的升级不会影响您的自定义代码修改),必须将所有连接器文件放置到 custom/ 文件夹中。还要注意一点:如果应用程序中已激活 LinkedIn 连接器,custom/modules/Connectors/ 文件夹中可能有一个 metadata/ 文件夹,这个文件夹中包含一个已发现连接器的注册表。这个文件夹需要删除,以便应用程序能够发现您新添加的自定义连接器。

Source

连接器分为两个部分。source 部分控制连接器的配置,从 Web 服务获取数据,并将现有 SugarCRM 模块字段映射到远程 Web 服务使用的字段。连接器的第二个部分是 formatter,我们将在 下 一节 介绍它。source 部分包含几个不同的文件,首先看看 config.php 文件,如 清 单 1 所示。


清单 1. custom/modules/Connectors/sources/ext/rest/googlenews/config.php

				

<?php
$config = array (
'name' => 'Google News',
'properties' => array(),
);

 

这个文件定义连接器名称,以及连接器可能需要的任何属性。通常,这些 Web 服务需要某种 API 键。这个 API 键必须作为请求的一部分提供给 Web 服务,因此您可以在这个文件中定义它。但是,对于您正在使用的 Google AJAX Search API,则不需要其他特殊配置,只需指定连接器名称和空的属性数组。

接下来,在 清 单 2 中检查 vardefs.php,该文件定义连接器提供的字段。


清单 2. custom/modules/Connectors/sources/ext/rest/googlenews/vardefs.php

				

<?php
$dictionary['ext_rest_googlenews'] = array(
'comment' => 'vardefs for google news connector',
'fields' => array (
'id' =>
array (
'name' => 'id',
'vname' => 'LBL_ID',
'type' => 'id',
'comment' => 'Unique identifier',
'hidden' => true,
),
'name'=> array(
'name' => 'name',
'vname' => 'LBL_NAME',
'type' => 'varchar',
'hover' => true,
'comment' => 'The name of the company',
),
)
);

 

这个 Google News 连接器将查询 Accounts 记录的 name 字段,因此,您需要将这个字段和该记录的 id 字段指定为一个字段,该字段将用于调用 Web 服务,以便发现该 Account 的 Google News 结果。(注意:那些具有 SugarCRM 经验的人可以认出这种文件格式设置,因为它使用和数据库字段文件 vardefs.php 相同的格式。)

关联 Account 和连接器的奇妙之处出现在 mappings.php 文件中,如 清 单 3 所示。


清单 3. custom/modules/Connectors/sources/ext/rest/googlenews/mapping.php

				

<?php
$mapping = array (
'beans' =>
array (
'Accounts' =>
array (
'name' => 'name',
'id' => 'id',
),
),
);

 

清 单 3 展示了如何将字段从连接器映射到相关模块。在本例中,您请求了连接器的 name 字段,该字段的值与 Accounts 模块中的 name 字段的值相同。同样,连接器的 id 字段映射到 Accounts 模块的 id 字段。

然后,您需要添加 rest source 类的一个实例,以便连接器可以完全发挥作用。检查 清 单 4,了解如何针对您的连接器处理该实例。 由于您将使用 Google AJAX Search API(它完全基于 JavaScript/浏览器),而不会使用在这个 source 类中的任何内置功能,因此您只需执行需要的调用。


清单 4. custom/modules/Connectors/sources/ext/rest/googlenews/googlenews.php

				

<?php
require_once('include/connectors/sources/ext/rest/rest.php');
class ext_rest_googlenews extends ext_rest
{
public function __construct()
{
parent::__construct();
$this->_enable_in_wizard = false;
$this->_enable_in_hover = true;
}
/*
* getItem
*
* As the google news connector does not have a true API call, you simply
* override this abstract method
*/
public function getItem($args=array(), $module=null) {}
/*
* getList
*
* As the google news connector does not have a true API call, you simply
* override this abstract method
*/
public function getList($args=array(), $module=null) {}
}

 

最后,为您的连接器中使用的一个语言字符串添加一个语言定义文件(见 清 单 5),这将指定 vardefs.php 文件(见 清 单 2)中使用的 name 字段的字段名称。(custom/modules/Connectors/connectors/sources/ext/rest /googlenews/language/en_us.lang.php 是 en_us.lang.php 文件的完整目录路径。)


清单 5. .../Connectors/connectors/sources/ext/rest/googlenews/language/en_us.lang.php

				

<?php
$connector_strings = array (
'LBL_NAME' => 'Company Name',
);

 

至此,您已经为这个连接器构建了源映射和配置。现在,可以使用 formatters 来显示从 Web 服务提取的数据。

Formatter

连接器的另一部分称为 formatter,用于向用户显示连接器数据。首先创建一个扩展 default_formatter 类的定义文件,并添加必要的代码片段以在一个细节视图中显示连接器数据。这个文件根据这个连接器命名(googlenews.php),如 清 单 6 所示。


清单 6. custom/modules/Connectors/formatters/ext/rest/googlenews/googlenews.php

				

<?php
require_once('include/connectors/formatters/default/formatter.php');
class ext_rest_googlenews_formatter extends default_formatter
{
public function getDetailViewFormat()
{
$mapping = $this->getSourceMapping();
$mapping_name = !empty($mapping['beans'][$this->_module]['name']) ?
$mapping['beans'][$this->_module]['name'] : '';

if(!empty($mapping_name)) {
$this->_ss->assign('mapping_name', $mapping_name);
return $this->fetchSmarty();
}

$GLOBALS['log']->error($GLOBALS['app_strings']['ERR_MISSING_MAPPING
_ENTRY_FORM_MODULE']);
return '';
}

public function getIconFilePath()
{
return 'custom/modules/Connectors/connectors/formatters/ext/rest
/googlenews/tpls/googlenews.gif';
}
}

 

清 单 6 中定义的两个函数由 DetailView 元数据框架调用,以便将连接器实际呈现在表单中。getIconFilePath() 返回链接到(连接器正在连接的) DetailView 表单中字段旁边的图标的 URL。然后,getDetailViewFormat() 处理这个小部件表单的呈现,这个表单在您将鼠标光标悬停在图标上方时显示。清 单 7 展示了这个连接器小部件的 Smarty 模板。


清单 7. custom/modules/Connectors/formatters/ext/rest/googlenews/tpls/default.tpl

				

<div style="visibility:hidden;" id="googlenews_popup_div"></div>
<script type="text/javascript" src="{sugar_getjspath
file='include/connectors/formatters/default/company_detail.js'}"></script>
<script type="text/javascript">
function show_ext_rest_googlenews(event)
{literal}
{
var xCoordinate = event.clientX;
var yCoordinate = event.clientY;
var isIE = document.all?true:false;

if(isIE) {
xCoordinate = xCoordinate + document.body.scrollLeft;
yCoordinate = yCoordinate + document.body.scrollTop;
}
{/literal}
cd = new CompanyDetailsDialog("googlenews_popup_div",
'<iframe height="90px" width="728px" frameborder="0" marginheight=0
marginwidth=0 scrolling="no" src="http://www.google.com/uds/modules/elements
/newsshow/iframe.html?rsz=small&q={$fields.{{$mapping_name}}.value}
&format=728x90"></iframe>',
xCoordinate, yCoordinate);
cd.setHeader("{$fields.{{$mapping_name}}.value}");
cd.display();
{literal}
}
{/literal}
</script>

 

您需要定义 JavaScript 函数 show_ext_rest_googlenews(),这个函数在鼠 标光标悬停在 DetailView 中的图标上方时触发。这个 JavaScript 函数处理包含该小部件内容的弹出对话框的呈现,还对 Web 服务进行外部调用,并在这个弹出对话框中显示其结果。然后,呈现的代码初始化弹出窗口,将标题设置为当前记录的名称,最后使用从当前记录传递的公司名称进 行 API 调用,构建一个 iframe。图 3 展示了上述过程。


图 3. 正在运行的 Google News 连接器
Google News 连接器的屏幕截图,包含关于目标公司的新闻条目

现在,您已经构建了一个功能齐备的连接器。当您的鼠标光标悬停于 Account 名称旁边的新闻图标上时,这个连接器将从 Google News 提取关于该 Account 的数据。您也可以对应用程序中的其他模块添加这个功能,只需在 mapping.php 文件(见 清 单 2)中添加另一个模块条目,将记录映射到连接器。SugarCRM 还在其 Admin 区域中的 Connector Settings 选项下面提供了一个图形方法来完成这个任务,只需单击那个屏幕中的 Connector Settings 选项,更改可以获取这个新闻图标的模块,如 图 4 所示。


图 4. Connector Settings
Connector Settings 的屏幕截图,Google News 选项卡带有一个对 Accounts 和  Contacts 启用的图标

下一步是为添加的模块映射字段,在 Connector Settings 下的 Map Connector Fields 页面中进行操作,如 图 5 所示。


图 5. Map Connector Fields
Google News 选项卡上的 Map Connector Fields 页面的屏幕截图:为 Accounts 和  Contacts 选择模块字段

对于连接器中的每个字段,使用下拉选择器来选择模块使用的字段,在两个实体间建立映射关系。可以对可用连接器的每个不同模块进行不同的映射。

结束语

本文介绍了 SugarCRM 连接器框架,它提供了一种方法来从您的应用程序内部连接到外部数据源。如您所见,这种集成外部应用程序的方法与传统方法大不相同。在传统方法中,应用程序 在其内部提供一些外部 hook,供其他应用程序使用。在检查了 SugarCRM 提供的 LinkedIn 连接器之后,您逐步浏览了定义过程,了解了如何使用 Google AJAX Search APIs 来构建自己的 Google News 连接器。最后,您构建了一个功能齐备的 Google News 连接器,用于显示您查看的 Account 的新闻结果。

下载本文代码

加载中
0
非凡软件
非凡软件
@红薯
这文章是你写的吗?
太详细了,比 SugarCRM Inc给的文档里的都详细,赞一个。
非凡软件
非凡软件
好吧,点击下载后才发现,连接是在IBM上的:( 顺便说一句: 不必特意删掉custom/modules/Connectors/metadata/下的配置文件,那个是自动生成的.只要在'Admin'->'Connects'->'Enable Connectors'中配置新加的Connector时就会更新的
0
DieChen
DieChen
翻译过来的....
返回顶部
顶部