重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
umbraco-conditions by umbraco/umbraco-cms-backoffice-skills
npx skills add https://github.com/umbraco/umbraco-cms-backoffice-skills --skill umbraco-conditions扩展条件使开发者能够声明在扩展项于后台可用之前必须满足的要求。它们充当门控机制,根据上下文(如部分、工作区、用户权限或内容类型)控制扩展项何时何地出现。多个条件使用 AND 逻辑——所有条件都必须通过,扩展项才会显示。
在实施前请务必获取最新文档:
Umbraco 源代码包含一个工作示例:
位置 : /Umbraco-CMS/src/Umbraco.Web.UI.Client/examples/entity-content-type-condition/
此示例演示了一个检查实体内容类型的自定义条件。研究此示例以了解创建自定义条件的模式。
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
{
"type": "dashboard",
"alias": "My.Dashboard",
"name": "My Dashboard",
"conditions": [
{
"alias": "Umb.Condition.SectionAlias",
"match": "Umb.Section.Content"
}
]
}
{
"type": "workspaceView",
"alias": "My.WorkspaceView",
"name": "My Workspace View",
"conditions": [
{
"alias": "Umb.Condition.WorkspaceAlias",
"match": "Umb.Workspace.Document"
}
]
}
const manifest = {
type: 'workspaceAction',
alias: 'My.WorkspaceAction',
name: 'My Action',
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
match: 'Umb.Section.Content'
},
{
alias: 'Umb.Condition.WorkspaceAlias',
match: 'Umb.Workspace.Document'
},
{
alias: 'Umb.Condition.WorkspaceContentTypeAlias',
match: 'blogPost'
}
]
};
{
"type": "entityAction",
"alias": "My.DeleteAction",
"name": "Delete Document",
"conditions": [
{
"alias": "Umb.Condition.UserPermission.Document",
"match": "Umb.UserPermission.Document.Delete"
}
]
}
{
"type": "dashboard",
"alias": "My.AdminDashboard",
"name": "Admin Dashboard",
"conditions": [
{
"alias": "Umb.Condition.SectionUserPermission",
"match": "Umb.Section.Settings"
}
]
}
{
"type": "workspaceView",
"alias": "My.View",
"name": "My View",
"conditions": [
{
"alias": "Umb.Condition.WorkspaceEntityType",
"match": "document"
}
]
}
{
"type": "workspaceView",
"alias": "My.BlogView",
"name": "Blog Post View",
"conditions": [
{
"alias": "Umb.Condition.WorkspaceContentTypeAlias",
"match": "blogPost"
}
]
}
{
"type": "workspaceAction",
"alias": "My.CollectionAction",
"name": "Collection Action",
"conditions": [
{
"alias": "Umb.Condition.WorkspaceHasCollection",
"match": true
}
]
}
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-api';
import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
export class MyCustomCondition extends UmbConditionBase<MyConditionConfig> {
constructor(host: UmbControllerHost, args: MyConditionConfig) {
super(host, args);
// 观察某些上下文或状态
this.consumeContext(SOME_CONTEXT, (context) => {
this.observe(context.someObservable, (value) => {
// 根据值更新允许状态
this.permitted = value === this.args.expectedValue;
});
});
}
}
interface MyConditionConfig {
expectedValue: string;
}
export const manifests = [
{
type: 'condition',
name: 'My Custom Condition',
alias: 'My.Condition.Custom',
api: MyCustomCondition,
},
];
{
"type": "dashboard",
"alias": "My.Dashboard",
"name": "My Dashboard",
"conditions": [
{
"alias": "My.Condition.Custom",
"expectedValue": "someValue"
}
]
}
部分条件:
Umb.Condition.SectionAlias - 匹配当前部分Umb.Condition.SectionUserPermission - 用户拥有部分访问权限工作区条件:
Umb.Condition.WorkspaceAlias - 匹配当前工作区Umb.Condition.WorkspaceEntityType - 匹配实体类型(文档、媒体等)Umb.Condition.WorkspaceContentTypeAlias - 匹配内容类型别名Umb.Condition.WorkspaceHasCollection - 工作区拥有集合用户权限条件:
Umb.Condition.UserPermission.Document - 文档权限Umb.Condition.CurrentUser.IsAdmin - 用户是管理员Umb.Condition.CurrentUser.GroupId - 用户在特定组中门控 : 条件控制扩展项的可用性
AND 逻辑 : 所有条件都必须通过,扩展项才会出现
匹配属性 : 用于比较的值(别名、实体类型等)
允许状态 : 指示条件是否通过的布尔值
自定义条件 : 实现 UmbConditionBase 并设置 this.permitted
用例 :
就是这样!请务必获取最新文档,保持示例简洁,生成完整的工作代码。
每周安装
68
仓库
GitHub 星标
14
首次出现
2026年2月4日
安全审计
安装于
github-copilot49
cursor22
opencode20
codex20
gemini-cli18
amp18
Extension Conditions enable developers to declare requirements that must be met before an extension becomes available in the backoffice. They function as gatekeeping mechanisms controlling when and where extensions appear based on context like section, workspace, user permissions, or content type. Multiple conditions use AND logic—all must pass for the extension to display.
Always fetch the latest docs before implementing:
The Umbraco source includes a working example:
Location : /Umbraco-CMS/src/Umbraco.Web.UI.Client/examples/entity-content-type-condition/
This example demonstrates a custom condition that checks entity content type. Study this for patterns on creating custom conditions.
{
"type": "dashboard",
"alias": "My.Dashboard",
"name": "My Dashboard",
"conditions": [
{
"alias": "Umb.Condition.SectionAlias",
"match": "Umb.Section.Content"
}
]
}
{
"type": "workspaceView",
"alias": "My.WorkspaceView",
"name": "My Workspace View",
"conditions": [
{
"alias": "Umb.Condition.WorkspaceAlias",
"match": "Umb.Workspace.Document"
}
]
}
const manifest = {
type: 'workspaceAction',
alias: 'My.WorkspaceAction',
name: 'My Action',
conditions: [
{
alias: 'Umb.Condition.SectionAlias',
match: 'Umb.Section.Content'
},
{
alias: 'Umb.Condition.WorkspaceAlias',
match: 'Umb.Workspace.Document'
},
{
alias: 'Umb.Condition.WorkspaceContentTypeAlias',
match: 'blogPost'
}
]
};
{
"type": "entityAction",
"alias": "My.DeleteAction",
"name": "Delete Document",
"conditions": [
{
"alias": "Umb.Condition.UserPermission.Document",
"match": "Umb.UserPermission.Document.Delete"
}
]
}
{
"type": "dashboard",
"alias": "My.AdminDashboard",
"name": "Admin Dashboard",
"conditions": [
{
"alias": "Umb.Condition.SectionUserPermission",
"match": "Umb.Section.Settings"
}
]
}
{
"type": "workspaceView",
"alias": "My.View",
"name": "My View",
"conditions": [
{
"alias": "Umb.Condition.WorkspaceEntityType",
"match": "document"
}
]
}
{
"type": "workspaceView",
"alias": "My.BlogView",
"name": "Blog Post View",
"conditions": [
{
"alias": "Umb.Condition.WorkspaceContentTypeAlias",
"match": "blogPost"
}
]
}
{
"type": "workspaceAction",
"alias": "My.CollectionAction",
"name": "Collection Action",
"conditions": [
{
"alias": "Umb.Condition.WorkspaceHasCollection",
"match": true
}
]
}
import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-api';
import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
export class MyCustomCondition extends UmbConditionBase<MyConditionConfig> {
constructor(host: UmbControllerHost, args: MyConditionConfig) {
super(host, args);
// Observe some context or state
this.consumeContext(SOME_CONTEXT, (context) => {
this.observe(context.someObservable, (value) => {
// Update permitted state based on value
this.permitted = value === this.args.expectedValue;
});
});
}
}
interface MyConditionConfig {
expectedValue: string;
}
export const manifests = [
{
type: 'condition',
name: 'My Custom Condition',
alias: 'My.Condition.Custom',
api: MyCustomCondition,
},
];
{
"type": "dashboard",
"alias": "My.Dashboard",
"name": "My Dashboard",
"conditions": [
{
"alias": "My.Condition.Custom",
"expectedValue": "someValue"
}
]
}
Section Conditions:
Umb.Condition.SectionAlias - Match current sectionUmb.Condition.SectionUserPermission - User has section accessWorkspace Conditions:
Umb.Condition.WorkspaceAlias - Match current workspaceUmb.Condition.WorkspaceEntityType - Match entity type (document, media, etc.)Umb.Condition.WorkspaceContentTypeAlias - Match content type aliasUmb.Condition.WorkspaceHasCollection - Workspace has collectionUser Permission Conditions:
Umb.Condition.UserPermission.Document - Document permissionsUmb.Condition.CurrentUser.IsAdmin - User is adminUmb.Condition.CurrentUser.GroupId - User in specific groupGatekeeping : Conditions control extension availability
AND Logic : All conditions must pass for extension to appear
Match Property : Value to compare against (alias, entity type, etc.)
Permitted State : Boolean indicating if condition passes
Custom Conditions : Implement UmbConditionBase and set this.permitted
Use Cases :
That's it! Always fetch fresh docs, keep examples minimal, generate complete working code.
Weekly Installs
68
Repository
GitHub Stars
14
First Seen
Feb 4, 2026
Security Audits
Gen Agent Trust HubFailSocketPassSnykPass
Installed on
github-copilot49
cursor22
opencode20
codex20
gemini-cli18
amp18
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
122,000 周安装