Списки страниц Hugo
←Hugo
Выведем на главной странице блок с 5 последними страницами из секции portfolio.
Добавьте в файл layouts/index.html следующий код:
{{ range first 5 (where .Data.Pages "Type" "portfolio") }}
{{ .Render "summary"}}
{{ end }}
Теперь создайте файл layouts/_default/summary.html с таким кодом:
<div class="post-preview">
<a href="{{ .Permalink }}"><h2 class="post-title">{{ .Title }}</h2></a>
<h3 class="post-subtitle">{{ .Description }}</h3>
{{ partial "categories.html" .}}<br>
{{ partial "tags.html" .}}
</div>
<hr>
Создайте три файла с кодом:
layouts/partials/categories.html:
{{ range .Params.categories }}
<a href="/category/{{ urlize . }}" >{{ title . }}</a>
{{ end }}
layouts/partials/tags.html:
{{ range .Params.tags }}
<a href="/tag/{{ urlize . }}" >{{ title . }}</a>
{{ end }}
layouts/partials/years.html:
{{ range .Params.years }}
<a href="/years/{{ urlize . }}" >{{ title . }}</a>
{{ end }}
Чтобы блок работал, нужно, чтобы в директории content/portfolio были файлы .md с такими полями в заголовке:
---
title: Литературный музей Владимира Даля
description: Официальный cайт музея, расположенного в Луганске.
tags:
- Drupal
categories:
- Site
- Culture
years:
- 2010
---
Weight -> Date (default)
{{ range .Data.Pages }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
Weight -> Date
{{ range .Data.Pages.ByWeight }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
Date
{{ range .Data.Pages.ByDate }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
Аналогично добавляются сортировки по стандартным параметрам:
- PublishDate
- ExpiryDate
- Lastmod
- Length
- Title
- LinkTitle
Reverse
{{ range .Data.Pages.ByDate.Reverse }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
{{ range (where .Site.Pages "Section" "portfolio").ByDate.Reverse }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a></li>
{{ end }}
Добавим в страницы параметр order:
---
order: 0
---
Будем считать значение по умолчанию 0, а чем больше, тем выше в результатах сортировки будет находиться страница.
Выведем все страницы с сортировкой от большего значения order к меньшему:
{{ range sort .Data.Pages "Params.order" "desc" }}
{{ .Render "summary"}}
{{ end }}
Параметр "desc" нужен для инвертирования сортировки — потому что иначе сверху будут материалы с наименьшим значением order.
Допустим, есть блок partials/block_section_pages.html, в котором выводится список страниц текущей Section.
Нужно в нем настроить, чтобы в разных Section список сортировался по-разному:
- по алфавиту (
Title):- slovar
- по весу (
Weight):- about
- how-to
- rules
- по дате (
Date):- portfolio
{{ if .Section }}
{{ $section_info := .Site.GetPage "section" .Section }}
<h4><a href="/{{ .Section }}/">{{ $section_info.Title }}</a></h4>
{{ $sort_by_field_map := (dict "slovar" "Title" "about" "Weight" "how-to" "Weight" "rules" "Weight" "portfolio" "Date" )}}
{{ $sort_by_field := index $sort_by_field_map .Section | default "Weight" }}
{{ range sort (where .Site.Pages "Section" .Section) $sort_by_field "asc" }}
{{ if .IsPage }}
<a {{ if eq ($.RelPermalink) .URL}} active{{ end }}" href="{{.URL}}">{{ .Title }}</a>
{{ end }}
{{ end }}
{{ end }}
Усложним задачу: выведем только страницы, у которых order больше 0 и у которых параметр to_title содержит "yes":
{{ range sort .Data.Pages "Params.order" "desc" }}
{{ if eq .Params.to_title "yes" }}
{{ if gt .Params.order "0"}}
{{ .Render "summary"}}
{{ end }}
{{ end }}
Вариант с ограничением на вывод только первых 5 результатов:
{{ range first 5 (where (sort .Data.Pages "Params.order" "desc") ".Params.to_title" "yes") }}
{{ if gt .Params.order "0"}}
{{ .Render "summary" }}
{{ end }}
{{ end }}
Список страниц раздела about:
{{ range where .Site.Pages "Section" "about" }}
{{ .Render "summary" }}
{{ end }}
Ссылка на главную страницу раздела:
<a href="{{.Site.BaseURL}}{{.Section}}/">{{.Section}}</a>
Используем шаблон:
{{ if eq ($.RelPermalink) .URL}} class="active"{{ end }}
Пример для меню:
{{ range .Site.Menus.menu_name }}
<li{{ if eq ($.RelPermalink) .URL}} class="active"{{ end }}><a href="{{.URL}}">{{ .Name }}</a></li>
{{ end }}
См. также: