注意事项:Xrm.Page中的方法使用的是实体、字段、关系的逻辑名称。
窗体调试:contentIFrame.Xrm.Page.getControl("compositeControlParams").setDisabled(false);一、Xrm.Page.context:上下文信息管理器
1、Xrm.Page.context.getServerUrl():获取服务器URL。2、Xrm.Page.context.getOrgUniqueName():获取组织名称。3、Xrm.Page.context.getUserRoles():获取当前用户安全角色数组(每个对象中存储的是安全角色的Guid)。Iframe 中获取当前数据guidthis.parent.Xrm.Page.context.getId();二、Xrm.Page.data.entity:实例数据管理器
㈠Xrm.Page.data.entity:实例级别1、Xrm.Page.data.entity.getId():返回当前实例的Guid值。2、Xrm.Page.data.entity.getEntityName():返回当前实例所属实体的逻辑名称。3、Xrm.Page.data.entity.getIsDirty():返回当前实例是否修改。4、Xrm.Page.data.entity.getDataXml():5、Xrm.Page.data.entity.addOnSave(function/functionName):添加保存记录时调用的函数。 ⑴取消OnSave事件:event.returnValue = false; function OnSaveHandler(ExecutionObj){ //2013适用,注意:要勾选上表单编辑中的执行上下文 ExecutionObj.getEventArgs().preventDefault(); }6、Xrm.Page.data.entity.removeOnSave(function/functionName):删除保存记录时调用的函数。7、Xrm.Page.data.entity.save(无/"saveandclose"/"saveandnew"):保存/保存并关闭/保存并新建。㈡Xrm.Page.data.entity.attributes:属性集级别
1、Xrm.Page.data.entity.attributes.getLength():返回属性集中的属性数量。2、Xrm.Page.data.entity.attributes.forEach( function( attribute, index ) ):遍历属性集,执行函数操作,参数为当前属性和索引值。3、Xrm.Page.data.entity.attributes.get( String / Index / null / function(attribute, index) ):返回属性或属性集。 Xrm.Page.getAttribute( String / Index / null / function(attribute, index) ):快捷方式 ⑴String:返回指定逻辑名称的属性(对象)。 ⑵Index:返回指定索引值的属性(对象)。 ⑶null:返回所有属性(数组)。 ⑷function(attribute, index):返回函数return true的属性(数组)。㈢Xrm.Page.getAttribute:属性级别
1、Xrm.Page.getAttribute("LogicalName").getAttributeType():返回属性的类型。2、Xrm.Page.getAttribute("LogicalName").getFormat():返回属性格式的设置选项。3、Xrm.Page.getAttribute("LogicalName").getName():返回属性的逻辑名称。4、Xrm.Page.getAttribute("LogicalName").addOnChange(function/functionName):添加属性变更时调用的函数。5、Xrm.Page.getAttribute("LogicalName").removeOnChange(function/functionName):删除属性变更时调用的函数。 6、Xrm.Page.getAttribute("LogicalName").setSubmitMode("always"/"never"/"ditry"):设置在保存记录时,是否提交属性中的数据。 ⑴always:始终 ⑵never:从不 ⑶ditry:脏页7、Xrm.Page.getAttribute("LogicalName").setRequiredLevel("none/required/recommended"):可选/必选/推荐。属性取值方法:若字段内容为空,则返回值为null。 1、单行文本、多行文本:Xrm.Page.getAttribute("LogicalName").getValue():String2、整数、浮点数、十进制数、货币:Xrm.Page.getAttribute("LogicalName").getValue():Number3、两个选项:Xrm.Page.getAttribute("LogicalName").getValue():Boolean4、选项集:Xrm.Page.getAttribute("LogicalName").getText():StringXrm.Page.getAttribute("LogicalName").getValue():NumberXrm.Page.getAttribute("LogicalName").getOption("选项的值"):Option对象⑴text:选项的标签⑵value:选项的值Xrm.Page.getAttribute("LogicalName").getOptions():Option对象数组5、日期和时间:Xrm.Page.getAttribute("LogicalName").getValue():Date对象6、查找:Xrm.Page.getAttribute("LogicalName").getValue():LookUp对象数组⑴[0].id:对象的Guid⑵[0].name:对象的主字段内容(LookUp中的显示名称)⑶[0].entityType:对象所属实体的逻辑名称(LogicalName)属性设值方法:若要设置字段为空,则设置为null。
1、单行文本、多行文本:Xrm.Page.getAttribute("LogicalName").setValue(String);2、整数、浮点数、十进制数、货币: Xrm.Page.getAttribute("LogicalName").setValue(Number); 3、两个选项:Xrm.Page.getAttribute("LogicalName").setValue(Boolean);4、选项集:Xrm.Page.getAttribute("LogicalName").setValue(Number);5、日期和时间:Xrm.Page.getAttribute("LogicalName").setValue(Date Object);e.g:Xrm.Page.getAttribute("LogicalName").setValue(new Date(1990,10,12)); // 显示 1990/11/126、查找:Xrm.Page.getAttribute("LogicalName").setValue(LookUp Object 数组);e.g:var lookup = new Array(1);lookup[0] = new Object();lookup[0].id = Xrm.Page.getAttribute("new_chazhao").getValue()[0].Id;lookup[0].name = Xrm.Page.getAttribute("new_chazhao").getValue()[0].Name;lookup[0].entityType = Xrm.Page.getAttribute("new_chazhao").getValue()[0].entityType;Xrm.Page.getAttribute("LogicalName").setValue(lookup); //js中得到该实体中lookup的属性 retrieveRecord(Xrm.Page.getAttribute("new_coursename").getValue()[0].id, "new_courseSet", function (data, textStatus, XmlHttpRequest) { var Item = new Object(); Item.id = data.new_courselevel.Id Item.name = data.new_courselevel.Name; Item.typename = data.new_courselevel.LogicalName; var array = new Array(); array[0] = Item; Xrm.Page.getAttribute("new_courselevellook").setValue(array); }, null, false);三、Xrm.Page.ui:窗体界面管理器
㈠Xrm.Page.ui:窗体级别1、Xrm.Page.ui.getFormType():返回表单窗体的类型。 ⑴ 0:未定义 ⑵ 1:创建 ⑶ 2:更新 ⑷ 3:只读模式 ⑸ 4:已禁用 ⑹ 5:快速创建(已弃用) ⑺ 6:批量编辑 ⑻11:读优化2、Xrm.Page.ui.refreshRibbon():刷新功能区。3、Xrm.Page.ui.close():关闭窗体。
Xrm.Page.ui.tabs.get("general").setLabel("Major"); //js改变选项卡标签值㈡Xrm.Page.ui.controls:控件级别(相似方法同上)1、Xrm.Page.ui.controls.getLength();2、Xrm.Page.ui.controls.forEach(function(control, index));3、Xrm.Page.ui.controls.get(String/Index/null/function(attribute, index)); Xrm.Page.getControl(String/Index/null/function(attribute, index))(快捷方式)4、属性.controls.get(0):可以获得对应控件。控件方法:1、Xrm.Page.getControl("控件逻辑名称").setVisible(true/false):可见/不可见控件。2、Xrm.Page.getControl("控件逻辑名称").setDisabled(true/false):禁用/启用控件。3、Xrm.Page.getControl("LogicalName").addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, isDefault):添加查找对话框视图(查找字段的视图选择器必须开启)。 // 指定视图的GUID(任意) var viewId = null; // 查找实体的逻辑名称 var entityName = null; // 指定视图的名称 var viewDisplayName = null; // 视图的fetchXml查询 var fetchXml = null; // 指定视图布局XML var layoutXml = null; // 是否设置为默认视图 var isDefault = true;4、Xrm.Page.getControl("LogicalName").addCustomFilter(fetchXml):添加视图筛选条件,对所有视图有效,必须在addPreSearch中调用。5、Xrm.Page.getControl("LogicalName").addPreSearch(function):在显示查询视图前,调用参数方法,常用于添加视图筛选条件。 · 猜想:点击查找按钮,加载查询语句,执行addPreSearch参数方法,显示查找视图。 · 注意:对同一个查询控件执行多次addPreSearch方法,在执行其参数方法时,会按照添加顺序依次执行每次添加的参数方法。6、Xrm.Page.getControl("IFrameLogicalName").setSrc(URL):设置资源地址。 · 每次展开选项卡,IFrame将刷新重置,因此,对src的修改,应放在TabStateChange事件中,而不是OnLoad事件。㈢Xrm.Page.ui.tabs: 选项卡级别(相似方法同上)1、Xrm.Page.ui.tabs.getLength();2、Xrm.Page.ui.tabs.forEach(function(attribute, index));3、Xrm.Page.ui.tabs.get(String/Index/null/function(attribute, index));选项卡方法:见SDK。㈣Xrm.Page.ui.tabs.get(...).sections:选项卡中节级别(相似方法同上)1、Xrm.Page.ui.tabs.get(...).sections.getLength();2、Xrm.Page.ui.tabs.get(...).sections.forEach(function(attribute, index));3、Xrm.Page.ui.tabs.get(...).sections.get(String/Index/null/function(attribute, index));节方法:见SDK。㈤Xrm.Page.ui.navigation.items:关联导航视图(相似方法同上)1、Xrm.Page.ui.navigation.items.getLength();2、Xrm.Page.ui.navigation.items.forEach(function(item, index));3、Xrm.Page.ui.navigation.items.get(String/Index/null/function(attribute, index)); · String:在CRM2013中为"nav_关系名称"节方法:见SDK。四、Xrm.Utility:
1、Xrm.Utility.openEntityForm(LocalName, Id, Parameters):⑴打开新记录:Xrm.Utility.openEntityForm("account");⑵打开新记录并设置默认值:Xrm.Utility.openEntityForm("account", null, parameters); var parameters = {}; parameters["文本/十进制数"] = String; parameters["数字/货币"] = Number; parameters["两个选项"] = true/false; parameters["选项集"] = Value; parameters["时间和日期"] = "1/31/1990"; parameters["查找"] = ID; parameters["查找name"] = Name; parameters["查找type"] = EntityType(仅限系统自带客户/负责人字段);⑶打开已有记录:Xrm.Utility.openEntityForm("account", "A85C0252-DF8B-E111-997C-00155D8A8410"); Xrm.Page.ui.getFormType() != 1 窗体不是创建状态Xrm.Page.ui.setFormNotification('创建保存成功!', "INFO", "remind"); 通知
var object=new Object(); obj.new_type = { Value: "100000000" }; //picklist赋值 obj.new_contractno = { Id: "" +id + "", LogicalName: "" + Xrm.Page.data.entity.getEntityName() + "", Name: "1" };//lookup赋值
高级JS
1. Xrm.Page.context.getClient()它是用来替代之前的 context.isOutlookClient() 接口的,返回值可能是 Browser 、Outlook或者Mobile之一。2. Xrm.Page.data.refresh(save).then(successCallback, errorCallback)用来异步刷新界面,可以保存当前修改且不需要重新载入页面。我们知道Dynamics CRM 2011 记录详情界面保存后后悔重新载入页面,现在Dynamics CRM 2013提供了新选择。3. Xrm.Page.data.save().then(successCallback, errorCallback)异步的保存对记录的更改,并在保存成功后调用回掉函数successCallback。4. Xrm.Page.getAttribute(arg).getIsPartyList()返回查找字段是不是参与方列表,比如活动的必须方字段就是,我们新建的客制化实体目前是的查找字段是不能查找多个实体的,就不是参与方列表。5. Xrm.Page.context.getUserName() 以前有getUserId(),要给查找实体是系统用户(SystemUser)的查找类型字段赋值为当前用户还真是有点麻烦,需要用ODATA查询下用户的主属性(姓名)的值才能赋值。当时我就在想,为啥没有getUserName()呢?哈哈,这不,想啥来啥,赞一个。我用代码 alert(Xrm.Page.context.getUserName()); 获取到的输出如下,正是当前用户的姓名。5.Xrm.Page.data.entity.getPrimaryAttributeValue()这个用来获取实体的主属性的值,主属性默认情况下就是解决方案前缀加上_name,比如new_name,示例代码是 alert(Xrm.Page.data.entity.getPrimaryAttributeValue());,结果如下:
6. Xrm.Page.ui.setFormNotification() 在Dynamics CRM 2011中,只有少部分地方系统有窗体通知,比如商机界面如果没有选择价目表会出现窗体提示,但是SDK中并没有提供自定义开发的时候如何设置窗体消息的方法,虽然网上有人说可以做到,毕竟官方没有公开支持嘛。一些用户也有这需求,因为总是弹出窗口来提示有时候挺烦人的。
到Dynamics CRM 2013时明确方便的支持了,示例代码是 Xrm.Page.ui.setFormNotification('窗体通知消息一错误', 'ERROR', 'D1ADCA8C-D70D-4A2E-A759-BA08FE8A221B'); ,效果如下图所示:
使用代码 Xrm.Page.ui.setFormNotification('窗体通知消息一警告', 'WARNING', 'D1ADCA8C-D70D-4A2E-A759-BA08FE8A221B'); 的效果如下图所示:
使用代码 Xrm.Page.ui.setFormNotification('窗体通知消息一信息', 'INFO', 'D1ADCA8C-D70D-4A2E-A759-BA08FE8A221B'); 的效果如下图所示:
当然,一次添加多个消息也是可以的,如下图所示。
这里会用到一个GUID的值,我一般使用Visual Studio自带的创建GUID工具即可。
7. Xrm.Page.ui.clearFormNotification(uniqueId) 清除参数指定的表单级别的消息。 8. Xrm.Page.getControl(arg).setNotification(message) 为指定的控件设置一个消息,能阻止窗体保存,是代替以前用alert方法弹出对话框提示错误信息的绝好替代方法。 9. Xrm.Page.getControl(arg).clearNotification()清除为指定控件设置的消息。10. Xrm.Utility.isActivityType(entityName)传入实体的逻辑名称,判断boolean值告知是否是活动实体11. Xrm.Utility.alertDialog(message,onCloseCallback)显示一个消息,并在用户点击确定按钮后调用回调函数 onCloseCallback,请以后使用该函数代替window.alert。12. Xrm.Utility.confirmDialog(message,yesCloseCallback,noCloseCallback)显示一个确认对话框,当用户点击确定时调用函数yesCloseCallback,点击取消时调用函数noCloseCallback。 下面这个例子涵盖了前面几个函数: function BtnOnClick() { Xrm.Utility.confirmDialog('确定要继续操作吗?', function () { Xrm.Page.getControl('new_name').setNotification('你点击了确定按钮!'); Xrm.Page.ui.clearFormNotification('D1ADCA8C-D70D-4A2E-A759-BA08FE8A221B'); }, function () { Xrm.Utility.alertDialog('你点击了取消按钮', function () { }); });}