[GELÖST] Drupal 8 | node-Template "if first" abfragen?
Eingetragen von marco-s (21)
am 15.02.2016 - 11:26 Uhr in
am 15.02.2016 - 11:26 Uhr in
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
- Anmelden oder Registrieren um Kommentare zu schreiben
Das sollte doch mit der
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".
Hallo Stefan Vielen Dank für
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?
Wenn Du die first/last
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.
Vielen Dank für den Input!
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 %}
Folgendes sollte
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.
Warum im Template
am 16.02.2016 - 10:52 Uhr
Ich würde das mit Views und CSS machen:
Der größte Fehler, den man in Drupal machen kann ist ... programmieren ;) Das gilt insbesondere für Drupal 8.
Wilfried
Drupal: a CMS without typo in its name
Auf Drupal.org bin ich als Pepe Roni unterwegs!
wbue schriebIch würde das
am 16.02.2016 - 14:53 Uhr
Ich würde das mit Views und CSS machen:
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.
Ich habe nur Gabor zitiert
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.
Wilfried
Drupal: a CMS without typo in its name
Auf Drupal.org bin ich als Pepe Roni unterwegs!
Stefan.Korn schrieb Folgendes
am 17.02.2016 - 08:06 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.
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.
Freut mich dass es so für
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?
Stefan.Korn schrieb Was mich
am 18.02.2016 - 11:20 Uhr
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)
Global für alle nodes
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 %}
Und das funktioniert auch mit
am 22.02.2016 - 13:41 Uhr
Und das funktioniert auch mit pager?
Wilfried
Drupal: a CMS without typo in its name
Auf Drupal.org bin ich als Pepe Roni unterwegs!
kommt drauf an was man haben
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.