Кастомизация
15
Мар
9

Кнопка активации Действий

Очередное «ленивое» решение… добавим кнопку на Ленте форм Действий, которая по нажатию будет активировать открытое Действие. Ведь кнопка деактивации и перевода в завершенный статус уже есть! А кнопку «активировать» обделили 🙂 Исправим:

  • Создайте новый JS Веб-ресурс new_activateRecord.js с таким кодом:
    function activateRecord(id, logicalName) {
        var orgServiceUrl = Xrm.Page.context.getServerUrl() + "/XRMServices/2011/Organization.svc/web";
    
        var request =
            '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
            '   <s:Body>' +
            '       <Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' +
            '           <request i:type="b:SetStateRequest" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:b="http://schemas.microsoft.com/crm/2011/Contracts">' +
            '               <a:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic">' +
            '                   <a:KeyValuePairOfstringanyType>' +
            '                       <c:key>EntityMoniker</c:key>' +
            '                       <c:value i:type="a:EntityReference">' +
            '                           <a:Id>' + id + '</a:Id>' +
            '                           <a:LogicalName>' + logicalName + '</a:LogicalName>' +
            '                           <a:Name i:nil="true" />' +
            '                       </c:value>' +
            '                   </a:KeyValuePairOfstringanyType>' +
            '                   <a:KeyValuePairOfstringanyType>' +
            '                       <c:key>State</c:key>' +
            '                       <c:value i:type="a:OptionSetValue">' +
            '                           <a:Value>0</a:Value>' +
            '                       </c:value>' +
            '                   </a:KeyValuePairOfstringanyType>' +
            '                   <a:KeyValuePairOfstringanyType>' +
            '                       <c:key>Status</c:key>' +
            '                       <c:value i:type="a:OptionSetValue">' +
            '                           <a:Value>-1</a:Value>' +
            '                       </c:value>' +
            '                   </a:KeyValuePairOfstringanyType>' +
            '               </a:Parameters>' +
            '               <a:RequestId i:nil="true" />' +
            '               <a:RequestName>SetState</a:RequestName>' +
            '           </request>' +
            '       </Execute>' +
            '   </s:Body>' +
            '</s:Envelope>';
    
        var req = new XMLHttpRequest();
        req.open("POST", orgServiceUrl, true);
        req.setRequestHeader("Accept", "application/xml, text/xml, */*");
        req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
        req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
        req.onreadystatechange = function () {
            if (req.readyState === 4) location.reload(true);
        }
        req.send(request);
    }
    

    Этот скрипт получает GUID записи и имя объекта, на Ленте которого была нажата кнопка. А затем выполняет SOAP-запрос. Напоследок скрипт перезагружает текущее окно;

  • Создайте Решение и добавьте в него объекты Действий, на Ленты форм которых необходимо поместить кнопку Активации. Выгрузите Решение и откройте на редактирование файл customization.xml. Замените все узлы RibbonDiffXml на:
    <RibbonDiffXml>
      <CustomActions />
      <Templates>
        <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
      </Templates>
      <CommandDefinitions>
        <CommandDefinition Id="Mscrm.Form.Activate">
          <EnableRules>
            <EnableRule Id="Mscrm.CanWritePrimary" />
          </EnableRules>
          <DisplayRules>
            <DisplayRule Id="Mscrm.CanWritePrimary" />
            <DisplayRule Id="Mscrm.PrimaryIsInactive" />
            <DisplayRule Id="Mscrm.PrimaryEntityHasStatecode" />
          </DisplayRules>
          <Actions>
            <JavaScriptFunction FunctionName="activateRecord"
            Library="$webresource:new_activateRecord.js">
              <CrmParameter Value="FirstPrimaryItemId" />
              <CrmParameter Value="PrimaryEntityTypeName" />
            </JavaScriptFunction>
          </Actions>
        </CommandDefinition>
      </CommandDefinitions>
      <RuleDefinitions>
        <TabDisplayRules />
        <DisplayRules />
        <EnableRules />
      </RuleDefinitions>
      <LocLabels />
    </RibbonDiffXml>
    

    По существу мы не создаем новую кнопку, а выводим из «тени» стандартную кнопку и вешаем на нее выполнение JS-кода;

  • Импортируйте Решение обратно в CRM.



Комментарии (9)
  • skfd 15.03.2012

    CommandDefinition описано, а Button нет 🙁

  • slivka_83 15.03.2012

    Читаем внимаетльно текст 🙂
    >По существу мы не создаем новую кнопку, а выводим из «тени» стандартную кнопку и вешаем на нее выполнение JS-кода;

  • Александр 15.03.2012

    Добрый день, у меня почему-то данная реализация падает с ошибками при импорте :(. У меня подозрение что может какие-то дополнительные права нужны? The ribbon item ‘Mscrm.Form.Activate’ is dependent on Web resource id=’new_activateRecord.js’.
    в чем может быть причина?

  • alex 15.03.2012

    Доброго времени суток!.
    Подскажите почему не срабатывает js скрипт?
    Кнопку отобразил на форме а реакции при нажатии на нее нет никакой.
    Может кто сталкивался?

  • slivka_83 15.03.2012

    Добрый день

    >Александр
    Система при импорте проверяет наличие в системе всех ресурсов задействованных в импортируемом Решении. В данном случае у Вас нет JS Веб-ресурса new_activateRecord.js

    >alex
    Попробуйте вставить в код alert и посмотреть срабатывает ли он.

  • Mike 15.03.2012

    >slivka_83
    У меня такая же проблема. Alert срабатывает (перезагрузка страницы тоже), а действие не активируется

  • slivka_83 15.03.2012

    Сейчас я в отпуске и немогу повторно проверить кнопку… так что на следующей неделе пинайте 🙂 проверю 🙂

  • less 15.03.2012

    Привет!
    Есть такая проблема, скрипт работает только во внутренней сети, где установлена CRM и используется windows авторизация. А как заставить скрипт работать «извне»? (Это, как я понял, http авторизация)
    Нужно как-то определить, из внутренней сети запрос или из внешней и передавать user/pass в xmlhttp.open(), но как? 🙂

  • slivka_83 15.03.2012

    Добрый день.

    По идее, если у Вас корректно развернут IFD, то код должен работать без проблем.

*

code