Triggering a Workflow from a Ribbon Button

Add Button to Entity Ribbon

Export the entity in question and open up customizations.xml. Add the following within the CustomActions tag…

<CustomAction
  Id="CA_MyFirstButton"
  Location="Mscrm.Form.account.MainTab.Save.Controls._children"
  Sequence="31">
  <CommandUIDefinition>
    <Button
      Id="B_MyFirstButton"
      Command="Mscrm.RunSomeJS"
      LabelText="Button Label"
      ToolTipTitle="Run Test Workflow"
      ToolTipDescription="Runs the test workflow to see if this works"
      TemplateAlias="o1"
      Image16by16="/_imgs/ribbon/tools_16.png"
      Image32by32="/_imgs/ribbon/tools_32.png" />
  </CommandUIDefinition>
</CustomAction>

Location sets which area of the ribbon the button will appear on.
Sequence sets where within that ribbon it will appear.
LabelText sets the text which appears under the icon on the ribbon.
TemplateAlias (who knows!)

Create the click action

Now we need to add the command Mscrm.RunSomeJS within the CommandDefinitions section.

<CommandDefinition
  Id="Mscrm.RunSomeJS">
  <EnableRules>
    <EnableRule Id="Mscrm.Enabled" />
  </EnableRules>
  <DisplayRules>
    <DisplayRule Id="Mscrm.CanWriteAccount" />
  </DisplayRules>
  <Actions>
    <JavaScriptFunction
      FunctionName="TriggerWorkflow"
      Library="$Webresource:isah_test">
      <StringParameter
        Value="{guid of account entity}" />
      <StringParameter
        Value="{7D78531A-23EB-4042-9626-1D80DFC10A8D}" />
    </JavaScriptFunction>
  </Actions>
</CommandDefinition>

EnableRules sets if the button is greyed out on the toolbar (always enabled in this example)
DisplayRules sets if the button appears on the toolbar (if the user can write to the account entity in this example)
FunctionName sets the name of the function to run within the web resource
Library sets the name of the web resource JavaScript library to access
StringParameters
in this case are the guid of the account entity (not used currently) and the guid of the workflow to trigger

JavaScript to Fire the Workflow

function TriggerWorkflow(entityName,workflowGuid) {

  var xx = prompt(Xrm.Page.data.entity.getId(),Xrm.Page.data.entity.getId());

  /*Generate Soap Body.*/
  var soapBody = "<soap:Body>" +
                 "  <Execute xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>" +
                 "    <Request xsi:type=\'ExecuteWorkflowRequest\'>" +
                 "      <EntityId>" + Xrm.Page.data.entity.getId() + "</EntityId>" +
                 "      <WorkflowId>" + workflowGuid + "</WorkflowId>" +
                 "    </Request>" +
                 "  </Execute>" +
                 "</soap:Body>";

  /*Wrap the Soap Body in a soap:Envelope.*/
  var soapXml = "<soap:Envelope " +
                "  xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' " +
                "  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
                "  xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" +
                GenerateAuthenticationHeader() +
                soapBody +
                "</soap:Envelope>";

  /* Create the XMLHTTP object for the execute method.*/
  var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  xmlhttp.open("POST", "/MSCRMservices/2007/crmservice.asmx", false);
  xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
  xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Execute");

  /* Send the XMLHTTP object. */
  xmlhttp.send(soapXml);

}
Advertisements