Как в HUGO получить список страниц в разделе из частичного просмотра?

Я хотел бы думать, что это довольно простая идея, однако я уже некоторое время борюсь с ней. Идея такова: у меня есть куча отдельных страниц блога. Справа от контента на этих страницах я хочу иметь список из пяти последних сообщений в блоге в виде частичного представления.

В моем проекте HUGO у меня есть настройка файловой структуры, подобная следующей:

content
|  |_ posts
|      |_ _index.md
|      |_ firstPost.md
|      |_ secondPost.md
|      |_ thirdPost.md
|      |_ fourthPost.md
|
layout
  |_ partials
        |_ footer.html
        |_ head.html
        |_ navbar.html
        |_ sidePosts.html
    posts
        |_ list.html
        |_ single.html
    index.html

  

Моя страница layout/posts/single.html выглядит следующим образом:

<!DOCTYPE html>
<html>
    {{partial "head.html"}}
    {{partial "navbar.html"}}
    <body>
        <div class = "container-fluid p-5">
            <a href = "/posts" class = "sub-font text-black-50"> << Back To Posts</a>
            <div class = "row">
                <div class = "col-lg-9">
                    <h1>{{.Title}}</h1>
                    <p class = "text-black-50"><i>{{ dateFormat "Monday, Jan 2, 2006" .Date }}</i></p>
                    <hr>
                    {{ .Content }}
                </div>
                <div class = "col-lg-3">
                    {{partial "sidePosts.html"}}
                </div>
            </div>
        </div>
    </body>
    {{partial "footer.html"}}
</html>

А мой layout/partial/sidePosts.html выглядит так:

<div class = "container-fluid d-flex flex-column align-items-center my-5 text-center">
    <div class = "row w-100">
        {{ range (where .Site.RegularPages "Section" "in" "posts") }}
            {{ .Title }}
        {{ end }}
    </div>
</div>

Однако, когда я запускаю это, я получаю эту ошибку:

error calling where: can’t iterate over <nil> failed to render pages

Я пробовал переключать типы, которые я ищу, и разные каталоги, кроме posts, но безрезультатно. Я продолжаю получать ту же <nil> проблему. У меня есть ощущение, что это как-то связано с областью, в которой я ищу; может быть, их какой-то глобальный параметр мне не хватает, чтобы получить доступ к содержимому проекта? Я все еще новичок в HUGO, поэтому, возможно, ответ очевиден, но я собираюсь продолжить поиск решения.

РЕДАКТИРОВАТЬ (27 декабря 2022 г.):

Мне удалось заставить его работать, просто не в частичном представлении. Что я сделал, так это просто написал то, что я хотел сделать, в самом шаблоне, а не в частичном представлении. Код для layout/posts/single.html был обновлен до:

<!DOCTYPE html>
<html>
    {{partial "head.html"}}
    {{partial "navbar.html"}}
    <body>
        <div class = "container-fluid p-5">
            <a href = "/posts" class = "sub-font text-black-50"> << Back To Posts</a>
            <div class = "row">
                <div class = "col-lg-9">
                    <h1>{{.Title}}</h1>
                    <p class = "text-black-50"><i>{{ dateFormat "Monday, Jan 2, 2006" .Date }}</i></p>
                    <hr>
                    {{ .Content }}
                </div>

                {{/*  START OF UPDATE: Dec 27th, 2022  */}}
                <div class = "col-lg-3">
                    <h3 class = "text-center text-black-50">Latest Posts</h3>
                    <div class = "container-fluid">
                        <div class = "row">
                            <div class = "col-lg-12 d-flex flex-column align-items-center justify-content-center">
                                {{ range first 5 (where .Site.RegularPages "Section" "in" "posts") }}
                                    <a href = "{{ .Permalink }}" class = "text-center main-font main-color-font" style = "cursor: pointer;">{{ .Title }}</a>
                                    <p>{{ .Summary }}</p>
                                    <hr>
                                {{ end }}
                            </div>
                        </div>
                    </div>
                </div>
                {{/*  END OF UPDATE: Dec 27th, 2022  */}}

            </div>
        </div>
    </body>
    {{partial "footer.html"}}
</html>

Это отлично работает для моих layout/posts/single.html-страниц, но что, если я хочу иметь что-то подобное в другом каталоге: скажем, layout/contacts/single.html-страницы? Придется ли мне копировать и вставлять тот же код в этот шаблон синглов? Вот тут-то и появляется моя идея использовать его как частичное представление. Я хотел бы иметь этот код, но в частичном представлении для большей модульности и сохранения его сухости. И всякий раз, когда я пытаюсь это сделать, я получаю ошибку error calling where: can’t iterate over <nil> failed to render pages.

🤔 А знаете ли вы, что...
HTML поддерживает ссылки (гиперссылки) для перехода с одной страницы на другую.


2
122
1

Ответ:

Решено

Вам нужно передать контекст вашему частичному фрагменту, чтобы ваш скрипт работал. Вот почему вы заставили его работать в шаблоне, но не в частичном.

{{ partial "sidePosts.html" }}

должно быть:

{{ partial "sidePosts.html" . }}

"." («точка») представляет контекст в Гюго. Если вы добавите его, ваш фрагмент должен иметь возможность повторяться .Site.RegularPages

Смотрите документацию по Partials здесь: https://gohugo.io/templates/partials/

И этот раздел про "точку": https://gohugo.io/templates/introduction/#the-dot