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. 03Umbraco拡張マニフェストを生成

インストール

コマンドをコピーしてターミナルで実行します。

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

インストール後、Claude Code で/umbraco-dynamic-rootを入力して読み込まれたか確認します。

詳細

Umbraco ダイナミックルート

これは何ですか?

ダイナミックルートを使用すると、コンテンツピッカーに固定ノードではなく動的に決定される開始点(オリジン)を設定できます。これには2つの拡張機能タイプが含まれます。

  • ダイナミックルートオリジン: ピッカーの開始位置を定義します(例: 現在のページ、サイトルート、指定タイプの最も近い祖先)
  • ダイナミックルートクエリステップ: オリジンからのナビゲーションステップを定義します(例: 最も近い祖先を検索、指定タイプの子を取得)

これらにより、コンテキストに応じて適応する柔軟なコンテンツピッカー設定が可能になります。

ドキュメント

実装する前に、常に最新のドキュメントを取得してください:

ワークフロー

  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設定UIに表示されるアイコン

クエリステップメタプロパティ

プロパティ説明
queryStepAliasバックエンド実装と一致する一意の識別子
labelピッカー設定に表示される名前
descriptionクエリステップを説明するヘルプテキスト
icon設定UIに表示されるアイコン

以上です!常に最新のドキュメントを取得し、例は最小限に保ち、完全に動作するコードを生成してください。

コメント