【发布时间】:2013-01-15 17:46:10
【问题描述】:
我想在 CRM 2011 表单中使用 javascript 有条件地禁用 System Ribbon = AddNew。这意味着如果 statusCode 是 X 或 Y 禁用功能区,我该怎么做?
我试图获取功能区的 ID 以将功能区的类名更改为禁用,但我得到了 Null,因为功能区是异步加载的!
【问题讨论】:
我想在 CRM 2011 表单中使用 javascript 有条件地禁用 System Ribbon = AddNew。这意味着如果 statusCode 是 X 或 Y 禁用功能区,我该怎么做?
我试图获取功能区的 ID 以将功能区的类名更改为禁用,但我得到了 Null,因为功能区是异步加载的!
【问题讨论】:
为了扩展 Anwar 的答案,让它发挥作用的关键是拦截并重新利用 AddNew 功能区按钮的功能,但是一旦你这样做了,就不需要破解功能区 DOM。以下是您可以采取的几个步骤。
1) Create a solution with the Application Ribbon included.
2) 在 SDK 中找到应用程序功能区的示例功能区,或使用 SDK 中包含的解决方案自行构建。
\sdk\resources\exportedribbonxml
\sdk\samplecode\cs\client\ribbon\exporttribbonxml\exportedribbonxml
3) 在应用程序功能区模板中找到您感兴趣的控件,在本例中我假设它是实体子网格中的AddNew 按钮。在 CustomAction 中重新调整此控件的用途,并使 CustomAction 的位置与您要重新调整用途的控件同名。
<CustomAction Id="YourOrg.SubGrid.{!EntityLogicalName}.AddNewStandard"
Location="Mscrm.SubGrid.{!EntityLogicalName}.AddNewStandard">
<CommandUIDefinition>
<Button Id="Mscrm.SubGrid.{!EntityLogicalName}.AddNewStandard"
Command="Mscrm.AddNewRecordFromSubGridStandard" Sequence="20"
LabelText="$Resources(EntityDisplayName):Ribbon.SubGrid.AddNew"
Alt="$Resources(EntityDisplayName):Ribbon.SubGrid.AddNew"
Image16by16="/_imgs/ribbon/NewRecord_16.png"
Image32by32="/_imgs/ribbon/newrecord32.png" TemplateAlias="o1"
ToolTipTitle="$Resources(EntityDisplayName):Mscrm_SubGrid_EntityLogicalName_MainTab_Management_AddNewStandard_ToolTipTitle"
ToolTipDescription="$Resources(EntityDisplayName):Mscrm_SubGrid_EntityLogicalName_MainTab_Management_AddNewStandard_ToolTipDescription" />
</CommandUIDefinition>
</CustomAction>
4) 在 Application Ribbon 模板中找到该按钮命令的定义,并以确切的定义为基础新建一个CommandDefinition,添加您自己的自定义规则(在本例中为一个新的@987654329 @)。
<CommandDefinition Id="Mscrm.AddNewRecordFromSubGridStandard">
<EnableRules>
<EnableRule Id="Mscrm.AppendToPrimary" />
<EnableRule Id="Mscrm.EntityFormIsEnabled" />
<EnableRule Id="YourOrg.DisableNewStuff" /> <!--your custom rule-->
</EnableRules>
<DisplayRules>
<DisplayRule Id="Mscrm.ShowForOneToManyGrids" />
<DisplayRule Id="Mscrm.AppendToPrimary" />
<DisplayRule Id="Mscrm.CreateSelectedEntityPermission" />
<DisplayRule Id="Mscrm.AppendSelected" />
<DisplayRule Id="Mscrm.HideAddNewForChildEntities" />
</DisplayRules>
<Actions>
<JavaScriptFunction FunctionName="Mscrm.GridRibbonActions.addNewFromSubGridStandard"
Library="/_static/_common/scripts/RibbonActions.js">
<CrmParameter Value="SelectedEntityTypeCode" />
<CrmParameter Value="PrimaryEntityTypeCode" />
<CrmParameter Value="FirstPrimaryItemId" />
<CrmParameter Value="PrimaryControl" />
</JavaScriptFunction>
</Actions>
</CommandDefinition>
5) 这里是安华的答案所在:同时使用OrRule 和ValueRule,定义您的EnableRule 以检查实体的statuscodes。链接的演示与新的功能区按钮相关,但相同的规则也适用于重新调整用途的功能区控件。
完成后发布您的更改,您的功能区应该已全部设置好。因为我不确定您对RibbonXml 的熟悉程度,我还要提一下Microsoft has some comprehensive walkthroughs,这对学习它很有帮助(经过大量研究!)。
【讨论】:
这篇文章准确地解释了你在寻找什么。
请点击此链接 How To Use "ValueRule" and "OrRule" in Ribbon Customizations - CRM 2011
【讨论】:
这就是我如何隐藏发票表单上的删除按钮,基于状态代码,表单的加载:
var statusVal = Xrm.Page.getAttribute("statuscode").getValue();
if (statusVal==4 || statusVal==6) {
//Disable delete button
var x =top.document.getElementById("invoice|NoRelationship|Form|Mscrm.Form.invoice.Delete-Medium");
x.style.display='none';
你可以获取元素 span 的 id,你想从页面源中隐藏它。
【讨论】:
top.document.querySelector("li[title*=' BUTTON NAME']")