Hi everyone,
We have a requirement where a Content Owner / Reviewer is given the authoring URL, they should have the option to turn on annotations, enter a comment, save it and view others annotations.
We had the old forum links which speaks of this, but they are inaccessible now.
https://forums.adobe.com/thread/2325941
https://forums.adobe.com/thread/2325941#10931831
If anyone has any suggestions for this, please do share.
Thanks
Views
Replies
Total Likes
Here is document on how to use add annotations to the page
Hi @Jangra98 ,
To enable commenting and annotations for reviewers on AEM pages, you can leverage AEM's built-in annotation feature or develop a custom solution. Here's a detailed guide on how to achieve this using both approaches:
AEM provides built-in support for annotations which can be used to comment on pages. Here’s how you can enable and use this feature:
Access AEM Author Instance:
Enable Annotations in Page Editor:
Add Comments:
View and Manage Annotations:
If you need more advanced features or a custom commenting solution, you might need to develop a custom component. Here’s a high-level approach to creating a custom annotation feature:
Create a Custom Component for Annotations:
Define the Component: Create a new component in AEM for annotations, for example, /apps/your-project/components/annotations.
Component Dialog: Define a dialog for the component where users can enter their comments.
Component Script: Create the HTL (HTML Template Language) script to render the component on the page.
<!-- /apps/your-project/components/annotations/annotations.html -->
<div class="annotation-component">
<h3>Annotations</h3>
<div id="annotations-list">
<!-- Annotations will be dynamically loaded here -->
</div>
<textarea id="new-annotation" placeholder="Enter your comment"></textarea>
<button id="save-annotation">Save Comment</button>
</div>
Client-Side Javascript: Add JavaScript to handle adding, displaying, and saving comments.
// /apps/your-project/components/annotations/clientlibs/js/annotations.js
document.getElementById('save-annotation').addEventListener('click', function() {
const comment = document.getElementById('new-annotation').value;
if (comment) {
// Save the comment to the server
saveAnnotation(comment);
}
});
function saveAnnotation(comment) {
// Implement AJAX call to save the comment to a JCR node or another storage
// Example: POST request to a custom Sling servlet
}
function loadAnnotations() {
// Implement AJAX call to load comments from the server
// Example: GET request to a custom Sling servlet
}
// Load existing annotations when the page loads
loadAnnotations();
Create a Custom Sling Servlet:
Servlet to Handle CRUD Operations: Create a Sling servlet to handle saving, retrieving, and managing comments.
@Component(service = Servlet.class,
property = {
Constants.SERVICE_DESCRIPTION + "=Annotation Servlet",
"sling.servlet.methods=" + HttpConstants.METHOD_POST,
"sling.servlet.paths=" + "/bin/annotations"
})
public class AnnotationServlet extends SlingAllMethodsServlet {
@Reference
private ResourceResolverFactory resourceResolverFactory;
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
// Implement logic to save annotation
}
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
// Implement logic to get annotations
}
}
Save Annotations in JCR: Save the annotations in the JCR repository under a specific path.
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
String comment = request.getParameter("comment");
// Save the comment under a specific path in the JCR
ResourceResolver resolver = request.getResourceResolver();
Session session = resolver.adaptTo(Session.class);
try {
Node rootNode = session.getNode("/content/annotations");
Node commentNode = rootNode.addNode(UUID.randomUUID().toString(), "nt:unstructured");
commentNode.setProperty("comment", comment);
session.save();
response.getWriter().write("Comment saved");
} catch (RepositoryException e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
// Retrieve and return comments
}
Register the Component and ClientLibs:
ClientLibs Configuration: Configure client libraries to include your JavaScript and CSS files.
<!-- /apps/your-project/components/annotations/clientlibs/.content.xml -->
<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="cq:ClientLibraryFolder"
categories="[annotations]">
<js>
<fileName>annotations.js</fileName>
</js>
<css>
<fileName>annotations.css</fileName>
</css>
</jcr:root>
Include the Annotation Component on Pages:
<!-- Include the annotation component -->
<cq:include path="annotations" resourceType="your-project/components/annotations"/>
By using AEM's built-in annotations or developing a custom solution, you can enable content owners and reviewers to comment on AEM pages. The built-in feature is straightforward to use and sufficient for basic needs, while a custom solution offers greater flexibility and control over the functionality. Choose the approach that best fits your requirements.
Views
Replies
Total Likes
@Jangra98 Did you find the suggestions from users 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
Views
Likes
Replies