How to convert sforce.apex.execute to Lightning


Posted on Jun 18, 2020


featured image

Let’s see how to convert a Salesforce JavaScript button that uses sforce.apex.execute in to Lightning Experience.

The good news is you will reuse this code and the approach for all your similar buttons

Imagine you have this JavaScript button in your Salesforce instance. OK, probably your button is larger and more complex but the idea is the same

      
{!requireScript("/soap/ajax/20.0/connection.js")} 
{!requireScript("/soap/ajax/20.0/apex.js")}
 
sforce.apex.execute("JSMMyExecuteClass", "myExecuteMethod", {param1:"Im param1",param2:"Im param2"}); 
window.location = 'https://google.com';
      
    

In the example above we want to invoke the method myExecuteMethod that belongs to the Apex class JSMMyExecuteClass and you will pass these parameters {param1:"Im param1",param2:"Im param2"}

After that, it redirects to google.com

There’s not a direct solution (aka point and click) so we have to work a little bit

Create a Lightning Component

JSMMyButton.cmp

      
<aura:component implements="force:lightningQuickAction" controller="JSMMyExecuteClass" >
 
  <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
 
</aura:component>
      
    

Create a controller

The controller part of my component is called JSMMyButton.js

      
({
  doInit : function(component, event, helper) {
    var action = component.get("c.myExecuteMethodAura");
    action.setParams({
      "param1": 'Im param1',
      "param2": 'Im param2'
    });
    action.setCallback(this, function(response) {
    var state = response.getState();
 
    if(state == "SUCCESS" && component.isValid()){
      console.log("success") ;
      var result = response.getReturnValue();
      console.log(result);
 
      var urlRedirect = "https://www.google.com/search?q="+result;
      var urlEvent = $A.get("e.force:navigateToURL");
      urlEvent.setParams({
        "url": urlRedirect
      });
      urlEvent.fire();
    }else{
      console.error("fail:" + response.getError()[0].message); 
    }
  });
  $A.enqueueAction(action);
  }
})
      
    

Create Apex class

In JSMMyExecuteClass we need to create an equivalent method to call from our js

      
public class JSMMyExecuteClass {
 
  public String myExecuteMethod(String param1, String param2){
    return 'ok '+param1+' - '+param2;
  }
 
  @AuraEnabled
  public static String myExecuteMethodAura(String param1, String param2){
    return new JSMMyExecuteClass().myExecuteMethod(param1, param2);
  }
}
      
    

Create a Quick Action

Create a quick action that points to our component

Add the quick action to the layout(s) you want

That’s all. You can use this approach again for others button you have that require some code.

Video

Maybe this video is interesting for you: Journey to Lightning Experience: Convert Your JavaScript Buttons

Photo by Artem Sapegin on Unsplash


salesforce lightning apex dev
Search
Side Widget
You can put anything you want inside of these side widgets. They are easy to use, and feature the new Bootstrap 4 card containers!