This has been tested on xRM Portal CE only.
There may be times where you need to load and display an entity form by JavaScript in CRM Portal. For example, you may have a content page with a link that when clicked, should display an entity form in a modal dialog. You want the modal dialog to display the entity form without any of the site’s branding, navigation, footer, etc.
You can achieve this by leveraging an OOTB service that renders the entity form. This is the same service that is used by the OOTB entity lists and sub-grids.
The service…
The URL for this service is:
[rootWebSite]/_portal/modal-form-template-path/[portalId]?id=[recordId]&entityformid=[entityFormId]
- portalId: The service seems to be happy with any GUID. We used an empty GUID (00000000-0000-0000-0000-000000000000) and it was fine.
- recordId: Guid of the record you want to display
- entityFormId: Guid of the entity form record you want to use
This service returns an HTML document containing the specified entity form loaded with the specified record. The site’s branding, navigation, footer, etc. are excluded, which means the HTML document is ready to be used in a modal dialog via an iframe.
The modal dialog…
CRM Portal uses Bootstrap, so we will use Bootstrap’s modal to load an iframe that invokes the service above and displays the entity form. Again, this is the same approach used by the OOTB entity lists and sub-grids.
Below is the HTML that should be added to the page. The first part (the div) is the normal page content. The second part (the section) is the modal dialog that stays hidden until the user clicks the link in our content. The code for this second part was adapted from the modal element used by the OOTB entity list. Please review the inline comments below.
<!--This is our main content--> <div> Hello world. <a href="javascript:loadEntityFormAsModal();">Click me!</a> </div> <!--Code adapted from modal element of entity list. The ID of the section element is used in the JavaScript below.--> <section id="myModalDialog" aria-hidden="true" aria-label="<span class='fa fa-info-circle' aria-hidden='true'></span> My Modal Title" class="modal fade modal-form modal-form-details" data-backdrop="static" role="dialog" tabindex="-1" style="display: none;"> <div class="modal-lg modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button aria-label="Close" class="close" data-dismiss="modal" tabindex="0" title="Close" type="button"> <span aria-hidden="true">×</span><span class="sr-only">Close</span> </button> <h1 class="modal-title h4" title="My Modal Title">My Modal Title</h1> </div> <div class="modal-body"> <div class="form-loading" style="display: none;"> <span class="fa fa-spinner fa-spin fa-4x" aria-hidden="true"></span> </div> <iframe src=""></iframe> </div> </div> </div> </section>
Next we need to add the below JavaScript to the page. If embedded on the same page, then should be wrapped in <script> tags. This script was adapted from the OOTB entity-grid.js script. Please review the inline comments below.
function loadEntityFormAsModal() { //Code adapted from entityGrid.prototype.addDetailsActionLinkClickEventHandlers in \js\entity-grid.js. //Setup the record and entity form you want to display var portalId = "00000000-0000-0000-0000-000000000000"; var recordId = "B3FEC1EB-7F68-E811-859D-B86B23AC9F7C"; var entityFormId = "396293DD-9D46-E811-8551-B86B23AC9F7C"; //Form the URL to the service var url = "/_portal/modal-form-template-path/" + portalId + "?id=" + recordId + "&entityformid=" + entityFormId; //This ID needs to match the ID of the modal section element. var $modal = $("#myModalDialog"); //Retrieve the iframe of the modal and set it load the service var $iFrame = $modal.find("iframe"); $iFrame.attr("src", url); //Hook in handler to hide loader image when done loading $iFrame.on("load", function () { $modal.find(".form-loading").hide(); $modal.find("iframe").contents().find("#EntityFormControl").show(); }); //Show the loader image at start $modal.find(".form-loading").show(); $modal.find("iframe").contents().find("#EntityFormControl").hide(); $modal.on('show.bs.modal', function () { $modal.attr("aria-hidden", "false"); }); $modal.off("hidden.bs.modal.entitygrid").on("hidden.bs.modal.entitygrid", function () { $modal.attr("aria-hidden", "true"); }); $modal.modal(); }
That’s it!
And there you have it, you can now dynamically launch an entity form in JavaScript. Leveraging the OOTB service means that any entity permissions you may have setup will be honoured, and any JavaScript attached to the entity form itself will also be executed.
By the way…
Do a lot of HTLM, JavaScript, CSS and Liquid coding in CRM Portal? You should check out my Visual Studio extension CRMQuickDeploy. This allows you to work with HTML, JavaScript, CSS and Liquid in Visual Studio and quickly deploy them to CRM Portal. Not only this improves your productivity, but also allows you to source control these artefacts and facilitates scenarios where multiple developers work on the same code base.
Hi,
Thank you for this post. I have used it and it perfectly fits my requirement.
But I need to capture the submit event in this popup entity form.
The below code is not working.
$(‘#UpdateButton’).click(function(){
alert(‘test’);
});
Is there a way to handle the event?
I am looking for the same thing, have you solved?
Good Post. Did you manage to get the submit event working in the end?
Have you managed by any chance?
I would like to also find out if the submit event was done on the modal form.
after submitting it,, modal dialog is not hiding
Do you have the code to open entity-list ?
example of how result looks would be nice. I amnot familiar with iframes.