以编程方式获取所有Episerver块/类型/用法

时间:2019-07-03 09:41:28

标签: episerver episerver-8

我正在尝试为“阻止”列表和使用情况int页面创建自定义报告。因此,我需要获取所有可用的块类型列表以及页面中的用法/链接。

我尝试了下面的代码,但这需要使用Block作为输入来获取用法。

        var repository = ServiceLocator.Current.GetInstance<IContentRepository>();
            var contentTypeRepository = ServiceLocator.Current.GetInstance<IContentTypeRepository>();
            var contentModelUsage = ServiceLocator.Current.GetInstance<IContentModelUsage>();
            var myblockType = contentTypeRepository.Load<InputBlock>();
            List<ContentReference> myblockTypeReferences = contentModelUsage.ListContentOfContentType(myblockType).Select(x => x.ContentLink.ToReferenceWithoutVersion()).Distinct().ToList();
            InputBlock blockType;
            foreach (ContentReference cref in myblockTypeReferences)
            {
                repository.TryGet<InputBlock>(cref, out blockType);
                model.lstBlocks.Add(blockType);                    
            }

我希望不提供输入块,并获得Episerver中可用块类型的所有列表以及页面中的用法

2 个答案:

答案 0 :(得分:0)

如果需要获取内容类型,则可以使用IContentRespository List()方法。

要获取内容的实际实例,可以使用IContentModelUsage ListContentOfContentType方法。那将抢占所有实例。

var usages = contentModelUsage.ListContentOfContentType(contentType);

Episerver的新App Marketplace中还有一个免费的应用程序,我认为它的功能类似于您想要check it out所追求的功能。

编辑:我看到您使用Episerver 8对此进行了标记,并且该应用程序仅适用于11及更高版本,因此可能对您不起作用。

答案 1 :(得分:0)

您将需要遍历所有内容类型,然后遍历所有这些内容类型的用法。我在Epi 11中使用了以下功能

    public IList<IContent> GetUnusedBlocks()
    {
        var contentTypeRepository = ServiceLocator.Current.GetInstance<IContentTypeRepository>();
        var contentModelUsage = ServiceLocator.Current.GetInstance<IContentModelUsage>();
        var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
        var linkRepository = ServiceLocator.Current.GetInstance<IContentSoftLinkRepository>();

        var unusedBlocks = new List<IContent>();

        // Loop through all content types
        foreach (var contentType in contentTypeRepository.List().Where(content => content.Name.ToLower().Contains("block")))
        {
            // Find usages of the content type in question
            IList<ContentUsage> contentUsages = contentModelUsage.ListContentOfContentType(contentType);

            // Get usages including versions
            IList<IContent> blocks = contentUsages.Select(contentUsage =>
                contentUsage.ContentLink.ToReferenceWithoutVersion())
                .Distinct()
                .Select(contentReference => contentRepository.Get<IContent>(contentReference))
                .ToList();

            // Find blocks that are being referenced
            foreach (IContent block in blocks)
            {
                var referencingContentLinks = linkRepository.Load(block.ContentLink, true)
                    .Where(link =>
                            link.SoftLinkType == ReferenceType.PageLinkReference &&
                            !ContentReference.IsNullOrEmpty(link.OwnerContentLink))
                    .Select(link => link.OwnerContentLink);

                if (!referencingContentLinks.Any())
                {
                    unusedBlocks.Add(block);
                }
            }
        }
        return unusedBlocks;
    }

参考:EpiServer - How can I find out if a block is being used on any published page?