umbraco-dynamic-root について
umbraco-dynamic-rootは、Umbracoのコンテンツピッカー向けDynamic Root拡張を作る開発スキルです。最新ドキュメントの確認から、起点やクエリステップの定義、マニフェスト生成までを案内し、実際のクエリにはバックエンドのC#実装が必要です。
主な機能
- 01Dynamic Rootの起点拡張ガイド
- 02クエリステップ拡張ガイド
- 03マニフェスト生成の手順
- 04バックエンドC#実装例
活用シーン
- 01現在のページやサイトルートをピッカーの起点に設定
- 02祖先ノード検索などのクエリステップを構成
- 03Umbraco拡張マニフェストを生成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ umbraco/ umbraco-cms-backoffice-skills --skill umbraco-dynamic-rootインストール後、Claude Code で/umbraco-dynamic-rootを入力して読み込まれたか確認します。
詳細
Umbraco ダイナミックルート
これは何ですか?
ダイナミックルートを使用すると、コンテンツピッカーに固定ノードではなく動的に決定される開始点(オリジン)を設定できます。これには2つの拡張機能タイプが含まれます。
- ダイナミックルートオリジン: ピッカーの開始位置を定義します(例: 現在のページ、サイトルート、指定タイプの最も近い祖先)
- ダイナミックルートクエリステップ: オリジンからのナビゲーションステップを定義します(例: 最も近い祖先を検索、指定タイプの子を取得)
これらにより、コンテキストに応じて適応する柔軟なコンテンツピッカー設定が可能になります。
ドキュメント
実装する前に、常に最新のドキュメントを取得してください:
- 拡張機能タイプ: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-types
- コンテンツピッカー: https://docs.umbraco.com/umbraco-cms/model-your-content/property-editors/built-in-umbraco-property-editors/content-picker
- Foundation: https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/foundation
ワークフロー
- ドキュメントを取得 - 上記のURLに対してWebFetchを使用します
- 質問する - どのような開始点ロジックが必要ですか?どのようなクエリステップが必要ですか?
- ファイルを生成 - 最新のドキュメントに基づいてマニフェストを作成します
- 説明 - 作成された内容とテスト方法を示します
最小限の例
ダイナミックルートオリジンマニフェスト
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に表示されるアイコン |
以上です!常に最新のドキュメントを取得し、例は最小限に保ち、完全に動作するコードを生成してください。
コメント
Markdown 対応