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.