How to create sling events for specific templates in aem? | Community
Skip to main content
Mario248
Level 7
February 5, 2024
Solved

How to create sling events for specific templates in aem?

  • February 5, 2024
  • 2 replies
  • 1645 views
I want to make an external call whenever the page is published and I don't want to do this for all pages. Only certain pages I want to do this call. For example for the page is created with /conf/abc/template template.(cq:template = /conf/abc/template)
 
Could anyone tell me what sling event API to use for this requirement ?
 
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 Kamal_Kishor

@mario248 : Every template has a resource type, I believe you can make use of that instead of template name. Also, you can use this in combination with path as well.

@Component(service = EventHandler.class, immediate = true, property = { Constants.SERVICE_DESCRIPTION + "=Event Handler ", EventConstants.EVENT_TOPIC + "="+ReplicationAction.Event_Topic, EventConstants.EVENT_FILTER + "= ((path=/content/your-site/*)(resourceType=myapp/components/page/your-page-component))" })

You can refer this :- https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/event-filter-is-not-working/m-p/374198

https://techagyan.blogspot.com/2015/02/aem-event-handling-and-filtering.html

 

thanks.

 

2 replies

iamnjain
Community Advisor
Community Advisor
February 5, 2024

Hi @mario248 

 

You can use ResourceChangeListener class to handle sling level events and below is the sample code and you can customize it according to your business logic.

import org.apache.sling.api.resource.observation.ResourceChange; import org.apache.sling.api.resource.observation.ResourceChangeListener; import org.osgi.service.component.annotations.Component; @Component(service = ResourceChangeListener.class, property = { "sling.resourceType=/conf/abc/temp1", // Target the specific template "path=/content/(.*)" // Observe page creation under content }) public class PageCreationEventHandler implements ResourceChangeListener { @Override public void onChange(ResourceChange change) { if (change.getType() == ResourceChange.Type.ADDED) { // Page has been created String pagePath = change.getPath(); // Your custom logic here System.out.println("Page created: " + pagePath); // Example: Send a notification, perform additional processing, etc. } } }


Hope it helps. 🙂

Mario248
Mario248Author
Level 7
February 5, 2024

Thanks for your response. You are using ResourceChangeListener over sling events. Is there any preference and suggestion?

iamnjain
Community Advisor
Community Advisor
February 12, 2024

@mario248 

I think @joerghoh  mentioned the reason behind using ResourceChangeListener. I hope that helps.

Kamal_Kishor
Community Advisor
Kamal_KishorCommunity AdvisorAccepted solution
Community Advisor
February 5, 2024

@mario248 : Every template has a resource type, I believe you can make use of that instead of template name. Also, you can use this in combination with path as well.

@Component(service = EventHandler.class, immediate = true, property = { Constants.SERVICE_DESCRIPTION + "=Event Handler ", EventConstants.EVENT_TOPIC + "="+ReplicationAction.Event_Topic, EventConstants.EVENT_FILTER + "= ((path=/content/your-site/*)(resourceType=myapp/components/page/your-page-component))" })

You can refer this :- https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/event-filter-is-not-working/m-p/374198

https://techagyan.blogspot.com/2015/02/aem-event-handling-and-filtering.html

 

thanks.

 

Mario248
Mario248Author
Level 7
February 5, 2024

Thank for your reply. For some reason the sling resource type is common for other pages hence I have to reply on cq:template property hence I tried below code but it is not working. any reason ?

 

@Component(service = EventHandler.class, immediate = true, property = {
Constants.SERVICE_DESCRIPTION + "=Event Handler ",
EventConstants.EVENT_TOPIC + "="+ReplicationAction.EVENT_TOPIC,
EventConstants.EVENT_FILTER + "= ((cq:template=/conf/abc/template))" })
Kamal_Kishor
Community Advisor
Community Advisor
February 6, 2024

@mario248 : In that case, you will have to create an EventHandler at a path level to reduce triggering of it everywhere and then in handleEvent method you can apply the filter based on cq:template property.

@Override public void handleEvent(Event event) { ReplicationAction replicationAction = ReplicationAction.fromEvent(event); String pagePath = replicationAction.getPath(); //read the jcr:content/cq:template property value and check if it matches with your template. based on the match you can take action. }