在 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 %>
我的问题如下:
- 如何使用 YAML 数据文件为每个动态页面提供唯一数据?
- 我可以使用最终的 URI 段(/teams/england/ 中的“england”,/teams/france/ 中的“france”等)来定义要使用的数据集吗?
- 我可以在不影响站点上其他非动态页面(/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 数据。
我花了很多时间研究这个问题,但没有找到有效的解决方案。如果有人能帮我解决这个问题,我会很高兴。
我正在尝试在我的设置中使用动态页面,但需要包括动态 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 %>
我的问题如下:
- 如何使用 YAML 数据文件为每个动态页面提供唯一数据?
- 我可以使用最终的 URI 段(/teams/england/ 中的“england”,/teams/france/ 中的“france”等)来定义要使用的数据集吗?
- 我可以在不影响站点上其他非动态页面(/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 数据。