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> 之上:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> <!--
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>