How to Get Parent Id when overriding standard actions with a Lightning Component in salesforce1 app ?
In this blog I will explain how you can get Parent Id when overriding standard actions with a lightning component.
For example I have changed my Opportunity New button action with a custom Lightning Component.
Let's create a new account and from the related tab try creating the new Opportunity. Have you noticed any change in URL ?
Let me share the URL with you :
_________________________________________________________________________
_________________________________________________________________________
In above URL you can notice an "additionalParams" parameter containing the Parent ID. But in the Ssalesforce1 App the scenario is completely different. In Salesforce1 App you have to perform some additional steps.
Let's check the URL first in the Salesforce1 App
_________________________________________________________________________
https://kapilbatra1-dev-ed.lightning.force.com/lightning/o/Opportunity/new?recordTypeId=0127F000000htlp&inContextOfRef=1.eyJ0eXBlIjoic3RhbmRhcmRfX2RpcmVjdENtcFJlZmVyZW5jZSIsImF0dHJpYnV0ZXMiOnsibmFtZSI6Im9uZTphbG9oYVBhZ2UiLCJhdHRyaWJ1dGVzIjp7ImFkZHJlc3MiOiIvc2V0dXAvdWkvcmVjb3JkdHlwZXNlbGVjdC5qc3A%2FZW50PU9wcG9ydHVuaXR5JnNhdmVfbmV3X3VybD0lMkYwMDYlMkZlJTNGYWNjaWQlM0QwMDE3RjAwMDAyUzZnOUgmbmF2aWdhdGlvbkxvY2F0aW9uPVJFTEFURURfTElTVCJ9fSwic3RhdGUiOnt9fQ%3D%3D
_________________________________________________________________________
Let's check the URL first in the Salesforce1 App
_________________________________________________________________________
https://kapilbatra1-dev-ed.lightning.force.com/lightning/o/Opportunity/new?recordTypeId=0127F000000htlp&inContextOfRef=1.eyJ0eXBlIjoic3RhbmRhcmRfX2RpcmVjdENtcFJlZmVyZW5jZSIsImF0dHJpYnV0ZXMiOnsibmFtZSI6Im9uZTphbG9oYVBhZ2UiLCJhdHRyaWJ1dGVzIjp7ImFkZHJlc3MiOiIvc2V0dXAvdWkvcmVjb3JkdHlwZXNlbGVjdC5qc3A%2FZW50PU9wcG9ydHVuaXR5JnNhdmVfbmV3X3VybD0lMkYwMDYlMkZlJTNGYWNjaWQlM0QwMDE3RjAwMDAyUzZnOUgmbmF2aWdhdGlvbkxvY2F0aW9uPVJFTEFURURfTElTVCJ9fSwic3RhdGUiOnt9fQ%3D%3D
_________________________________________________________________________
In above URL you will notice that the "Additionalparam" parameter is missing and we are just getting an encoded URL.
To get the parent Id from URL of Lightning Component & Salesforce1 App here is the code below :
OpportunityPage.cmp
1 2 3 4 5 6 | <aura:component implements="force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,lightning:actionOverride,lightning:isUrlAddressable" access="global" > <aura:attribute name="recordId" type="String"/> <aura:attribute name="accId" type="string"/> <aura:handler name="init" action="{!c.doInit}" value="{!this}" /> <p style="font-size:40px">Parent ID : {!v.accId}</p> </aura:component> |
OpportunityPageController.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | ({ doInit : function(component, event, helper) { //Get Parent Id from URL start // // var pageReference = component.get("v.pageReference"); console.log('###RecordId : '+pageReference.state.recordTypeId); var getAccId = pageReference.state.additionalParams; if(typeof getAccId !== 'undefined') { console.log('###GetAccID : '+getAccId); getAccId = getAccId.replace('accid=',''); getAccId = getAccId.substring(0,15); console.log('###AccId : '+getAccId); component.set("v.accId", getAccId); } // // //Get Parent ID from URL end // // //Get Parent ID from URL in Salesforce1 App Start // // // var value = helper.getParameterByName(component , event, 'inContextOfRef'); console.log('###Value='+value); var context = JSON.parse(window.atob(value)); console.log('###context='+context); var newContext = JSON.stringify(context); console.log('###newContext : '+newContext); if(newContext.indexOf("address")>0){ console.log('###Context : '+context.attributes.attributes.address); var url =context.attributes.attributes.address; console.log('###URL='+url); var n = url.indexOf("accid%3D"); var subStr = url.substring(n+8); console.log('###Sub Str='+subStr); var accId = subStr.substring(0,15); console.log('###AccId : '+accId); component.set("v.accId", accId); } else{ console.log('##Its not a Salesforce1 App'); } // // //Get Parent ID from URL in Salesforce1 App end } }) |
OpportunityPageHelper.js
1 2 3 4 5 6 7 8 9 10 11 | ({ getParameterByName: function(component, event, name, url) { name = name.replace(/[\[\]]/g, "\\$&"); var url = window.location.href; var regex = new RegExp("[?&]" + name + "(=1\.([^&#]*)|&|#|$)"); var results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, " ")); } }) |
Note : Please open the console in your browser and check the logs carefully to understand it better.
Check the video below to understand it better
Please check below links also and subscribe if you like the content :
- How to get Parent Id from encoded URL in Lightning Component ?
- How to add sorting in Lightning Data Table ?
- How to Send SMS from Salesforce ?
- How to Add Star Ratings in Salesforce ?
If you have any question please leave a comment below.
If you would like to add something to this post please leave a comment below.
Share this blog with your friends if you find it helpful somehow !
Thanks
Keep Coding 😊
36 Comments
Hi,
ReplyDeleteThanks for posting this, but I am getting below error. I'm overriding the button with VF page:
Invalid 'X-Frame-Options' header encountered when loading 'https://motorolasolutions--uat.my.salesforce.com/setup/ui/recordtypeselect.jsp?ent=Opportunity&save_new_url=%2F006%2Fe%3Faccid%3D0018000000rFekD&navigationLocation=RELATED_LIST&lexiSObjectName=Opportunity&lexiActionName=new&tour=&isdtp=p1&sfdcIFrameOrigin=https://motorolasolutions--uat.lightning.force.com&nonce=299579a9d082d249f00787a947b0abe347bad71414ba233cff4a7930c42ff402&clc=0&sfdcIFrameHost=web<n_app_id=': 'ALLOW-FROM https://motorolasolutions--uat.lightning.force.com' is not a recognized directive. The header will be ignored.
Hi Gurditta Garg,
DeleteYou can bypass the above error by disabling CORS in chrome. It seems like a browser related issue to me.
Please check below link for reference
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
hi we got parent id how to bind that into child filed if you have any idea please kindly help me out .
ReplyDeleteHello, please check link below :
Deletehttps://www.salesforcebolt.com/2020/05/pass-variables-parent-child-lightning-component.html
Hi,
ReplyDeleteI don't think the above senerio works for all objects. I created a custom object and whenever I create the object in Salesforce below is the URL: https://*.force.com/lightning/o/Quote__c/new . How can I get the parent ID then?
Hi,
DeleteNo it won't work as the scenario will only work when you override a standard action with your custom Lightning Component.
Hi,
ReplyDeleteI don't think the above senerio works for all objects. I created a custom object and whenever I create the object in Salesforce below is the URL: https://*.force.com/lightning/o/Quote__c/new . How can I get the parent ID then?
Hi,
DeleteNo it won't work as the scenario will only work when you override a standard action with your custom Lightning Component.
Hi
ReplyDeleteI'm getting error ''Action failed: c:CA_InternalSupportNewCaseButton$controller$doInit [address is not defined]''.
This comment has been removed by the author.
DeleteGetting error ''Action failed: c:CA_InternalSupportNewCaseButton$controller$doInit [address is not defined]'' at below line.
Deleteif(newContext.indexOf("address")>0)
The reason is you are not getting address parameter in your url. Please check your parameter name and pass it instead of address.
DeleteCool, Thanks its working now.
DeleteHI, I am unable to see adidtionalParam attribute from lightning for the child object related list from parent for both opportunity and custom objects. Please help me out here
ReplyDeletePlease check your URL again, if the additionalParam parameter is not available then there must be some other parameters in the URL.
DeleteHi, this code is working fine for desktop but in mobile app I am getting error for JSON parser. It seems that window.location.href URL is completely different on mobile. it has /native/bridge.app/... in the URL.
ReplyDeleteHello, the functionality is only for when you override standard action with your custom component. Are you having the same scenario ? If yes, could you please share complete URL here so I could help.
DeleteHi, yes I am overriding Opportunity New button . When triggered from Account related list it hsa following window.location.ref: http:///native/bridge.app?maxLayoutcachesize=5&eventTransalator=1.0#/lightning/o/Opportunity/new
DeleteOn further looking it seems that i am getting the destination details rather than source. In v.pageReference also I am getting the Opportunity details.
DeleteThanks for sharing the details. I am not sure about it why you are not getting the source url.
DeleteI will ping you back here if I get some solution for it.
Hey Kapil, I am trying to use your logic to override View Action on the related list. Will this work for it as well?
ReplyDeleteHello, yes it will work but URL parameters will be changed in the case of View Action. Kindly modify the code accordingly.
DeleteHi Kapil, great post. I'm running into same issue where when standard action is overridden by a component the parent id is not getting pre-populated on a related list. It works as a quick action.
ReplyDeleteI'm trying to implement your solution but running into issues. I'm using virtual device builds for iOS simulator. How do you debug your mobile code? I mean how to see console.log statements when running on mobile as Chrome tools mobile UI is broken after Summer 2020 release. Thanks.
Hi, to debug the code you can also try alert() in JavaScript instead of console.log
DeleteLet me know if that works for you.
Hi kapil,
ReplyDeleteThanks for post, but Actually i am trying to get the standard page layout of contact.
when i click new button from related list at that movement account name is not populating .
the code i refereed is https://gist.github.com/sfcure/845a0e75815f7c0d6c92baebcce5bc3d(if any other alternative is also fine for me)
Thanks in Advance.
Hi sfdcdev, I didn't understand your query. Whenever you will click on the new button Contact from Account's related list, it will redirect you to the standard page itself automatically. There is no need to get parameters from URL.
DeleteHi Kapil,
DeleteI am overriding the standard page with my custom component.
Actually in jscontroller i am using the below code but code is working fine for desktop version when i login from mobile it is not working.
doInit : function(component,event,helper){
//alert(component.get("v.recordId"));
var pageRef = component.get("v.pageReference");
console.log(JSON.stringify(pageRef));
var state = pageRef.state; // state holds any query params
console.log('state = '+JSON.stringify(state));
var base64Context = state.inContextOfRef;
console.log('base64Context = '+base64Context);
if (base64Context.startsWith("1\.")) {
base64Context = base64Context.substring(2);
console.log('base64Context = '+base64Context);
}
var addressableContext = JSON.parse(window.atob(base64Context));
console.log('addressableContext = '+JSON.stringify(addressableContext));
component.set("v.recordId", addressableContext.attributes.recordId);
},
Hi sfdcdev, are you receiving any error ? Could you please check console once ? There must be some logs as in above code.
Deletei referred the below link:
ReplyDeletehttps://sfdclesson.com/2019/11/23/get-parent-record-id-from-lightning-url/
yes i am getting error in mobile device
ReplyDeleteuncaught Action failed:c: compname $init[cannot read property ' startwith' of undefined]callbackfailed:aura://componentcontroller/ACTION$getComponent
Hi sfdcdev : as per above error I think you are using subString and the starting index is not available in that. To trace the error you could print console after each line in your doInit function and track the line number of error.
DeleteLet me know if that helps !
Very thanks for your response
ReplyDeleteHi, this code is working fine in desktop version but when i try to create a opportunity record from account's related list page in mobile app there is a component error "Uncaught Action failed: c:newOppMobile$controller$doInit [Unexpected token ž in JSON at position 0] ".
ReplyDeleteSo, kindly help me to resolve this issue.
Hi, salesforce has stopped the mobile browser version from it's last release. The code was meant to be run on mobile browser version & Salesforce1 app as well. But now due to mobile version is not available we can not debug the logs.
DeleteThanks for your response can u suggest me any other way to achieve this.
ReplyDeleteI will try it once and let you know.
Delete