注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

微软MVP罗勇的博客

微软MVP罗勇,www.luoyong.me

 
 
 

日志

 
 

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

2014-04-14 08:24:12|  分类: CRM客户端开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

一般是新建一个解决方案用于客制化命令栏和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;
}
}


素格格新疆特产店--做最好新疆特产的搬运工。
本店由博主的新疆老婆开设,搬运各种最好的新疆特产,是自用,送礼,年货,孝敬长辈特别是(岳)父母的首选!
Dynamics CRM 客户端程序开发:自定义系统标准按钮的可用性 - 罗勇 - 罗勇的博客
 
  评论这张
 
阅读(1262)| 评论(4)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017