Я хотел бы думать, что это довольно простая идея, однако я уже некоторое время борюсь с ней. Идея такова: у меня есть куча отдельных страниц блога. Справа от контента на этих страницах я хочу иметь список из пяти последних сообщений в блоге в виде частичного представления.
В моем проекте 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 поддерживает ссылки (гиперссылки) для перехода с одной страницы на другую.
Вам нужно передать контекст вашему частичному фрагменту, чтобы ваш скрипт работал. Вот почему вы заставили его работать в шаблоне, но не в частичном.
{{ partial "sidePosts.html" }}
должно быть:
{{ partial "sidePosts.html" . }}
"." («точка») представляет контекст в Гюго. Если вы добавите его, ваш фрагмент должен иметь возможность повторяться .Site.RegularPages
Смотрите документацию по Partials здесь: https://gohugo.io/templates/partials/
И этот раздел про "точку": https://gohugo.io/templates/introduction/#the-dot