使用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 查询。

下面展示了应用程序中的交互情况:

Fig01.jpg

上面展示了和 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连接器所需的目录布局。

Fig02.jpg

为了使连接器 “升级安全”(即主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 连接器

Fig03.jpg

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

Fig04.jpg

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

Fig05.jpg

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

总结[ ]

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

参考来源[ ]

参考来源