如何在 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.politicscollections.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) 上处理这个问题的方式是这样的:

  1. 我创建了一个类别集合。我通过使用 .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();
    });
  1. 然后我制作了一个页面,categories.liquid,负责生成我的类别页面。很简单:
---
pagination:
    data: collections.categories
    size: 1
    alias: cat
permalink: "categories/{{ cat | myEscape }}/"
layout: category
renderData:
    title: "{{ cat }}"
---

请注意,我对类别中的每个项目都使用了 cat,请注意我在此处 没有其他内容。所有的布局都在分类布局页面完成。

  1. 这是我的类别页面的顶部:
---
layout: default
---

{% assign posts = collections.posts | getByCategory: cat %}

所以假设我有一个 post 的集合,其中每个 post 都有 N 个类别分配给它,我写了一个自定义过滤器,将它减少到 post 将 cat 作为其类别之一。

S 最终结果是 N 个类别页面已填充 posts 分配给该类别。