Microsoft Dynamics CRM 2011 & Business Productivity - Jim Wang's blog [MVP]

Welcome to my blog: http://mscrm.cn [Chinese] & http://jianwang.blogspot.com [English]

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  23 随笔 :: 52 文章 :: 103 评论 :: 5 引用
在论坛上看到网友“一千零一夜”提出的一个问题,在CRM窗体上被隐藏的字段却还出现在打印预览里,如果在打印的页面也可以隐藏掉这些字段就比较实际了,而且也符合用户期望。 


CRM 4.0
没有提供基于Field的安全机制,可能是因为会牵扯到性能的问题。不过我已经向微软提了建议,希望在下个版本里有所增强。但是在当前的版本里没有Supported的方法可以实现。我注意到这个打印预览窗体实际上是被窗体上的按钮触发的,所以window.opener 就是这个CRM窗体,这样就可以比较它上面的字段属性了,如果设定成 style.display="none"; 的形式,我们也可以在当前的打印预览窗体里隐藏对应的字段。同样也可以隐藏Tab,不过方法有些不同:因为打印预览里的Tab并没有id,所以根据className等来判断。
 

我提供这个方法可以解决CRM的打印需求,并没有真正实现了 field level security,比如在高级查找里还可以发现所有可搜索字段。 如果你的企业CRM应用有严格的安全考量,这个方法并不适合。

 

你需要修改的文件是  \CRMWeb\_forms\print\print.aspx 把下面的代码帖在 </html> 之上:

<!--
Field level security on Print form
author: Jim Wang @ July 
2009
http:
//jianwang.blogspot.com
http://mscrm.cn
-->

<script language="javascript">
var printFrame = document.getElementById("printMain");
var printWindow = document.frames["printMain"];
printFrame.onreadystatechange 
= function() 
{
    
if(window.opener && printWindow.document.readyState == "complete")
    {
        
//hide attributes
        var allFields = opener.document.getElementsByTagName("TD");
        
for (var i = 0; i < allFields.length; i++)
        {
            
var thisField = allFields[i];
            
if (thisField.style.display == "none")
            {
                printWindow.document.getElementById(thisField.id).style.display 
= "none";
            }
        }
        
        
//hide tabs
        var printTabs = printWindow.document.getElementsByTagName("DIV");
        
var openerTabs = opener.document.getElementsByTagName("LI");
        
for (var i = 0; i < openerTabs.length; i++)
        {
            
var openerTab = openerTabs[i];
            
if (openerTab.className && openerTab.className == "ms-crm-Tab")
            {
                
if(opener.document.getElementById(openerTab.id).style.display == "none")
                
var printTab = printTabs[openerTab.id.replace("tab","").replace("Tab","")];
                printTab.style.display 
= "none";
            }
        }

    }
}
</script>


下图可以看出来:我隐藏了LastName和2个Tab。

posted on 2009-07-29 20:23 Jim Wang 阅读(506) 评论(7)  编辑 收藏

评论

Jim 你太强了,非常感谢!
 回复 引用   

我用了这个方法,可是每次必须要把实体里面需要隐藏的字段的Display label on the form取消掉,否则每次打印都显示他的Label...不知道这个问题怎么解决???
 回复 引用   

#3楼[楼主] 2009-08-22 19:44 Jim Wang      
不需要啊,比如你要在FORM上隐藏lastname字段,那么在onload里你应该这样写:

crmForm.all.lastname_c.style.display = "none";
crmForm.all.lastname_d.style.display = "none";


_c 就是label
_d 就是text

这样才可以隐藏一个完整的字段,打印预览也不会显示这个字段了。
 回复 引用 查看   

@Jim Wang
我用的隐藏语句是crm.Form.all.lastname.parentElement.parentElement.style.display = 'none';
是不是我用的这个隐藏方式不可以
 回复 引用   

#5楼[楼主] 2009-08-24 17:03 Jim Wang      
这样也可以,但是要用不同的代码;具体的情况只能自己调试了。(IE Developer Toolbar可以帮你分析tag)
 回复 引用 查看   

非常感谢Jim. 可以了.
 回复 引用   

#7楼 2010-04-20 18:55 o自由自在o      
HI jim :
请问如何在搜索功能里边限制搜索的数据范围,
只是在我当前的默认视图内呢?
 回复 引用 查看