mcpField
U
umbraco-dynamic-root

umbraco-dynamic-root

github.com/umbraco开发27391 次安装6 周前更新
代码仓库

关于 umbraco-dynamic-root

umbraco-dynamic-root 是用于开发 Umbraco Dynamic Root 扩展的技能,面向配置内容选择器的开发者。它指导查阅最新文档、定义起点与查询步骤并生成清单;实际查询逻辑还需后端 C# 实现。

主要功能

  1. 01Dynamic Root 起点扩展指导
  2. 02查询步骤扩展指导
  3. 03清单生成流程
  4. 04后端 C# 实现示例

适用场景

  1. 01将当前页面或站点根设为选择器起点
  2. 02配置查找祖先节点等查询步骤
  3. 03生成 Umbraco 扩展清单

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/umbraco/umbraco-cms-backoffice-skills --skill umbraco-dynamic-root

安装后在 Claude Code 中输入/umbraco-dynamic-root确认已加载。

详细介绍

Umbraco 动态根

这是什么?

动态根允许内容选择器使用动态确定的起始点(原点),而不是固定节点。它包含两种扩展类型:

  • 动态根原点:定义选择器的起点(例如,当前页面、站点根节点、最近的指定类型祖先)
  • 动态根查询步骤:定义从原点开始的导航步骤(例如,查找最近的祖先、获取指定类型的子节点)

借助这些扩展,可以灵活配置内容选择器,使其根据上下文进行调整。

文档

实施前,务必获取最新文档:

工作流

  1. 获取文档 - 对上述 URL 使用 WebFetch
  2. 提问 - 起始点逻辑是什么?需要哪些查询步骤?
  3. 生成文件 - 根据最新文档创建清单
  4. 说明 - 展示创建的内容以及测试方法

最小示例

动态根原点清单
import type { ManifestDynamicRootOrigin } from '@umbraco-cms/backoffice/extension-registry';

const manifest: ManifestDynamicRootOrigin = {
  type: 'dynamicRootOrigin',
  alias: 'My.DynamicRootOrigin.SiteRoot',
  name: 'Site Root Origin',
  meta: {
    originAlias: 'SiteRoot',
    label: 'Site Root',
    description: 'Start from the root of the current site',
    icon: 'icon-home',
  },
};

export const manifests = [manifest];
动态根查询步骤清单
import type { ManifestDynamicRootQueryStep } from '@umbraco-cms/backoffice/extension-registry';

const manifest: ManifestDynamicRootQueryStep = {
  type: 'dynamicRootQueryStep',
  alias: 'My.DynamicRootQueryStep.NearestBlog',
  name: 'Nearest Blog Query Step',
  meta: {
    queryStepAlias: 'NearestBlog',
    label: 'Nearest Blog',
    description: 'Find the nearest blog ancestor',
    icon: 'icon-article',
  },
};

export const manifests = [manifest];
多个原点和步骤
import type { ManifestDynamicRootOrigin, ManifestDynamicRootQueryStep } from '@umbraco-cms/backoffice/extension-registry';

const originManifests: ManifestDynamicRootOrigin[] = [
  {
    type: 'dynamicRootOrigin',
    alias: 'My.DynamicRootOrigin.CurrentPage',
    name: 'Current Page Origin',
    meta: {
      originAlias: 'CurrentPage',
      label: 'Current Page',
      description: 'Start from the page being edited',
      icon: 'icon-document',
    },
  },
  {
    type: 'dynamicRootOrigin',
    alias: 'My.DynamicRootOrigin.Parent',
    name: 'Parent Page Origin',
    meta: {
      originAlias: 'Parent',
      label: 'Parent Page',
      description: 'Start from the parent of current page',
      icon: 'icon-arrow-up',
    },
  },
];

const queryStepManifests: ManifestDynamicRootQueryStep[] = [
  {
    type: 'dynamicRootQueryStep',
    alias: 'My.DynamicRootQueryStep.Children',
    name: 'Children Query Step',
    meta: {
      queryStepAlias: 'Children',
      label: 'Children',
      description: 'Get all child pages',
      icon: 'icon-tree',
    },
  },
  {
    type: 'dynamicRootQueryStep',
    alias: 'My.DynamicRootQueryStep.Ancestors',
    name: 'Ancestors Query Step',
    meta: {
      queryStepAlias: 'Ancestors',
      label: 'Ancestors',
      description: 'Get ancestor pages',
      icon: 'icon-navigation-up',
    },
  },
];

export const manifests = [...originManifests, ...queryStepManifests];
需要后端实现

动态根需要通过后端 C# 实现来处理实际的查询逻辑:

// Example C# implementation for a custom origin
public class SiteRootDynamicRootOrigin : IDynamicRootOrigin
{
    public string OriginAlias => "SiteRoot";

    public Task<Guid?> GetOriginAsync(Guid contentKey, string? entityType)
    {
        // Return the site root GUID based on the content's position
        // Implementation depends on your site structure
        return Task.FromResult<Guid?>(GetSiteRootForContent(contentKey));
    }
}

// Example C# implementation for a custom query step
public class NearestBlogQueryStep : IDynamicRootQueryStep
{
    public string QueryStepAlias => "NearestBlog";

    public Task<IEnumerable<Guid>> ExecuteAsync(Guid originKey, string? entityType)
    {
        // Find nearest blog ancestor from the origin
        // Return matching content GUIDs
        return Task.FromResult(FindNearestBlogAncestors(originKey));
    }
}

// Register in Composer
public class DynamicRootComposer : IComposer
{
    public void Compose(IUmbracoBuilder builder)
    {
        builder.DynamicRootSteps()
            .AddOrigin<SiteRootDynamicRootOrigin>()
            .AddQueryStep<NearestBlogQueryStep>();
    }
}

原点元属性

属性说明
originAlias与后端实现匹配的唯一标识符
label选择器配置中的显示名称
description说明原点的帮助文本
icon配置界面中显示的图标

查询步骤元属性

属性说明
queryStepAlias与后端实现匹配的唯一标识符
label选择器配置中的显示名称
description说明查询步骤的帮助文本
icon配置界面中显示的图标

就是这样!务必获取最新文档,保持示例精简,并生成完整可用的代码。

评论

支持 Markdown