In CRM Portal, different web form steps of a web form can operate on different entities. Imagine you have an Enrolment web form that allows students to enrol in courses. The first step of this form might capture student details (Student entity). The second step might capture the enrolment details (Course Enrolment entity). The Student entity would have a lookup to the Course Enrolment entity in this particular example.
Each web form step of the web form must have a Mode specified, which can be Insert, Edit or ReadOnly. If you want to allow users to be able to edit the form (e.g. save and resume), then you would typically need (at a minimum) a web form where all the steps are set to Edit mode.
As the 2nd step operates on a related record, and not the main record that the user clicked on to launch the form however, there is no OOTB way to configure this as an Edit step.
This is because for Edit mode, we need to provide the step with the source record. OOTB however, the available options are:
- Query String
- Current Portal User
- Result From Previous Step
- Record Associated to Current Portal User
Since our record is not related to the current Portal User, option 2 and 4 above are no good. Since the record that our 2nd step operates on is different to that of the 1st step, option 3 is also no good. The only viable option for us is the first option, Query String.
The problem here is that CRM Portal does not include the ID of the related record (the one our 2nd step operates on) in the URL when the user navigates to the 2nd step of the form.
So how do we workaround this?
The workaround…
The workaround, at a high level, is to use JavaScript to manipulate the URL to pass the ID of the related record in the query string to our 2nd step. This JavaScript will run on load of the 1st step, and update the action property of the form HTML element. This effectively changes the URL that is used to navigate to the 2nd step.
Perform the following:
- Add the lookup field to the related entity (e.g. new_courseenrolmentid) to the backing CRM form of the 1st step. This enables our JavaScript on the web form step to read this value.
- Make the lookup field above read-only on the backing CRM form so that users cannot update this field on the Portal.
- Configure the following JavaScript for the 1st web form step. This script passes the ID of the related record to the 2nd web form step using the ‘relatedid‘ query string parameter. Please review the in line comment.
function appendRelatedEntityIdToQueryString() { //Append the ID of the related record to the form's post URL using the 'relatedid' query string parameter. //If this query string param already exists in the URL then it is updated. Else, it is appended to the end of the URL. var relatedEntityId = $("#new_courseenrolmentid").val(); var $form = $("form"); var formActionUrl = $form.prop("action"); if (formActionUrl.indexOf("&relatedid=") == -1) { //The URL does not contain our param so just add it. formActionUrl += "&relatedid=" + relatedEntityId; $form.prop("action", formActionUrl); return; } //Find the existing param in the URL and replace its value. var queryStringStartIndex = formActionUrl.indexOf("?") + 1; var queryString = queryStringStartIndex == 0 || queryStringStartIndex == formActionUrl.length ? "" : formActionUrl.substring(queryStringStartIndex); var queryPairs = queryString.split("&"); var newQueryString = ""; for (var i = 0; i < queryPairs.length; i++) { /*Find the relatedid and replace it.*/ if (queryPairs[i].indexOf("relatedid=") == 0) { queryPairs[i] = "relatedid=" + relatedEntityId; } if (newQueryString == "") { newQueryString = queryPairs[i]; } else { newQueryString += "&" + queryPairs[i]; } } formActionUrl = formActionUrl.substring(0, queryStringStartIndex) + newQueryString; $form.prop("action", formActionUrl); } $(function () { appendRelatedEntityIdToQueryString(); });
- Configure the 2nd web form step as follow:
- Set Target Entity Logical Name to the related entity (e.g. Course Enrolment)
- Set Mode to Edit
- For Record Source:
- Set Source Type to Query String
- Set Primary Key Query String Parameter Name to relatedid
- Set Primary Key Attribute Logical Name to the lookup field (e.g. new_courseenrolmentid) on the primary entity
That’s it!
Now you should be able to edit the related entity on your 2nd web form step.
By the way…
Do a lot of JavaScript, CSS, HTML and Liquid coding with CRM Portal? Want to source-control these artefacts and work together with your team without overwriting each other’s code? Then check out my Visual Studio extension CRMQuickDeploy! This simple extension allows you to work with these artefacts in Visual Studio and quickly deploy them to CRM!