Ein besseres Archiv

Konfiguration eines Archivblocks mit Drupal 7 und Views
Screenshot

You need Views if ... You want a monthly archive similar to the typical Movable Type/Wordpress archives that displays a link ... in the form of "Month, YYYY (X)" where X is the number of posts that month.

drupal.org/project/views

Zum Lieferumfang des Drupal-Moduls Views gehört der nach Monaten sortierte Block Monthly archive. Mit Hilfe dieser vorkonfigurierten Datenbankabfrage lässt sich ein Archiv aller Beiträge einer Website darstellen.

Kontextfilter

Die Links im Archivblock werden durch einen 'contextual filter' in Views erzeugt. Solche dynamischen Filter beziehen ihre Werte eigentlich aus der URL, können für den Fall fehlender Filterwerte jedoch praktischerweise so konfiguriert werden, dass eine Zusammenfassung der ungefilterten Ergebnisse angezeigt wird. Und nicht mehr als diese Fallback-Lösung wird im Archivblock als Übersicht angezeigt. Deren Links führen dann auf eine dynamisch gefilterte Archivseite.

Die Darstellung

Bei einem umfangreichen Archiv, das sich über Jahre erstreckt, wird eine monatsweise Darstellung sehr lang und irgendwann unpraktisch. In der Sidebar-Chronik dieser Website habe ich daher die Darstellung nach Jahren gewählt. Noch besser gefällt mir eine Kombination beider Kriterien: ein Monats-Jahres-Archiv.

Screenshots

Abb: Monate vs. Monate u. Jahre

Das kalendarisches Jahr

Den mitgelieferten 'View' zu einem Monats-Jahres-Archiv auszubauen, ist eigentlich nicht schwer, doch bis vor kurzem bin ich immer an der gewünschten Abgrenzung von Monats- und Jahresdarstellung gescheitert: Mir war nicht klar, wie ich Views mitteile, dass im Archivblock nur die Monate des laufenden Jahres (dieses Jahr also nur die aus 2013) angezeigt werden sollen. Meine Versuche, das aktuelle Jahr anzuzeigen, ergaben als Resultat leider nicht das kalendarische Jahr, sondern die letzten 12 Monate.

Neulich ist es mir dann doch gelungen, die Monate des laufenden kalendarischen Jahres im Archiv-Block anzuzeigen. Entscheidend war eine Konfigurationsmöglichkeit in Views, die das Date-Modul mitbringt. Was es damit auf sich hat, und wie ich meinen Archiv-Block insgesamt entwickelt habe, erläutere ich im folgenden Tutorial.

Schritt-für-Schritt

  1. ​Gehe zu admin/structure/views, aktiviere den mitgelieferten View "Archive", dupliziere den View (edit > clone), und arbeite dann mit dem Archiv-Duplikat.
  2. Dupliziere das Display "Page" zweimal: zum einen für die Monats- und zum anderen für die Jahresdarstellung.
    1. Bei dem Seitendisplay für die Monatsdarstellung braucht nur der Pfad "archive" unter "Page settings" geändert zu werden. Beispiel: "custom-archive/by-month/%"
    2. Beim Seitendisplay für die Jahresdarstellung änderst du ebenfalls den Pfad (z.B. "custom-archive/by-year/%"). Unter "Advanced" ersetzt du außerdem den Kontextfilter "Content: Created year + month":
      Zunächst fügst du den Filter "Content: Created year" hinzu und orientierst dich in der Konfiguration am bestehenden year + month-Exemplar. Wichtige Ausnahme: Die Sortierreihenfolge unter "Display a summary" wird von "Ascending" auf "Descending" gestellt.
      Wenn der year-Filter fertig ist, entfernst du den year + month-Filter.
  3. Dupliziere das Display "Block".
    Dieses Display wird für die Darstellung der Jahre im Archivblock zuständig sein. Wir benötigen hier nur Beiträge, die vor dem laufenden kalendarischen Jahr veröffentlicht wurden. Beiträge des laufenden Jahres werden mit Hilfe der "Filter criteria" ausgeschlossen.
    1. Ersetze zunächst (wie oben anhand des Seitendisplays erläutert) im "Advanced"-Bereich den dynamischen year + month-Filter durch "Content: Created year". Da in dem gesamten View mehrere Seitendisplays vorhanden sind, sollte in der Filterkonfiguration außerdem ein "Base path" genannt werden; in meinem Fall "custom-archive/by-year".
    2. Füge in der linken Spalte der Views-Konfiguration unter "Filter criteria" den statischen Filter "Date: Date (node)" hinzu, der sich auf das Veröffentlichungsdatum von Beiträgen bezieht. (Dieser Filter wird vom Date-Modul zur Verfügung gestellt und bietet im Gegensatz zum Standard-Filter "Content: Post date" die entscheidende Möglichkeit, das laufende kalendarische Jahr zu bestimmen.) Stelle die "Filter granularity" in den Einstellungen auf "Year". In der weiteren Konfiguration wählst du "Operator: Is less than". Anschließend wählst du kein konkretes Datum aus, sondern gibst den 'relativen' Datumswert "now" an. Als Ergebnis werden nur Beiträge angezeigt, die vor dem laufenden Jahr liegen.
  4. Füge ein 'Attachment' zum View hinzu (add > Attachment).
    Das Attachment wird den Block um die Darstellung der Monate des laufenden Jahres ergänzen. Dazu ist ein Attachment besser geeignet als ein eigener Monatsblock.
    1. Unter "Attachment settings" ordnest du das Attachment mit der Position "Before" dem oben erzeugten Block zu.
    2. Im "Advanced"-Bereich modifizierst du den dynamischen year + month-Filter und gibst als "Base path" die URL deines Seitendisplays an, z.B. "custom-archive/by-month".
    3. Als "Filter criteria" fügst du den statischen Filter "Date: Date (node)" hinzu, den du bereits aus der Block-Konfiguration kennst. Die Granularität liegt wieder bei "Year". Als Operator für das relative Datum "now" wählst du hier nicht Is less than, sondern Is equal to.
  5. Speichere den View und konfiguriere die Sichtbarkeit des Archivblocks unter admin/structure/block.

Verwendete Versionen

  • Drupal 7.20
  • Views + Views UI 7.x-3.5
  • Date + Date Views 7.x-2.6

To do

  • Bildschirmfotos zu diesem Beitrag hinzufügen

Fazit

Die vorkonfigurierten Datenbankabfragen von Views sind interessante Lernobjekte, und sie sind ein guter Ausgangspunkt, durch gezielte Modifikation eigene Entwicklungsziele zu erreichen.

Interessieren würde mich, ob es bessere Alternativen zur oben dargestellte Vorgehensweise gibt und ob sich das laufende kalendarische Jahr doch ohne die Hilfe des Date-Moduls ausfiltern lässt.

Kommentare

Von Dieter Hardt,

Prima, Klasse, Danke,
ich habe Deine Anleitung umgesetzt, und es funktioniert!

Allerdings habe ich zuerst keinen älteren Inhalt (letztes Jahr oder älter) gehabt und dann erscheint der Block erst gar nicht.

Hast Du eine Idee, wie man das noch ausmärzen kann? Dann wäre es perfekt.

LG
Dieter Hardt

Von Olaf Grabienski,

Hallo Dieter,

stimmt: Wenn für den Block noch keine Inhalte vorliegen, wird er nicht angezeigt - und somit auch nicht dessen Attachment mit den aktuellen Monaten (deren Darstellung in dieser Situation ja reichen würde). Ich sehe drei Möglichkeiten, damit umzugehen:

  • Statt Block plus Attachment baust du zwei Blöcke, die du per CSS optisch zu einem Bereich verbindest. Nachteil: mehr Aufwand mit Styling und Block-Verwaltung.
  • Block und Attachment umkehren: Die Monate des laufenden Jahres kommen in den Block, die vergangenen Jahre ins Attachment (Position hier: nach Block). In diesem Fall können allerdings auch Inhalte fehlen, die Voraussetzung zur Darstellung des Blocks sind: Immer dann, wenn zu Beginn eines Jahres noch keine aktuellen Beiträge vorliegen.
  • Du legst in der Views-Konfiguration des Blocks unter "Advanced" ein "No results behavior" fest, z.B. einen kurzen Text wie "Noch keine älteren Inhalte". (Wenn der Text dich stört, kannst du ihn per CSS ausblenden.)

Von Dieter Hardt,

Vielen Dank für die prompte Antwort!

Ich habe Alternative zwei gewählt und bin sehr zufrieden damit.

LG
Dieter Hardt