Списки страниц Hugo

Матеріал з Wiki.Zina
Перейти до навігації Перейти до пошуку

←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 }}

Cортировка по произвольному параметру

[ред. | ред. код]

Добавим в страницы параметр 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 }}

Список страниц в шаблоне layouts/SECTION/single.html

[ред. | ред. код]

Список страниц раздела 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 }}

См. также: