Jak renderować szablon w Drupal 8

12

Próbuję wyrenderować szablon w Drupal 8. W Drupal 7 stworzyłbym szablon z hook_theme, utworzyłem katalog szablonów w moim module, upuściłem plik szablonu i mogłem wyświetlić go za pomocą theme (). Jak zrobić ekwiwalent za pomocą Drupala 8? Próbowałem następujące, ale błędy:

W twitter_pull.module

/ **
 * Implementuje hook_theme ().
 * /
funkcja twitter_pull_theme ($ istniejący, $ typ, $ motyw, $ ścieżka) {
  zwracana tablica (
    'twitter_pull_tweet_listing' => tablica (
      „zmienne” => tablica (
        „description” => array (),
      ),
      „template” => „templates / twitter_pull_tweet_listing”,
    ),
  );
}

Wewnątrz twitter_pull / templates: twitter_pull_tweet_listing.html.twig

Wewnątrz mojego bloku:

$ tweet_template = array ('# theme' => 'twitter_pull_tweet_listing', '#attributes' => array ('params' => $ params);
$ output = drupal_render ($ tweet_template, array ('params' => $ params);
wydrukuj $ wyjście;

W moich logach pojawia się następujący błąd:

Błąd użytkownika: „treść” jest niepoprawnym kluczem tablicy renderowania w Drupal \ Core \ Render \ Element :: children () (wiersz 89 C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element. php).

EDYCJA: Kolejny błąd:

Twig_Error_Loader: Nie można znaleźć szablonu „moduły / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig” (sprawdzono w: C: \ xampp \ htdocs \ drupal). w Twig_Loader_Filesystem-> findTemplate () (wiersz 202 C: \ xampp \ htdocs \ drupal \ core \ vendor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php).

Wyobrażam sobie, że ten błąd występuje, ponieważ nie używam przestrzeni nazw i automatycznego ładowania. Gdzie mogę umieścić plik szablonu? Na podstawie komunikatu o błędzie próbowałem nawet umieścić go w C: \ xampp \ htdocs \ drupal \ templates \, ale nadal nie działał.

użytkownik1015214
źródło
Co zawiera twitter_pull_tweet_listing.html.twig?
Clive
tylko symbol zastępczy: tekst „to jest szablon gałązki”
1015214,
Czy jest jakiś konkretny powód, dla którego przekazujesz tablicę parametrów jako drugi argument drupal_render()? Oczekuje wartości logicznej
Clive
Nie, to był błąd. Wyjąłem drugi parametr drupal_render i nadal mam ten sam problem. Edytuję moje pytanie powyżej, aby uwzględnić drugi błąd, który widzę.
user1015214,
templates/templates/Część 2 w komunikacie błędu kojarzy mi się należy spróbować 'template' => 'twitter_pull_tweet_listing',zamiast 'template' => 'templates/twitter_pull_tweet_listing',whook_theme()
Clive

Odpowiedzi:

24

Ogólnie w Drupal 8 powinieneś pominąć linię szablonu i nazwać szablon tak samo jak hak, konwertując podkreślenia na myślniki. Zostało to zmienione, ponieważ szablony są domyślnym formatem wyjściowym dla motywów wyjściowych w D8. W twoim przypadku to hook_theme():

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

… Wskazuje na szablon w templates/twitter-pull-tweet-listing.html.twig. (To używa składni krótkiej tablicy ).

Odpowiedni zapis zmian: https://www.drupal.org/node/2231673

A także z bloku lub kontrolera proszę zwrócić tablicę renderującą zamiast łańcucha. W ten sposób można później manipulować wynikami, a nieprzetworzone dane są nadal dostępne wzdłuż linii. Innymi słowy, w drupal_render()miarę możliwości unikaj dzwonienia z kodu. Dotyczy to również Drupal 7: https://www.drupal.org/node/930760#creating

Więc z twojego bloku:

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];
Cottser
źródło
1
Dobrze wiedzieć, że to celowe :)
Clive
Dziękuję za odpowiedź! Ale czy możesz wyjaśnić nieco więcej, dlaczego mogę po prostu zwrócić tablicę jako wynik? W pewnym momencie konieczne jest wywołanie renderowania drupal, aby go uruchomić, więc jeśli go nie wywołam, kto to zrobi?
user1015214,
Nawiasem mówiąc, możesz to zrobić również w Drupal 7. Spróbuję znaleźć jakieś dokumenty, które można dodać do odpowiedzi.
Cottser
1
Trochę opóźnione, ale w odpowiedzi dodałem link do drupal.org/node/930760#creating .
Cottser,
1
Dokładnie to, czego potrzebowałem, a także jasne wyjaśnienie! Dziękuję Ci.
Johan Haest