In unserem aktuellen Swim-Projekt hatten wir eine typische Anforderung, wie sie häufiger in Projekten auftritt: ein bestimmter Beitrag soll oberhalb von Teaser-Listen prominent dargestellt werden. In den Listen soll sich dieser Beitrag anschließend nicht wiederholen.
Die einfache Lösung - ohne Panels
Solange es ein oder mehrere Sortierkriterien gibt, anhand derer der prominente Beitrag an erster Stelle erscheint, lässt sich diese Anforderung nur mit Views und ohne Panels-Kontext umsetzen. Man verwendet dafür zwei Views mit identischen Filter- und Sortiereigenschaften, bei denen die erste unter "Anzuzeigende Einträge" nur einen Beitrag - den prominenten Teaser - ausgibt und die zweite View ein Offset von 1 erhält. Diese Einstellung bewirkt, dass die zweite View das erste Element überspringt und mit dem zweiten beginnt.
Dies funktioniert gut, wenn z.B. immer der neueste Beitrag prominent erscheinen soll oder aber der Beitrag eine ganz bestimmte Eigenschaft besitzt (z.B. besitzt Bilder), über die ich ihn an den Anfang sortieren kann.
Lösung für komplexere Anforderungen mit Panels-Kontexten
Das einfache Modell funktioniert nicht mehr, wenn es keine eindeutige Reihenfolge über alle Beiträge gibt. Bei swim.de haben wir ein Teaser-Modell, in dem innerhalb jeder Kategorie mehrere Beiträge mit verschiedenen Status-Zuständen geteasert sein können. In der zweiten Navigations-Ebene soll jeweils der Beitrag mit dem höchsten Teaserstatus prominent dargestellt werden, die übrigen Beiträge (die ebenfalls einen Teaserstatus besitzen können) sollen chronologisch absteigend dargestellt werden.
In diesem Fall muss der obere View dem unteren View sein Ergebnis mitteilen, damit dieser dort als Auswahl-auschließendes Kriterium verwendet wird. Wenn man das nicht mit "embed-Views" "händisch" per Programmierung im Template lösen möchte, gibt es eine Möglichkeit, dies per Panels über "Kontexte" und "Relationen" zu umzusetzen
Ein fiktives Beispiel
Um das Vorgehen zu illustrieren, habe ich ein einfaches Beispiel gewählt. Ich stelle sämtliche Nodes eines bestimmten Inhaltstyps auf einer Seite mit Panels dar.
- Im oberen Bereich soll der zuletzt bearbeitete Beitrag, der auf eine bestimmte Weise ausgezeichnet ist (hier: "auf der Startseite anzeigen") dargestellt werden.
- Darunter folgt eine Liste sämtlicher Beiträge ungeachtet ihrer Auszeichnung, sortiert nach Node-Title.
Panels-Kontexte
"Kontexte" - nicht mit dem Context-Modul zu verwechseln - erweitern Panels um die Möglichkeit, weitere "Umgebungsvariablen" abzufragen um diese an die eingebetteten Views als Argumente zur Verfügung stellen zu können.
Klingt kompliziert? Ist es auch! ;-)
In Kontexten stehen verschiedene Bezüge wie z.B. "Benutzer", "Taxonomie-Begriff", "Token" und einige mehr zur Verfügung, um Umgebungsvariablen abfragen zu können. Der erste Eintrag heißt "Anzeigen". Hinter dieser für mein Empfinden wenig aussagekräftigen Bezeichnung verbirgt sich die Liste sämtlicher Views-Displays vom Typ "Kontext".
Erstellen eines Kontext-Views
Um zu unserem Beispiel zurück zu kehren, benötigen wir also einen View, der den prominenten Teaser als Kontext zurück gibt. Ich erstelle dafür von dem View 1 ein weiteres Display vom Typ Kontext. Bis auf die Felder bleiben sämtliche Einstellungen unverändert - ich lösche sämtliche Felder und selektiere nur die Node-ID.
Sobald dieser Views-Display existiert ist auf der Kontext-Ansicht in Panels die Liste zum Hinzufügen einer neuen "Anzeige" nicht mehr leer und bietet den neuen View zur Auswahl an. Dem View kann ich Namen für Bezeichner und Platzhalter zuweisen, um im Fall mehrerer Views zu wissen, welchen Kontext ich später verwenden möchte.
Den Kontext per "Relation" mit Bedeutung versehen
Ab jetzt kennt Panels zwar diesen Kontext, weiß aber nicht, wie die Daten zu behandeln sind. In unserem Fall liefert die View eine Node-ID als Wert zurück. Für Panels ist das zunächst nur eine Zeichenkette, die genau so auch eine User- oder Term-ID sein könnte - oder auch nur eine Kette von Zeichen zufälligerweise nur aus Ziffern bestehend.
Die Bedeutung der Zeichenketten stellen wir mit Hilfe einer Beziehung "Node from View" her. In der folgenden Maske können wir einen Kontext wählen und - genau wie auch schon bei den Kontexten können wir noch eine Bezeichnung und den Platzhalter angeben. Zusätzlich ist die Zeilen-Nummer anzugeben. Die Kontext-View liefert und möglicherweise mehrere Treffer zurück. Jede Beziehung kann daraus immer nur genau einen Treffer verwenden - wir haben aber die Auswahl, welche Zeile verwendet werden soll.
Unglücklicherweise heißt das Beschriftungsfeld zur Auswahl des Kontexts ebenfalls "View" bzw. auf deutsch "Anzeigen", obwohl hier nicht eine View (vom Typ Kontext) sondern eines Kontext gewählt wird.
Argumente im View einrichten
Nun müssen wir die zweite View mit unserem Argument vertraut machen. Dafür müssen wir erstens in der View die Node-ID als zusätzliches Argument mit folgenden Einstellung hinzufügen:
- "Ansicht ausblenden / Seite wurde nicht gefunden (404)", wenn das Argument nicht vorhanden ist
- Argument ausschließen
Zweitens müssen wir Views in den View-Pane- bzw. "Ausschnitt"-Einstellungen die Herkunft der Argumente mitteilen. Hierfür wählen wir "Aus Kontext" als "Quelle" sowie "Beitrag-ID" als "erforderlicher Kontext". Was nun noch fehlt, ist die Angabe, aus welchem Kontext die ID hergenommen werden soll. Potentiell kann das Panel beliebig viele Kontexte mit bringen. Views bekommt an der Stelle nur mitgeteilt, dass es die ID aus dem Kontext entnehmen soll, nicht aber aus welchem.
Wahl des Kontextes bei Einbindung des View-Panes
Dieser fehlende Baustein in unserer Kette geschieht bei Einbindung des View-Panes in unser Panel. Dort werden wir endlich gefragt, aus welchem Kontext Views das Argument entnehmen soll.
Das ganze Vorgehen kann man sicherlich kaum als intuitiv bezeichnen, aber es funktioniert. :-)
Grenzen von Kontexten: Auswahl multipler Argumente ist nicht möglich.
Im Feld "Row Number" muss der Eintrag mit einer ganzen Zahl beginnen. Alles hinter dieser Zahl wird ignoriert. Eingaben der Form "1+2+3" werden nur als "1" behandelt.
Auf die oben beschriebene Weise ist es insofern nicht möglich mehrere Argumente zu übergeben. Es wäre toll, wenn sich der Inhalt des Kontext-Views (z.B. Node-IDs 1, 2, 3 etc.) in eine Zeichenkette der Form "NID1 + NID2 + NID3 + etc" konvertieren, die sich ohne den Umweg über die Relation direkt als Argument in Views verwenden ließe. Meines Wissens ist das nicht möglich bzw. habe ich noch keine Möglichkeit dafür entdeckt.
Mein Resümee dazu
Am Verwirrendsten an Kontexten empfand ich bislang immer die Auswahl der richtigen Argumenten-Herkunft in Views:
- In Views exisitiert eine ellenlange Aufklappliste voll möglicher Kontext Quellen. Bei der Auswahl muss man sich klarmachen, dass das Argument zunächst nur eine Zeichenkette ist und Views mitteilen, was sich darunter verbirgt. In unserem Beispiel war das die Node-ID.
- Die Auswahl, welcher der möglichen Kontexte verwendet werden solle, wird beim Einfügen des Views als Pane in Panels festgelegt.
Dies kann übrigens zur Folge haben, dass ein Pane gegebenenfalls gelöscht und neu wieder eingefügt werden muss, wenn in Panels Kontexte gelöscht wurden oder andere neu hinzugekommen sind.
Ich hoffe, ich konnte mit diesem Beitrag etwas Licht in die weniger dokumentieren Bereiche von Panels bringen.














