Skip to content

Resolving links to content items

Ondřej Chrastina edited this page Apr 2, 2019 · 15 revisions

Contents

  1. Contents
  2. Content links
  3. Implementing a resolver
  4. Registering a resolver
  5. 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 application, 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. Register the resolver through the DeliveryClientBuilder.
  3. Retrieve content of a Rich text element.

Implementing a resolver

Your resolver must implement the IContentLinkUrlResolver interface, which defines two methods for resolving URLs to content items, ResolveLinkUrl and ResolveBrokenLinkUrl.

  • ResolveLinkUrl – used when the linked content item is available.
  • ResolveBrokenLinkUrl – 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, and unavailable when deleted.
// Sample resolver implementation
public class CustomContentLinkUrlResolver : IContentLinkUrlResolver
{
    public string ResolveLinkUrl(ContentLink link)
    {
        // Resolves URLs to content items based on the 'accessory' content type
        if (link.ContentTypeCodename == "accessory") {
            return $"/accessories/{link.UrlSlug}";
        }

        // TODO: Add the rest of the resolver logic
    }

    public string ResolveBrokenLinkUrl()
    {
        // Resolves URLs to unavailable content items
        return "/404";
    }
}

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

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

Property Description Example
Id The identifier of the linked content item. 65832c4e-8e9c-445f-a001-b9528d13dac8
Codename The codename of the linked content item. aeropress_filters
UrlSlug 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
ContentTypeCodename The content type codename of the linked content item. accessory

Registering a resolver

Once you implement the link resolver, you need to either register it within IServiceCollection

// Registers the resolver in IServiceCollection
// or another framework you are using for dependency injection
services
    .AddSingleton<IContentLinkUrlResolver, CustomContentLinkUrlResolver>()
    .AddDeliveryClient(Configuration);

or within the IDeliveryClient instance through the DeliveryClientBuilder class

// Sets the resolver as an optional dependency of the `IDeliveryClient` instance
IDeliveryClient client = DeliveryClientBuilder
    .WithProjectId("975bf280-fd91-488c-994c-2f04416e5ee3")
    .WithContentLinkUrlResolver(new CustomContentLinkUrlResolver())
    .Build();

Retrieving Rich text content

With the client instance set up, you can resolve links in Rich text elements by using the GetString method on the ContentItem object.

// Retrieves the 'aeropress' content item
DeliveryItemResponse response = await client.GetItemAsync("aeropress");
ContentItem item = response.Item;

// 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 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.