如何在 frontmatter 中指定 11ty collection?
How can I specify an 11ty collection in frontmatter?
在我的网站上,我想在对应于每个 collection 的页面上显示 collection 项的列表。例如,在 Games 页面上,我想显示所有游戏相关文章的列表,在 Politics 页面上,我想显示列表所有与政治相关的文章等
我现在拥有的是每个此类页面的一个 Nunjucks 模板文件,我不是特别喜欢它,因为除了要显示的 collection 之外它们是相同的。这是我的两个模板,分别用于政治文章和游戏文章,我在其中扩展了一个通用样板(base.njk),在主块中,我首先打印了一些Markdown 内容,然后是 collection 项列表:
{# politics.njk #}
{% extends "base.njk" %}
{% block main %}
<main>
{{ content | safe }}
<ul class="postlist no-bullets">
{% for item in collections.politics %}
{% include "partials/collection-list-item.njk" %}
{% endfor %}
</ul>
</main>
{% endblock %}
{# games.njk #}
{% extends "base.njk" %}
{% block main %}
<main>
{{ content | safe }}
<ul class="postlist no-bullets">
{% for item in collections.games %}
{% include "partials/collection-list-item.njk" %}
{% endfor %}
</ul>
</main>
{% endblock %}
如您所见,这两个文件之间的唯一区别是 collections.politics
和 collections.games
。我想使用一个模板,并在 frontmatter 中指定我想要的 collection。由于模板使用的每页已经有一个 Markdown 文件(用于在我开始列出文章之前编写内容),所以如果可能的话就太好了。例如:
<!-- politics.md -->
---
layout: articles-list.njk
title: Politics
listCollection: collections.politics
---
# Politics
Below is a list of all politics articles I've written.
<!-- games.md -->
---
layout: articles-list.njk
title: Games
listCollection: collections.games
---
# Games
I think about games a lot. Below is a list of articles I've written on the topic.
{# articles-list.njk #}
{% extends "base.njk" %}
{% block main %}
<main>
{{ content | safe }}
<ul class="postlist no-bullets">
{% for item in listCollection %}
{% include "partials/collection-list-item.njk" %}
{% endfor %}
</ul>
</main>
{% endblock %}
除了拥有多个模板文件之外,是否可以通过其他方式完成我想做的事情?
您可以使用 computed data 访问 collection,但我不确定您是否可以访问那里的 collection。
更简单的方法:将 frontmatter 字段设置为要显示为字符串的集合的名称,然后使用它来获取模板中的 collection:
<!-- politics.md -->
---
layout: articles-list.njk
title: Politics
listCollection: 'politics'
---
{# articles-list.njk #}
{% extends "base.njk" %}
{% block main %}
<main>
{{ content | safe }}
<ul class="postlist no-bullets">
{% for item in collections[listCollection] %}
{% include "partials/collection-list-item.njk" %}
{% endfor %}
</ul>
</main>
{% endblock %}
我在我的博客 (https://github.com/cfjedimaster/raymondcamden2020) 上处理这个问题的方式是这样的:
- 我创建了一个类别集合。我通过使用 .eleventy.js 和 eleventyConfig.addCollection 来做到这一点。我使用一些 JavaScript 来获取我所有的 post,遍历每个类别列表,并创建一个唯一列表。最后,我有一个名为类别的集合。
eleventyConfig.addCollection("categories", collection => {
let cats = new Set();
let posts = collection.getFilteredByGlob("_posts/**/*.md");
for(let i=0;i<posts.length;i++) {
for(let x=0;x<posts[i].data.categories.length;x++) {
cats.add(posts[i].data.categories[x].toLowerCase());
}
}
return Array.from(cats).sort();
});
- 然后我制作了一个页面,categories.liquid,负责生成我的类别页面。很简单:
---
pagination:
data: collections.categories
size: 1
alias: cat
permalink: "categories/{{ cat | myEscape }}/"
layout: category
renderData:
title: "{{ cat }}"
---
请注意,我对类别中的每个项目都使用了 cat
,请注意我在此处 没有其他内容。所有的布局都在分类布局页面完成。
- 这是我的类别页面的顶部:
---
layout: default
---
{% assign posts = collections.posts | getByCategory: cat %}
所以假设我有一个 post 的集合,其中每个 post 都有 N 个类别分配给它,我写了一个自定义过滤器,将它减少到 post 将 cat
作为其类别之一。
S 最终结果是 N 个类别页面已填充 posts 分配给该类别。
在我的网站上,我想在对应于每个 collection 的页面上显示 collection 项的列表。例如,在 Games 页面上,我想显示所有游戏相关文章的列表,在 Politics 页面上,我想显示列表所有与政治相关的文章等
我现在拥有的是每个此类页面的一个 Nunjucks 模板文件,我不是特别喜欢它,因为除了要显示的 collection 之外它们是相同的。这是我的两个模板,分别用于政治文章和游戏文章,我在其中扩展了一个通用样板(base.njk),在主块中,我首先打印了一些Markdown 内容,然后是 collection 项列表:
{# politics.njk #}
{% extends "base.njk" %}
{% block main %}
<main>
{{ content | safe }}
<ul class="postlist no-bullets">
{% for item in collections.politics %}
{% include "partials/collection-list-item.njk" %}
{% endfor %}
</ul>
</main>
{% endblock %}
{# games.njk #}
{% extends "base.njk" %}
{% block main %}
<main>
{{ content | safe }}
<ul class="postlist no-bullets">
{% for item in collections.games %}
{% include "partials/collection-list-item.njk" %}
{% endfor %}
</ul>
</main>
{% endblock %}
如您所见,这两个文件之间的唯一区别是 collections.politics
和 collections.games
。我想使用一个模板,并在 frontmatter 中指定我想要的 collection。由于模板使用的每页已经有一个 Markdown 文件(用于在我开始列出文章之前编写内容),所以如果可能的话就太好了。例如:
<!-- politics.md -->
---
layout: articles-list.njk
title: Politics
listCollection: collections.politics
---
# Politics
Below is a list of all politics articles I've written.
<!-- games.md -->
---
layout: articles-list.njk
title: Games
listCollection: collections.games
---
# Games
I think about games a lot. Below is a list of articles I've written on the topic.
{# articles-list.njk #}
{% extends "base.njk" %}
{% block main %}
<main>
{{ content | safe }}
<ul class="postlist no-bullets">
{% for item in listCollection %}
{% include "partials/collection-list-item.njk" %}
{% endfor %}
</ul>
</main>
{% endblock %}
除了拥有多个模板文件之外,是否可以通过其他方式完成我想做的事情?
您可以使用 computed data 访问 collection,但我不确定您是否可以访问那里的 collection。
更简单的方法:将 frontmatter 字段设置为要显示为字符串的集合的名称,然后使用它来获取模板中的 collection:
<!-- politics.md -->
---
layout: articles-list.njk
title: Politics
listCollection: 'politics'
---
{# articles-list.njk #}
{% extends "base.njk" %}
{% block main %}
<main>
{{ content | safe }}
<ul class="postlist no-bullets">
{% for item in collections[listCollection] %}
{% include "partials/collection-list-item.njk" %}
{% endfor %}
</ul>
</main>
{% endblock %}
我在我的博客 (https://github.com/cfjedimaster/raymondcamden2020) 上处理这个问题的方式是这样的:
- 我创建了一个类别集合。我通过使用 .eleventy.js 和 eleventyConfig.addCollection 来做到这一点。我使用一些 JavaScript 来获取我所有的 post,遍历每个类别列表,并创建一个唯一列表。最后,我有一个名为类别的集合。
eleventyConfig.addCollection("categories", collection => {
let cats = new Set();
let posts = collection.getFilteredByGlob("_posts/**/*.md");
for(let i=0;i<posts.length;i++) {
for(let x=0;x<posts[i].data.categories.length;x++) {
cats.add(posts[i].data.categories[x].toLowerCase());
}
}
return Array.from(cats).sort();
});
- 然后我制作了一个页面,categories.liquid,负责生成我的类别页面。很简单:
---
pagination:
data: collections.categories
size: 1
alias: cat
permalink: "categories/{{ cat | myEscape }}/"
layout: category
renderData:
title: "{{ cat }}"
---
请注意,我对类别中的每个项目都使用了 cat
,请注意我在此处 没有其他内容。所有的布局都在分类布局页面完成。
- 这是我的类别页面的顶部:
---
layout: default
---
{% assign posts = collections.posts | getByCategory: cat %}
所以假设我有一个 post 的集合,其中每个 post 都有 N 个类别分配给它,我写了一个自定义过滤器,将它减少到 post 将 cat
作为其类别之一。
S 最终结果是 N 个类别页面已填充 posts 分配给该类别。