CRM Client Programming -javascript

来源:互联网 发布:网络协议仿真 编辑:程序博客网 时间:2024/05/10 04:45

     
  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 _disibledevent=>  
  
  
  // 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;
  
  //Default to true if no value is set
  if (value == null) {
   value = true;
  }
  
  if (value == true)
  
   {
   //do something
  }
  else
  
  {
   //do something else
  }
  
  5. 判断是运行在CRM 3.0还是CRM4.0
  CRM4.0 提供了一个新的global的方法,我们可以利用它来判断当前运行的环境:
  if (typeof(GenerateAuthenticationHeader) == "undefined") {
   alert("CRM 3.0");
  }
  else {
   alert("CRM 4.0");
  }
  
  6. 控制tab的显示与隐藏
  CRM4.0中的tab页默认都是按tab1Tab…tabNTab来命名的,隐藏或更改其中的某个tab跟隐藏和显示普通的对象相同,你只需要提供tab的名字即可。(通过view page source来查看生成的源代码便可以得到,你也可以通过IE Developer Tools或FireBug轻松得到)
  if (crmForm.FormType = 1)
  
   {
   var value = crmForm.all.new_FileType.DataValue;
  
   crmForm.all.tab1Tab.style.display = (value == "1") ? "none" : "";
   crmForm.all.tab1Tab.style.backgroundColor = 'red';
  }
  
  7. 用正则表达式格式化
  var originalPhoneNumber = "+49 (89) 12345678";
  var formattedPhoneNumber = originalPhoneNumber.replace(/[^0-9,+]/g, "-");
  formattedPhoneNumber = formattedPhoneNumber.replace(/-+/g, "-");
  alert(formattedPhoneNumber);
  
  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');
  script.language = 'javascript';
  script.src = '/ISV/scripts/jquery-1.2.6.js';
  script.onreadystatechange = function()
  {
   if (event.srcElement.readyState == "complete" ||
  
   event.srcElement.readyState == "loaded")
   _disibledevent=>CSS("border","1px solid red");
本文来自:http://www.crazycoder.cn/DotNet/Article126893.html