Hello!
I have a template where I set a convenience variable using data-sly-set:
<sly data-sly-template.myTemplate="${@ parameter}">
<sly data-sly-use.myModel="${'com.xxx.xxx.xxx.core.models.MyModel' @ parameter=parameter}" data-sly-set.myVariable="${myModel.method}"/>
</sly>
Is there a way I can access this variable in sightly code that calls this template?
The reason why I'm trying to figure this out is because we have multiple repositories, and we want to avoid having to include a Java dependency in every repo. We'd rather have a soft dependency, hence the template.
Solved! Go to Solution.
Views
Replies
Total Likes
Hi @IshaJa
I have found this https://gist.github.com/dlh3/248aa56ba7301f65e29f435c7cb03de0 which can help you in a way.
Basically, you are setting some value on calling template and then after calling the template, you need to access the set variable in main HTL.
Please go through https://gist.github.com/dlh3/248aa56ba7301f65e29f435c7cb03de0 and on high level the approach is:
1. You can call template and whithin template, you use RequestAttributesHelper.java to save the values with key and value form in Request Attributes.
2. with in main HTL after calling template, you can now again use RequestAttributesHelper.java using data-sly-use to get the value using its key.
3. Value will be accessible as it is now part of the SlingHTtpServletRequest and hence is accessible everywhere once set.
Hope it helps!
Thanks,
nupur
You can access the variable set in aem sightly as explained on https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/how-to-declare-a-variable-... but not sure if it will works in your case like sharing it among different repositories
Hi @DPrakashRaj, my question was how to access a variable that is set in a template from Sightly code that references that template. I've tried with both data-sly-test and data-sly-set, and while I can access it within the template, I cannot seem to access it in code that uses that template.
Have you tried Sightly Template and Call feature.
@DPrakashRaj yes I have, I showed that in my post. But the purpose of my template is not to retrieve an HTML object. it's to get a string, specifically a URL.
I can't simply data-sly-call it over and over again because that wouldn't be efficient. I want to be able to access the value that the template generates and set it to a variable.
Hi @IshaJa ,
In Adobe Experience Manager (AEM), Sightly (HTL) is designed to keep the markup and logic cleanly separated. Variables set within a data-sly-template scope are generally intended to be used only within that template. However, if you need to expose a variable from within a template to the outer context where the template is called, there are a few approaches you can consider.
One common approach is to leverage data-sly-resource to include a component that can use the model and expose its properties. This way, you can encapsulate the logic inside the component and reuse it without adding Java dependencies to multiple repositories.
Another approach involves passing values back from the template by using additional parameters. This way, you can define a parameter that the caller can use to receive the computed value.
Here's a detailed example:
In your template file (e.g., myTemplate.html), you set up the template to take an additional parameter to pass the computed value back.
<sly data-sly-template.myTemplate="${@ parameter, returnVariable=''}">
<sly data-sly-use.myModel="${'com.xxx.xxx.xxx.core.models.MyModel' @ parameter=parameter}" />
<sly data-sly-set.var="${myModel.method}" />
<sly>${returnVariable = var}</sly>
</sly>
In the calling script (e.g., caller.html), you can call the template and use the returned value.
<sly data-sly-call="${myTemplate @ parameter='someValue', returnVariable=use.returnVariable}" />
<p>Computed Value: ${returnVariable}</p>
This method allows you to create a soft dependency where the logic resides within the template, and the calling context can access the results without directly dealing with the underlying Java model. It effectively separates concerns and avoids the need to include Java dependencies in multiple repositories.
Views
Replies
Total Likes
Thanks ChatGPT
Hi @IshaJa
Yes, you can use that, this should work.
If does not then try with data-sly-test
<sly data-sly-use.myModel="${'com.xxx.xxx.xxx.core.models.MyModel' @ parameter=parameter}" data-sly-test.myVariable="${myModel.method}"/>
Hi @arunpatidar, I did try with both data-sly-test and data-sly-set, but it wasn't able to detect the variable. Got any other suggestions?
Also just to clarify, the variable is set in the template, and I need to be able to access that from files that reference that template.
Hi @IshaJa
I have found this https://gist.github.com/dlh3/248aa56ba7301f65e29f435c7cb03de0 which can help you in a way.
Basically, you are setting some value on calling template and then after calling the template, you need to access the set variable in main HTL.
Please go through https://gist.github.com/dlh3/248aa56ba7301f65e29f435c7cb03de0 and on high level the approach is:
1. You can call template and whithin template, you use RequestAttributesHelper.java to save the values with key and value form in Request Attributes.
2. with in main HTL after calling template, you can now again use RequestAttributesHelper.java using data-sly-use to get the value using its key.
3. Value will be accessible as it is now part of the SlingHTtpServletRequest and hence is accessible everywhere once set.
Hope it helps!
Thanks,
nupur
Yeah you would just keep passing down variable through templates.
<!-- card.html -->
<sly data-sly-set.variable="test"></sly>
<div data-sly-use.template="card.template.html">
<div data-sly-call="${template.template @ title=variable}"></div>
</div>
<!-- card.template.html -->
<template data-sly-template.template="${@ title}">
<h1>${title}</h1>
</template>
hope this helps.
@IshaJa Did you find the suggestion helpful? Please let us know if you require more information. Otherwise, please mark the answer as correct for posterity. If you've discovered a solution yourself, we would appreciate it if you could share it with the community. Thank you!
Views
Replies
Total Likes
Views
Likes
Replies