集合

为你的 CMS 设置不同的集合

集合是一组具有相同结构,并且通常保存在同一文件夹中的文件。你可以将集合用于博客文章、产品页面、作者数据文件等等。

要在 LumeCMS 中定义一个集合,你需要 3 样东西:

  • 集合名称。例如:"Posts"。
  • 用于读取和写入内容的存储。例如 "src:posts"。
  • 用于修改内容的字段

cms.collection() 函数允许你定义一个集合:

cms.collection("posts", "src:posts/*.md", [
  "title: text",
  "content: markdown",
]);

在上面的例子中,我们定义了 posts 集合,使用了 src 存储(选择 posts 文件夹下所有的 .md 文件)。第三个参数是此集合的字段列表。有关此值的更多信息,请参阅 字段文档

集合可以创建、编辑和删除文档。

额外选项

对于额外的选项,可以使用如下对象形式:

cms.collection({
  name: "posts",
  store: "src:posts/*.md",
  fields: [
    "title: text",
    "content: markdown",
  ],
});

除了 namestorefields 之外,集合还具有以下选项:

description

它允许在集合名称下方插入一段描述:

cms.collection({
  name: "posts",
  description: "用于创建、编辑或删除博客文章",
  store: "src:posts/*.md",
  fields: [
    "title: text",
    "content: markdown",
  ],
});

label

在菜单中此集合的可视化名称。如果未定义,则使用 name 值。

cms.collection({
  name: "posts",
  label: "你的文章!"
  description: "用于创建、编辑或删除博客文章",
  store: "src:posts/*.md",
  fields: [
    "title: text",
    "content: markdown",
  ],
});

url

url 选项允许设置集合的预览 URL。它用于集合中的每个条目不生成页面,但所有条目生成一个唯一页面的情况。

例如,我们可以有一个事件集合,但在网站中所有事件都列在一个唯一的页面中。我们可以配置 CMS,以便每次我们编辑任何事件时都预览此 URL:

cms.collection({
  name: "events",
  store: "src:_data/events/*.yml",
  fields: [
    "title: text",
    "date: datetime",
    "content: markdown",
  ],
  url: "/events/",
});

documentName

要在集合中创建一个新条目,我们必须指定文件路径(例如:/new-post.md)。此选项允许使用任何字段的值自动生成名称。

在模式中使用 {varname} 语法来使用任何值生成文件名。例如,我们可以使用标题字段来生成新文章的文件名:

cms.collection({
  name: "posts",
  store: "src:posts/*.md",
  fields: [
    "title: text!",
    "content: markdown",
  ],
  documentName: "{title}.md",
});

为了生成文件名,空格会被转换为连字符,并且 / 字符会被移除。例如,标题 A/B testing 将生成文件 ab-testing.md

使用函数进行更高级的名称生成:

cms.collection({
  name: "posts",
  store: "src:posts/*.md",
  fields: [
    "title: text!",
    "author: text!",
    "content: markdown",
  ],
  documentName(data) {
    return `${data.title}-${data.author}.md`;
  },
});

Note

建议将用于生成文件路径的字段配置为“必需”,以避免由空值引起的错误。

documentLabel

此函数自定义文档的标签。标签是每个文档在集合的文档列表中使用的可见名称。

这是一个删除 .md 扩展名的示例:

cms.collection({
  name: "posts",
  store: "src:posts/*.md",
  fields: [
    "title: text!",
    "author: text!",
    "content: markdown",
  ],
  documentLabel(name) {
    return name.replace(".md", "");
  },
});

如果未指定,则使用默认函数来删除扩展名、将连字符转换为空格并应用其他小的调整。例如,文档名称 /this-is-a-page.md 将转换为标签 This is a page

create & delete

如果你不想在集合中创建和/或删除条目(因为它具有固定长度),则此选项很有用。

cms.collection({
  name: "countries",
  store: "src:countries/*.yml",
  fields: [
    "title: text",
    "content: markdown",
  ],
  create: false,
  delete: false,
});