在 Middleman 4 中使用 Frontmatter 和动态页面

Using Frontmatter with Dynamic Pages in Middleman 4

我花了很多时间研究这个问题,但没有找到有效的解决方案。如果有人能帮我解决这个问题,我会很高兴。

我正在尝试在我的设置中使用动态页面,但需要包括动态 Frontmatter。但是我不能在模板文件中使用 Frontmatter,所以我在想我可以使用 YAML 数据文件代替吗?我尝试了各种方法,但 none 都成功了。动态页面加载得很好,但是每个页面都将使用相同的 Frontmatter,除非我可以引入动态数据。

我的配置包括:

["england", "france"].each do |team|
  proxy "/teams/#{team}/index.html", "/teams/team.html", :locals => { :team_name => team }, :ignore => true
end

我在本节中的目录结构如下所示:

teams
- index.html.erb
- team.html.erb

我开始了一个 YAML 数据文件,其中包括:

england:
  title: "Teams/England"
  description: "England"
  headline: "England"
  addclass: "england cols"
france:
  title: "Teams/France"
  description: "France"
  headline: "France"
  addclass: "france cols"

当我在模板文件中使用上述数据作为Frontmatter时,它工作得很好:

---
title: Teams/France
description: France
headline: France
addclass: france cols
---

我如何使用数据的一个例子:

<%= current_page.data.addclass %>

我的问题如下:

  1. 如何使用 YAML 数据文件为每个动态页面提供唯一数据?
  2. 我可以使用最终的 URI 段(/teams/england/ 中的“england”,/teams/france/ 中的“france”等)来定义要使用的数据集吗?
  3. 我可以在不影响站点上其他非动态页面(/matches/、/groups/ 等)的情况下执行此操作吗?

非常感谢您。

我建议稍微更改您的数据格式。它允许您将整个本地数据项传递给模板,这样您就可以使用数据而无需先 "load it" 进入 Frontmatter。

调整您的 teams.yml 文件(我在此处添加了 'slug' 值):

items:
- title: "England"
  slug: "england"
  description: "England"
  headline: "England"
  addclass: "england cols"
- title: "France"
  slug: "france"
  description: "France"
  headline: "France"
  addclass: "france cols"

将您的 config.rb 块更改为(假设 teams.yml 位于 /data/teams.yml)- 注意检查以防止数据丢失时出现错误:

if File.exist?("data/teams.yml")
  data.teams.items.each do |item|
     p = item
     proxy "teams/#{p.slug}.html", "teams/team.html", locals: { item: p }, ignore: true
  end
end

这会将团队项目中的所有数据传递到模板中。您不必 "define which data set to use",因为模板上下文将仅引用该数据项。

现在,在您的 team.html.erb 模板中,您可以像这样引用数据(在模板 body 中,而不是在 Frontmatter 中):

<h1 class="<%= item.addclass %>"><%= item.title %></h1>
<h2><%= item.description %></h2>
<h3><%= item.headline %></h3>

这应该会为您提供英国和法国的两个独立页面,其中包含各自独特的数据。

不幸的是,Frontmatter 不喜欢在 Middleman 中生成动态页面后被覆盖。为了覆盖您用于元数据的 Frontmatter,特别是 "title",我在 gem 'middleman-meta-tags' [ https://github.com/tiste/middleman-meta-tags ] 上取得了成功,它允许您覆盖模板中的页面标题 body 定义后,来自 YAML 数据。