Sending Allowed Children Notification

Example of how to use a SendingAllowedChildren Notification

The SendingAllowedChildrenNotification enables you to manipulate the Document Types that will be shown in the create menu when adding new content in the backoffice.

Usage

With the example below we can ensure that a Document Type cannot be selected if the type already exists in the Content tree.

using System.Web;
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Notifications;

namespace Umbraco.Docs.Samples.Web.Notifications;

public class SendingAllowedChildrenNotificationHandler : INotificationHandler<SendingAllowedChildrenNotification>
{
    public void Handle(SendingAllowedChildrenNotification notification)
    {
        const string contentIdKey = "contentId";

            // Try get the id from the content item in the backoffice
            var queryStringCollection = HttpUtility.ParseQueryString(notification.UmbracoContext.OriginalRequestUrl.Query);

        if (!queryStringCollection.ContainsKey(contentIdKey))
        {
            return;
        }

        var contentId = queryStringCollection[contentIdKey].TryConvertTo<int>().ResultOr(-1);

        if (contentId == -1)
        {
            return;
        }

        var content = notification.UmbracoContext.Content?.GetById(true, contentId);

        if (content is null)
        {
            return;
        }

        // Allowed children as configured in the backoffice
        var allowedChildren = notification.Children.ToList();

        if (content.ChildrenForAllCultures is not null)
        {
            // Get all children of current page
            var childNodes = content.ChildrenForAllCultures.ToList();

            // If there is a Settings page already created, then don't allow it anymore
            // You can also use the ModelTypeAlias property from your PublishedModel for comparison,
            // like Settings.ModelTypeAlias if you have set models builder to generate SourceCode models
            if (childNodes.Any(x => x.ContentType.Alias == "settings"))
            {
                allowedChildren.RemoveAll(x => x.Alias == "settings");
            }
        }

        // Update the allowed children
        notification.Children = allowedChildren;
    }
}

You also need to register this notification handler. You can achieve this by updating the Program class like:

builder.CreateUmbracoBuilder()
    .AddBackOffice()
    .AddWebsite()
    .AddDeliveryApi()
    .AddComposers()
    .AddNotificationHandler<SendingAllowedChildrenNotification, SendingAllowedChildrenNotificationHandler>()
    .Build();

For more information about registering notifications read the Registering notification handlers article.

Last updated