使用SugarCRM连接器连接数据与外部世界
导航: 上一页|ASP | PHP | JSP | HTML | CSS | XHTML | aJAX | Ruby | JAVA | XML | Python | ColdFusion
如何将其连接到一个已经存在的应用程序?典型的解决方案是提供某种API,以常量编程接口(constant programmatic interface)的形式提供应用程序功能或数据,开发人员可以使用这个接口来连接到该应用程序。
这个解决方案解决了如何连接到一个应用程序的问题,但没有解决这个问题的另一半:如何将您的应用程序连接到另一个应用程序。对于SugarCRM,这个问题通过连接器框架得以解决。
这个连接器框架提供一种标准方法,以通过 REST 或 SOAP Web 服务连接您的 SugarCRM 记录与另一个应用程序中的数据。SugarCRM中默认提供的LinkedIn Connector就是这样一个例子,它提供 SugarCRM 细节记录中的 Accounts 和 Contacts 的 LinkedIn 查询。
下面展示了应用程序中的交互情况:
上面展示了和 Accounts 模块的集成。要触发这个连接器,只需将鼠标光标悬停在 Accounts 旁边的 LinkedIn 图标上方,这个操作将执行一个快速 LinkedIn 搜索,查看给定公司有多少连接。作为这个小部件的一部分,它还提供到这些连接的概要页面的链接。
构建Google News连接器[ ]
Google News是一个新闻聚合服务,它从全世界大量不同的新闻机构和在线网站抓取新闻,然后将这些新闻显示在一个便于搜索的统一站点中。连接到这个服务的连接器是非常有用的 SugarCRM附件:当SugarCRM用户检查一个Account记录时,可以快速查看关于该记录的最新新闻条目。
对于这个Google News连接器,使用Google AJAX Search API来连接到Google News,这是一个非常方便、非常轻量级和简单易用的API。为使JavaScript端更简单,我们将使用Iframe集成,其中一个完全样式化的HTML小部件将包含在一个iframe中返回到客户机。这样,就可以专注于需要添加到SugarCRM的代码段,从而使一切按计划进行。
首先,为您即将创建的连接器添加几个配置和映射文件,以及向用户显示连接器数据的显示模板。下图展示了添加这个新的Google News连接器所需的目录布局。
为了使连接器 “升级安全”(即主SugarCRM应用程序的升级不会影响自定义代码修改),必须将所有连接器文件放置到custom/文件夹中。还要注意一点:如果应用程序中已激活 LinkedIn连接器,custom/modules/Connectors/ 文件夹中可能有一个metadata/文件夹,这个文件夹中包含一个已发现连接器的注册表。这个文件夹需要删除,以便应用程序能够发现您新添加的自定义连接器。
Source[ ]
连接器分为两个部分。source 部分控制连接器的配置,从Web服务获取数据,并将现有SugarCRM模块字段映射到远程Web服务使用的字段。连接器的第二个部分是formatter。source 部分包含几个不同的文件,如下是config.php文件(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,则不需要其他特殊配置,只需指定连接器名称和空的属性数组。
检查vardefs.php(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结果。
关联Account和连接器的奇妙之处出现在mappings.php(custom/modules/Connectors/sources/ext/rest/googlenews/mapping.php)文件中
<?php $mapping = array ( 'beans' => array ( 'Accounts' => array ( 'name' => 'name', 'id' => 'id', ), ), );
上面内容展示了如何将字段从连接器映射到相关模块。在本例中,您请求了连接器的 name 字段,该字段的值与Accounts模块中的name 段的值相同。同样,连接器的id字段映射到Accounts模块的 id 字段。
然后,您需要添加 rest source 类的一个实例,以便连接器可以完全发挥作用。检查custom/modules/Connectors/sources/ext/rest/googlenews/googlenews.php,了解如何针对您的连接器处理该实例。 由于您将使用 Google AJAX Search API(它完全基于 JavaScript/浏览器),而不会使用在这个source类中的任何内置功能,因此您只需执行需要的调用。
<?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) {} }
最后,为您的连接器中使用的一个语言字符串添加一个语言定义文件:.../Connectors/connectors/sources/ext/rest/googlenews/language/en_us.lang.php ,这将指定 vardefs.php 文件中使用的 name 字段的字段名称。
<?php $connector_strings = array ( 'LBL_NAME' => 'Company Name', );
至此,您已经为这个连接器构建了源映射和配置。现在,可以使用 formatters 来显示从Web服务提取的数据。
Formatter[ ]
连接器的另一部分称为formatter,用于向用户显示连接器数据。首先创建一个扩展default_formatter类的定义文件,并添加必要的代码片段以在一个细节视图中显示连接器数据。这个文件根据这个连接器命名( 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'; } }
上面代码中定义的两个函数由DetailView元数据框架调用,以便将连接器实际呈现在表单中。getIconFilePath() 返回链接到(连接器正在连接的) DetailView 表单中字段旁边的图标的 URL。然后,getDetailViewFormat() 处理这个小部件表单的呈现,这个表单在您将鼠标光标悬停在图标上方时显示。以下代码展示了这个连接器小部件的Smarty模板。
<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。下图展示了上述过程。
- 正在运行的 Google News 连接器
现在,您已经构建了一个功能齐备的连接器。当您的鼠标光标悬停于Account名称旁边的新闻图标上时,这个连接器将从Google News提取关于该Account的数据。您也可以对应用程序中的其他模块添加这个功能,只需在mapping.php文件中添加另一个模块条目,将记录映射到连接器。SugarCRM 还在其 Admin 区域中的 Connector Settings 选项下面提供了一个图形方法来完成这个任务,只需单击那个屏幕中的Connector Settings选项,更改可以获取这个新闻图标的模块,如下图所示:
下一步是为添加的模块映射字段,在Connector Settings下的Map Connector Fields页面中进行操作,如下图所示:
对于连接器中的每个字段,使用下拉选择器来选择模块使用的字段,在两个实体间建立映射关系。可以对可用连接器的每个不同模块进行不同的映射。
总结[ ]
本条目介绍了SugarCRM连接器框架,它提供了一种方法来从您的应用程序内部连接到外部数据源。这种集成外部应用程序的方法与传统方法大不相同。在传统方法中,应用程序在其内部提供一些外部hook,供其他应用程序使用。在检查了SugarCRM提供的LinkedIn连接器之后,您逐步浏览了定义过程,了解了如何使用Google AJAX Search APIs来构建自己的 Google News连接器。最后,构建了一个功能齐备的Google News连接器,用于显示查看的Account的新闻结果。