sugarcrm 数据库_使用SugarCRM连接器将数据连接到外界
什么是连接器?
大多数人对任何应用程序(无论是Web还是桌面应用程序)都有一个疑问:如何将其连接到现有的应用程序? 典型的解决方案是提供某种API,该API以恒定的编程接口形式公开应用程序功能或数据,开发人员可以使用该接口来连接到应用程序。 此解决方案解决了如何连接到应用程序的问题,但是并没有解决问题的另一半,即将应用程序连接到另一个应用程序。 对于SugarCRM,此问题通过连接器框架解决。
连接器框架提供了一种标准化方法,可以通过REST或SOAP Web服务将SugarCRM记录连接到另一个应用程序中的数据。 SugarCRM中的LinkedIn连接器就是一个例子。 它在SugarCRM详细记录中提供了对LinkedIn和“帐户”和“联系人”的查找。 默认情况下,它带有SugarCRM。 图1显示了交互在应用程序内部的外观。
图1. SugarCRM内的LinkedIn连接器
图1显示了与Accounts模块的集成。 触发连接器非常简单,只需将光标悬停在“帐户”旁边的LinkedIn图标上,即可快速进行LinkedIn搜索以查看您在给定公司中的连接数。 它还作为小部件的一部分提供了到这些连接的配置文件页面的链接。
既然您已经了解了此功能的实用性,那么请看如何根据自己的需要构建自定义连接器。
建立您的Google新闻连接器
对于本文,您将构建一个Google新闻服务连接器。 Google新闻是一项新闻聚合服务,它来自世界各地许多不同的新闻社和在线站点,可以在一个易于搜索的统一站点中呈现新闻。 该服务的连接器是SugarCRM的非常有用的附加组件。 它使应用程序的用户可以快速查看用户当前正在查看的帐户记录的最新新闻。
对于Google新闻连接器,您将使用Google AJAX搜索API连接到Google新闻。 这是一个非常方便的API,非常轻巧且易于使用。 为了使JavaScript方面的事情变得更简单,请使用iframe集成,在iframe中,将完整样式HTML小部件返回到iframe中,返回给客户端。 这使您可以专注于需要添加到SugarCRM中的代码段,以使所有功能按预期工作。
首先,为您要构建的连接器添加一些配置和映射文件,以及为向用户显示连接器数据的显示模板。 图2显示了添加新的Google新闻连接器所需的目录布局。 (查看图2的纯文本版本 。)
图2. Google News连接器目录布局
为了使连接器升级安全(意味着主SugarCRM应用程序的升级不会影响您的自定义代码修改),必须将所有连接器文件放入custom /目录中。 还要注意,如果您已经在应用程序中**了LinkedIn连接器,则在custom / modules / Connectors /目录中可能有一个元数据/目录; 其中包含找到的连接器的注册表。 您将要删除此文件夹,以便应用程序找到您新添加的自定义连接器。
资源
连接器分为两部分。 源部分控制连接器的配置,从Web服务获取数据,并将现有的SugarCRM模块字段映射到远程Web服务使用的字段。 连接器的第二部分是格式化程序,您将在下一部分中进行查看 。 源代码部分包含一些不同的文件。 首先查看清单1中的config.php文件。
清单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新闻连接器将查询“帐户”记录的名称字段,因此您将指定该字段以及该记录的ID字段作为用于进行Web服务调用以查找该帐户的Google新闻结果的字段。 (注意:有SugarCRM经验的人会识别文件格式,因为它使用与数据库字段vardefs.php文件相同的格式。)
将Account与连接器关联起来的神奇之处在于清单3中的mappings.php文件。
清单3. custom / modules / Connectors / sources / ext / rest / googlenews / mapping.php
<?php
$mapping = array (
'beans' =>
array (
'Accounts' =>
array (
'name' => 'name',
'id' => 'id',
),
),
);
清单3显示了如何将字段从连接器映射到相关模块。 在此示例中,您请求连接器的名称字段; 该值将与“帐户”模块的名称字段中的值相同。 同样,连接器的id字段映射到Accounts模块的id字段。
然后,您需要添加rest
源类的实例,以使连接器充分发挥作用。 请查看清单4,以了解如何处理连接器。 由于您将使用全部基于JavaScript /浏览器的Google AJAX搜索API,因此您将不会使用源类内部的任何内置功能,因此只需要进行必要的调用即可。
清单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中为连接器中使用的一种语言字符串添加语言定义文件,该文件为清单2中的vardefs.php文件中使用的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',
);
这样,您就建立了连接器的源映射和配置。 现在,您可以使用格式化程序来显示从Web服务提取的数据。
格式化程序
连接器的另一部分向用户显示连接器数据,称为格式化程序。 首先创建一个定义文件,该文件扩展了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()
将URL返回到在DetailView表单中的字段旁边显示的图标,该图标正由连接器连接。 然后, 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="//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服务的外部调用,将其结果呈现在弹出对话框中。 然后,呈现代码初始化弹出窗口,将标题设置为当前记录的名称,最后构建一个iframe,该iframe使用来自当前记录的传递的公司名称进行API调用。 图3显示了这一切的运作方式。
图3.运行中的Google新闻连接器
现在,您已经建立了一个功能齐全的连接器,当光标悬停在帐户名称旁边的新闻图标上时,该连接器将从给定帐户的Google新闻中提取数据。 您还可以轻松地为应用程序中的其他模块添加此功能,只需在清单2中的mapping.php文件中添加另一个模块条目,并将记录映射到连接器即可。 在应用程序“管理”部分的“连接器设置”选项下,SugarCRM还提供了一种图形方式来执行此操作。 只需单击该屏幕上的Connector Settings
选项,即可更改具有新闻图标的模块, 如图4所示 。
图4.连接器设置
下一步是添加模块的字段映射。 在“连接器设置”下的“映射连接器字段”页面中执行此操作, 如图5所示 。
图5.映射连接器字段
对于连接器中的每个字段,使用下拉选择器选择将与模块一起用于两个实体之间映射的字段。 您可以为连接器可用的每个不同模块进行不同的映射。
摘要
在本文中,您了解了SugarCRM连接器框架,该框架提供了一种从应用程序内部连接到外部数据源的方法。 您看到了这种用于外部应用程序集成的方法与传统方法的不同之处,在传统方法中,应用程序向应用程序提供了外部挂钩,供其他应用程序使用。 回顾了SugarCRM随附的LinkedIn连接器后,您学习了如何通过定义过程逐步使用Google AJAX搜索API构建自己的Google新闻连接器。 最后,您将拥有一个可以正常运行的Google新闻连接器,以显示您查看的给定帐户记录的新闻结果。
翻译自: https://www.ibm.com/developerworks/opensource/library/x-sugarcrmcon/index.html