CRM Client Programming Tips
前段时间一直在做CRM4.0的相关开发,其中大多数都是在做Customization和工作流,其实CRM的开发本来大多都是Customization,而在做Customization时更多的我们通常又会选择用Javascript来实现一些逻辑,包括有关界面样式的更改,动态生成一些控件,调用Web Service,强制提交隐藏字段,客户端事件通知等等。这里简单的将一些常用的Javascript操作做一总结,当然,这只是一部分,大家一起慢慢增加。至于复杂一些的像动态生成控件/字段,这里先不提及。客户端操作Web Service已经在另外一篇文章中提及。
1. Lookup的操作
Lookup类型在CRM里是个很常用而且有些略显怪异的类型。根据生成的HTML来看,其实它本身也就是一个Input和一个Image而已,至于它的玄机在别的blog里也有过很多的解释,这里不尽阐述,但需要明白的是其实一个lookup就类似于Array,里便包含了多个Item(Object).如此理解之后我们可以很轻易的给lookup赋初始值:
//Create an array to set as the DataValue for the lookup control. var lookupData = new Array(); //Create an Object add to the array. var lookupItem= new Object();
//Set the id, typename, and name properties to the object. lookupItem.id = '{EEEA32C6-7430-DD11-BBDE-00155D012229}'; lookupItem.typename = 'systemuser'; lookupItem.name = 'Tony Park';
// Add the object to the array. lookupData[0] = lookupItem;
// Set the value of the lookup field to the value of the array. crmForm.all.new_financeofficerid.DataValue = lookupData; |
在获取lookup的值时,需要分清获取的是value还是text,这是根据name和id来分的:
var lookupItem = new Array;
// Get the lookup for the primarycontactid attribute on the account form. lookupItem = crmForm.all.primarycontactid.DataValue;
// If there is data in the field, show it in a series of alerts. if (lookupItem[0] != null) { // Display the text value of the lookup. alert(lookupItem[0].name);
// Display the entity type name. alert(lookupItem[0].typename);
// Display the GUID of the lookup. alert(lookupItem[0].id);
// Display the entity type code of the lookup. A value of 1 equals account, and a value of 2 equals contact. alert(lookupItem[0].type); } |
2. 给客户端控件添加事件
除了在定制的时候我们可以选择一个控件的onChange事件,我们仍然可以在onLoad事件里通过Javascript给控件添加自己的事件处理程序。例如一下代码片段给一个checkBox控件添加了onClick事件。
var clickEventHandler = function {} clickEventHandler.prototype = { click:function(checked) { var intCount = parseInt(crmForm.all.numberofdaysrequested.DataValue); if (intCount == null) intCount = 0;
if (checked) { intCount += 1; } else { if (intCount > 0) intCount -= 1; }
crmForm.all.numberofdaysrequested.DataValue = intCount; } }
crmForm.all.new_otherreasons.disabled = true;
crmForm.all.new_monday.onclick = function() { clickEventHandler.click(crmForm.all.new_monday.DataValue); } |
3. 隐藏字段的强制提交ForceSubmit
在Form上没有的字段(但实体对象上有)或者隐藏的字段,默认情况下CRM是不会提交这个值,只有在设置了ForceSubmit=true之后才会提交。如一下语句强制将new_name属性设置并提交。
//Force submit the disabled field crmForm.all.new_name.ForceSubmit = true;
//Set Name(Primary Attribute) to be "[ChildName]-[NumberOfDaysRequested] days"; crmForm.all.new_name = childName + " - " + intCount + " days"; |
一个字段可以设置的属性还包括:
· {Field}.DataValue
· {Field}.Disabled
· {Field}.RequiredLevel
· {Field}.IsDirty
还有两个公共方法可以调用:
· {Field}.FireOnChange()
· {Field}.SetFocus()
4. Boolean的空值
CrmBoolean类型的值是可以包含null值的,所以很多时候我们直接将field.DataValue转换为bool是错误的。在转换之前需要先判断是否为null.
var value = crmForm.all.my_bool.DataValue; { { |
5. 判断是运行在CRM 3.0还是CRM4.0
CRM4.0 提供了一个新的global的方法,我们可以利用它来判断当前运行的环境:
if (typeof(GenerateAuthenticationHeader) == "undefined") { |
6. 控制tab的显示与隐藏
CRM4.0中的tab页默认都是按tab1Tab…tabNTab来命名的,隐藏或更改其中的某个tab跟隐藏和显示普通的对象相同,你只需要提供tab的名字即可。(通过view page source来查看生成的源代码便可以得到,你也可以通过IE Developer Tools或FireBug轻松得到)
if (crmForm.FormType = 1) { |
7. 用正则表达式格式化
var originalPhoneNumber = "+49 (89) 12345678"; |
8. 隐藏表格的行
其实在CRM中,除了在crmForm中的对象我们可以用crmForm.all.对象名来简单获取外,其它的位于crmForm外的对象仍然可以像平时一样用document.getElementById来获取(其实crmForm内的也可以),并通过获取的对象来设置属性。如以下代码演示了如何获取一个行并将其隐藏:
//the field you want to hide var field = crmForm.all.name;
//search the enclosing table row while ((field.parentNode != null) && (field.tagName.toLowerCase() != "tr")) { field = field.parentNode; }
//if we found a row, disable it if (field.tagName.toLowerCase() == "tr") { field.style.display = "none"; } |
9. 如上的操作其实也可以用现在流行的jQuery来操作,并且更为简单。在CRM中引用jQuery来操作客户端对象,你会发现其优雅的方式让你的开发工作更为舒服。
利用jQuery来做客户端开发,你只需要做两件事即可完成:
1). 将jQuery的类库置入CRM并引用进页面模型。将jQuery-1.2.6.js文件放于服务器的"ISV"Scripts目录下,并在onLoad事件内加入将js文件加入文件引用的代码:
var script = document.createElement('script'); event.srcElement.readyState == "loaded") function onReady() // custom code goes here } |
2). 用jQuery来执行客户端操作
$("#name").parents("tr:first").hide(); $("*[RequiredLevel=2]").css("border","1px solid red"); |