After developing a custom portal on Microsoft CRM Portals, I like to share my experience.
This is kind of starter guide to build highly customised web pages on Microsoft CRM portals. It is a high level and very informal guide.
Libraries and frameworks
To customise the portal, a good understanding of followings are essential.
Microsoft CRM portal uses Bootstrap. Use bootstrap customiser like https://www.bootstrap-live-customizer.com/ for a quick customisation.
Needless to say why jQuery is here. It is essential to manipulate DOMs and adding custom data validation logic. https://jquery.com
Scalable vector based icons. http://fontawesome.io/
To build server-side logic and customsied pages. It always renders in server-side and only renders once per request. There is no post-back, sessions or cookies. Dynamic loading of entity lists, entity forms or web forms can be done using Liquid.
Make sure to look at the reference https://docs.microsoft.com/en-us/dynamics365/customer-engagement/portals/tags
Accessing data from client side
Calling web service to perform server side logic from client side is common in web development. There is two approaches to retrieve CRM data from client side.
An entity list can be configured to expose the result as OData just by one click. However, it may not be always the best practice as it exposes the data for anonymous users. That leads to the next approach.
Create a web page returning JSON
MIME type of a web template can be configured as application/json and you can write a logic using Liquid to retrieve the data and return as JSON. Retrieving the data using Liquid is under security control which means you can only see what you are allowed to see.
Entity permissions in CRM portal are similar to entity privileges in CRM. Permission scope can be global, contact or account and can be easily configured. Permissions can be added to Web Role and a web role can be assigned to a login user. However, if role level permissions are required within the portal, there is a little background customisation required to develop. I will cover it in the next blog post.