关于 umbraco-collection-view
umbraco-collection-view 是用于开发 Umbraco 集合自定义数据视图的技能,面向扩展开发者。它指导创建清单和视图元素,可构建表格、网格或卡片布局,并支持用户切换视图。
主要功能
- 01自定义集合视图开发指导
- 02表格、网格与卡片布局
- 03清单和视图元素示例
- 04访问集合上下文与项目
- 05读取用户定义的列
适用场景
- 01为现有集合添加自定义布局
- 02为集合项目构建表格或卡片视图
- 03为媒体或其他集合创建可切换视图
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ umbraco/ umbraco-cms-backoffice-skills --skill umbraco-collection-view安装后在 Claude Code 中输入/umbraco-collection-view确认已加载。
详细介绍
Umbraco 集合视图
这是什么?
集合视图定义了集合中数据的显示方式。你可以借此为实体列表创建自定义可视化表示形式,例如表格、网格、卡片或任意自定义布局。集合视图可以添加到现有集合或自定义集合中,用户也可以在可用视图之间切换。
文档
实现之前,务必获取最新文档:
- 主要文档:https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-types/collections/collection-view
- 集合:https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-types/collections
- 基础:https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/foundation
- 扩展注册表:https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/extending-overview/extension-registry
相关基础技能
-
上下文 API:用于访问集合上下文和项目数据
- 参考技能:
umbraco-context-api
- 参考技能:
-
状态管理:用于订阅集合数据变更
- 参考技能:
umbraco-state-management
- 参考技能:
-
Umbraco Element:用于实现视图元素
- 参考技能:
umbraco-umbraco-element
- 参考技能:
工作流
- 获取文档 - 对上方 URL 使用 WebFetch
- 提出问题 - 要针对哪个集合?使用表格、网格还是自定义布局?需要哪些列/字段?
- 生成文件 - 根据最新文档创建清单和视图元素
- 说明 - 展示创建的内容以及测试方法
最简示例
清单(manifests.ts)
import type { ManifestCollectionView } from '@umbraco-cms/backoffice/extension-registry';
const manifest: ManifestCollectionView = {
type: 'collectionView',
alias: 'My.CollectionView.Cards',
name: 'Card View',
element: () => import('./card-view.element.js'),
meta: {
label: 'Cards',
icon: 'icon-grid',
pathName: 'cards',
},
conditions: [
{
alias: 'Umb.Condition.CollectionAlias',
match: 'My.Collection',
},
],
};
export const manifests = [manifest];
视图元素(card-view.element.ts)
import { html, css, customElement, state } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection';
@customElement('my-card-view')
export class MyCardViewElement extends UmbLitElement {
@state()
private _items: Array<any> = [];
constructor() {
super();
this.consumeContext(UMB_COLLECTION_CONTEXT, (context) => {
this.observe(context.items, (items) => {
this._items = items;
});
});
}
render() {
return html`
<div class="card-grid">
${this._items.map(
(item) => html`
<div class="card">
<h3>${item.name}</h3>
<p>${item.description || 'No description'}</p>
</div>
`
)}
</div>
`;
}
static styles = css`
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: var(--uui-size-space-4);
padding: var(--uui-size-space-4);
}
.card {
background: var(--uui-color-surface);
border: 1px solid var(--uui-color-border);
border-radius: var(--uui-border-radius);
padding: var(--uui-size-space-4);
}
`;
}
export default MyCardViewElement;
declare global {
interface HTMLElementTagNameMap {
'my-card-view': MyCardViewElement;
}
}
表格视图示例
import { html, css, customElement, state } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection';
@customElement('my-table-view')
export class MyTableViewElement extends UmbLitElement {
@state()
private _items: Array<any> = [];
constructor() {
super();
this.consumeContext(UMB_COLLECTION_CONTEXT, (context) => {
this.observe(context.items, (items) => {
this._items = items;
});
});
}
render() {
return html`
<uui-table>
<uui-table-head>
<uui-table-head-cell>Name</uui-table-head-cell>
<uui-table-head-cell>Status</uui-table-head-cell>
<uui-table-head-cell>Updated</uui-table-head-cell>
</uui-table-head>
${this._items.map(
(item) => html`
<uui-table-row>
<uui-table-cell>${item.name}</uui-table-cell>
<uui-table-cell>${item.status}</uui-table-cell>
<uui-table-cell>${item.updateDate}</uui-table-cell>
</uui-table-row>
`
)}
</uui-table>
`;
}
}
export default MyTableViewElement;
内置集合的视图(例如 Media)
const manifest: ManifestCollectionView = {
type: 'collectionView',
alias: 'My.CollectionView.MediaThumbnails',
name: 'Thumbnail View',
element: () => import('./thumbnail-view.element.js'),
weight: 100, // Higher weight = appears first in view switcher
meta: {
label: 'Thumbnails',
icon: 'icon-picture',
pathName: 'thumbnails',
},
conditions: [
{
alias: 'Umb.Condition.CollectionAlias',
match: 'Umb.Collection.Media',
},
],
};
访问用户定义的列
this.consumeContext(UMB_COLLECTION_CONTEXT, (context) => {
// Get configured columns/properties
this.observe(context.userDefinedProperties, (properties) => {
this._columns = properties;
});
// Get items
this.observe(context.items, (items) => {
this._items = items;
});
});
元属性
| 属性 | 描述 |
|---|---|
label | 视图切换器中的显示名称 |
icon | 视图切换器中的图标 |
pathName | 用于深层链接的 URL 路径片段 |
常见的用于条件判断的集合别名
Umb.Collection.DocumentUmb.Collection.MediaUmb.Collection.MemberUmb.Collection.User
就是这样!务必获取最新文档,保持示例简洁,并生成完整可运行的代码。
评论
支持 Markdown