Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Themes & Theming ›

[GELÖST] Drupal 8 | node-Template "if first" abfragen?

Eingetragen von marco-s (21)
am 15.02.2016 - 11:26 Uhr in
  • Themes & Theming
  • Drupal 8.x

Hallo zusammen

Ich muss ein Node-Template gemäss einem FE-Layout anpassen. Es wird mir per View eine unformatierte Liste der Nodes ausgegeben.

<!-- views-view-unformatted.html.twig -->
<div class="views-row">
<!-- node--teaser.html.twig -->
<div>...</div>
</div>
<div class="views-row">/div>
<div class="views-row">/div>
...

Nun müsste ich wissen, wann das node-Template zum erstenmal ausgeführt wird. Also in etwa {{% if this.first %}}
Ich muss beim ersten Node eine first-CSS-Klasse anhängen und einen Titel ausgeben und beim letzten Node eine last-CSS-Klasse anhängen.

Wie kann ich das bewerkstelligen?

Vielen Dank im Voraus!

Marco

‹ Content Links sortieren [GELÖST] Drupal 8 | node-Template "if first" abfragen? ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Das sollte doch mit der

Eingetragen von Stefan.Korn (286)
am 15.02.2016 - 11:46 Uhr

Das sollte doch mit der Loop-Variable von Twig gehen: http://twig.sensiolabs.org/doc/tags/for.html

Im Twig-Template hast Du ja die for-Schleife über "rows".

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Stefan Vielen Dank für

Eingetragen von marco-s (21)
am 15.02.2016 - 13:09 Uhr

Hallo Stefan

Vielen Dank für deine rasche Antwort und den Input. Das Problem ist aber, dass ich zwingend im node-Template wissen muss, in welchem Durchlauf ich mich befinde. Könnte ich im views-view-unformatted.html.twig eine Variable setzen, auf die ich im node-Template zugreifen kann?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Wenn Du die first/last

Eingetragen von Stefan.Korn (286)
am 15.02.2016 - 15:55 Uhr

Wenn Du die first/last CSS-Klasse in views-view-unformatted.html.twig setzt, kannst Du einen Style doch auch problemlos in den Node bringen? Das wäre vielleicht die einfachere Variante für die Klasse.

Bezüglich der Änderung des Titels für den ersten Node könntest Du z. B. folgendes versuchen:

function template_preprocess_views_view_unformatted(&$variables) {
  $variables['rows'][0]['content']['#node']->setTitle("First");
}

Hiermit würdest Du den Standard-Titel überschreiben.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Vielen Dank für den Input!

Eingetragen von marco-s (21)
am 16.02.2016 - 08:09 Uhr

Vielen Dank für den Input! (sorry, ich befasse mich erst seit kurzem mit Drupal)

Kann ich denn aus dieser Preprocess-Funktion auch eigene Variablen für node definieren, welche ich dann im Template abfragen kann? Überlegung:

<?php
$count
= 0;
$key = 0;
while (!empty(
$variables['rows'][$key])) {
    if(
$variables['rows'][$key]['content']['#node']->values['type']['x-default'] == 'test'){
        if(
$count == 0){
           
$variables['rows'][$key]['content']['#node']->values['test_first'] = true;
        } else {
           
$variables['rows'][$key]['content']['#node']->values['test_first'] = false;
        }
       
$count++;
    }
   
$key++;
}
?>

Dann könnte ich im Node-Template ja nach diesem Wert abfragen:
{% if test_first %}...{% endif %}

  • Anmelden oder Registrieren um Kommentare zu schreiben

Folgendes sollte

Eingetragen von Stefan.Korn (286)
am 16.02.2016 - 15:38 Uhr

Folgendes sollte funktionieren in template_preprocess_views_view_unformatted:

$variables['rows'][$key]['content']['#node']->__set('test_first', true); // (oder eben false)

Dann hast Du test_first unter values im Node.

Dann kannst Du in template_preprocess_node Folgendes machen:

function template_preprocess_node(&$variables) {

$variables['test_first'] = $variables['elements']['#node']->__get('test_first"');

}

Dann hast Du in node.html.twig die Variable test_first verfügbar und kannst was damit anstellen.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Warum im Template

Eingetragen von wbue (234)
am 16.02.2016 - 10:52 Uhr

Ich würde das mit Views und CSS machen:

  • Den auszugebenden Titel definiert man im Header-Bereich der View
  • Statt der First-Klasse kann man auch die css-Pseudoklasse :first-child verwenden
  • Statt der Last-Klasse kann man auch die css-Pseudoklasse :last-child verwenden

Der größte Fehler, den man in Drupal machen kann ist ... programmieren ;) Das gilt insbesondere für Drupal 8.

  • Anmelden oder Registrieren um Kommentare zu schreiben

wbue schriebIch würde das

Eingetragen von Stefan.Korn (286)
am 16.02.2016 - 14:53 Uhr
wbue schrieb

Ich würde das mit Views und CSS machen:

  • Den auszugebenden Titel definiert man im Header-Bereich der View
  • Statt der First-Klasse kann man auch die css-Pseudoklasse :first-child verwenden
  • Statt der Last-Klasse kann man auch die css-Pseudoklasse :last-child verwenden

Der größte Fehler, den man in Drupal machen kann ist ... programmieren ;) Das gilt insbesondere für Drupal 8.

Das finde ich jetzt nur bedingt hilfreich/qualifiziert ... Wenn es der größte Fehler in Drupal ist zu programmieren, dann fragt es sich wofür die Drupal API da ist!?

Es gibt sicherlich Fälle in denen man mit dem Standard-Views-Verhalten nicht weiterkommt und man dann eben auch mal etwas tiefer einsteigen muss.

Wenn im konkreten Fall nur mal als Beispiel der zusätzliche Titel eben nicht im View-Header stehen soll, sondern als eine Art Untertitel im ersten Node der Liste ...

Bezüglich der CSS-Klasse ist es sicherlich fraglich ob man das unbedingt im Node setzen muss oder nicht von oben herunter stylen kann, darauf habe ich ja auch schon hingewiesen. Ich gestehe es aber auch jedem zu einen eigenen Use Case zu haben und dann aus mir vielleicht nicht gleich ersichtlichen Gründen die Klasse direkt im Node setzen zu wollen.
Der first-child-Selektor ist nach meiner Erfahrung nicht immer so ganz einfach zu gebrauchen, insbesondere bei verschachtelten Ausgaben wie bei Views nicht unüblich.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich habe nur Gabor zitiert

Eingetragen von wbue (234)
am 16.02.2016 - 16:11 Uhr

und bisher sogar mit Drupal 7 noch keine Notwendigkeit gesehen, PHP zu kodieren. In Views und mit SASS/CSS habe ich bisher noch alles hinbekommen. Fences ist übrigens gut geeignet, den Output von Views zu vereinfachen.

Wenn du dein Problem ausführlicher beschreibst, bekommst du sicher auch besser zutreffende Vorschläge. Ich kann nur aus meinen eigenen Erfahrungen schöpfen. Dass du den View-Header als Untertitel im ersten Node angeben möchtest ist etwas anderes als nur "den Views-Titel beim ersten Node angeben".

PS. man sollte schon den Zwinkersmiley nicht mit einem Rufzeichen verwechseln.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Stefan.Korn schrieb Folgendes

Eingetragen von marco-s (21)
am 17.02.2016 - 08:06 Uhr
Stefan.Korn schrieb

Folgendes sollte funktionieren in template_preprocess_views_view_unformatted:

$variables['rows'][$key]['content']['#node']->__set('test_first', true); // (oder eben false)

Dann hast Du test_first unter values im Node.

Dann kannst Du in template_preprocess_node Folgendes machen:

function template_preprocess_node(&$variables) {

$variables['test_first'] = $variables['elements']['#node']->__get('test_first"');

}

Dann hast Du in node.html.twig die Variable test_first verfügbar und kannst was damit anstellen.

Genial! Das mit __set und __get hatte mir noch gefehlt! Vielen Dank!!

PS: ich muss mich an ein vorgegebenes FE-Template halten. Darum muss ich diesen Weg via eine eigene Programmierung gehen und kann nicht einfach CSS/HTML anpassen.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Freut mich dass es so für

Eingetragen von Stefan.Korn (286)
am 17.02.2016 - 08:19 Uhr

Freut mich dass es so für Dich funktioniert. Dann kannst Du den Thread vielleicht noch auf Gelöst setzen.

Was mich noch interessieren würde: Was kürzt du eigentlich mit FE-Template ab?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Stefan.Korn schrieb Was mich

Eingetragen von marco-s (21)
am 18.02.2016 - 11:20 Uhr
Stefan.Korn schrieb

Was mich noch interessieren würde: Was kürzt du eigentlich mit FE-Template ab?

Ein Frontend-Template: also ein reines HTML/CSS - Template, welches nun in Drupal integriert werden soll (ohne das HTML-Markup zu verändern)

  • Anmelden oder Registrieren um Kommentare zu schreiben

Global für alle nodes

Eingetragen von marco-s (21)
am 18.02.2016 - 11:31 Uhr

Ich habe die Lösung jetzt global für alle Nodes erstellt. Konnte ich überall wieder gebrauchen!

MYTHEME.theme

<?php
function template_preprocess_views_view_unformatted(&$variables) {
   
$key = 0;
   
$count = 0;
    while(!empty(
$variables['rows'][$key])) {           
       
$node = $variables['rows'][$key]['content']['#node'];
       
$node->__set('node_first', false);
        if(
$count == 0){
           
$node->__set('node_first', true);
           
$count++;
        }
       
$key++;
    }
}

function
template_preprocess_node(&$variables){
   
$variables['node_first'] = $variables['node']->__get('node_first');
}
?>

Im twig-Template:

{% if node_first %}
do something
{% endif %}

  • Anmelden oder Registrieren um Kommentare zu schreiben

Und das funktioniert auch mit

Eingetragen von wbue (234)
am 22.02.2016 - 13:41 Uhr

Und das funktioniert auch mit pager?

  • Anmelden oder Registrieren um Kommentare zu schreiben

kommt drauf an was man haben

Eingetragen von Stefan.Korn (286)
am 22.02.2016 - 14:58 Uhr

kommt drauf an was man haben will. So wie es jetzt gelöst ist, würde auf jeder Page des Views das erste Element entsprechend markiert.

Wenn man das nicht will kann man über ViewExecutable::getCurrentPage auch herausfinden wo man sich befindet und das dann z. B. nur für die erste Seite anwenden.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 1 Woche 2 Stunden
  • Hey danke
    vor 1 Woche 20 Stunden
  • Update: jetzt gibt's ein
    vor 1 Woche 1 Tag
  • Hallo, im Prinzip habe ich
    vor 1 Woche 6 Tagen
  • Da scheint die Terminologie
    vor 1 Woche 6 Tagen
  • Kannst doch auch alles direkt
    vor 2 Wochen 3 Tagen
  • In der entsprechenden View
    vor 2 Wochen 3 Tagen
  • Dazu müsstest Du vermutlich
    vor 2 Wochen 3 Tagen
  • gelöst
    vor 4 Wochen 6 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 5 Wochen 21 Stunden

Statistik

Beiträge im Forum: 250233
Registrierte User: 20450

Neue User:

  • Mroppoofpaync
  • 4aficiona2
  • AppBuilder

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 10 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association