Hope my earlier posts on Ribbon elements helps you. In this post we will see how to Enable/Disable Out of the Box ribbon elements in Dynamics CRM 2011. After going through the SDK, it seems there is no direct solution to override existing <CommandDefinition>. However, the documention says using <CustomAction> we can Add or Replace items in the ribbon. It gives me an idea to replace existing OOB(Out of the Box) ribbon item with Custom ribbon item and define our own <CommandDefinition> for that. At the same time we can also go with the OOB <CommandDefinition>. Lets see how we can do that stuff.
Lets consider “Edit” ribbon item on the “Account” entity “HomePageGrid”. I want to disable this “Edit” button when user selects more than one record in the sub grid(i.e I don’t want “Bulk Edit” feature for Account records). The same can be achieved with security roles. However, for the sake of simplicity and to focus more on how we can override <EnableRules>, <DisplayRules> and <Actions> for an OOB item I have considered this scenario.
Step 1:
Open “accounribbon.xml” file from the “sdksamplecodecsclientribbonexportribbonxmlexportedribbonxml” location in the CRM 2011 SDK.
Below is the definition for “Edit” button
<Button Id=”Mscrm.HomepageGrid.account.Edit” ToolTipTitle=”$Resources:Ribbon.HomepageGrid.MainTab.Management.Edit” ToolTipDescription=”$Resources(EntityDisplayName):Ribbon.Tooltip.Edit” Command=”Mscrm.EditSelectedRecord” Sequence=”20″ LabelText=”$Resources:Ribbon.HomepageGrid.MainTab.Management.Edit” Alt=”$Resources:Ribbon.HomepageGrid.MainTab.Management.Edit” Image16by16=”/_imgs/ribbon/Edit_16.png” Image32by32=”/_imgs/ribbon/edit32.png” TemplateAlias=”o1″ />
Below is the <CommandDefinition> for “Edit” button.
<CommandDefinition Id=”Mscrm.EditSelectedRecord”>
<EnableRules>
<EnableRule Id=”Mscrm.CheckBulkEditSupportForEntity” />
<EnableRule Id=”Mscrm.VisualizationPaneNotMaximized” />
</EnableRules>
<DisplayRules>
<DisplayRule Id=”Mscrm.BulkEditPrivilege” />
<DisplayRule Id=”Mscrm.WriteSelectedEntityPermission” />
</DisplayRules>
<Actions>
<JavaScriptFunction FunctionName=”Mscrm.GridRibbonActions.bulkEdit” Library=”/_static/_common/scripts/RibbonActions.js”>
<CrmParameter Value=”SelectedControl” />
<CrmParameter Value=”SelectedControlSelectedItemReferences” />
<CrmParameter Value=”SelectedEntityTypeCode” />
</JavaScriptFunction>
</Actions>
</CommandDefinition>
Copy both of the definitions and we gonna use them in the next steps.
Step 2:
Add “Account” entity to a solution. Export it. Open “Customizations.xml” file.
Go to <EnableRules> section and add following <EnableRule> which will return “true” when only one item is selected in the sub grid.
<EnableRule Id=”Sample.account.grid.OnSelection.EnableRule”>
<SelectionCountRule AppliesTo=”SelectedEntity” Maximum=”1″ Minimum=”1″/>
</EnableRule>
Step 3:
Go to <CommandDefinitions> section and add copied <CommandDefintion> form the Step1. Rename “Id” value to “Sample.account.grid.DisableExisting.Command”
<CommandDefinition Id=”Mscrm.EditSelectedRecord”>
<EnableRules>
<EnableRule Id=”Mscrm.CheckBulkEditSupportForEntity” />
<EnableRule Id=”Mscrm.VisualizationPaneNotMaximized” />
</EnableRules>
<DisplayRules>
<DisplayRule Id=”Mscrm.BulkEditPrivilege” />
<DisplayRule Id=”Mscrm.WriteSelectedEntityPermission” />
</DisplayRules>
<Actions>
<JavaScriptFunction FunctionName=”Mscrm.GridRibbonActions.bulkEdit” Library=”/_static/_common/scripts/RibbonActions.js”>
<CrmParameter Value=”SelectedControl” />
<CrmParameter Value=”SelectedControlSelectedItemReferences” />
<CrmParameter Value=”SelectedEntityTypeCode” />
</JavaScriptFunction>
</Actions>
</CommandDefinition>
Add <EnableRule Id=”Sample.account.grid.OnSelection.EnableRule”/> to the <EnableRules> section.
<CommandDefinition Id=”Mscrm.EditSelectedRecord”>
<EnableRules>
<EnableRule Id=”Mscrm.CheckBulkEditSupportForEntity” />
<EnableRule Id=”Mscrm.VisualizationPaneNotMaximized” />
<EnableRule Id=”Sample.account.grid.OnSelection.EnableRule”/>
</EnableRules>
<DisplayRules>
<DisplayRule Id=”Mscrm.BulkEditPrivilege” />
<DisplayRule Id=”Mscrm.WriteSelectedEntityPermission” />
</DisplayRules>
<Actions>
<JavaScriptFunction FunctionName=”Mscrm.GridRibbonActions.bulkEdit” Library=”/_static/_common/scripts/RibbonActions.js”>
<CrmParameter Value=”SelectedControl” />
<CrmParameter Value=”SelectedControlSelectedItemReferences” />
<CrmParameter Value=”SelectedEntityTypeCode” />
</JavaScriptFunction>
</Actions>
</CommandDefinition>
Step 4:
Add following <CustomAction> to the <CustomActions> section:
<CustomAction Id=”Sample.account.grid.DisableExisting.CustomAction” Location=”Mscrm.HomepageGrid.account.Edit” Sequence=”21″>
<CommandUIDefinition>
<Button Id=”Mscrm.HomepageGrid.account.Edit” Command=”Sample.account.grid.DisableExisting.Command” LabelText=”$Resources:Ribbon.HomepageGrid.MainTab.Management.Edit” Alt=”$Resources:Ribbon.HomepageGrid.MainTab.Management.Edit” ToolTipTitle=”$Resources:Ribbon.HomepageGrid.MainTab.Management.Edit” ToolTipDescription=”$Resources(EntityDisplayName):Ribbon.Tooltip.Edit” TemplateAlias=”o1″ Image16by16=”$webresource:new_/icons/TIcon16x16.png” Image32by32=”$webresource:new_/icons/TIcon32x32.png” />
</CommandUIDefinition>
</CustomAction>
Here we need to carefully observe what we have done to replace existing “Edit” button with our own Custom Button.
<CustomAction Id=”Sample.account.grid.DisableExisting.CustomAction” Location=”Mscrm.HomepageGrid.account.Edit” Sequence=”21″>
Here I have given unique id for the <CustomAction> and for the “Location” attribute I have placed “Id” of the OOB “Edit” button only. I haven’t kept “._children”. This makes all the difference…
<Button Id=”Mscrm.HomepageGrid.account.Edit” Command=”Sample.account.grid.DisableExisting.Command” LabelText=”$Resources:Ribbon.HomepageGrid.MainTab.Management.Edit” Alt=”$Resources:Ribbon.HomepageGrid.MainTab.Management.Edit” ToolTipTitle=”$Resources:Ribbon.HomepageGrid.MainTab.Management.Edit” ToolTipDescription=”$Resources(EntityDisplayName):Ribbon.Tooltip.Edit” TemplateAlias=”o1″ Image16by16=”$webresource:new_/icons/TIcon16x16.png” Image32by32=”$webresource:new_/icons/TIcon32x32.png” />
Here, I have given OOB “Edit” button “Id” as the “Id” for the new item. Do remember that, “Id” value in the <Button> should be same as “Id” value in the <CustomAction>. In other words the new Ribbon Item should have same “Id” as the OOB item.
For the “Command” attribute I am planning to use OOB Command that has been defined for the “Edit” item. I am planning to use OOB features and in addition to that I am planning to have my own <EnableRules>, <DisplayRules> and <Actions> rules. Feel free to use your own Command if you require to.
For remaining attributes also I wish to go with OOB except for the Images. Here I want to show images from my web resource.
Now, Import the solution with these changes to your system. Below is the result:
When no recod is selected:
When One record is selected:
When multiple records are selected
Hope it helps everyone. 🙂
Cheers…!!!
Vikranth Pandiri.