D365 Portals : Using FetchXML with Liqiuid
Hello Everyone,
This is my first ever post with D365 Portals. I will bring up more interesting ones as we go along. Today I am going to talk about how you can customize your portal's web template to use CRM fetch query with liquid.
Prerequisites:
- FetchXML using Advanced Find in CRM
- Customizing D365 Portals
Scenario:
D365 CRM provides an ability to categorize your articles using ISH (Interactive Service Hub). Those categories are used as tags and then displayed on D365 Portals as a list to browse the articles from. I will showcase how to modify the existing template and using FetchXML instead.
Build your FetchXML using Advanced Find
- Go to Advanced Find
- Select the entity as "Categories"
- See FetchXML Sample
<fetch mapping="logical" returntotalrecordcount="true" count="{{ count }}">
<entity name="category">
<attribute name="categorynumber" />
<attribute name="title" />
<attribute name="createdon" />
<attribute name="categoryid" />
<order descending="false" attribute="title" />
</entity>
</fetch>
Review existing web template:
- Go to D365 Online Instance - CRM
- Go to Portals > Web Templates > Knowledge Base Home
- Open the record
- You will see the below code:
{% extends 'layout_1_column' %}
{% block main %}
{% include 'Page Copy' %}
{% assign category_url = sitemarkers['Category'].url %}
{% assign count = count | default: 0 %}
{% assign categories = knowledge.categories | top_level: count %}
{% if categories %}
<div class="list-group unstyled">
{% for category in categories %}
<a href="{{ category_url | add_query: 'id', category.categorynumber }}" class="list-group-item">
{{ category.title }}
</a>
{% endfor %}
</div>
{% endif %}
Modify the Web Template:
- Add the liqiuid objects in following format:
<!-- New Category Display -->
{% extends 'layout_1_column' %}
<!-- OLD Category Display -->
{% block main %}
{% include 'Page Copy' %}
{% assign category_url = sitemarkers['Category'].url %}
{% assign count = count | default: 0 %}
{% assign categories = knowledge.categories | top_level: count %}
{% if categories %}
<div class="list-group unstyled">
{% for category in categories %}
<!-- <a href="{{ category_url | add_query: 'id', category.categorynumber }}" class="list-group-item">
{{ category.title }}
</a> -->
{% endfor %}
</div>
{% endif %}
<!-- OLD Category Display -->
<!-- New Category Display -->
<div class="list-group">
{% fetchxml categories_query %}
<fetch mapping="logical" returntotalrecordcount="true" count="{{ count }}">
<entity name="category">
<attribute name="categorynumber" />
<attribute name="title" />
<attribute name="createdon" />
<attribute name="categoryid" />
<order descending="false" attribute="title" />
</entity>
</fetch>
{% endfetchxml %}
{% assign categories = categories_query.results.entities %}
{% if categories %}
<div class="list-group">
<h4 class="list-group-item-heading">Articles by Categories</h4> <br/> <br/>
{% for category in categories %}
<a class="list-group-item" href="{{ category_url | add_query: 'id', category.categorynumber }}{{ category.categorynumber | escape }}">{{ category.title | escape }}</a>
{% endfor %}
</div>
{% endif %}
<!-- End New Category Display -->
</div>
{% endblock %}
You will see the categories are now sorted in order.
Hope you had fun customizing your Portals :)
-Apurv
Comments
- Anonymous
June 27, 2017
Apurv,Thanks for this great topic. I was able to modify the built-in article views to achieve a custom category filter that will display the most popular articles in each category with the help of your blog post.This is great info for anyone wanting to customize their Dynamics portal site!- Anonymous
July 04, 2017
Thanks, Elliot. Great to know this satisfied your scenario :)
- Anonymous