【问题标题】:How can I specify an 11ty collection in frontmatter?如何在 frontmatter 中指定 11ty 集合?
【发布时间】:2021-07-28 00:39:39
【问题描述】:

在我的网站上,我想在与每个集合对应的页面上显示集合项目列表。例如,在 Games 页面上,我想显示所有游戏相关文章的列表,在 Politics 页面上,我想显示所有政治相关文章的列表,等等

我现在拥有的是每个这样的页面都有一个 Nunjucks 模板文件,我不是特别喜欢它,因为除了要显示的集合之外它们是相同的。这是我的两个模板,用于政治文章和游戏文章,我在其中扩展了一个通用样板 (base.njk),在主块中,我首先打印一些 Markdown 内容,然后来收藏品清单:

{# 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 中指定我想要的集合。由于我已经在每页使用该模板(用于在我开始列出文章之前编写内容)拥有一个 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 %}

除了拥有多个模板文件之外,是否可以通过其他方式做我想做的事情?

【问题讨论】:

    标签: nunjucks eleventy


    【解决方案1】:

    您也许可以使用computed data 访问该收藏,但我不确定您是否可以访问那里的收藏。

    一个更简单的方法:将你的 frontmatter 字段设置为你想要显示为字符串的集合的名称,然后使用它来获取模板中的集合:

    <!-- 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 %}
    

    【讨论】:

    • 谢谢!我会去你的第二个建议。我从没想过集合是关联数组,因为这就是 collections[listCollection] 的全部意义所在,不是吗?
    • @JohanNilsson JS 中不存在关联数组,只有数组(始终以数字索引)和对象。您可以使用点表示法和方括号表示法访问对象属性,后者主要用于此目的,访问属性名称来自变量的属性。由于 110 中的集合是对象,因此您可以使用变量作为键来动态访问一个。 Nunjucks imitates that behaviour,因此它既适用于常规 JS,也适用于 Nunjucks。
    • 从 Nunjucks 示例中,它们是等效的:{{ foo.bar }}{{ foo["bar"] }}。文档没有提到它,但当然"bar" 字符串也可以来自变量。这是resource on bracket notation in JavaScript
    【解决方案2】:

    我在博客 (https://github.com/cfjedimaster/raymondcamden2020) 上的处理方式是这样的:

    1. 我创建了我的类别的集合。我通过使用.eleventy.js 和leventyConfig.addCollection 来做到这一点。我使用一些 JavaScript 来获取我所有的帖子,遍历每个类别列表,并创建一个唯一列表。最后,我得到了一个名为 categories 的集合。
      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,并注意我这里没有nothing。所有的布局都是在分类布局页面中完成的。

    1. 这是我的类别页面的顶部:
    ---
    layout: default
    ---
    
    {% assign posts = collections.posts | getByCategory: cat %}
    

    因此,鉴于我有一组帖子,其中每个帖子都分配了 N 个类别,我编写了一个自定义过滤器,将其简化为以 cat 作为其类别之一的帖子。

    S 最终结果是 N 个类别页面填充的帖子分配给该类别。

    【讨论】:

    • 谢谢!我知道分页,但我想在我的收藏页面中有一些自定义正文文本,并且每个页面中有不同的文本。我想我会接受@MoritzLost 的回答。有一天我一定会查看您的博客源代码以获取一些行业工具。我是 Eleventy 的新手。
    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 2021-07-19
    • 2020-03-23
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多