CRM 客户端程序开发:自定义系统标准按钮的可用性

一般是新建一个解决方案用于客制化命令栏和Ribbon区,我这里是新建了一个 RibbonEditor的解决方案,然后将你要修改的实体加入进来。

我这里是选择 报价单 实体,然后点击 确定 按钮。

在 CRM > 设置 > 解决方案页面 点击 自定义 图标。

选择前面建立的解决方案,然后点击 OK 按钮。

确保选择的选项卡是Command Bar,因为我这里要修改的实体是Dynamics CRM 2013版本中的更新的实体。在 ENTITIES 中选择你要修改的实体,上面部分就会更新成你选择实体的命令栏了。

然后根据你要更改的命令栏的区域,选中合适的命令按钮,我这里是修改表单命令栏,所以我选择如下,选择的事 FORM 的 Active Quote按钮。

右击我要修改的命令按钮,选择 Customize Command 菜单项。

然后就可以看到有些变化了,如下,这是这个按钮的一些属性。

本来最好的办法是增加一个Diplay Rule来根据条件隐藏这个按钮,这里介绍下。右击 Display Rules,选择 Add New这个菜单项,如下。

就会看到 Display Rules多了一行记录,右击,选择 Add Rule。

弹出的窗口如下,但是我们是要根据自定义的JavaScript来判定是否有角色权限,这里没有我们所要的类型,所以我们要用Enable Rule来做。

删除前面建立的Display Rule,我们利用Enable Rule来实现。可以看到已经有Enable Rule了,右击这个已经存在的Enable Rule,选择 Add New菜单项。

这里出来的可选类型和前面的Display Rule有些不同,我这里选择Custom Javascript Rule,然后点击OK按钮。

会多出一个 Custom Rule的节点,选中它,然后在右边设置属性如下。

注意,Library中选择的Web Resource (我这里是 new_/Test.js) 要先上传至这个解决方案,用到的函数(这里是UserInSalesManagerRole) 也要先定义。

然后保存并发布,如下图。

最后我去测试下,发现没有 激活报价单 按钮了。

我换个有这个角色的账号进去,可以看到这个按钮了。

用到的代码如下:

function GuidsAreEqual(guid1, guid2) {var isEqual = false;if (guid1 == null || guid2 == null) {isEqual = false;}else {isEqual = guid1.replace(/[{}]/g, "").toLowerCase() == guid2.replace(/[{}]/g, "").toLowerCase();}return isEqual;}function HasRole(roleName) {var serverUrl = Xrm.Page.context.getClientUrl();var oDataEndpointUrl = serverUrl + "/XRMServices/2011/OrganizationData.svc/";oDataEndpointUrl += "RoleSet?$select=RoleId&$filter=Name eq ‘" + encodeURIComponent(roleName) + "‘";var service = new XMLHttpRequest();if (service != null) {service.open("GET", oDataEndpointUrl, false);service.setRequestHeader("Accept", "application/json");service.setRequestHeader("Content-Type", "application/json; charset=utf-8");service.send(null);var requestResults = eval(‘(‘ + service.responseText + ‘)‘).d;if (requestResults != null && requestResults.results.length >= 1) {var currentUserRoles = Xrm.Page.context.getUserRoles();for (var j = 0; j < requestResults.results.length; j++) {var RoleId = requestResults.results[j].RoleId;for (var i = 0; i < currentUserRoles.length; i++) {UserRoleId = currentUserRoles[i];if (GuidsAreEqual(UserRoleId, RoleId)) {return true;}}}}}return false;} function UserInSalesManagerRole() {return HasRole(‘销售经理‘);}

可以知道的是使用Ribbon Workbench自定义按钮时是增加了如下的xml ,这些元素的含义可以参考SDK。

<RuleDefinitions> <TabDisplayRules /> <DisplayRules /> <EnableRules> <EnableRule Id="Mscrm.QuoteIsInDraftState"> <FormStateRule State="Disabled" InvertResult="true" /> <FormStateRule State="Create" InvertResult="true" /> <CustomRule FunctionName="UserInSalesManagerRole" Library="$webresource:new_/Test.js" Default="false" InvertResult="false" /> </EnableRule> </EnableRules> </RuleDefinitions> <LocLabels /> </RibbonDiffXml>

切记不要犯低级错误:如果你的Web Resource是直接使用记事本编辑然后上传的,记得保存的时候要选择编码为UTF-8,而不是默认的ASCII,应为你的代码中可能包括中文。

2015
年10月6日补充:一般用一个专门的JS文件来保存Ribbon区(命令栏)用到的Java
Script类型Web资源,比如这个JS文件我一般命名为 new_/common/RibbonScript.js
,我这篇博文没有这么做,大家不要学。因为在debug JavaScript的过程中发现,这个用到的Java Script类型Web资源,比如是new_/common/RibbonScript.js
会在浏览器按 F12
进行调试的时候找不到,如果你和实体使用的主要JS文件是一个的话,调试js的时候会带来麻烦。还有一个值得注意的地方是,enable
rule会执行两次,一次在表单没有加载之前就执行一次,这个时候获取不到表单中字段的值,如果你的js代码涉及到获取的话就会报错,我的建议是将所有代
码放在try catch 块中,捕获到异常的时候不要弹出提示,直接不处理,返回false即可。我这里有个例子如下:


//判断记录的Owner是否等于当前用户
function CheckOwnerEqualsCurrentUser() {
   try {
       var userId = Xrm.Page.context.getUserId();
       var owner = Xrm.Page.getAttribute("ownerid").getValue();
       var ownerID = owner[0].id;
       if (userId.toLowerCase() == ownerID.toLowerCase()) {
           return true;
       }
       else {
           return false;
       }
   }
   catch (ex) {
       //Xrm.Utility.alertDialog(ex.message); //要注释掉这行代码,否则会弹出错误提示
       return false;
   }
}

时间: 2024-10-12 15:48:04

CRM 客户端程序开发:自定义系统标准按钮的可用性的相关文章

CRM 客户端程序开发:根据主键使用OData获取记录的值

根据官方的建议,在表单界面使用OData终结点最好使用REST版本,而不是jQuery版本,所以我这个示例是按照官方的建议来做的. 因为我的JavaScript水平不怎么高,我就直接利用SDK里面的示例辅助JavaScript类库吧.这个类库的位置在 SDK\SampleCode\JS\RESTEndpoint\JavaScriptRESTDataOperations \JavaScriptRESTDataOperations\Scripts. 我将这个文件夹下面的 SDK.REST.js 和

CRM 客户端程序开发:设置实体表单界面字段的值

为了方便演示,我这里新建一个实体,实体定义如下: 还为它定义了如下的自定义字段,每种可定义的类型都有,基本上都是使用默认设置: 并且修改了它的窗体类型为主要的窗体,使它新建记录的界面如下所示: 我这里用代码演示,新建记录的时候为每个字段设置默认值.代码当然是JavaScript代码,需要放到类型为JScript的Web资源中,上传到CRM中并发布,然后和事件挂钩,这样就可以执行了. 我打开以前新建的解决方案,右击 CrmPackge 项目下面的 WebResources 文件夹,选择 添加 >

CRM 客户端程序开发:获取表单界面上各种字段的值及其他属性

我们写程序常用的就是获取字段的值,对于不同的字段类型,通过getValue() 获取到的值如下,这个表摘自SDK中的 Xrm.Page.data.entity attribute (client-side reference) 章节. Attribute Type Return Type boolean Boolean datetime Date To get the string version of a date using the Microsoft Dynamics CRM user's

网站建设,程序开发,系统开发

我们的优势:1.用户体验绝佳无需编程,可视化操作功能自助搭配,个性化编辑排版主题丰富,一键制作,自动搭配2.行业技术领先独有App更新技术.模拟预览技术日常App功能全覆盖,产品组合力行业领先源生语言开发,与主流手机高度适配3.配套服务齐全SaaS一站式App制作运营平台App.管理后台.服务器.手机助手同步生成售前售后专人对接,制作运营问题轻松解决 业务范围:1.网站建设:包括企业官-网 外贸网站建设品牌网站 购物商城 分销型网站等2.移动应用:手机网站 微官-网 APP开发 微信公众号 微信

门店小程序开发模式系统详解

门店小程序开发(李想.185.6504.8478)门店是一种极具发展前景的新型业态,在门店购物已成为现代人快节奏生活的方式之一.门店的投资发展是一种见效比较快,但风险及投资成本较高的一种行业. 微信小程序从张小龙提出这一概念后到现在一直都非常的火,微信小程序从上线后就不断的完善,功能逐渐的增加,很多人都已经争先开始抢占微信小程序的红利,那么对于线下门店来说要如何抢占小程序的红利呢?这就需要赢在移动开发的门店微信小程序了. 一.门店微信小程序是什么? 门店微信小程序就像是门店在微信上的「名片」,它

tcp客户端程序开发

https://www.cnblogs.com/python-No/ 话不多说,直接进入正题 一:客户端一共分为5大块: 1.创建客户端套接字 2.和服务端套接字建立连接 3.发送数据 4.接收发送 5.关闭客户端套接字 二:socket类的介绍 导入 socket 模块import socket 创建客户端 socket 对象socket.socket(AddressFamily, Type) send(data) 表示发送数据,data是二进制数据 recv(buffersize) 表示接收

小程序开发 自定义转发

请确认测试手机微信版本为最高版本 1,wxml (主要) <button open-type="share">分享</button> //<button open-type="share"><image src='../../imgs/index/wear_1.png'></image></button> 2,js (次要) withShareTicket 为 true 时,表示允许转发时是否携

小程序开发----自定义会员卡卡号和用户领取,以及简单介绍卡券功能和注意事项

前一段时间做项目涉及到这方面的内容,看了技术文档,小程序页面没有详细介绍,要前往微信公众号开发文档,卡券功能是先为微信公众号开发的功能,后来也提供个小程序,文档在小程序中没有过多的介绍,微信文档我就不想过多的吐槽了,大家都懂. 一.会员卡 1.在小程序会员卡,其实也是用到微信公众号的,开始在摸索,在微信公众号管理后台创建会员卡,在小程序中能调用,但会员卡号不能自定义编号,因为管理后创建的,默认是不能自定义编码(use_custom _code=false),一键开卡(wx_activate=tr

微信小程序开发---自定义组件

开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用:也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护.自定义组件在使用时与基础组件非常相似. 创建自定义组件 类似于页面,一个自定义组件由 json wxml wxss js 4个文件组成.要编写一个自定义组件,首先需要在 json 文件中进行自定义组件声明(将 component 字段设为 true 可这一组文件设为自定义组件):同时,还要在 wxml 文件中编写组件模板,在 wxss 文件中加入组件样式,它们的写法