volume_up

A critical vulnerability was discovered in React Server Components (Next.js). Our systems remain protected but we advise to update packages to newest version. Learn More

volume_up

A critical vulnerability was discovered in React Server Components (Next.js). Our systems remain protected but we advise to update packages to newest version. Learn More

Multiselect Category Picker for 7.5

Hi!

Upgrade from cms 6r2 to 7.9.2

Im actually looking for a category picker that gets child categories from a specific Category node?

Needs to be a multi select. Listing for example News Categories or Image Categories and so on...

Its helping the editors since we do have a lot of Categories.

When Im using a legacy Category Picker. It does not work when a new page is created.
Throws a [JsonSerializationException: Unexpected initial token 'Null' when populating object. Expected JSON object or array. Path '', line 1, position 4.]

[BackingType(typeof(CategoryPicker))]
[UIHint(EPiServer.Web.UIHint.Legacy)]

#121222
May 05, 2015 9:24
Vote:

Hi!

You can create a custom attribute and replace the built in EditorDescriptor for the CategoryList type. Here's a sample:

Custom attribute:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class CategorySelectionAttribute : Attribute
{
    public bool Multiple { get; set; }
    public int RootCategoryId { get; set; }
    public string RootCategoryName { get; set; }

    public CategorySelectionAttribute()
    {
        Multiple = true;
    }

    public int GetRootCategoryId()
    {
        if (RootCategoryId > 0)
        {
            return RootCategoryId;
        }

        if (!string.IsNullOrEmpty(RootCategoryName))
        {
            var category = Category.Find(RootCategoryName);

            if (category != null)
            {
                return category.ID;
            }
        }

        return Category.GetRoot().ID;
    }
}


Editor descriptor:

[EditorDescriptorRegistration(TargetType = typeof(CategoryList), EditorDescriptorBehavior = EditorDescriptorBehavior.OverrideDefault)]
public class CustomCategoryListEditorDescriptor : EPiServer.Cms.Shell.UI.ObjectEditing.EditorDescriptors.CategoryListEditorDescriptor
{
    public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable<Attribute> attributes)
    {
        base.ModifyMetadata(metadata, attributes);
        var categorySelectionAttribute = attributes.OfType<CategorySelectionAttribute>().FirstOrDefault();

        if (categorySelectionAttribute != null)
        {
            metadata.EditorConfiguration["multiple"] = categorySelectionAttribute.Multiple;
            metadata.EditorConfiguration["root"] = categorySelectionAttribute.GetRootCategoryId();
        }
    }
}


Then you can decorate your content type property like this:

[CategorySelection(RootCategoryId = 123)]
public virtual CategoryList MyCategories { get; set; }


Or like this:

[CategorySelection(RootCategoryName = "MyCategoryName")]
public virtual CategoryList MyCategories { get; set; }
#121260
Edited, May 05, 2015 21:16
<p>Neat and great! thanks =)</p>
#121270
May 06, 2015 8:10
error This topic was created over six months ago and has been resolved. If you have a similar question, please create a new topic and refer to this one.
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.