Кастомизация
24
Ноя
6

Настройка Ленты: примеры

Добавление

1. Кастомная кнопка на существующей Группе

Итак, задача добавить кнопку рядом с кнопкой «Сохранить и закрыть» на форме Организации. Этот пример рассмотрим поподробнее, а остальные делаются по аналогии…

  • Скачайте MS CRM SDK 2011 и распакуйте его;
  • Откройте в МЫ 2010 решение \samplecode\cs\client\ribbon\exportribbonxml\exportribbonxml.sln и скомпилируйте его;
  • Запустите <SDK\samplecode\cs\client\ribbon\exportribbonxml\bin\Debug\ExportRibbonXml.exe и задайте параметры для подключения к CRM. По окончании работы в папке C:\SDK2011\samplecode\cs\client\ribbon\exportribbonxml\bin\Debug\ExportedRibbonXml\ будет сформирован ряд XML-файлов с определением объектов CRM, включая и определение Ленты. Нам они понадобятся для изучения разметки Ленты и заимствования некоторых ее параметров.



Далее переходим непосредственно к созданию кнопки:

  • Экспортируйте из CRM Решение, содержащее только объект Организация;
  • Откройте в текстовом редакторе файл customizations.xml;
  • Чтобы добавить кнопку, мы должны определить дочерний элемент CustomAction в узле CustomActions (в RibbonDiffXml):
    <CustomActions>
      <CustomAction Id="new_MyFirstButton" Location="Mscrm.Form.account.MainTab.Save.Controls._children" Sequence="31">
        <CommandUIDefinition>
    

CustomAction имеет следующие атрибуты:

  • ID: уникальный идентификатор;
  • Location: ID «места» где будет распологаться наша кнопка. Т.к. мы собираемся разместить ее в существующей группе, существующей вкладки, то нам необходимо узнать ее ID 🙂
    Откройте файл \samplecode\cs\client\ribbon\exportribbonxml\bin\Debug\ExportedRibbonXml \accountribbon.xml
    Найдите определение кнопок сохранения записи. Вы увидите, что они распологаются в коллекции:

    <Controls Id="Mscrm.Form.account.MainTab.Save.Controls">

    Поэтому, чтобы поместить в нее кнопку нам нужно использовать следующий идентификатор в Location:

    Mscrm.Form.account.MainTab.Save.Controls._children

    Суффикс «._children» обязательно должен быть указан при добавлении элеметна к существующей группе.

  • Sequence: определяет порядок следования элементов. Т.к. нам необходимо поместить нашу кастомную кнопку после кнопки «Save & Close», найдем ее в существующем определении Ленты:
    <Button Id="Mscrm.Form.account.SaveAndClose" 
            ToolTipTitle="$Resources:Mscrm_Form_Other_MainTab_Save_SaveAndClose_ToolTipTitle" 
            ToolTipDescription="$Resources(EntityDisplayName):Ribbon.Tooltip.SaveAndClose" 
            Command="Mscrm.SaveAndClosePrimary" 
            Sequence="30" 
            LabelText="$Resources:Ribbon.Form.MainTab.Save.SaveAndClose" 
            Alt="$Resources:Ribbon.Form.MainTab.Save.SaveAndClose" 
            Image16by16="/_imgs/FormEditorRibbon/SaveAndClose_16.png" 
            Image32by32="/_imgs/ribbon/SaveAndClose_32.png" 
            TemplateAlias="o1" />
    

    Кук видите у существующей кнопки Sequence = 30. Следовательно, чтобы поствить нашу кастомную кнопку сразу после нее, то Sequence необходимо установить равным 31.

  • Ну и собственно определяем кнопка внутри контейнера CommandUIDefinition и помещаем в CustomAction:
    <CommandUIDefinition>
      <Button Id="B_MyFirstButton"
              LabelText="Супер кнопка"
              ToolTipTitle="Подсказка для супер кнопки"
              ToolTipDescription="Описание для супер кнопки"
              TemplateAlias="o1"
              Image32by32="$webresource:new_cub32.png" />
    </CommandUIDefinition>
    

Весь RibbonDiffXml после этого будет таким:

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="new_MyFirstButton"
                  Location="Mscrm.Form.account.MainTab.Save.Controls._children"
                  Sequence="31">
      <CommandUIDefinition>
        <Button Id="B_MyFirstButton"
                LabelText="Супер кнопка"
                ToolTipTitle="Подсказка для супер кнопки"
                ToolTipDescription="Описание для супер кнопки"
                TemplateAlias="o1"
                Image32by32="$webresource:new_cub32.png" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>


2. Кнопка на кастомной Группе на существующей Вкладке

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="Sample.account.form.CustomGroup.MaxSize.CustomAction" Location="Mscrm.Form.account.MainTab.Scaling._children" Sequence="120">
      <CommandUIDefinition>
        <MaxSize Id="Sample.account.form.CustomGroup.MaxSize" GroupId="MyAccountCustomGroup" Sequence="21" Size="LargeLarge"/>
      </CommandUIDefinition>
    </CustomAction>
    <CustomAction Id="Mscrm.Form.account.MainTab.Groups.CustomAction" Location="Mscrm.Form.account.MainTab.Groups._children" Sequence="110">
      <CommandUIDefinition>
        <Group Id="MyAccountCustomGroup" Title="Новая группа" Sequence="39" Template="Mscrm.Templates.Flexible2">
          <Controls Id="MyCustomControls">
            <Button
              Id="B_MyFirstButton"
              LabelText="Супер кнопка"
              ToolTipTitle="Подсказка для супер кнопки"
              ToolTipDescription="Описание для супер кнопки"
              TemplateAlias="o1"
              Image32by32="$webresource:new_cub32.png"
                  />
          </Controls>
        </Group>
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"/>
  </Templates>
  <CommandDefinitions>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels/>
</RibbonDiffXml>

3. Кастомная кнопка на кастомной вкладке

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="Sample.Form.account.CustomTab.CustomAction" Location="Mscrm.Tabs._children" Sequence="40">
      <CommandUIDefinition>
        <Tab Id="account.Form.CustomTab1" Command="Sample.Form.account.CustomTab" Title="Супер вкладка" Sequence="40">
          <Scaling Id="Sample.Form.account.CustomTab.Scaling">
            <MaxSize Id="Sample.Form.account.CustomTab.FirstGroup.MaxSize" GroupId="Sample.Form.account.CustomTab.FirstGroup" Sequence="10" Size="LargeMedium" />
          </Scaling>
          <Groups Id="Sample.Form.account.CustomTab.Groups">
            <Group Id="Sample.Form.account.CustomTab.FirstGroup" Command="Sample.Form.account.FirstGroup" Sequence="10" Title="Первая группа" Template="Mscrm.Templates.3.3">
              <Controls Id="Sample.Form.account.CustomTab.FirstGroup.Controls">
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.FirstButton" ToolTipTitle="Кнопка 1 заголовок" ToolTipDescription="Кнопка 1 описание" Command="Form.account.CustomButton" Sequence="10" LabelText="Кнопка 1" Alt="Кнопка 1" Image16by16="$webresource:new_cub16.png" Image32by32="$webresource:new_cub32.png" TemplateAlias="o1" />
              </Controls>
            </Group>
          </Groups>
        </Tab>
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Sample.Form.account.CustomTab">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanWriteaccount" />
      </DisplayRules>
      <Actions />
    </CommandDefinition>
    <CommandDefinition Id="Sample.Form.account.FirstGroup">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanWriteaccount" />
      </DisplayRules>
      <Actions />
    </CommandDefinition>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled " />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanWriteaccount" />
      </DisplayRules>
      <Actions>
        <JavaScriptFunction Library="$webresource:new_alert.js" FunctionName="show" />
      </Actions>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules>
      <TabDisplayRule TabCommand="Sample.Form.account.CustomTab">
        <EntityRule EntityName="account" Context="Form" AppliesTo="PrimaryEntity" />
      </TabDisplayRule>
    </TabDisplayRules>
    <DisplayRules />
    <EnableRules />
  </RuleDefinitions>
  <LocLabels/>
</RibbonDiffXml>

4. Кнопка на главной Ленте (для всех объектов)

Цель: поместить кнопку на главной Ленте рядом с кнопкой Start Dialog для представлений всех объектов (первая вкладка меняется в зависимости от объекта).

Создайте и выгрузите из CRM Решение, которое содержит компонент «Лента приложение». Именно в нем содержится определение добавлений для главной Ленты.

Откройте файл applicationRibbon.xml (в нем содержится определение стандартной главной Ленты) созданный программой ExportedRibbonXml.exe и найдите ID контейнера, в котором содержится кнопка Start Dialog (на основной Вкладке главной Ленты):

Mscrm.HomepageGrid.{!EntityLogicalName}.MainTab.Workflow.Controls

З.Ы. Общие Вкладки имеют такие ID:

  • Главная вкладка: Mscrm.HomepageGrid.{!EntityLogicalName}.MainTab;
  • Представление: Mscrm.HomepageGrid.{!EntityLogicalName}.View;
  • Добавление: Mscrm.HomepageGrid.{!EntityLogicalName}.Related;
  • Настройка: Mscrm.HomepageGrid.{!EntityLogicalName}.Developer.

Где, {!EntityLogicalName} означает «любой объекта», поскольку большенство вкладок на главной Ленте — кроссобъектные.

Соответственно определение кнопки на главной Ленте будет таким (только узел RibbonDiffXml):

<RibbonDiffXml>
  <CustomActions>
    <CustomAction
      Id ="Sample.{!EntityLogicalName}.MainTab.MyURL.CustomAction"
      Sequence="41"
      Location="Mscrm.HomepageGrid.{!EntityLogicalName}.MainTab.Workflow.Controls._children"
      >
      <CommandUIDefinition>
        <Button
          Id="B_MyFirstButton"
          LabelText="Супер кнопка"
          ToolTipTitle="Подсказка для супер кнопки"
          ToolTipDescription="Описание для супер кнопки"
          TemplateAlias="o1"
          Image32by32="$webresource:new_cub32.png"
          />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions/>
  <RuleDefinitions>
    <TabDisplayRules />
    <DisplayRules />
    <EnableRules />
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

Макеты

1. Кастомный макет из обычных секций

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="Sample.Form.account.CustomTab.CustomAction" Location="Mscrm.Tabs._children" Sequence="40">
      <CommandUIDefinition>
        <Tab Id="account.Form.CustomTab1"
             Command="Sample.Form.account.CustomTab"
             Title="Супер вкладка" Sequence="40">
          <Scaling Id="Sample.Form.account.CustomTab.Scaling">
            <MaxSize Id="Sample.Form.account.CustomTab.FirstGroup.MaxSize"
                     GroupId="Sample.Form.account.CustomTab.FirstGroup"
                     Sequence="10"
                     Size="ManyRows" />
          </Scaling>
          <Groups Id="Sample.Form.account.CustomTab.Groups">
            <Group Id="Sample.Form.account.CustomTab.FirstGroup"
                   Command="Sample.Form.account.FirstGroup"
                   Sequence="10"
                   Title="Первая группа"
                   Template="Ribbon.Templates.CustomTemplate">
              <Controls Id="Sample.Form.account.CustomTab.FirstGroup.Controls">
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.Button1"
                        ToolTipTitle="Кнопка 1 заголовок"
                        ToolTipDescription="Кнопка 1 описание"
                        Command="Form.account.CustomButton"
                        Sequence="10"
                        LabelText="Кнопка 1"
                        Alt="Кнопка 1"
                        Image16by16="$webresource:new_cub16.png"
                        Image32by32="$webresource:new_cub32.png"
                        TemplateAlias="cust1" />
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.Button2"
                        ToolTipTitle="Кнопка 2 заголовок"
                        ToolTipDescription="Кнопка 2 описание"
                        Command="Form.account.CustomButton"
                        Sequence="10"
                        LabelText="Кнопка 2"
                        Alt="Кнопка 2"
                        Image16by16="$webresource:new_cub16.png"
                        Image32by32="$webresource:new_cub32.png"
                        TemplateAlias="cust4" />
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.Button3"
                        ToolTipTitle="Кнопка 3 заголовок"
                        ToolTipDescription="Кнопка 3 описание"
                        Command="Form.account.CustomButton"
                        Sequence="10"
                        LabelText="Кнопка 3"
                        Alt="Кнопка 3"
                        Image16by16="$webresource:new_cub16.png"
                        Image32by32="$webresource:new_cub32.png"
                        TemplateAlias="cust6" />
              </Controls>
            </Group>
          </Groups>
        </Tab>
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates">
      <GroupTemplate Id="Ribbon.Templates.CustomTemplate">
        <Layout Title="ManyRows" LayoutTitle="ManyRows">
          <Section Alignment="Top" Type="ThreeRow">
            <Row>
              <ControlRef DisplayMode="Small" TemplateAlias="cust1" />
            </Row>
            <Row>
              <ControlRef DisplayMode="Small" TemplateAlias="cust2" />
            </Row>
            <Row>
              <ControlRef DisplayMode="Small" TemplateAlias="cust3" />
            </Row>
          </Section>
          <Section Alignment="Top" Type="OneRow">
            <Row>
              <ControlRef DisplayMode="Large" TemplateAlias="cust4" />
            </Row>
          </Section>
          <Section Alignment="Top" Type="TwoRow">
            <Row>
              <ControlRef DisplayMode="Medium" TemplateAlias="cust5" />
            </Row>
            <Row>
              <ControlRef DisplayMode="Medium" TemplateAlias="cust6" />
            </Row>
          </Section>
        </Layout>
      </GroupTemplate>
    </RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Sample.Form.account.CustomTab">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanWriteaccount" />
      </DisplayRules>
      <Actions />
    </CommandDefinition>
    <CommandDefinition Id="Sample.Form.account.FirstGroup">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanWriteaccount" />
      </DisplayRules>
      <Actions />
    </CommandDefinition>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled " />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanWriteaccount" />
      </DisplayRules>
      <Actions>
        <JavaScriptFunction Library="$webresource:new_alert.js" FunctionName="show" />
      </Actions>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules>
      <TabDisplayRule TabCommand="Sample.Form.account.CustomTab">
        <EntityRule EntityName="account" Context="Form" AppliesTo="PrimaryEntity" />
      </TabDisplayRule>
    </TabDisplayRules>
    <DisplayRules />
    <EnableRules />
  </RuleDefinitions>
  <LocLabels/>
</RibbonDiffXml>

2. Макет с «полосками»

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="Sample.Form.account.CustomTab.CustomAction" Location="Mscrm.Tabs._children" Sequence="40">
      <CommandUIDefinition>
        <Tab Id="account.Form.CustomTab1"
             Command="Sample.Form.account.CustomTab"
             Title="Супер вкладка" Sequence="40">
          <Scaling Id="Sample.Form.account.CustomTab.Scaling">
            <MaxSize Id="Sample.Form.account.CustomTab.FirstGroup.MaxSize"
                     GroupId="Sample.Form.account.CustomTab.FirstGroup"
                     Sequence="10"
                     Size="StripZ" />
          </Scaling>
          <Groups Id="Sample.Form.account.CustomTab.Groups">
            <Group Id="Sample.Form.account.CustomTab.FirstGroup"
                   Command="Sample.Form.account.FirstGroup"
                   Sequence="10"
                   Title="Первая группа"
                   Template="Ribbon.Templates.CustomTemplate2">
              <Controls Id="Sample.Form.account.CustomTab.FirstGroup.Controls">
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.Button1"
                        ToolTipTitle="Кнопка 1 заголовок"
                        ToolTipDescription="Кнопка 1 описание"
                        Command="Form.account.CustomButton"
                        Sequence="10"
                        LabelText="Кнопка 1"
                        Alt="Кнопка 1"
                        Image16by16="$webresource:new_cub16.png"
                        Image32by32="$webresource:new_cub32.png"
                        TemplateAlias="previousPage" />
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.Button2"
                        ToolTipTitle="Кнопка 2 заголовок"
                        ToolTipDescription="Кнопка 2 описание"
                        Command="Form.account.CustomButton"
                        Sequence="11"
                        LabelText="Кнопка 2"
                        Alt="Кнопка 2"
                        Image16by16="$webresource:new_cub16.png"
                        Image32by32="$webresource:new_cub32.png"
                        TemplateAlias="currentPage1" />
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.Button3"
                        ToolTipTitle="Кнопка 3 заголовок"
                        ToolTipDescription="Кнопка 3 описание"
                        Command="Form.account.CustomButton"
                        Sequence="12"
                        LabelText="Кнопка 3"
                        Alt="Кнопка 3"
                        Image16by16="$webresource:new_cub16.png"
                        Image32by32="$webresource:new_cub32.png"
                        TemplateAlias="currentPage2" />
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.Button4"
                        ToolTipTitle="Кнопка 4 заголовок"
                        ToolTipDescription="Кнопка 4 описание"
                        Command="Form.account.CustomButton"
                        Sequence="13"
                        LabelText="Кнопка 4"
                        Alt="Кнопка 4"
                        Image16by16="$webresource:new_cub16.png"
                        Image32by32="$webresource:new_cub32.png"
                        TemplateAlias="currentPage3" />
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.Button5"
                        ToolTipTitle="Кнопка 5 заголовок"
                        ToolTipDescription="Кнопка 5 описание"
                        Command="Form.account.CustomButton"
                        Sequence="14"
                        LabelText="Кнопка 5"
                        Alt="Кнопка 5"
                        Image16by16="$webresource:new_cub16.png"
                        Image32by32="$webresource:new_cub32.png"
                        TemplateAlias="nextPage1" />
                <Button Id="Sample.Form.account.CustomTab.FirstGroup.Button6"
                        ToolTipTitle="Кнопка 6 заголовок"
                        ToolTipDescription="Кнопка 6 описание"
                        Command="Form.account.CustomButton"
                        Sequence="15"
                        LabelText="Кнопка 6"
                        Alt="Кнопка 6"
                        Image16by16="$webresource:new_cub16.png"
                        Image32by32="$webresource:new_cub32.png"
                        TemplateAlias="nextPage2" />
              </Controls>
            </Group>
          </Groups>
        </Tab>
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates">
      <GroupTemplate Id="Ribbon.Templates.CustomTemplate2">
        <Layout Title="StripZ" LayoutTitle="StripZ">
          <Section Alignment="Top" Type="TwoRow">
            <Row>
              <Strip>
                <ControlRef TemplateAlias="previousPage" DisplayMode="Small" />
                <ControlRef TemplateAlias="currentPage1" DisplayMode="Medium" />
                <ControlRef TemplateAlias="currentPage2" DisplayMode="Medium" />
                <ControlRef TemplateAlias="currentPage3" DisplayMode="Medium" />
              </Strip>
            </Row>
            <Row>
              <Strip>
                <ControlRef TemplateAlias="nextPage1" DisplayMode="Small" />
                <ControlRef TemplateAlias="nextPage2" DisplayMode="Small" />
              </Strip>
            </Row>
          </Section>
        </Layout>
      </GroupTemplate>
    </RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Sample.Form.account.CustomTab">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanWriteaccount" />
      </DisplayRules>
      <Actions />
    </CommandDefinition>
    <CommandDefinition Id="Sample.Form.account.FirstGroup">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanWriteaccount" />
      </DisplayRules>
      <Actions />
    </CommandDefinition>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled " />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanWriteaccount" />
      </DisplayRules>
      <Actions>
        <JavaScriptFunction Library="$webresource:new_alert.js" FunctionName="show" />
      </Actions>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules>
      <TabDisplayRule TabCommand="Sample.Form.account.CustomTab">
        <EntityRule EntityName="account" Context="Form" AppliesTo="PrimaryEntity" />
      </TabDisplayRule>
    </TabDisplayRules>
    <DisplayRules />
    <EnableRules />
  </RuleDefinitions>
  <LocLabels/>
</RibbonDiffXml>

Скрытие

Удаляем всякую всячину с главной Ленты и с Ленты формы объекта Организация:

1. Скрытие кнопки «Общий доступ»

<RibbonDiffXml>
  <CustomActions>
    <HideCustomAction Location="Mscrm.Form.account.Permissions.Sharing" HideActionId="Mscrm.Form.account.Permissions.Sharing.HideAction"/>
    <HideCustomAction Location="Mscrm.HomepageGrid.account.Sharing" HideActionId="Mscrm.HomepageGrid.account.Sharing.HideAction"/>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

2. Скрытие Группы «Совместная работа»

<RibbonDiffXml>
  <CustomActions>
    <HideCustomAction Location="Mscrm.HomepageGrid.account.MainTab.Collaborate" HideActionId="Sample.HomepageGrid.account.MainTab.Collaborate.HideAction"/>
    <HideCustomAction Location="Mscrm.Form.account.MainTab.Collaborate" HideActionId="Mscrm.Form.account.MainTab.Collaborate.HideAction"/>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

3. Скрытие вкладки «Добавление»

<RibbonDiffXml>
  <CustomActions>
    <HideCustomAction Location="Mscrm.Form.account.Related" HideActionId="Sample.Form.account.Related.HideAction"/>
    <HideCustomAction Location="Mscrm.HomepageGrid.account.Related" HideActionId="Sample.HomepageGrid.account.Related.HideAction"/>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

Действия

1. Javascript

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="new_MyFirstButton"
                  Location="Mscrm.Form.account.MainTab.Save.Controls._children"
                  Sequence="31" >
      <CommandUIDefinition>
        <Button Id="B_MyFirstButton"
                LabelText="Супер кнопка"
                ToolTipTitle="Подсказка для супер кнопки"
                ToolTipDescription="Описание для супер кнопки"
                TemplateAlias="o1"
                Image32by32="$webresource:new_cub32.png"
                Command="Form.account.CustomButton" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules/>
      <Actions>
        <JavaScriptFunction Library="$webresource:new_alert.js" FunctionName="show" />
      </Actions>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

2. Открытие URL по кнопке

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="new_MyFirstButton"
                  Location="Mscrm.Form.account.MainTab.Save.Controls._children"
                  Sequence="31" >
      <CommandUIDefinition>
        <Button Id="B_MyFirstButton"
                LabelText="Супер кнопка"
                ToolTipTitle="Подсказка для супер кнопки"
                ToolTipDescription="Описание для супер кнопки"
                TemplateAlias="o1"
                Image32by32="$webresource:new_cub32.png"
                Command="Form.account.CustomButton" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules/>
      <Actions>
        <Url
          Address="$webresource:New_Page.htm"
          PassParams="true"
          WinParams="height=200, width=400,toolbar=no, menubar=no,location=no" />
      </Actions>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

2. Видимость в зависимости от прав доступа

Кастомная кнопка отображается, только если у пользователя есть полномочия на создание Организаций.

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="new_MyFirstButton"
                  Location="Mscrm.Form.account.MainTab.Save.Controls._children"
                  Sequence="31" >
      <CommandUIDefinition>
        <Button Id="B_MyFirstButton"
                LabelText="Супер кнопка"
                ToolTipTitle="Подсказка для супер кнопки"
                ToolTipDescription="Описание для супер кнопки"
                TemplateAlias="o1"
                Image32by32="$webresource:new_cub32.png"
                Command="Form.account.CustomButton" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules/>
      <DisplayRules>
        <DisplayRule Id="Form.account.DisplayRule" />
      </DisplayRules>
      <Actions/>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules>
      <DisplayRule Id="Form.account.DisplayRule">
        <EntityPrivilegeRule EntityName="account" PrivilegeType="Create" PrivilegeDepth="Basic" />
      </DisplayRule>
    </DisplayRules>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

3. Активация в зависимости от значения поля

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="new_MyFirstButton"
                  Location="Mscrm.Form.account.MainTab.Save.Controls._children"
                  Sequence="31" >
      <CommandUIDefinition>
        <Button Id="B_MyFirstButton"
                LabelText="Супер кнопка"
                ToolTipTitle="Подсказка для супер кнопки"
                ToolTipDescription="Описание для супер кнопки"
                TemplateAlias="o1"
                Image32by32="$webresource:new_cub32.png"
                Command="Form.account.CustomButton" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules>
        <EnableRule Id="Form.account.EnableRule" />
      </EnableRules>
      <DisplayRules/>
      <Actions/>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules>
      <EnableRule Id="Form.account.EnableRule">
        <!-- Активация кнопки только если customertypecode = 3 -->
        <ValueRule Field="customertypecode" Value="3" Default="0" />
      </EnableRule>
    </EnableRules>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

Кнопка активируется только когда customertypecode = 3. Во всех других случаях, включая тот, когда нет никакого значения (определяем с помощью атрибута «Default = 0», который определяет возвращаемое значение для оценки на true/false, если не выбрано никакого значения) мы деактивируем кнопку.

З.Ы. Активация/деактивация рассчитывается только при прорисовке Ленты или при принудительном вызове прорисовки формы с помощью JS (см. ниже).

4. Отображение кнопки в зависимости от типа формы

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="new_MyFirstButton"
                  Location="Mscrm.Form.account.MainTab.Save.Controls._children"
                  Sequence="31" >
      <CommandUIDefinition>
        <Button Id="B_MyFirstButton"
                LabelText="Супер кнопка"
                ToolTipTitle="Подсказка для супер кнопки"
                ToolTipDescription="Описание для супер кнопки"
                TemplateAlias="o1"
                Image32by32="$webresource:new_cub32.png"
                Command="Form.account.CustomButton" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules/>
      <DisplayRules>
        <DisplayRule Id="Form.account.DisplayRule" />
      </DisplayRules>
      <Actions/>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules>
      <DisplayRule Id="Form.account.DisplayRule">
        <FormStateRule State="Create" InvertResult="true" />
      </DisplayRule>
    </DisplayRules>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

Кнопка отображается на всех типов форм, кроме формы Создания записи (в качестве состояния мы указали Create и инвертировали значение с помощью атрибута InvertResult).

З.Ы. Скрытие/отображение рассчитывается только при прорисовке Ленты или при принудительном вызове прорисовки формы с помощью JS (см. ниже).

5. Отображение кнопки только при Создании или Обновлении

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="new_MyFirstButton"
                  Location="Mscrm.Form.account.MainTab.Save.Controls._children"
                  Sequence="31" >
      <CommandUIDefinition>
        <Button Id="B_MyFirstButton"
                LabelText="Супер кнопка"
                ToolTipTitle="Подсказка для супер кнопки"
                ToolTipDescription="Описание для супер кнопки"
                TemplateAlias="o1"
                Image32by32="$webresource:new_cub32.png"
                Command="Form.account.CustomButton" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules/>
      <DisplayRules>
        <DisplayRule Id="Form.account.DisplayRule" />
      </DisplayRules>
      <Actions/>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules>
      <DisplayRule Id="Form.account.DisplayRule">
        <OrRule>
          <Or>
            <FormStateRule State="Existing"/>
          </Or>
          <Or>
            <FormStateRule State="Create"/>
          </Or>
        </OrRule>
      </DisplayRule>
    </DisplayRules>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

6. Проверка на количество выделенных записей

Рассмотрим сценарий, когда кнопка на главное Ленте должна активироваться только если выбрано минимум 2 записи. Для этого нужно использовать тэг SelectionCountRule (в нем мы задаем, что кнопка должна активироваться при выборе от 2 до 50 записей):

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="new_MyFirstButton"
                  Location="Mscrm.HomepageGrid.{!EntityLogicalName}.MainTab.Management.Controls._children"
                  Sequence="31" >
      <CommandUIDefinition>
        <Button Id="B_MyFirstButton"
                LabelText="Супер кнопка"
                ToolTipTitle="Подсказка для супер кнопки"
                ToolTipDescription="Описание для супер кнопки"
                TemplateAlias="o1"
                Image32by32="$webresource:new_cub32.png"
                Command="Form.account.CustomButton" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules>
        <EnableRule Id="Form.account.EnableRule"/>
      </EnableRules>
      <DisplayRules/>
      <Actions/>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules>
      <EnableRule Id="Form.account.EnableRule">
        <SelectionCountRule AppliesTo="SelectedEntity" Minimum="2" Maximum="50"/>
      </EnableRule>
    </EnableRules>
  </RuleDefinitions>
  <LocLabels/>
</RibbonDiffXml>

7. Получение GUID’ов выделенных записей

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="new_MyFirstButton"
                  Location="Mscrm.HomepageGrid.{!EntityLogicalName}.MainTab.Management.Controls._children"
                  Sequence="31" >
      <CommandUIDefinition>
        <Button Id="B_MyFirstButton"
                LabelText="Супер кнопка"
                ToolTipTitle="Подсказка для супер кнопки"
                ToolTipDescription="Описание для супер кнопки"
                TemplateAlias="o1"
                Image32by32="$webresource:new_cub32.png"
                Command="Form.account.CustomButton" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Form.account.CustomButton">
      <EnableRules>
        <EnableRule Id="Mscrm.Enabled" />
      </EnableRules>
      <DisplayRules/>
      <Actions>
        <JavaScriptFunction FunctionName="AlertGUID" Library="$Webresource:new_AlertGUID.js" >
          <CrmParameter Value="SelectedControlSelectedItemIds" />
        </JavaScriptFunction>
      </Actions>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

JavaScript Beб-ресурс с именем new_AlertGUID.js:

function AlertGUID(SelectedControlSelectedItemIds) {
  alert("SelectedControlSelectedItemIds: " + SelectedControlSelectedItemIds); // Все GUID'ы разделенные запятыми
}

Изменение существующих элементов

1. Изменение подписи и иконки

Для примера изменим метку и значок кнопки «Добавить в маркетинговый список» на Ленте формы объекта Организация.

Для начала найдем определение стандартной кнопки «Добавить в маркетинговый список»:

<Button Id="Mscrm.Form.account.AddToList"
        ToolTipTitle="$Resources:Ribbon.HomepageGrid.account.Add.AddToList"
        ToolTipDescription="$Resources(EntityDisplayName):Ribbon.Tooltip.AddToMarketingList"
        Command="Mscrm.AddPrimaryToMarketingList"
        Sequence="9"
        Alt="$Resources:Ribbon.HomepageGrid.account.Add.AddToList"
        LabelText="$Resources:Ribbon.HomepageGrid.account.Add.AddToList"
        Image16by16="/_imgs/ribbon/AddToMarketingList_16.png"
        Image32by32="/_imgs/ribbon/AddToMarketingList_32.png"
        TemplateAlias="o1" />

Здесь мы полностью скопировали стандартный CommandDefinition кнопки «Сохранить и закрыть». При этом добавив в него вызов кастомного EnableRule:

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="SuperSave"
                  Location="Mscrm.Form.account.MainTab.Collaborate.Controls._children"
                  Sequence="9">
      <CommandUIDefinition>
        <Button Id="Mscrm.Form.account.AddToList"
                ToolTipTitle="$Resources:Ribbon.HomepageGrid.account.Add.AddToList"
                ToolTipDescription="$Resources(EntityDisplayName):Ribbon.Tooltip.AddToMarketingList"
                Command="Mscrm.AddPrimaryToMarketingList"
                Sequence="9"
                Alt="$Resources:Ribbon.HomepageGrid.account.Add.AddToList"
                LabelText="В Лист!"
                Image16by16="/_imgs/ribbon/AddToMarketingList_16.png"
                Image32by32="$webresource:new_cub32.png"
                TemplateAlias="o1" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions/>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules/>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

В таком CustomAction’а нам нужно:

  • ID CustomAction’а задайте любой;
  • Location CustomAction’а задайте как у существующей кнопки + добавьте «._children»;
  • Ну, и меняем на свои метку и иконку в самом определении кнопки.

2. Изменение размера кнопки

На форме организации изменить размер кнопки «Сохранить и создать» – сделать ее большого размера.

<RibbonDiffXml>
  <CustomActions/>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="Mscrm.SaveAndClosePrimary">
      <EnableRules>
        <EnableRule Id="Mscrm.AvailableOnForm" />
        <EnableRule Id="Mscrm.CanSavePrimary" />
        <EnableRule Id="SuperSaveClose.EnableRule" />
      </EnableRules>
      <DisplayRules>
        <DisplayRule Id="Mscrm.CanSaveAndClosePrimaryEntityType" />
      </DisplayRules>
      <Actions>
        <JavaScriptFunction FunctionName="Mscrm.RibbonActions.saveAndCloseForm" Library="/_static/_common/scripts/RibbonActions.js">
          <CrmParameter Value="PrimaryControl" />
        </JavaScriptFunction>
      </Actions>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules/>
    <DisplayRules/>
    <EnableRules>
      <EnableRule Id="SuperSaveClose.EnableRule">
        <CustomRule FunctionName="EnableButtons" Library="$Webresource:new_SuperSaveClose.js" />
      </EnableRule>
    </EnableRules>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

Здесь мы полностью скопировали стандартный CommandDefinition кнопки «Сохранить и закрыть». При этом добавив в него вызов кастомного EnableRule:

<EnableRule Id="SuperSaveClose.EnableRule">
  <CustomRule FuncationName="EnableButtons" Library="$Webresource:new_SuperSaveClose.js" />
</EnableRule>

Теперь в функции EnableButtons Вы будете определять, когда необходимо активировать кнопку, возвращая true или false. При этом изначально проверка будет происходить при открытии формы и всякий раз при принудительном обновлении Ленты с помощью метода Xrm.Page.ui.refreshRibbon().

Для тестирования создайте JS Веб-ресурс с именем new_SuperSaveClose.js и таким кодом:

function EnableButtons() {
    var z = Math.floor(Math.random() * 11);
    if (z > 5) return true;
    return false;
}

Этот код просто рандомно то активирует, то деактивирует кнопку.

3. Перемещение кнопки

Задача: переместить кнопку Добавить заметку на основную вкладку формы объекта Организация.

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="MoveAddNoteCustomAction" 
                  Location="Mscrm.Form.account.MainTab.Save.Controls._children" 
                  Sequence="1">
      <CommandUIDefinition>
        <Button Id="Mscrm.Form.incident.AddNote" 
                ToolTipTitle="$Resources:Mscrm_Form_Other_Related_Document_AddNote_ToolTipTitle"
                Sequence="1"
                ToolTipDescription="$Resources(EntityDisplayName):Ribbon.Tooltip.AddNote" 
                Command="Mscrm.AddNoteToPrimaryRecord"
                LabelText="$Resources:Ribbon.HomepageGrid.Add.Document.AddNote" 
                Alt="$Resources:Ribbon.HomepageGrid.Add.Document.AddNote"
                Image16by16="/_imgs/ribbon/AddNote_16.png" 
                Image32by32="/_imgs/ribbon/noteyellowadd32.png" 
                TemplateAlias="o1" />
      </CommandUIDefinition>
    </CustomAction>
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions />
  <RuleDefinitions>
    <TabDisplayRules />
    <DisplayRules />
    <EnableRules />
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

4. Скрытие кнопки со связанного представления

Задача: скрыть кнопку «Добавить новый элемент типа …» со связанного представления объекта new_test при значении Статуса != 2.

<RibbonDiffXml>
  <CustomActions>
    <CustomAction Id="MyOrg_CustomAction" 
                  Location="Mscrm.SubGrid.new_test.AddNewStandard">
      <CommandUIDefinition>
        <Button Id="Mscrm.SubGrid.new_test.AddNewStandard" 
                Command="MyOrg_Command"
                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>
    <HideCustomAction Location="Mscrm.SubGrid.new_test.AddExistingStandard" HideActionId="Mscrm.SubGrid.new_test.AddExistingStandard.HideAction" />
  </CustomActions>
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions>
    <CommandDefinition Id="MyOrg_Command">
      <EnableRules>
        <EnableRule Id="MyOrg_CustomEnableRule" />
      </EnableRules>
      <DisplayRules></DisplayRules>
      <Actions></Actions>
    </CommandDefinition>
  </CommandDefinitions>
  <RuleDefinitions>
    <TabDisplayRules />
    <DisplayRules />
    <EnableRules>
      <EnableRule Id="MyOrg_CustomEnableRule">
        <ValueRule Default="true"  Field="statuscode" InvertResult="true" Value="2"/>
      </EnableRule>
    </EnableRules>
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

Динамическое создание элементов управления

Элементы управления, которые могут содержать другие наборы элементы управления:

Рассмотрим как динамически создавать элементы управления типа «Кнопка» и помещать их в FlyoutAnchor.

Сначала определим FlyoutAnchor:

<CustomAction Id="Add_Dynamic_Menu"
              Location="Mscrm.BasicHomeTab.Tools.Controls._children">
  <CommandUIDefinition>
    <FlyoutAnchor Id="ISV.DynamicFlyoutAnchor"
                  Sequence="100"
                  Command="Mscrm.Enabled"
                  Image16by16="/_imgs/placeholders/ribbon_placeholder_16.png"
                  Image32by32="/_imgs/ribbon/newrecord32.png"
                  LabelText="Dynamic Menu"
                  Alt="Dynamic Menu"
                  PopulateDynamically="true"
                  PopulateQueryCommand="ISV.PopulateMenu"
                  TemplateAlias="isv"/>
  </CommandUIDefinition>
</CustomAction>

Обратите внимание, что PopulateDynamically установлено в true. Этот атрибут указывает механизму рендеринга, что меню FlyoutAnchor заполняется динамически. Задайте в PopulateQueryCommand идентификатор CommandDefinition’а , который Вы создадите далее.

Далее нужно определить CommandDefinition, которых у нас две штуки:

  • ID = ISV.PopulateMenu: этот CommandDefinition будет управлять отображением элементов управления. Для этого он будет обращаться к функции Jscript «DynamicMenu». Именно на этот CommandDefinition нужно поставить ссылку в FlyoutAnchor (в свойстве «PopulateQueryCommand»);
  • ID = ISV.SearchCommand: этот CommandDefinition будет управлять тем, какие действия будут выполняться при щелчке на динамических элементах управления (кнопках в FlyoutAnchor). Для этого он вызывает функцию JS «Search».
<CommandDefinition Id="ISV.PopulateMenu">
  <EnableRules>
    <EnableRule Id="Mscrm.Enabled" />
  </EnableRules>
  <DisplayRules />
  <Actions>
    <JavaScriptFunction
      FunctionName="DynamicMenu"
      Library="$webresource:new_dynamicmenupopulator.js">
      <CrmParameter Value="CommandProperties" />
    </JavaScriptFunction>
  </Actions>
</CommandDefinition>
<CommandDefinition Id="ISV.SearchCommand">
  <EnableRules />
  <DisplayRules />
  <Actions>
    <JavaScriptFunction
      FunctionName="Search"
      Library="$webresource:new_dynamicmenupopulator.js">
      <CrmParameter Value="CommandProperties" />
    </JavaScriptFunction>
  </Actions>
</CommandDefinition>

Отметьте, что в обоих элементах CommandDefinition используются CrmParameter со атрибутом Value равным «CommandProperties». В результате в JS-функцию будет передан объект, по которому функция «узнает», какая динамически сгенерированная кнопка была нажата.
Далее создадим JS Веб-ресурс с именем new_dynamicmenupopulator.js:

function DynamicMenu(CommandProperties) {
    var menuXml = '
        <Menu Id=\"ISV.DynamicMenu\">
          <MenuSection Id=\"ISV.Dynamic.MenuSection\" Sequence=\"10\">
            <Controls Id=\"ISV.Dynamic.Controls\">
              <Button Id=\"ISV.Dynamic.Button1\" Command=\"ISV.SearchCommand\" Sequence=\"20\" LabelText=\"Test Button1\" Alt=\"Test Button1\" />
              <Button Id=\"ISV.Dynamic.Button2\" Command=\"ISV.SearchCommand\" Sequence=\"30\" LabelText=\"Test Button2\" Alt=\"Test Button2\" />
            </Controls>
          </MenuSection>
        </Menu>
    ';
    CommandProperties.PopulationXML = menuXml;
}

function Search(CommandProperties) {
    var controlId = CommandProperties.SourceControlId;
    switch (controlId) {
        case 'ISV.Dynamic.Button1':
            alert('Button 1 Command Implementation');
            break;
        case 'ISV.Dynamic.Button2':
            alert('Button 2 Command Implementation');
            break;
        default:
            alert('Button Unknown');
    }
}
  • Функция DynamicMenu определяет XML-разметку элемента Menu, содержащего две кнопки (в элементе MenuSection). Обе эти кнопки используют ISV.SearchCommand созданный на предыдущем шаге;
  • Функция Search вызывается при нажатии динамически сгенерированных кнопок. Поскольку CommandDefinition, который мы создали на первом шаге, передает в функцию «CommandProperties» мы можем прочитать свойство SourceControlId, чтобы определить, какая из динамических сгенерированных кнопок нажата и выполните соответствующий код.
Комментарии (6)
  • Dmitry 24.11.2011

    привет!
    а как удалить супер кнопку ,)
    после удаления решения — кнопка остается так как она продолжает присутствовать в глобальном ribbonxml

    как ее от туда грохнуть?

  • slivka_83 24.11.2011

    Добрый день.

    Снова создайте Решение, добавьте туда Ваш Объект, выгрузите решение, удалите из customization.xml кнопку и импортируйте Решение обратно в CRM

  • Ion 24.11.2011

    Спасибо за полезную информацию. А есть где-то примеры как можно в родительской сущности на кнопку повесить JS + Rest запрос, чтобы создавалась дочерня сущность и некоторые поля копировались с родительской?

  • Ion 24.11.2011

    Спасибо, крутой сайт) со своии вопросом разобрался

  • Михаил 24.11.2011

    Очень помог твой сайт. Но к сожалению с кнопкой не разобрался. Создал кнопку на ленте в том же месте что и ты, скопировал JS скрипт для действия кнопки. При нажатии она должна запускать скрипт alert, но увы кнопка всегда серая и скрипт не запустить. Где может быть ошибка? P.s. сам alert работает без проблем (проверял на onLoad)

  • slivka_83 24.11.2011

    Добрый день. Могу предположить только, что не задано EnableRules или задано не правильно.

*

code