Expand my Community achievements bar.

SOLVED

Inclusion of content fragment path along with model json

Avatar

Level 4

Hi All,

As of now AEM OOB model.json expose content fragment elements but not the fragment path. We have a requirement to expose the fragment path along with the model.json as part of our headless CMS requirement. I found that the Exporter contains the fragmentPath variable but not getter for that.

aem-core-wcm-components/ContentFragmentImpl.java at master · adobe/aem-core-wcm-components · GitHub

As this is inside internal package structure no idea on how to override this. What would be the solution to achieve the additional fragmentPath property?

 

Thanks

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

You can extend any core component or customize functionality.

Try like this: 

Step 1: Create an Interface to extend ContentFragment class and add a method to return path

Step 2: Implement the class , use Delegation

 

==== Declare an Interface to ContentFragment Extention Class =========


import com.adobe.cq.wcm.core.components.internal.models.v1.contentfragment;

/**
* An extension to the AEM Core Component ContentFragment
*/
public interface ContentFragmentExtention extends ContentFragment {

default String contentFragmentPath() {
throw new UnsupportedOperationException();
}

}

 

 

Step2:

 

==== Implementation your interface ContentFragmentExtention / Class =========

/**
* An extension to the AEM Core Component ContentFragment
*/
@Model(
adaptables = SlingHttpServletRequest.class,
adapters = { ContentFragmentExtention.class, ContentFragment.class, ComponentExporter.class },
resourceType = ContentFragmentExtentionImpl.RESOURCE_TYPE
)
@exporter(
name = ExporterConstants.SLING_MODEL_EXPORTER_NAME,
extensions = ExporterConstants.SLING_MODEL_EXTENSION
)
public class ContentFragmentExtentionImpl implements ContentFragmentExtention {

public static final String RESOURCE_TYPE = "<path to your proxy ContentFragment path> /apps/project/proxy/componetns/contentfragment";

@Deleted Account @Via(type = ResourceSuperType.class)
@Delegate(excludes = DelegationExclusion.class)
private ContentFragment contentFragment;


@ValueMapValue
private String contentFragmentPath; // This is a new property that we are introducing


/**
* implement your method
*
* @Return <your path>
*/
@Override
public String contentFragmentPath() {
<< Logic to get the path >>
return <Path to contentfragment>; //contentFragmentPath
}


}

View solution in original post

4 Replies

Avatar

Correct answer by
Community Advisor

You can extend any core component or customize functionality.

Try like this: 

Step 1: Create an Interface to extend ContentFragment class and add a method to return path

Step 2: Implement the class , use Delegation

 

==== Declare an Interface to ContentFragment Extention Class =========


import com.adobe.cq.wcm.core.components.internal.models.v1.contentfragment;

/**
* An extension to the AEM Core Component ContentFragment
*/
public interface ContentFragmentExtention extends ContentFragment {

default String contentFragmentPath() {
throw new UnsupportedOperationException();
}

}

 

 

Step2:

 

==== Implementation your interface ContentFragmentExtention / Class =========

/**
* An extension to the AEM Core Component ContentFragment
*/
@Model(
adaptables = SlingHttpServletRequest.class,
adapters = { ContentFragmentExtention.class, ContentFragment.class, ComponentExporter.class },
resourceType = ContentFragmentExtentionImpl.RESOURCE_TYPE
)
@exporter(
name = ExporterConstants.SLING_MODEL_EXPORTER_NAME,
extensions = ExporterConstants.SLING_MODEL_EXTENSION
)
public class ContentFragmentExtentionImpl implements ContentFragmentExtention {

public static final String RESOURCE_TYPE = "<path to your proxy ContentFragment path> /apps/project/proxy/componetns/contentfragment";

@Deleted Account @Via(type = ResourceSuperType.class)
@Delegate(excludes = DelegationExclusion.class)
private ContentFragment contentFragment;


@ValueMapValue
private String contentFragmentPath; // This is a new property that we are introducing


/**
* implement your method
*
* @Return <your path>
*/
@Override
public String contentFragmentPath() {
<< Logic to get the path >>
return <Path to contentfragment>; //contentFragmentPath
}


}

Avatar

Level 4
Thanks so much. I'll try to see if it is working. Thanks again

Avatar

Community Advisor

In case if you are looking for a custom solution https://aemlab.blogspot.com/2019/07/get-json-response-of-aem-page.html

Note: I did this as part of PoC, so not a production-ready code.



Arun Patidar

Avatar

Level 4
Thanks for the response, really appreciate but customizing existing model json is what I am looking for.