×
Startseite RSS-Feed Info
Pagination mehrfach auf einer Website einsetzen

Hugo - Pagination für Blogbeiträge und Tags

Hugo - Pagination für Blogbeiträge und Tags

Und es geht doch - Pagination mehrfach auf einer Website einsetzen. Mit der Hilfe von Joe Mooring habe ich unterschiedliche Pagination für meine Blogbeiträge auf der Startseite und für die Tag-Liste erstellt.

Mehrfache Paginierung bedingt instanziieren. Dies gelingt nicht in einem Partial, aber in der baseof.html. In einem Partial ist es zu spät für das Erstellen von Instanzen.

Die Notwendigkeit von zumindest 2 Pagnination auf einer Website besteht für die meisten Blogs. In der Doku von Hugo habe ich keinen Hinweis gefunden, dass mehr als eine Pagination möglich ist. Zum Glück gibt es das Hugo Forum und - Joe Mooring - mit seinem umfangreichen Wissen und folgender Lösung.

Hugo - Instanzieren von zwei Pagination

Die baseof.html wird bei jedem Generieren als erstes Template benutzt. Deshalb ist das Instanzieren von Pagination möglich. In meinem Fall brauche ich nur 2 Pagination, aber es sollte auch mehr möglich sein.

Hugo baseof.html Paginate

In der baseof.html folgenden Sourcecode einfügen:

<head>
..
{{ $paginator := slice }}
{{ if .IsHome }}
  {{ $paginator = .Paginate (where .Site.RegularPages "Section" "blog") }}
{{ else }}
  {{ $paginator = .Paginate .Pages }}
{{ end }}
..
</head>

Mit slice wird eine Array-Variable erstellt. Wenn die Startseite (IsHome) erstellt wird, werden alle Pages aus der Section blog durch .Paginate in der Array-Variable gespeichert.

Die Anzahl der Elemente per Page

Die standardmäßige Elementeanzahl pro Seite ist bei einer Pagination 10. Dies ist mir bei meinen wenigen Blogbeiträgen zu viel. Deshalb habe ich in der Konfigurationsdatei config.toml die Anzahl mit paginate = 4 angegeben. Für das Austesten der Pagination kann der Wert dort auch auf 1 stehen. Der Hugo Server muss nach einer Änderung an der Konfiguration neu gestartet werden.

Startseite - Aufruf der Pagination

Meine multilingualen Startseiten sind im Verzeichnis /themes/tekki/layouts/ gespeichert.

themes/tekki
|__  
|__layouts
   |__index.html
   |__index.en.html
   |__partial
      |__blogTeaser.html

Startseite - index.html

Die deutsche und englische Version unterscheiden sich nur in der angezeigten Sprache. Beiden gemeinsam ist der Aufruf des Partial blogTeaser.html.

{{- define "main" -}}
<div class="content-header">
  <div class="container">
    <h1>Ein Blog über Hugo, Webdesign, CSS/SCSS, ..</h1>
    <p>Tipps und Tricks rund um den statischen Webseitengenerator Hugo.</p> 
  </div>
</div>
{{- partial "blogTeaser.html" . -}}
{{- end -}}

Startseite - Partial blogTeaser.html

Der Sourcecode von blogTeaser.html ist sehr übersichtlich und sieht so aus:

{{- range .Paginator.Pages -}}
{{- partial "articleTeaser.html" . -}}
{{- end -}}
{{- template "_internal/pagination.html" . -}}

Im Partial articleTeaser.html werden die Teaser-Daten der einzelnen Blogbeiträge angezeigt. Danach wird das Hugo interne Template _internal/pagination.html aufgerufen. Der Hugo Generator baut aus diesem Aufruf die jeweilige Pagination zusammen. Diese Magie von Hugo fasziniert mich immer wieder.

Liste der Tag-Artikel - Aufruf der Pagination

Meine vorhandenen Tags werden auf einer Übersichtsseite, mehrfarbig angezeigt. Sobald auf einen Tag geklickt wird, wird das Template tag.html aufgerufen, welches wiederum das Partial tagTeaser.html aufruft.

themes/tekki
|__  
|__layouts
   |__partials
      |__tagTeaser.html
   |__taxonomy
      |__tag.html

Liste der Tag-Artikel - Template tag.html

{{- define "main" -}}
<section class="container tag">
  <h1>
    <span class="tag-icon">
      <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-tags" viewBox="0 0 16 16">
        <path d="M3 2v4.586l7 7L14.586 9l-7-7H3zM2 2a1 1 0 0 1 1-1h4.586a1 1 0 0 1 .707.293l7 7a1 1 0 0 1 0 1.414l-4.586 4.586a1 1 0 0 1-1.414 0l-7-7A1 1 0 0 1 2 6.586V2z"/>
        <path d="M5.5 5a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0 1a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM1 7.086a1 1 0 0 0 .293.707L8.75 15.25l-.043.043a1 1 0 0 1-1.414 0l-7-7A1 1 0 0 1 0 7.586V3a1 1 0 0 1 1-1v5.086z"/>
      </svg>
    </span>
    #{{- .Title -}}
  </h1>
  <div class="tagArticle">
    <p class="tagHint">{{- T "tagHint1" -}}<span>#{{- .Title -}}</span>{{- T "tagHint2" -}}</p>
  </div>
</section>
{{- partial "tagTeaser.html" . -}}
{{- end -}}

Das Einbinden von SVG-Grafiken habe ich in dem Artikel - Kostenlose Bootstrap SVG-Icons in Hugo benutzen - beschrieben.

Wegen der multilingualen Texte wird die Hugo T Funktion (Translate) benutzt. Anschließend erfolgt der Aufruf des Partials tagTeaser.html.

Liste der Tag-Artikel - Partial tagTeaser.html

Hier erfolgt das Einbinden der Pagination. Der Inhalt von tagTeaser.html ist identisch mit blogTeaser.html. Identischer Sourcecode sollte eigentlich nicht verwendet werden, aber für mich ist der Partialname dadurch eindeutiger. Den Code schaut man sich ja auch nicht dauernd an und nach einem halben Jahr habe ich vergessen was ich damals gemacht habe.

{{- range .Paginator.Pages -}}
{{- partial "articleTeaser.html" . -}}
{{- end -}}
{{- template "_internal/pagination.html" . -}}

Das SCSS für die Pagination

Laut der - Hugo Doku - ist der einfachste Weg die Pagination in den eigenen Sourcecode zu integrieren, dass Einbinden des von Hugo zur Verfügung gestellten _internal/pagination.html Templates. Das Template hat automatisch ein Bootstrap kompatibles Style. Da ich selber Bootstrap benutze, kann ich nicht sagen ob dies ohne Bootstrap wirklich stimmt.

Das Aussehen der Pagination habe ich an meine Umgebung angepasst. Was auf jeden Fall nicht mitgeliefert wird, ist ein responsive Style. Die Navigation ist für Smartphones hochkant nicht geeignet und muss entsprechend angepasst werden.

.pagination {
  justify-content: center;

  .page-item.active {
    .page-link {
      background-color: var(--wk-linkactive-color) !important;
      border-color: unset;

      a {
        color: white;
      }
    }
  }
  li:nth-child(3) {
    margin-left: 1.0rem;
  }
  li:nth-last-child(2) {
    margin-left: 1.0rem;
  }
}
@media (max-width: 549.98px) {
  .pagination {
    li:first-child,
    li:nth-child(2),
    li:last-child,
    li:nth-last-child(2) {
      display: none;
    }
  }
  .pagination {
    li:nth-child(3) {
      margin-left: 0;
    }
  }
}
@media (max-width: 399.98px) {
  .pagination {
    font-size: 0.7rem;
  }
}

Im allgemeinen Teil habe ich die Pagination zentriert, farblich angepasst und einigen Elementen etwas mehr Raum zur Verfügung gestellt. Bis zu einer maximalen Breite von 549.98px habe ich die Anzeige von diversen Navigationselementen ausgeschaltet. Das sieht sonst wirklich nicht schön aus. Damit das Ganze auch für noch kleinere Displays passt - bis 399.98px Breite dann eine kleinere Schrift.

Fazit

Ohne die Hilfe von - Joe Mooring - hätte ich dies nicht realisieren können. Da die Lösung im Hugo Forum ja dokumentiert ist wollte ich dies eigentlich nicht mehr in einem Blogbeitrag zum Thema machen. Einige Monate später habe ich mir den Thread im Hugo Forum noch einmal angeschaut und meinen eigenen Code und den von Joe im ersten Moment überhaupt nicht mehr verstanden. Dadurch, dass ich mich erneut damit beschäftigt habe, habe ich auch nachträglich in meinem Source noch einige Dinge, die überflüssig waren, entfernt. Ich hoffe, dass dieser Beitrag anderen hilft die mehrfache Pagination selber einfacher umzusetzen.

Linkliste zu diesem Beitrag

Das könnte Sie auch interessieren

|
6 Minuten Lesezeit
0
Dieser Beitrag wurde mit der Hugo-Version 0.115.2 erstellt.

Kommentare werden bei deutscher Spracheinstellung nicht in der englischen Variante der Webseite angezeigt und umgekehrt.

© 2023 - Frank Kunert  -  Ich über mich