So rendern Sie eine Vorlage in Drupal 8

12

Ich versuche, eine Vorlage in Drupal 8 zu rendern. In Drupal 7 würde ich ein Thema mit hook_theme erstellen, ein Vorlagenverzeichnis in meinem Modul erstellen, die Vorlagendatei ablegen und sie mit theme () anzeigen. Wie mache ich das Gleiche mit Drupal 8? Ich habe folgendes ausprobiert, aber es ist ein Fehler aufgetreten:

In twitter_pull.module

/ **
 * Implementiert hook_theme ().
 * /
Funktion twitter_pull_theme ($ existent, $ type, $ theme, $ path) {
  Array zurückgeben (
    'twitter_pull_tweet_listing' => array (
      'Variablen' => Array (
        'description' => array (),
      ),
      'template' => 'templates / twitter_pull_tweet_listing',
    ),
  );
}}

Innerhalb von twitter_pull / templates: die twitter_pull_tweet_listing.html.twig

In meinem Block:

$ tweet_template = array ('# theme' => 'twitter_pull_tweet_listing', '#attributes' => array ('params' => $ params));
$ output = drupal_render ($ tweet_template, array ('params' => $ params));
print $ output;

Ich erhalte den folgenden Fehler in meinen Protokollen:

Benutzerfehler: "Inhalt" ist ein ungültiger Render-Array-Schlüssel in Drupal \ Core \ Render \ Element :: children () (Zeile 89 von C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element. php).

EDIT: Ein weiterer Fehler:

Twig_Error_Loader: Vorlage "modules / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig" konnte nicht gefunden werden (untersucht: C: \ xampp \ htdocs \ drupal). in Twig_Loader_Filesystem-> findTemplate () (Zeile 202 von C: \ xampp \ htdocs \ drupal \ core \ vendor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php).

Ich stelle mir vor, dass dieser Fehler auftritt, weil ich keine Namespaces verwende und nicht richtig automatisch lade. Wo lege ich meine Vorlagendatei ab? Aufgrund der Fehlermeldung habe ich sogar versucht, sie unter C: \ xampp \ htdocs \ drupal \ templates \ abzulegen, aber es hat immer noch nicht funktioniert.

user1015214
quelle
Was ist in twitter_pull_tweet_listing.html.twig?
Clive
Nur ein Platzhalter: Der Text 'Dies ist eine
Zweigvorlage
Gibt es einen bestimmten Grund, an den Sie ein Array von Parametern als zweites Argument übergeben drupal_render()? Es erwartet einen Booleschen Wert
Clive
Nein, das war ein Fehler. Ich habe den zweiten Parameter von drupal_render herausgenommen und habe immer noch das gleiche Problem. Ich bearbeite meine Frage oben, um einen zweiten Fehler aufzunehmen, den ich sehe.
user1015214
Der templates/templates/Teil in der 2. Fehlermeldung lässt mich denken, dass Sie versuchen sollten, 'template' => 'twitter_pull_tweet_listing',anstatt 'template' => 'templates/twitter_pull_tweet_listing',inhook_theme()
Clive

Antworten:

24

Im Allgemeinen sollten Sie in Drupal 8 die Vorlagenzeile weglassen und die Vorlage wie Ihren Hook benennen, um die Unterstriche in Bindestriche umzuwandeln. Dies wurde geändert, da Vorlagen das Standardausgabeformat für die themenbezogene Ausgabe in D8 sind. Also in Ihrem Fall dies hook_theme():

/**
 *  Implements hook_theme().
 */
function twitter_pull_theme($existing, $type, $theme, $path) {
  return [
    'twitter_pull_tweet_listing' => [
      'variables' => [
        'description' => [],
      ],
    ],
  ];
}

… Würde auf eine Vorlage bei verweisen templates/twitter-pull-tweet-listing.html.twig. (Das verwendet eine kurze Array-Syntax .)

Relevanter Änderungsdatensatz: https://www.drupal.org/node/2231673

Außerdem geben Sie von einem Block oder Controller ein Render-Array anstelle eines Strings zurück. Auf diese Weise können die Ergebnisse anschließend bearbeitet werden und die Rohdaten sind später weiterhin verfügbar. Mit anderen Worten, vermeiden drupal_render()Sie es, wann immer möglich von Ihrem Code aus anzurufen. Dies gilt auch für Drupal 7: https://www.drupal.org/node/930760#creating

Also aus deinem Block:

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];
Cottser
quelle
1
Gut zu wissen, dass es beabsichtigt ist :)
Clive
Danke für die Antwort! Aber können Sie etwas mehr erklären, warum ich das Array einfach als Ausgabe zurückgeben könnte? Irgendwann muss drupal render aufgerufen werden, um es auszuführen. Wenn ich es also nicht aufrufe, wer macht es dann?
user1015214
Das können Sie übrigens auch in Drupal 7. Ich werde versuchen, einige Dokumente zu finden, die der Antwort hinzugefügt werden können.
Cottser
1
Etwas verzögert, aber ich habe in der Antwort einen Link zu drupal.org/node/930760#creating hinzugefügt .
Cottser
1
Genau das, was ich brauchte, auch klare Explantation! Vielen Dank.
Johan Haest