Tuesday 27 June 2017

Create & Access the content fragment programmatically

Content Fragment helps to create content without referring a page. This fragments can be used to showcase the content across various channels.
You can read multiple blogs on the same here.
AEM Leading to head less CMS?
AEM Content Fragment output as JSON
AEM 6.3 Content Fragments Basics
How to create a Content Fragment? step by step tutorial
Create & Access the content fragment programmatically

Programmatic creation, access, modification of Content Fragment

To create a content fragment, we need 'create' API reference from 'com.adobe.cq.dam.cfm.
ContentFragmentManager'.

Once we have the import, use below code to create a content fragment programmatizally.

//reference the Content Fragment Manager
@Reference
private ContentFragmentManager fragmentManager;

private void myCreateFun() {
    /** fragmentManager.create helps to create a content fragment
        parent - The location where the content fragment should be created (for eg. "/content/dam/fragments")
        template - the content fragment template to refer while creating the new fragment
        my-test-fragment - name of the fragment
        My Test Fragment - title of the fragment **/
     
    ContentFragment myFragment = fragmentManager.create(parent, template, "my-test-fragment", "My Test Fragment");
 
}

Programmatically accessing a content fragment

We need 'com.adobe.cq.dam.cfm.ContentFragment' API reference to access a content fragment

//Get the resource of content fragment as below.
Resource fragmentResource = resourceResolver.getResource("/content/dam/fragments/my-test-fragment");

//Adapt it to a fragment resource
if (fragmentResource != null) {
    ContentFragment fragment = fragmentResource.adaptTo(ContentFragment.class);
    // the resource is now accessible through the API
}


Programmatically accessing elements from Content Fragment

Iterator<ContentElement> elements = fragment.getElements();
while (elements.hasNext()){
ContentElement element = elements.next();
//your action on element
}

Programmatically Accessing Content Fragment metadata:

Map<String, Object> getMetaData();


Programmatically Accessing Content Fragment variations:

Iterator<ContentVariation> variations = element.getVariations();

while(variations.hasNext()){
ContentVariations variation = variations.next();
//do the variation process here
}

Programmatically Accessing  Content Fragment elements/variations by its name

ContentElement title = fragment.getElement("title");
ContentVariation mobileAppVariation = title.getVariation("mobile-app");

Programmatically Accessing Content:

String content = element.getContent();
String contentType = element.getContentType();

Programmatically Modifying Content Fragment content
element.setContent("Content", "text/plain")

Programmatically Modifying Content Fragment metadata
void setMetaData(String name, Object value) throws ContentFragmetException

YouTube demo videos for Content Fragments:
         AEM 6.3 Content Fragments Basics
         Content Fragments AEM
         View Content fragment output in aem

Thursday 22 June 2017

AEM Content Fragment output as JSON

AEM Content Fragments can be accessed through JSON file URL's. This helps to verify the data while authoring.

To ensure the JSON format is enabled follow below steps:

To enable the content fragment JSON, we need to enable /system/console/configurations > AEM Content Service Feature Flag > (Select) Enable AEM Content Services check box.


YouTube demo videos for Content Fragments:
         AEM 6.3 Content Fragments Basics
         Content Fragments AEM
         View Content fragment output in aem

Say we have created 'this-is-my-frag' Content Fragment,

We can see the complete content using infinity json as url.
http://localhost:4502/content/dam/this-is-my-frag.infinity.json

If we want to generate its output as caas way below url helps.
http://localhost:4502/content/dam/this-is-my-frag/_jcr_content.caas.json

{
    "_children": [{
        "name": "jcr:content",
        "title": "This is my frag",
        "path": "/content/dam/this-is-my-frag/jcr:content",
        "type": "dam:AssetContent",
        "href": "http://localhost:4502/content/dam/this-is-my-frag/_jcr_content.caas.json"
    }]
}

Now when we load the children from above _jcr_content.caas.json

{
    "title": "This is my frag",
    "dam:assetState": "processed",
    "description": "Hello there",
    "contentFragment": true,
    "lastFragmentSave": "Wed Jun 21 2017 15:29:39 GMT+0530",
    "dam:relativePath": "this-is-my-frag",
    "_children": [{
        "name": "renditions",
        "path": "/content/dam/this-is-my-frag/jcr:content/renditions",
        "type": "nt:folder",
        "href": "http://localhost:4502/content/dam/this-is-my-frag/_jcr_content/renditions.caas.json"
    }, {
        "name": "related",
        "path": "/content/dam/this-is-my-frag/jcr:content/related",
        "type": "nt:unstructured",
        "href": "http://localhost:4502/content/dam/this-is-my-frag/_jcr_content/related.caas.json"
    }, {
        "name": "associated",
        "path": "/content/dam/this-is-my-frag/jcr:content/associated",
        "type": "sling/collection",
        "href": "http://localhost:4502/content/dam/this-is-my-frag/_jcr_content/associated.caas.json"
    }, {
        "name": "metadata",
        "path": "/content/dam/this-is-my-frag/jcr:content/metadata",
        "type": "nt:unstructured",
        "href": "http://localhost:4502/content/dam/this-is-my-frag/_jcr_content/metadata.caas.json"
    }, {
        "name": "model",
        "title": "Simple Fragment",
        "path": "/content/dam/this-is-my-frag/jcr:content/model",
        "type": "nt:unstructured",
        "href": "http://localhost:4502/content/dam/this-is-my-frag/_jcr_content/model.caas.json"
    }]
}

Now we can iterate through the children in above json and get corresponding renditions, related, associated, metadata, model

For eg: model gives below json
{
    "title": "Simple Fragment",
    "version": 2,
    "description": "A simple fragment, containing one single element and no predefined variations",
    "precreateElements": true,
    "_children": [{
        "name": "elements",
        "path": "/content/dam/this-is-my-frag/jcr:content/model/elements",
        "type": "nt:unstructured",
        "href": "http://localhost:4502/content/dam/this-is-my-frag/_jcr_content/model/elements.caas.json"
    }, {
        "name": "variations",
        "path": "/content/dam/this-is-my-frag/jcr:content/model/variations",
        "type": "nt:unstructured",
        "href": "http://localhost:4502/content/dam/this-is-my-frag/_jcr_content/model/variations.caas.json"
    }]
}

where the variations from above link loads

{
    "_children": [{
        "name": "variation2",
        "title": "variation2",
        "path": "/content/dam/this-is-my-frag/jcr:content/model/variations/variation2",
        "type": "nt:unstructured",
        "href": "http://localhost:4502/content/dam/this-is-my-frag/_jcr_content/model/variations/variation2.caas.json"
    }]
}

This way we can iterate through the content fragment JSON.

https://www.youtube.com/channel/UCbDTGaDneAbj_RCX27VE4cA/videos



Subscribe Our YouTube Channel Here.


Related Posts

AEM Leading to head less CMS?
AEM Content Fragment output as JSON
AEM 6.3 Content Fragments Basics
How to create a Content Fragment? step by step tutorial
Create & Access the content fragment programmatically


AEM 6.3 Content Fragments Basics


AEM 6.3 Supports Content Fragments to deliver content as a service.
Experience Fragments enables Experience-as-a-Service, where the CMS controls partial-page rendering, or Hybrid CMS, solutions that let you push your content to any channel — just as headless systems do — using a delivery tier that connects all those channels and shares data between them.

What is a content fragment?

  • Contains one or more Content Elements,
  • Content can have one or more  Variations.
  • Content fragment can be created based on templates which define the structure.
  • Content fragments are a type of new assets.
  • Content Fragment use existing Assets functionality & fully integrated with assets.
  • Content Fragments are well tied with Translation workflows, metadata schema.
         YouTube demo videos for Content Fragments:
         AEM 6.3 Content Fragments Basics
         Content Fragments AEM
         View Content fragment output in aem

A content fragment groups renditions, related items, associated items, metadata, model, elements, variations etc in a single Content.



Can we add a Content Fragment to a page?

Yes it can be added to a page using default content fragment component as other components.

Which is the API service for Content Fragments?
Latest AEM provides server side API com.adobe.cq.dam.cfm to programmatically interact with Content Fragments.



Related Posts

AEM Leading to head less CMS?
AEM Content Fragment output as JSON
AEM 6.3 Content Fragments Basics
How to create a Content Fragment? step by step tutorial
Create & Access the content fragment programmatically







AEM Leading to head less CMS?

Headless 
Now a days many goes with headless CMS. Here the content capabilities of a CMS are not used for rendering; the rendering output could be through any channel like websites, print, campaign or mobile apps. From Beginning AEM's one of the core module Apache Sling, allows to access the contents of the JCR through HTTP requests.

The DefaultGetServlet helps to render content in JSON format by using the json extension.
For eg: /content/site/en/page.infinity.json

In addition to the OOTB features, one can create Sling Servlet to expose content which ever format we want.



The latest AEM features:
AEM 6.3 is built with Content as a Service (CaaS) feature. Now AEM provides editor an aggregated view of content within the JCR called Content Fragments. This content can be assets, content fragments or pages, intended for external consumption.

Caas  = > content as a service
The CaaS way suggest that a CMS should only be used for managing content, not for controlling its presentation.

Caas features

  • The CMS just hosts the content.
  • Content structure here is highly customizable, which can be managed through a web framework.
  • The content can be available through RESTful API in formats like JSON/xml.

Advantages of Caas

  • Presentation is decoupled from content. The delivery channel could be websites, campaigns, print, mobile apps, and other devices and channels.
  • Here content supports different variations which could be varying for devices. Content author is not aware of the display part of the system.
  • Here the data is content centric and not page centric.


Some use cases of CaaS (scenarios when a content fragment to be used?)

Multi-channel approach: The same content can be used to render for websites or mobile which makes the system more flexible.
Mobile apps content backend: Real world want more latest content on mobile devices. This approach helps for pulling data from a live content system supporte by Caas.
MVC Front end support : Angular, ReactJS can be used to provide rich front end. Also the CMS front end has restrictions based on the architecture of CMS. Thus Caas model supports any MVC front end frame work.
Easy integration with existing services : There are cases where we need to use/ pull existing content to new system. Using the Caas API this is quite easy.

YouTube demo videos for Content Fragments:
AEM 6.3 Content Fragments Basics
Content Fragments AEM
View Content fragment output in aem

Related Posts

AEM Leading to head less CMS?
AEM Content Fragment output as JSON
AEM 6.3 Content Fragments Basics
How to create a Content Fragment? step by step tutorial
Create & Access the content fragment programmatically

Wednesday 21 June 2017

Translate content in AEM for multi lingual sites


Translate content in AEM for multi lingual sites
AEM is widely accepted for its capability of handling regional sites using its multi site management system. On completion of creating a site, it can be converted into various language copies using various methods. A page content, asset, user generated content can be converted into its language variations to effectively utilize the multi lingual web site capability of AEM. AEM provides translation service provider interfaces to translate the content.



The content can be translated into language version using either Machine options or Human methods.
Machine Translation: In this case the service quickly converts the content into its language version.
Human Translation: Professional translators are involved to convert the content.

Below given the core steps to translate the content,


  • Create translation integration frame work configurations.
  • Connect AEM with translation service provider.
  • Link the language master framework configurations with translation service.
  • Identify the type of content to translate.
  • Creating the root pages of language copies.
  • Prepare the content for translation by authoring master.
  • Create projects to collect the content to translate and to prepare the translation.
  • Use the created translation project to manage the content translation process.


AEM has constantly worked to improve the language translation process more easily.
The latest AEM version's multilingual enhancements Streamline localization efforts with the ability to translate a source file along with derived file.

There are new options to translate linked assets within InDesign files, Content Fragments.
AEM by default provides a translator tool to manage English strings to their language versions.

The console for managing the various translations of texts is available at http://<hostname>:<port-number>/libs/cq/i18n/translator.html
You can see the translator lists the texts with its various language translations listed.
Options like search, filter and edit the English and translated texts are provided here.

AEM also provides XML based language conversions(Using Translation ApI's), we can also export dictionaries to XLIFF(XML Localization Interchange File Format) format for translating, then import the translations back into the dictionaries.

Thursday 8 June 2017

AEM Content Solutions

Have you thought the ways we can implement a website in AEM? I am going to discuss some of the approaches here. Do let me know your thoughts through the post comments area.

1) AEM - The traditional way:

Here AEM is used as a pure solution. All the content and data are fed into AEM. The pages are authored in AEM including the DAM assets. In this scenario, there is no integration of any type of application with AEM. Here rendering is done through AEM.

2) AEM - As Hybrid Approach:

This is the most common way. Here the pages, assets are fed into AEM through authoring. Integrations like data access, social integrations are handled through web service calls. In this scenario there is always an integration layer, which could be used for search, data base authentication etc. Here rendering is through AEM.

3) AEM - As web content Model

Not a common way of implementing  projects in industry, but yet to analyse the abundant capabilities. Here AEM is used as a data storage layer. The data gets into AEM from various sources like DB, third party data etc. Once the data is available in AEM, it can be made available to other systems through a different user interface technology other than AEM provided. Here rendering is through different technology. AEM makes the data available in a generalised way(Either JSON or XML formats) to the front end here.

How do we make the AEM content to third party applications?

The usual way of making AEM content to third party application is through a web service layer. We can utilise the sling API's to invoke the specific component or page and create required custom format JSON and pass it to service layer.

AEM contents are page oriented. How do we make component level information?
Have you heard of content fragments? The latest AEM provide content fragments - makes the Content As A Service (CaaS) way of implementation. These are components like structure which are not bonded to a specific page. We can author a content data with its metadata. Content fragments can even be transformed to its language versions. Watch this place for more details.

Thursday 1 June 2017

Sling models - Adobe Recommended Way Of Object Binding

Sling Models
Sling Models are widely used with in AEM now. They are simple POJO classes(support both class and interface) mapped automatically with Sling Objects( resources, also request objects). Example use cases in AEM are they allow us to access jcr node property values directly into java classes. Also helps to wire the OSGi Services. Sling Models uses annotations & annotations Mark a class as adaptable via Sling Models.


Why sling models:

  • Adobe recommended Sling Models as the best practice.
  • Provides convenient injection annotations for data retrieval.
  • Pure POJO classes. Entirely annotation driven.
  • Less code to write & easy to extend from other Sling Models.
  • Quite simple setup for unit testing.
  • Flexibility of smooth integration with JSP or sightly.


Two major differences with WCM Use class and Sling Model

  1. WCM Use classes expect you to overwrite the activate() method, But Sling Models provides @PostConstruct annotation, where the init method will be called.
  2. ECM Use classes use Felix annotation @Reference to reference the OSGI service, whereas in Sling Models, you will use @Inject or @OSGiService


Below given the complete list of annotation references


  • @Model - declares a model class or interface
  • @Inject - marks a field or method as injectable
  • @Named - declare a name for the injection (otherwise, defaults based on field or method name).
  • @Optional - marks a field or method injection as optional
  • @Source - explictly tie an injected field or method to a particular injector (by name). Can also be on other annotations.
  • @Filter - an OSGi service filter
  • @PostConstruct - methods to call upon model option creation (only for model classes)
  • @Via - use a JavaBean property of the adaptable as the source of the injection
  • @Default - set default values for a field or method
  • @Path - only used together with the resource-path injector to specify the path of a resource


While working with AEM latest versions, do we need any update for Sling models?
You can check the version of Sling Model from AEM Console.



If you are working with AEM 6.2, download the latest Sling Models API and Implementation bundles from Sling and then manually upload them to AEM bundles console, because AEM 6.2 has Sling Models API and Implementation version 1.2. If you are workig with AEM 6.3 you dont have to do this step.

In future when Sling new major release available, you can still manually import them into your 6.3 server.( Ensure to check Adobe’s documentation for additional dependency package to be installed.)

Sample Code: Sling Model Vs Sightly

// @Model declares a model class or interface
@Model(adaptables = Resource.class) public class MyCustomClass {
// @Inject marks a field or method as injectable
// age can be empty
@Inject @Optional
private String age;
// we expected always an firstName-property
@Inject
private String firstName;
// OSGi Externalizer Service
@Inject
private Externalizer externalizer;

    // Executed after the class is created
    @PostConstruct  protected void init() {
     //init here  
     }

 }

How sightly calls the Sling Model class

<div data-sly-use.customClass=customsite.customproject.MyCustomClass>
${ customClass.firstName }
</div>