Resolving links to content items

Aaron Collier edited this page Dec 18, 2018 · 14 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.
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.