0

我正在尝试为块列表和使用 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 中可用的所有块类型列表以及页面中的用法

4

2 回答 2

1

您需要遍历所有内容类型,然后遍历所有这些内容类型的用法。我在 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 - 我怎样才能知道一个块是否正在任何已发布的页面上使用?

于 2019-12-24T15:00:52.590 回答
0

如果需要获取 Content Types,可以使用 IContentRespository List() 方法。

要获取内容的实际实例,您可以使用 IContentModelUsage ListContentOfContentType 方法。这将抓取所有实例。

var usages = contentModelUsage.ListContentOfContentType(contentType);

Episerver 的新 App Marketplace 中还有一个免费的应用程序,我认为它的功能类似于您想要查看的功能。

编辑:我看到你用 Episerver 8 标记了这个,并且该应用程序只有 11 及更高版本,所以这可能不适合你。

于 2019-07-03T14:48:48.410 回答