How to customize Deeplinks for AEM tabs | Community
Skip to main content
Level 2
June 11, 2024
Solved

How to customize Deeplinks for AEM tabs

  • June 11, 2024
  • 2 replies
  • 1661 views

Hi,

 

How can I customize the deeplinks for tabs in java? Instead of the auto generated id, I would like to make it more a meaningful to my current use case. Any code snippet or examples would help. Thank you

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by zmdeluyas

For those who are wondering, this is the exact thing I needed. Check this forum post

2 replies

HrishikeshKagne
Community Advisor
Community Advisor
June 12, 2024

Hi @zmdeluyas ,

To customize deep links for tabs in Adobe Experience Manager (AEM), you typically need to work with Java and the Sling framework. Deep links in AEM are often handled through selectors, and you can customize them by creating components and using Sling Models. Below is a step-by-step guide on how to create customized deep links for tabs in AEM:

Step 1: Create a Custom Component for Tabs

  1. Create the Component Structure:

    • Create a new component in your AEM project, for example, under /apps/myproject/components/tabs.
    • Within this folder, create the necessary files like tabs.html, tabs.js, and tabs.css.
  2. Define the Component HTML (tabs.html):

 

<div class="tabs-component"> <ul class="tabs"> <li><a href="#tab1" data-deeplink="custom-tab-1">Tab 1</a></li> <li><a href="#tab2" data-deeplink="custom-tab-2">Tab 2</a></li> <li><a href="#tab3" data-deeplink="custom-tab-3">Tab 3</a></li> </ul> <div id="tab1" class="tab-content">Content for Tab 1</div> <div id="tab2" class="tab-content">Content for Tab 2</div> <div id="tab3" class="tab-content">Content for Tab 3</div> </div>

 

JavaScript to Handle Deep Links (tabs.js):

 

document.addEventListener("DOMContentLoaded", function() { const tabs = document.querySelectorAll('.tabs a'); const tabContents = document.querySelectorAll('.tab-content'); function showTab(deeplink) { tabContents.forEach(content => { content.style.display = 'none'; }); const activeTab = document.querySelector(`#${deeplink}`); if (activeTab) { activeTab.style.display = 'block'; } } tabs.forEach(tab => { tab.addEventListener('click', function(e) { e.preventDefault(); const deeplink = this.getAttribute('data-deeplink'); showTab(deeplink); history.pushState(null, null, `#${deeplink}`); }); }); const currentHash = window.location.hash.substring(1); if (currentHash) { showTab(currentHash); } });

 

Step 2: Create a Sling Model for Tabs

  1. Java Sling Model (TabsModel.java):

 

package com.myproject.models; import org.apache.sling.api.resource.Resource; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; @Model(adaptables = Resource.class) public class TabsModel { @ValueMapValue private String[] tabTitles; @ValueMapValue private String[] deeplinkIds; public String[] getTabTitles() { return tabTitles; } public String[] getDeeplinkIds() { return deeplinkIds; } }

 

HTL Template to Render Tabs (tabs.html):

 

<div class="tabs-component"> <ul class="tabs"> <sly data-sly-use.tabs="${'com.myproject.models.TabsModel'}"> <sly data-sly-list.tab="${tabs.tabTitles}"> <li><a href="#${tabs.deeplinkIds[tabListIndex]}" data-deeplink="${tabs.deeplinkIds[tabListIndex]}">${tab}</a></li> </sly> </sly> </ul> <sly data-sly-use.tabs="${'com.myproject.models.TabsModel'}"> <sly data-sly-list.tab="${tabs.tabTitles}"> <div id="${tabs.deeplinkIds[tabListIndex]}" class="tab-content">Content for ${tab}</div> </sly> </sly> </div>

 

Step 3: Define the Component Dialog

  1. Dialog Definition (tabs/.content.xml)

 

<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" jcr:primaryType="cq:Component" jcr:title="Tabs Component" sling:resourceSuperType="core/wcm/components/commons/v1/default" componentGroup="My Project"> <cq:dialog jcr:primaryType="nt:unstructured" xmlns:cq="http://www.day.com/jcr/cq/1.0" cq:dialogMode="floating" cq:templatePath="/libs/wcm/foundation/components/page/dialog"> <content jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/container"> <items jcr:primaryType="nt:unstructured"> <tabs jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/tabs"> <items jcr:primaryType="nt:unstructured"> <tab jcr:primaryType="nt:unstructured" jcr:title="Tab Titles"> <items jcr:primaryType="nt:unstructured"> <tabTitles jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/multifield" fieldLabel="Tab Titles" name="./tabTitles"> <field jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/textfield"/> </tabTitles> </items> </tab> <tab jcr:primaryType="nt:unstructured" jcr:title="Deeplink IDs"> <items jcr:primaryType="nt:unstructured"> <deeplinkIds jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/multifield" fieldLabel="Deeplink IDs" name="./deeplinkIds"> <field jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/textfield"/> </deeplinkIds> </items> </tab> </items> </tabs> </items> </content> </cq:dialog> </jcr:root> ​

 

  • Component Structure: Create the necessary files for your tabs component.
  • HTML and JavaScript: Define the structure and behavior of your tabs. The JavaScript handles the deep linking by updating the URL and displaying the correct tab content.
  • Sling Model: Use a Sling Model to manage the data for your tabs, including the titles and deep link IDs.
  • HTL Template: Use HTL to dynamically render the tabs and their contents based on the data from the Sling Model.
  • Component Dialog: Define a dialog to allow authors to input tab titles and deep link IDs.

This setup allows you to customize the deep links for your AEM tabs, providing more meaningful URLs that reflect the tab content.

Hrishikesh Kagane
Level 6
June 13, 2024

Thanks ChatGPT, I've been following you, and this is considered spamming, I am reporting you.

zmdeluyasAuthorAccepted solution
Level 2
June 14, 2024

For those who are wondering, this is the exact thing I needed. Check this forum post