关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复167或者20151029可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!
前面的博文都是为一个实体添加按钮,如果我要为一批具有某些特征的实体添加一样的按钮呢?难道一个一个实体去添加?当然不是这样。有简便的方法的,这个也是本文要介绍内容,follow me。为了更好的阐述本博文要讲解的内容,我们模拟一个场景,就是启用了注释功能的实体,在表单界面增加一个名称为点赞的按钮,点击后执行一个JavaScript函数。
首先还是要将 应用程序功能区 加入到我们之前建立好的一个解决方案,只要这个组件,其余不需要。
 
然后将其作为非托管解决方案导出,凡是和前面博文类似的操作这里就不详述了,请各位看官先看前面博文。解压后我们还是用Visual Studio 来打开编辑其中的 customizations.xml 文件,并为它指定使用名称为 CustomizationsSolution.xsd 的架构文件辅助进行编辑。因为我没有对应用程序功能区做过定制,所以这个文件还是原始的,字符也是很少的,全部字符如下:
  1. <ImportExportXml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  2. <Entities></Entities>
  3. <Roles></Roles>
  4. <Workflows></Workflows>
  5. <FieldSecurityProfiles></FieldSecurityProfiles>
  6. <Templates />
  7. <RibbonDiffXml>
  8. <CustomActions />
  9. <Templates>
  10. <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  11. </Templates>
  12. <CommandDefinitions />
  13. <RuleDefinitions>
  14. <TabDisplayRules />
  15. <DisplayRules />
  16. <EnableRules />
  17. </RuleDefinitions>
  18. <LocLabels />
  19. </RibbonDiffXml>
  20. <EntityMaps />
  21. <EntityRelationships />
  22. <OrganizationSettings />
  23. <optionsets />
  24. <Languages>
  25. <Language>2052</Language>
  26. <Language>1033</Language>
  27. </Languages>
  28. </ImportExportXml>
还是一样,我们添加的元素内容都必须位于 RibbonDiffXml 这个元素之间。我们先来准备按钮旁边显示的文本吧。文本应该放到 LocLabels 元素中,正如你知道的是支持多语言的,我们这里配置简体中文和英文吧,这里主要参考SDK中的 Use localized labels with ribbons 章节。
  1. <LocLabels>
  2. <LocLabel Id="LuoYong.Common.LikeIt.LabelText">
  3. <Titles>
  4. <Title languagecode="2052" description="点赞" />
  5. <Title languagecode="1033" description="Like it"/>
  6. </Titles>
  7. </LocLabel>
  8. <LocLabel Id="LuoYong.Common.LikeIt.ToolTip">
  9. <Titles>
  10. <Title languagecode="2052" description="喜欢就点赞吧!"/>
  11. <Title languagecode="1033" description="I like it!" />
  12. </Titles>
  13. </LocLabel>
  14. </LocLabels>
  15. </RibbonDiffXml>
出了按钮显示的文字,我们知道按钮旁边还有图标,这个图标我的做法简单,一般用现有的图标,去哪里找现有的图标,我一般在 SDK\Resources\Images\Ribbon 中找,比如我这次喜欢这个笑脸图标 Entity16_8006.png ,就用它了,到时候16*16大小的图标(也就是button元素的Image16by16属性)配置为 /_imgs/ribbon/Entity16_8006.png 即可,当然我一般也会同时配置 32*32大小的图标(也就是button元素的Image32by32属性)。
命令一般还可以使用一个或者多个Enable Rule,这个是要定义在在元素 /RuleDefinitions/EnableRules 下面定义一个EnableRule元素,命令和它关联则是通过在 /CommandDefinitions/CommandDefinition/EnableRules 下面定义EnalbleRule 元素来关联。对于Enable Rule来说,在Dynamics CRM 2011的时候可能显示一个禁用的按钮,但是对于 Dynamics CRM 2013以后的版本,禁用的按钮不会显示,效果和Display Rule差不多。
命令一般还可以使用一个或者多个 Display Rule,这个是要定义在 /RuleDefinitions/DisplayRules 下面定义个一个DisplayRule元素,命令和它关联则是通过在 /CommandDefinitions/CommandDefinition/DisplayRules 下面定义EnalbleRule 元素来关联。
我这里分别定义了一个Enable Rule和Display Rule,如下:这个手写也简单,因为有智能提示。
  1. <RuleDefinitions>
  2. <TabDisplayRules />
  3. <DisplayRules>
  4. <DisplayRule Id="LuoYong.Common.DisplayRules.EntityPropertyHasNotes">
  5. <EntityPropertyRule AppliesTo="PrimaryEntity" PropertyName="HasNotes" PropertyValue="true"/>
  6. </DisplayRule>
  7. </DisplayRules>
  8. <EnableRules>
  9. <EnableRule Id="LuoYong.Common.EnableRules.FormStateExisting">
  10. <FormStateRule State="Existing"/>
  11. </EnableRule>
  12. </EnableRules>
  13. </RuleDefinitions>
我们定义这些Display Rule和Enable Rule是要和命令关联的,所以我们来定义一个命令,命令定义在 CommandDefinitions 元素中。CommandDefinition下面主要要定义三个元素,分别是EnableRules,DisplayRules,和 Actions ,前两者的含义很清楚啦,Actions就是点击按钮要执行的操作。主要分成两种,一种是打开一个网页,另外一种是执行一个JavaScript函数,执行的JavaScript代码一般在Web资源中,引用Web要以这种形式引用:Library="$webresource:new_/common/js/RibbonScript.js" ,也就是Web资源的名称前面要加上$webresource: ,当然可以给执行的Action传递参数,我这里传递了两个参数,当前记录的逻辑架构名称和记录的ID。我这里定义的完整命令如下:
  1. <CommandDefinitions>
  2. <CommandDefinition Id="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.LikeIt.Command">
  3. <EnableRules>
  4. <EnableRule Id="LuoYong.Common.EnableRules.FormStateExisting"/>
  5. </EnableRules>
  6. <DisplayRules>
  7. <DisplayRule Id="LuoYong.Common.DisplayRules.EntityPropertyHasNotes"/>
  8. </DisplayRules>
  9. <Actions>
  10. <JavaScriptFunction FunctionName="LikeIt" Library="$webresource:new_/common/js/RibbonScript.js">
  11. <CrmParameter Value="PrimaryEntityTypeName" />
  12. <CrmParameter Value="FirstPrimaryItemId" />
  13. </JavaScriptFunction>
  14. </Actions>
  15. </CommandDefinition>
  16. </CommandDefinitions>
命令定义了,它要和按钮关联才行。按钮需要定义在 CustomActions/CustomAction/CommandUIDefinition 元素下,按钮的元素名当然是Button了,这个元素通过 Command 属性和前面定义的命令关联起来,通过 LabelText 属性和 ToolTipTitle 属性和前面定义的文本关联起来,和文本关联的时候需要以类似这种形式 LabelText="$LocLabels:LuoYong.Common.LikeIt.LabelText" ,也就是属性值要以 $LocLabels: 开头。通过Image16by16属性和Image32by32属性来定义按钮显示的图片。按钮元素也有个 Sequence 属性,这个要赋予一个整数值,它值越大就越在这些按钮组中靠后。比如我要放在 激活按钮的前面,从 applicationRibbon.xml 中我们知道 Mscrm.Form.{!EntityLogicalName}.Activate 是激活按钮,这个按钮的 Sequence 属性是50,如果我自己添加的按钮的 Sequence 设置为49,就会显示在这个按钮的前面。
 
定义上面这些就行了?NO!如果你只定义这些导入的话会报错 Object reference not set to an instance of an object. 后来我明白了是哪里还需要定义。就是 CustomAction 元素的Id,Location 和 Sequence 属性也要定义。特别是这个Location要注意,比如我会放在 Mscrm.Form.{!EntityLogicalName}.Activate 按钮的旁边,那就是这个按钮所在的按钮组了,在 applicationRibbon.xml 中可以知道是 Mscrm.Form.{!EntityLogicalName}.MainTab.Save 这个Group,那么你设置的 Location属性的值为这个以外还要加上 .Controls._children ,比如我设置的就是 Mscrm.Form.{!EntityLogicalName}.MainTab.Save.Controls._children 。这个CustomAction元素也有Sequence 属性,这个一般设置为刚才这个按钮组的Sequence 属性值就可以,从 applicationRibbon.xml 中可以知道这个属性值是10,所以我也设置为 10。当然这些东西自己去找applicationRibbon这个接近8000行的文件很难,我的建议是使用 CRM 2011 Visual Ribbon Editor来辅助查看,应该用它也可以直接修改,它支持Dynamics CRM 2015。我这里
这个CustomAction 元素的设置如下:
  1. <CustomAction Id="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.LikeIt.CustomAction" Location="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.Controls._children" Sequence="10">
  2. <CommandUIDefinition>
  3. <Button Id="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.LikeIt" Command="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.LikeIt.Command" Sequence="48" LabelText="$LocLabels:LuoYong.Common.LikeIt.LabelText" ToolTipTitle="$LocLabels:LuoYong.Common.LikeIt.ToolTip" Image16by16="/_imgs/ribbon/Entity16_8006.png" Image32by32="/_imgs/ribbon/Entity32_8006.png" />
  4. </CommandUIDefinition>
  5. </CustomAction>
整个 customizations.xml文件的 RibbonDiffXml 元素的值如下,我们所有修改的内容都在这个元素下:
  1. <RibbonDiffXml>
  2. <CustomActions>
  3. <CustomAction Id="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.LikeIt.CustomAction" Location="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.Controls._children" Sequence="10">
  4. <CommandUIDefinition>
  5. <Button Id="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.LikeIt" Command="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.LikeIt.Command" Sequence="48" LabelText="$LocLabels:LuoYong.Common.LikeIt.LabelText" ToolTipTitle="$LocLabels:LuoYong.Common.LikeIt.ToolTip" Image16by16="/_imgs/ribbon/Entity16_8006.png" Image32by32="/_imgs/ribbon/Entity32_8006.png" />
  6. </CommandUIDefinition>
  7. </CustomAction>
  8. </CustomActions>
  9. <Templates>
  10. <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  11. </Templates>
  12. <CommandDefinitions>
  13. <CommandDefinition Id="Mscrm.Form.{!EntityLogicalName}.MainTab.Save.LikeIt.Command">
  14. <EnableRules>
  15. <EnableRule Id="LuoYong.Common.EnableRules.FormStateExisting"/>
  16. </EnableRules>
  17. <DisplayRules>
  18. <DisplayRule Id="LuoYong.Common.DisplayRules.EntityPropertyHasNotes"/>
  19. </DisplayRules>
  20. <Actions>
  21. <JavaScriptFunction FunctionName="LikeIt" Library="$webresource:new_/common/js/RibbonScript.js">
  22. <CrmParameter Value="PrimaryEntityTypeName" />
  23. <CrmParameter Value="FirstPrimaryItemId" />
  24. </JavaScriptFunction>
  25. </Actions>
  26. </CommandDefinition>
  27. </CommandDefinitions>
  28. <RuleDefinitions>
  29. <TabDisplayRules />
  30. <DisplayRules>
  31. <DisplayRule Id="LuoYong.Common.DisplayRules.EntityPropertyHasNotes">
  32. <EntityPropertyRule AppliesTo="PrimaryEntity" PropertyName="HasNotes" PropertyValue="true"/>
  33. </DisplayRule>
  34. </DisplayRules>
  35. <EnableRules>
  36. <EnableRule Id="LuoYong.Common.EnableRules.FormStateExisting">
  37. <FormStateRule State="Existing"/>
  38. </EnableRule>
  39. </EnableRules>
  40. </RuleDefinitions>
  41. <LocLabels>
  42. <LocLabel Id="LuoYong.Common.LikeIt.LabelText">
  43. <Titles>
  44. <Title languagecode="2052" description="点赞" />
  45. <Title languagecode="1033" description="Like it"/>
  46. </Titles>
  47. </LocLabel>
  48. <LocLabel Id="LuoYong.Common.LikeIt.ToolTip">
  49. <Titles>
  50. <Title languagecode="2052" description="喜欢就点赞吧!"/>
  51. <Title languagecode="1033" description="I like it!" />
  52. </Titles>
  53. </LocLabel>
  54. </LocLabels>
  55. </RibbonDiffXml>
我使用的Web资源的JavaScript代码如下:
  1. function LikeIt(EntityName, EntityId) {
  2. Xrm.Utility.alertDialog("感谢用户 " + Xrm.Page.context.getUserName() + " 对实体逻辑名称为" + EntityName + ",Id为" + EntityId + ",主要属性值为" + Xrm.Page.data.entity.getPrimaryAttributeValue() + "的记录点赞!");
  3. }
 
保存,压缩后将解决方案导入系统,发布所有自定义项后我们去看效果:打开客户这个实体的记录,可以看到点赞这个按钮在我指定的位置,显示文本和提示和我设置的一样,点击后有我预料的效果。
 
去自定义的一个启用了注释的测试实体看看,也有:
 
但是我如果去一个我没有启用注释功能的实体看看,则是没有这个按钮的,当然新建记录时候也是没有的。
测试基本满足要求,搞定。话说点赞容易,当面赞难。各位看官下次看见我的时候当面赞一下,看看是不是很难。
 

Dynamics CRM通过定制应用程序功能区为符合条件的实体表单增加按钮的更多相关文章

  1. Dynamics CRM 依赖组件类型为应用程序功能区导致的无法删除实体问题的解决方法

    看到有人问到这个问题,这边就简单描述下解决方法,主要是针对第一次碰到这个问题云里雾里的朋友,错误如下 在我们建lookup关联的时候有下图中的这么个设置,对于很多新手默认就是下图这样不会去做改动,因为 ...

  2. Dynamics CRM命令栏定制基础知识及手动编辑customization.xml实例

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复166或者20151028可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面的博文:Dynamics C ...

  3. Dynamics CRM 客户端程序开发:在实体的列表界面添加按钮

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复114或者20140312可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 如果没有安装Ribbon Wor ...

  4. Dynamics CRM定制子网格添加按钮实例之一

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复221或者20160430可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  5. 控制台程序(C#)不弹出认证窗口连接到Dynamics CRM Online的Web API

    摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复271或者20180602可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...

  6. Microsoft Dynamics CRM4.0 JScript 过滤lookup 出现 Microsoft Dynamics CRM 窗口无法打开,可能已被弹出窗口阻止程序所阻止。

    一.现象:JScript过滤lookup字段,选择lookup字段出现下图的情况: 出现:Microsoft Dynamics CRM 窗口无法打开,可能已被弹出窗口阻止程序所阻止.请将这台Micro ...

  7. 定制Dynamics CRM标准导出功能:不能导出指定列的值

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复239或者20161203可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  8. 控制台程序(C#)不弹出登录窗口连接到Dynamics CRM Online的Web API

    微软动态CRM专家罗勇 ,回复331或者20190505可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 我之前的文章 控制台程序(C#)不弹出认证窗口连接到Dynami ...

  9. Dynamics CRM - 解决无法使用 Ribbon Workbench 2016 定制 Sub-Grid View Button 的问题(SubGrid MainTab 消失之谜)

    发现问题: 在 Dynamics CRM 开发中,会经常使用 Ribbon Workbench 工具来定制 Button 或者对已有 Button 进行自定义功能开发,比如隐藏 SubGrid 的 A ...

随机推荐

  1. mq解决分布式事物问题

    今天只看看原理,下一节看项目怎么集成mq进行解决分布式事物. 1.什么情况下会使用到分布式事物? 举例说明:现有一个支付系统,因为项目使用的是微服务框架,有订单模块和支付模块两个模块.生产者进行订单的 ...

  2. Windows下利用IIS建立网站并实现局域网共享

    https://blog.csdn.net/qq_41485414/article/details/82754252 https://www.cnblogs.com/linuxprobe-sarah/ ...

  3. luogu P2860 [USACO06JAN]冗余路径Redundant Paths |Tarjan

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...

  4. luogu P1901 发射站

    题目描述 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发射站接 ...

  5. git 使用详解(4)—— commit -a -m/diff --staged/rm/mv

    查看已暂存和未暂存的更新 实际上 git status的显示比较简单,仅仅是 列出了(修改过的.新创建的.已经暂存但未提交的)文件,如果要查看具体修改了什么地方,可以用git diff 命令.稍后我们 ...

  6. 笔记||Python3之对象的方法

    什么是对象的方法? python中的一切类型的数据都是对象. 对象:数据和方法 对象数据:如 a = 'sfd' 对象方法:其实就是属于该对象的函数 对象的方法调用:对象.方法 字符串对象常用的方法: ...

  7. 【JS】369- 20个常用的JavaScript字符串方法

    点击上方"前端自习课"关注,学习起来~ 作者:前端小智 https://segmentfault.com/a/1190000020204425 本文主要介绍一些最常用的JS字符串函 ...

  8. 【CSS】330- 手把手教你玩转 CSS3 3D 技术

    点击上方"前端自习课"关注,学习起来~ CSS3的3D起步 要玩转css3的3d,就必须了解几个词汇,便是透视(perspective).旋转(rotate)和移动(transla ...

  9. JS-常见数据结构

    常见数据结构 这一章节我们将来学习数据结构的内容.经常会有人提问说:学习数据结构或者算法对于前端工程师有用么? 总的来说,这些基础学科在短期内收效确实甚微,但是我们首先不要将自己局限在前端工程师这点上 ...

  10. poj 2955 Brackets (区间dp基础题)

    We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...