Resolving links to content items

Jan Lenoch edited this page Aug 28, 2018 · 2 revisions

Contents

  1. Content links
  2. Implementing a resolver
  3. Registering a resolver
  4. Retrieving Rich text content

Content links

Rich text elements in Kentico Cloud can contain links to other content items. For example, if you run a blog, these content item links might represent hyperlinks to other blog posts or your contact page.

Without adjusting your project, any link in a Rich text element that points to a content item will contain an empty value.

<p>Each AeroPress comes with a <a href="" data-item-id="65832c4e-8e9c-445f-a001-b9528d13dac8">pack of filters</a> included in the box.</p>

To make sure such links resolve correctly on your website, you need to complete these steps:

  1. Implement a content link URL resolver
  2. Implement a broken link URL resolver
  3. Register the resolvers within the DeliveryClient instance
  4. Retrieve content of a Rich text element

Implementing a resolver

Your content link URL resolver must implement the ContentLinkUrlResolver interface, which is a functional interface for resolving URLs to content items, with a String resolveLinkUrl(Link link) method.

Your broken link URL resolver must implement the BrokenLinkUrlResolver interface, which is a functional interface for resolving URLs to missing content items, with a String resolveBrokenLinkUrl() method.

  • ContentLinkUrlResolver – used when the linked content item is available.
  • BrokenLinkUrlResolver – used when the linked content item is not available.

When are content items available?

  • For live environment, a content item is available when published, and unavailable when deleted or unpublished.
  • For preview environment, a content item is available when it exists in the project inventory, and unavailable when deleted.
// Sample resolver implementation
public class CustomContentLinkUrlResolver implements ContentLinkUrlResolver {
    
    @Override
    String resolveLinkUrl(Link link) {
        // Resolves URLs to content items based on the 'accessory' content type
        if ("accessory".equals(link.getCodename())) {
            return String.format("/accessories/%s", link.getUrlSlug());
        }
    }
}

public class CustomBrokenContentLinkUrlResolver implements BrokenLinkUrlResolver {

    @Override
    String resolveBrokenLinkUrl() {
        // Resolves URLs to unavailable content items
        return "/404";
    }
}

Note, because both of these are functional interfaces, you can also implement these as lambdas, see Registering a resolver for examples.

When building the resolver logic, you can use the link argument in your code.

The link argument provides the following information about the linked content item:

Method Description Example
getCodename() The codename of the linked content item. aeropress_filters
getUrlSlug() The URL slug of the linked content item. The value is null if the item's content type doesn't have a URL slug element in its definition. aeropress-filters
getType() The codename of the content type of the linked content item. accessory

Registering a resolver

Once you implement the resolver, you need to register it in the DeliveryClient.

// Sets the resolver as an optional dependency of the DeliveryClient
DeliveryClient client = new DeliveryClient("975bf280-fd91-488c-994c-2f04416e5ee3"); 
client.setContentLinkUrlResolver(new CustomContentLinkUrlResolver());
client.setBrokenLinkUrlResolver(new CustomBrokenContentLinkUrlResolver());

You can also register lambdas with the DeliveryClient as the resolvers are functional interfaces.

DeliveryClient client = new DeliveryClient("975bf280-fd91-488c-994c-2f04416e5ee3"); 
client.setContentLinkUrlResolver((link) -> {
    if ("accessory".equals(link.getCodename())) {
        return String.format("/accessories/%s", link.getUrlSlug());
    }
});
client.setBrokenLinkUrlResolver(() -> "/404");

Retrieving Rich text content

Now, you can resolve links in Rich text elements by using the getString() method on the ContentItem object.

// Retrieves the 'aeropress' content item
ContentItemResponse response = client.getItem("aeropress");
ContentItem item = response.getItem();

// Retrieves text from the 'long_description' Rich text element
String description = item.getString("long_description");

The URL to the content item in the text is now correctly resolved.

<p>Each AeroPress comes with a <a href="/accessories/aeropress-filters" data-item-id="65832c4e-8e9c-445f-a001-b9528d13dac8">pack of filters</a> included in the box.</p>

Analytics

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.