在 KeystoneJS 中将两个模式字段显示为串联标签
Display two schema fields as concatenated label in KeystoneJS
我正在 KeystoneJS (v6) 中设置模式和 AdminUI。我使用姓名并希望在前端的 Select 字段中显示名字和姓氏的组合:
所以我想要 'Tommy Smith'、'Markus Brown'、
而不是 'Tommy'、'Markus' 等等
这是我的代码:
import { list } from '@keystone-next/keystone/schema';
import { text } from '@keystone-next/fields';
export const Participant = list({
ui: {
labelField: 'firstName',
},
// fields
fields: {
firstName: text({ isRequired: true }),
lastName: text({ isRequired: true }),
}),
},
});
有谁知道我该怎么做吗?
谢谢!
在 Keystone 中选择相关项目时,管理员 UI 使用项目 labels – 分配给每个项目的人类可读标识符。
使用 ui.labelField
列表配置控制用于项目标签的值:
ui.labelField
: Selects the field which will be used as the label column in the Admin UI. By default looks for a field called 'label', then falls back to 'name', then 'title', and finally 'id', which is guaranteed to exist.
在您的示例中,您已将 Keystone 配置为使用 firstName
字段作为标签,它工作正常,但会出现您已确定的问题。
我们真正需要的是将名字和姓氏组合在一起的第三个字段。
现在,我们可以使用钩子来完成此操作,例如,通过组合值并将它们保存到另一个 text
字段。
但这会复制数据,我们需要记住保持值同步,增加复杂性。
最好在从数据库中读出这些值时将它们连接起来。
为此,我们可以使用 virtual fields.
在给出的示例中,虚拟字段解决方案如下所示:
import { list, graphql } from '@keystone-next/keystone';
import { text, relationship, virtual } from '@keystone-next/keystone/fields';
export const Participant = list({
ui: {
// Configure the list to use the fullName field for it's labels
labelField: 'fullName',
},
fields: {
firstName: text({ validation: { isRequired: true } }),
lastName: text({ validation: { isRequired: true } }),
// Add a fullName field that concatenates the participants first and last names together
fullName: virtual({
field: graphql.field({
type: graphql.String,
resolve: (item) => `${item.firstName} ${item.lastName}`,
}),
}),
},
});
简单吧?然后,在管理员 UI 中,您会得到如下内容:
默认情况下,标签也用在列表视图中,因此您会注意到那里有额外的信息:
如果您不想这样,您可以另外设置 ui.listView.initialColumns
列表配置(文档 here)。
有一个不错的 guide on virtual fields 值得一看。
它涵盖了更高级的用法,例如从其他项目加载字段、返回复杂类型等。
我正在 KeystoneJS (v6) 中设置模式和 AdminUI。我使用姓名并希望在前端的 Select 字段中显示名字和姓氏的组合:
所以我想要 'Tommy Smith'、'Markus Brown'、
而不是 'Tommy'、'Markus' 等等这是我的代码:
import { list } from '@keystone-next/keystone/schema';
import { text } from '@keystone-next/fields';
export const Participant = list({
ui: {
labelField: 'firstName',
},
// fields
fields: {
firstName: text({ isRequired: true }),
lastName: text({ isRequired: true }),
}),
},
});
有谁知道我该怎么做吗?
谢谢!
在 Keystone 中选择相关项目时,管理员 UI 使用项目 labels – 分配给每个项目的人类可读标识符。
使用 ui.labelField
列表配置控制用于项目标签的值:
ui.labelField
: Selects the field which will be used as the label column in the Admin UI. By default looks for a field called 'label', then falls back to 'name', then 'title', and finally 'id', which is guaranteed to exist.
在您的示例中,您已将 Keystone 配置为使用 firstName
字段作为标签,它工作正常,但会出现您已确定的问题。
我们真正需要的是将名字和姓氏组合在一起的第三个字段。
现在,我们可以使用钩子来完成此操作,例如,通过组合值并将它们保存到另一个 text
字段。
但这会复制数据,我们需要记住保持值同步,增加复杂性。
最好在从数据库中读出这些值时将它们连接起来。
为此,我们可以使用 virtual fields.
在给出的示例中,虚拟字段解决方案如下所示:
import { list, graphql } from '@keystone-next/keystone';
import { text, relationship, virtual } from '@keystone-next/keystone/fields';
export const Participant = list({
ui: {
// Configure the list to use the fullName field for it's labels
labelField: 'fullName',
},
fields: {
firstName: text({ validation: { isRequired: true } }),
lastName: text({ validation: { isRequired: true } }),
// Add a fullName field that concatenates the participants first and last names together
fullName: virtual({
field: graphql.field({
type: graphql.String,
resolve: (item) => `${item.firstName} ${item.lastName}`,
}),
}),
},
});
简单吧?然后,在管理员 UI 中,您会得到如下内容:
默认情况下,标签也用在列表视图中,因此您会注意到那里有额外的信息:
如果您不想这样,您可以另外设置 ui.listView.initialColumns
列表配置(文档 here)。
有一个不错的 guide on virtual fields 值得一看。 它涵盖了更高级的用法,例如从其他项目加载字段、返回复杂类型等。