Expand my Community achievements bar.

Guidelines for the Responsible Use of Generative AI in the Experience Cloud Community.
SOLVED

When use data-sly-use.multifield="${resource.path}/field" getting sling error

Avatar

Level 2

I am getting below error when add the component in the AEM new page. Kindly suggest the correction, if anyone have the idea for code changes. 

 

ERROR:

org.apache.sling.api.SlingException: Cannot get DefaultSlingScript: org.apache.sling.api.SlingException: Cannot get DefaultSlingScript: org.apache.sling.api.SlingException: Cannot get DefaultSlingScript: org.apache.sling.api.SlingException: Cannot get DefaultSlingScript: No use provider could resolve identifier /***********_header/field

Cannot serve request to /content/project/path/test.html in /apps//project/path/webhelp-header/webhelp-header.html

Exception:

org.apache.sling.scripting.sightly.SightlyException: org.apache.sling.api.SlingException: Cannot get DefaultSlingScript: org.apache.sling.api.SlingException: Cannot get DefaultSlingScript: org.apache.sling.a

 

My code in html:

<div class="contentArea" id="${properties.id}">
<h1>${properties.title}</h1>
</br>
<sly data-sly-use.multifield="${resource.path}/field"/>
        <sly data-sly-list.item=${multifield.listChildren}>
<h2>${item.text}</h2>
<p>${item.termDef  @CONTEXT='html'}</p>
</sly>
</sly>
</br>
<P align="right" style="margin-right:30px"><a href="#top" TITLE="Back to top"><B>^</B></A></P>
<p>&nbsp;</p>
 
</div>

 

Topics

Topics help categorize Community content and increase your ability to discover relevant content.

1 Accepted Solution

Avatar

Correct answer by
Level 6

Hi @MohanasundaramMo 

where is the your file named field and have you create a model class for it because what i can see you are using resource.path, in Sightly refers to the absolute path of the current resource within the AEM content repository

If your component is included on a page located at /content/mysite/en/products/myproduct, then resource.path would return /content/mysite/en/products/myproduct
what i would suggest that If the script file (field) is located within the same folder as your component, use a relative path:

data-sly-use.multifield="./field" // "./" refers to the current component's folder

If you're using a Sling Model for the multifield functionality, the attribute should reference the model class path:

data-sly-use.multifield="com.your.package.FieldModel" // Replace with your actual model class path

feel free to reply if you need further clarifications.

Hope this helps!


View solution in original post

6 Replies

Avatar

Level 6

Hi @MohanasundaramMo 

AEM cannot find the script associated with the data-sly-use.multifield, In your case, it's looking for a script with the identifier /_header/field also i noticed

The data-sly-list attribute should be enclosed in double quotes.
You have nested <sly> tags, which is not necessary in this case. You can simplify it by removing the inner <sly> tag.

Check below blog to see the use case of HTL Java Use-API
https://experienceleague.adobe.com/en/docs/experience-manager-htl/content/java-use-api 

Avatar

Level 2

Hi Abhishek,

 

Thanks for the quick response.

 

After mode the changes also based on you suggestion still getting same error. i thought  "<sly data-sly-use.multifield="${resource.path}/field">" multifield need to change i am not sure how to change that. This same used some components for existing our project but all component not working with this check.

corrected code:

<sly data-sly-use.multifield="${resource.path}/field">
<sly data-sly-list.item="${multifield.listChildren}">

<a class="grayButton" data-sly-element="${!item.enableLink? 'span':'a'}" href="${item.link @Extension='html'}" >${item.button} </a>
</sly>
</sly>

 

Thanks,

Mohan

Avatar

Correct answer by
Level 6

Hi @MohanasundaramMo 

where is the your file named field and have you create a model class for it because what i can see you are using resource.path, in Sightly refers to the absolute path of the current resource within the AEM content repository

If your component is included on a page located at /content/mysite/en/products/myproduct, then resource.path would return /content/mysite/en/products/myproduct
what i would suggest that If the script file (field) is located within the same folder as your component, use a relative path:

data-sly-use.multifield="./field" // "./" refers to the current component's folder

If you're using a Sling Model for the multifield functionality, the attribute should reference the model class path:

data-sly-use.multifield="com.your.package.FieldModel" // Replace with your actual model class path

feel free to reply if you need further clarifications.

Hope this helps!


Avatar

Level 2

Thanks for suggestion. after implement new sling model changes works good.

Avatar

Community Advisor

It seems you are just trying to iterate over some composite multifield set in your component. If I have to take a guess your content structure looks something like 

componentNode
  field
    item0
    item1

So to get the multifield properties and iterate, you could possibly do something like 

<sly data-sly-list.childResource="${resource.children}">
  <sly data-sly-test="${childResource.name =='field'}" data-sly-list="${childResource.children}">
    <a class="grayButton" data-sly-element="${!item.enableLink? 'span':'a'}" href="${item.link @ extension='html'}" >${item.button} </a>
  </sly>
</sly>

Ofcourse this is just sample, you can do it better in a sling model as Abhishek suggested.
Hope this helps

Avatar

Community Advisor

To retrieve values from multiple fields, we typically use Sling Model. You can refer to the article for step-by-step instructions.

https://ms-29.com/aem/sites/fetch-multifield-values-using-sling-model