Set AEM dialog property as page property | Community
Skip to main content
Level 4
March 15, 2024
Solved

Set AEM dialog property as page property

  • March 15, 2024
  • 6 replies
  • 1701 views

Hi all,

 

i have a requirement wherein I want to set the value authored in dialog as a page property.

What is the best way to do it?

 

1. Read component/resource's properties in value map and set it on the currentPage's valuemap in sling model.

2. Is there any way to do it directly while configuring the dialog xml?

 

thanks

@imran__khan@estebanbustamante@arunpatidar@aanchal-sikka 

 

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 aanchal-sikka

@aem_noob 

 

If the requirement is to share the value between page dialog and component dialog, then in component dialog you can have the property as 'abc', while in page '<crx_path_to_component>/abc'

 

Need some clarity on whats the use-case for which you would copy property from component to page. Might be able to provide suggestions accordingly.

 

6 replies

aanchal-sikka
Community Advisor
Community Advisor
March 15, 2024

@aem_noob 

 

Is the component present on the page at a constant location? Basically is the path of the component to the page constant.

Aanchal Sikka
aem_noobAuthor
Level 4
March 15, 2024

yes the page will have only this one component so it will be relatively fixed always

aanchal-sikka
Community Advisor
aanchal-sikkaCommunity AdvisorAccepted solution
Community Advisor
March 15, 2024

@aem_noob 

 

If the requirement is to share the value between page dialog and component dialog, then in component dialog you can have the property as 'abc', while in page '<crx_path_to_component>/abc'

 

Need some clarity on whats the use-case for which you would copy property from component to page. Might be able to provide suggestions accordingly.

 

Aanchal Sikka
Madhur-Madan
Community Advisor
Community Advisor
March 15, 2024

Hi @aem_noob ,

Let's explore the two options you mentioned:

1.Using Sling Model to Read Dialog Value and Set Page Property:
In this approach, you would create a Sling Model associated with your component. Within the Sling Model, you can inject the dialog's values using the @ValueMapValue annotation and then set these values as properties of the current page's ValueMap. This approach is flexible and allows you to manipulate the data before setting it as a page property if necessary.

 

2.Configuring Dialog XML to Set Page Property Directly:
Directly configuring the dialog XML to set a page property might not be a conventional approach, as dialogs typically interact with the component's data rather than the page's data. However, if you have a specific requirement to set a page property based on a dialog value, you might need to implement a custom handler or listener that intercepts the dialog submission and performs the desired action of setting the page property accordingly. This approach might involve more complexity and customization.

 

In most cases, the first approach using a Sling Model is preferred because it follows the separation of concerns principle and provides better maintainability and flexibility.

Thanks,
Madhur

arunpatidar
Community Advisor
Community Advisor
March 15, 2024

Hi @aem_noob 
As @aanchal-sikka  mentioned read is directly from the component path(in case component path is fixed).

 

The other way is to update page property on dialog submit using sling servlet

 

Example

 

Dialog field

<pageTitle jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/textfield" fieldLabel="Custom Property" name="./dialogPropName" />



Servlet

@SlingServlet( paths = "/bin/updatePageProperty", methods = HttpMethod.POST ) public class UpdatePagePropertyServlet extends SlingAllMethodsServlet { @Override protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) { try { ResourceResolver resolver = request.getResourceResolver(); String pagePath = request.getParameter("pagePath"); String propertyValue = request.getParameter("propertyValue"); // Get the page resource Resource pageResource = resolver.getResource(pagePath); if (pageResource != null) { ModifiableValueMap properties = pageResource.adaptTo(ModifiableValueMap.class); if (properties != null) { // Set the page title property properties.put("propertyName", propertyValue); resolver.commit(); response.getWriter().println("Page title updated successfully."); } else { response.getWriter().println("Failed to update page title: Resource is not modifiable."); } } else { response.getWriter().println("Failed to update page title: Page resource not found."); } } catch (IOException e) { // Handle IOException } } }

 

Arun Patidar
DPrakashRaj
Community Advisor
Community Advisor
March 15, 2024

Why can’t you put that value in page property instead of component dialog?

aem_noobAuthor
Level 4
March 20, 2024

Because the content authors are authoring only the component while editing page property is restricted for them.

EstebanBustamante
Community Advisor and Adobe Champion
Community Advisor and Adobe Champion
March 15, 2024

Hi,

 

I came late to the game, but this looks like the wrong design/approach to follow. I would recommend revisiting what you are trying to do and managing this directly in a page properties. Perhaps it's better to add a new option in the page properties and show it to a specific group of users than what you are trying to achieve. However, if I were forced to do what you are required to, I would just use a Sling model to build the path from the resource to the page and commit the properties.

 

Hope this helps.

Esteban Bustamante
aem_noobAuthor
Level 4
March 20, 2024

Yes coupling component property with page property is not exactly an ideal scenario. We are looking to decouple them going forwards but for now still wanted to bind them anyways. Thanks!

kautuk_sahni
Community Manager
Community Manager
March 20, 2024

@aem_noob Did you find the suggestions from users helpful? Please let us know if more information is required. Otherwise, please mark the answer as correct for posterity. If you have found out solution yourself, please share it with the community.

Kautuk Sahni