Dynamics CRM2015自定义框架解决方案1.0
Dynamics CRM 2015自定义框架解决方案1.0版下载
一、目的
许多客户习惯之前系统自定义开发的页面、操作习惯和界面风格,但使用了Dynamics CRM 2015后只能使用产品自带的风格,导航菜单使用不是很方便,并且现阶段大部分办公设备并不支持触屏,给系统的使用带来了不便。
为解决此类问题提供了该解决方案,在CRM2015数据结构的基础上构建自定义风格的操作方式,满足用户的操作习惯,最大限度实现用户对系统的自定义。
二、特点
(1)、支持自定义风格、样式、颜色或公司Logo等等,产品自带功能不提供的解决方案;
(2)、支持多浏览器目前测试通过的浏览器有IE7及以上版本、Chrome和Firefox等;
(3)、运行速度提升,在同等环境下列表页面的展示速度提升到2-5倍;
(4)、部署简单现有系统不需要写任何代码,只需进行三个步骤即可让现有系统运行到此框架内;
(5)、完全兼容SiteMap设置,包括数据、菜单、权限等设置。因为使用的是当前登录用户权限使用SDK进行数据的读取和修改,所以插件功能完全不受影响;
数据的编辑、修改、停用、激活和删除都是当前登录人员有权限下才能使用。
注:配置的管理员账号和数据库连接字符串只是在读取框架时使用。
(6)、系统自带的页面在此框架内页面完全兼容;
(7)、窗体编辑页面使用两种方式:
Ø 使用系统自带的窗体布局;
Ø 使用框架提供的自定义开发模式,自定义窗体编辑页面,定制页面的布局和风格,开发者只需会html、css和js就能实现开发。
三、系统运行截图
(1)、系统整体截图
(2)、系统整体截图(集成呼叫中心版)
(3)、查询关键字高亮显示
(4)、选择系统自带的视图切换布局数据
(5)、新建、删除、停用、启用和导出Excel等基本操作,并且此功能按钮是可以动态配置的
(6)、系统自带页面仍然可用
(7)、通用的实体编辑页面(即第一种方式窗体编辑页面,系统定义的窗体页面编辑布局),双击列表行数据打开编辑页面
四、部署步骤
(1)、导入解决方案(XRMWeb_1_0_0_0)并发布;
(2)、文件发布
将文件CRMWeb\bin目录文件发布到Program Files\Microsoft Dynamics CRM\CRMWeb\bin目录中,文件如下图;
将页面文件CRMWeb目录页面文件发布到Program Files\Microsoft Dynamics CRM\CRMWeb目录中,文件如下图
(3)、Web.config文件修改
在appSettings节点中加入配置项,对应修改为自己系统配置数据
<!--CRM系统数据库连接-->
<addkey="XRMDBCon"value="server=LUTHERPC\MSSQLSERVER2014;database=MSCRM_MSCRM;uid=sa;pwd=1234.com;"/>
<!--组织服务地址-->
<addkey="XRMOrgServerAddress"value="http://192.168.1.126:5555/MSCRM/XRMServices/2011/Organization.svc"/>
<!--组织服务调用用户名-->
<addkey="XRMUserName"value="administrator"/>
<!--组织服务调用密码-->
<addkey="XRMPassword"value="123.com"/>
<!--系统域名-->
<addkey="XRMDomain"value="xrm"/>
注:配置的管理员账号和数据库连接字符串只是在读取框架时使用,数据操作均使用当前登录用户身份调用组织服务。
发布成功后使用路径http://192.168.1.126:5555/MSCRM/Index.aspx进行访问http://192.168.1.126:5555/MSCRM替换成自己系统地址。
五、自定义开发
1、开发前菜单配置
使用SiteMap工具将实体xrm_entitywebresource(实体Web资源配置)、xrm_entitylistbutton(实体按钮配置)和xrm_form(实体窗体定义)加入到菜单中,如下图
2、配置实体对应操作按钮
(1)说明:配置实体列表对应操作按钮,如果不配置使用默认操作,配置项如下图
(2)、输入项
A.实体代码:需要配置对应的实体如:new_project;
B.按钮名称;
C.按钮图标,对应一个Web资源图片;
D.按钮客户端脚步事件,填入点击按钮JS方法,添加方法对应AddNew,方法对应EditData等,也可以自定义方法名和参数形如:AddNew(obj,actionName);
E.按钮宽度单位为像素;
F.按钮描述,鼠标移动到按钮提示信息;
G.按钮操作名称对应方法AddNew(obj, actionName)中的actionName,点击按钮时会自动传入JS调用方法中;
H.按钮默认是否可用;
I.按钮顺序;
J.按钮是否默认可见。
3、脚本中按钮调用方法
//设置工具栏按钮是否可用
functionSetToolBoxButtonIsEnable(actionName, isEnable)
//设置工具栏按钮是否显示
functionSetToolBoxButtonIsVisible(actionName, isVisible)
3、配置实体Web资源
(1)、说明:配置实体列表和窗体中自定义的Web资源,包括JS和CSS,如图:
2、输入项
A. 实体代码;
B. Web资源类型,包括JS文件和CSS文件;
C. Web资源名称;
D. Web资源数据类型,包括列表和窗体。
4、配置实体窗体
(1)说明:自定义实体的编辑页面如下图
(2)、输入项
A. 名称;
B. 实体代码;
C. 窗体编号;
D. 窗体类型,包括编辑窗体和显示窗体;
E. 窗体内容定义,定义窗体HTML内容。
5、窗体内容定义说明
(1)、使用配置实体Web资源可添加窗体自定义的JS和CSS文件;
(2)、实体字段对应HTML说明
Ø 字段名标签
如:<% new_name%>显示字段名称
Ø INPUT type="text"输入项标签
如:<inputfname="new_name" type="text" />加入属性fname对应实体字段,支持CRM的字段类型有:单行文本、整数、浮点数、十进制数、货币、日期和时间和多行文本。
其中日期和时间加入事件οnclick="WdatePicker({dateFmt:'yyyy年MM月dd日',el:'Text21'});"
Ø INPUT type="checkbox"输入项标签
如<inputfname="xrm_isdefault"type="checkbox" name="xrm_isdefault" /><label for="xrm_isdefault"><% xrm_isdefault%></label>加入属性fname对应实体字段,支持CRM的字段类型有:两个选项集。
Ø textarea标签
如:<textareafname="xrm_content"style="width: 750px;height: 430px;"></textarea>加入属性fname对应实体字段,支持CRM的字段类型有:单行文本和多行文本。
Ø select标签
如:<selectfname="xrm_formtype"style="width: 157px;height: 23px;"></select>
加入属性fname对应实体字段,支持CRM的字段类型有:选项集
Ø div、input、img组合标签
如:<divclass="lookup" style="width: 463px;"><inputfname="new_projectname"readonly="readonly"style="width: 463px;" /><imgltitle="选择项目名称"onclick="OpenLookupDialog(this);"src="WebResources/xrm_CUS_IMG_lookupimg"/></div>
INPUT加入属性fname对应实体字段,支持CRM的字段类型有:Lookup字段。
Ø 添加附件功能
<div datatype="attachment" autoheight="true" style="width:500px; height:200px; margin:auto;border:1px solid #E5E5E5;"></div>
Ø 添加子网格
<div relname="new_new_dealbill_new_worktasktrans_WorkTaskID" style="width: 600px; height: 300px; margin: auto; "></div>
relname是关系的名称
注:所有标签的fname必须添加到标签内第一个属性,fname后后面至少需要一个空格
<select fname="new_businesstype" >正确 |
窗体内容定义示例:
<div style="width: 900px;margin-top: 5px; clear: both;">
<table width="900" cellpadding="5"cellspacing="5" border="0">
<colgroup>
<col style="width: 15%" />
<col style="width: 35%" />
<col style="width: 15%" />
<col style="width: 35%" />
</colgroup>
<tr>
<td align="right">
<% new_name %>:
</td>
<td>
<input fname="new_name"style="width:290px;" type="text" />
</td>
<td align="right">
<% new_datatype %>:
</td>
<td>
<select fname="new_datatype"style="width: 157px; height: 23px;">
</select>
</td>
</tr>
</table>
6、常用JS调用方法
(1)、返回窗体所有属性值对象
xrmForm.GetFormData()
返回数据对象
(2)、根据列值查询条件查询实体数据
GetEntityDataByColumnValue(entityName,columnName, columnValue, selectColumns)
参数:entityName,实体名
columnName,条件列名
columnValue,条件列值
selectColumns,需要查询的属性名,查询多列使用竖线分割
调用方式,例如:
var entDatas =GetEntityDataByColumnValue("new_projectname", "new_projectnameid","F6B924F4-6E0D-E511-80C1-00155D00631B", "new_name|new_projectname");
根据项目编号查询项目名称返回对象为数组
(3)、保存实体数据
var res = SaveData();
成功返回true,失败返回false
(4)、关闭窗体
CloseForm();
(5)、保存实体数据并关闭窗体
var res = SaveAndClose();
成功返回true,失败返回false
(6)、根据团队编号获取用户数据
var user=xrmPage.GetUsersByTeamId('265014C9-DA10-E511-80C2-00155D00631B');
返回对象
(7)、判断用户是否属于此团队
var isInTeam = xrmPage.CheckUserIsInTeam(teamId, systemUserId);
调用如:
var isInTeam = xrmPage.CheckUserIsInTeam('265014C9-DA10-E511-80C2-00155D00631B', '316469B0-DC10-E511-80C2-00155D00631B');
返回true或false
(8)、设置Lookup表单对象值
xrmForm.SetLookUpDataValue(entityName, fName,fId, fText);
参数:entityName:引用实体代码,不是当前实体
fName:字段属性代码
fId:引用实体记录编号
fText:引用实体记录主字段名称
例如,清空Lookup表单对象
xrmForm.SetLookUpDataValue(inputObj.attr("refentname"),inputObj.attr("fname"), "", "");
(9)、获取用户实体权限方法
获取当前用户实体权限
xrmPage.GetCurrentUserEntityPrivilege(entityName);
获取用户实体权限
xrmPage.GetEntityPrivilege(systemUserId, entityName);
参数:entityName:实体代码
systemUserId:用户编号
返回对象
返回对应的值(Append,Create等值) 0:无权限 1:用户级 2:业务部门 3:上下级业务部门 4:全组织级
(10)、当前用户编号
xrmPage.GetSystemUserId();
(11)、获取子网格对象
var subGridCon =xrmForm.GetSubGridControl(relName);
参数:relName:关系名称
(12)、自定义子网格
Ø添加标签
<div relname="new_new_dealbill_new_projectname" iscusview="true"
style="width: 600px; height: 300px; margin: auto; "></div>
relname是关系的名称
Ø编写过自定义视图代码
//查找子网格控件
var subGridCon =xrmForm.GetSubGridControl("new_new_dealbill_new_projectname");
varfetchXml ="<fetch version='1.0' output-format='xml-platform' mapping='logical'distinct='true'>" +"<entity name='" +subGridCon.TargetEntityType + "'>" +
"<attribute name='new_name' />" +
"<attributename='createdby' />" +
"<filter type='and'>" +
"<conditionattribute='statecode' operator='eq' value='0' />"; //筛选可用状态
fetchXml += "</filter>";
fetchXml += "</entity>";
fetchXml += "</fetch>";
var layoutXml ="<grid name='resultset' object='" + subGridCon.TargetEntityCode +"' jump='" + c.new_name + "' select='1' icon='1'preview='1'>" +
"<row name='result' id='" + subGridCon.TargetEntIdName +"'>" +
"<cell name='new_name' width='200' />" +
"<cell name='createdby' width='50' />" +
"</row>" +
"</grid>";
//添加自定义视图
subGridCon.AddCustomView(fetchXml, layoutXml);
(13)、实体列表相关方法
Ø 加载事件回调方法
xrmGrid.OnLoadData
Ø 刷新方法
xrmGrid.Refresh()
Ø 替换单元格Html方法
xrmGrid.SetDataCellHtml(attrName, value, strHtml);
参数:attrName:属性列
value:属性值
strHtml:替换该属性值单元格Html
例如:
xrmGrid.SetDataCellHtml("new_emergencylevel","3", strHtml);
Ø 根据属性设置单元格样式
xrmGrid.SetDataCellStyle (attrName, styleKey, styleValue);
参数:attrName:属性列
styleKey:样式关键字
styleValue:样式值
调用示例:
(1)、添加Web资源(JS类型),将该资源添加到对应的列表实体中
(3)、在JS中添加如下代码
jQuery(document).ready(function() {
xrmGrid.OnLoadData = function () {
//1:正常 2:紧急 3:特级
var strHtml = '<img src="WebResources/new_IMG_emergencylevel1"/>';
xrmGrid.SetDataCellHtml("new_emergencylevel", "1",strHtml);
strHtml = '<img src="WebResources/new_IMG_emergencylevel2"/>';
xrmGrid.SetDataCellHtml("new_emergencylevel", "2",strHtml);
strHtml = '<img src="WebResources/new_IMG_emergencylevel3"/>';
xrmGrid.SetDataCellHtml("new_emergencylevel", "3",strHtml);
//设置单元格样式
//xrmGrid.SetDataCellStyle("new_emergencylevel","text-align", "center");
};
});
实现列表效果:
欢迎广大CRM爱好者使用和测试,提出您的意见和建议,后续会持续加入更多的功能。如需帮助请给我发邮件953754092@qq.com
作者:陆建宇 QQ: 953754092