Как сделать шаблон в Drupal 8

12

Я пытаюсь отобразить шаблон в Drupal 8. В Drupal 7 я создавал тему с hook_theme, создавал каталог шаблонов в моем модуле, вставлял файл шаблона и мог отображать его с помощью theme (). Как мне сделать equivilent с Drupal 8? Я попробовал следующее, но это ошибки:

В твиттере твиттер

/ **
 * Реализует hook_theme ().
 * /
функция twitter_pull_theme ($ существующие, $ type, $ theme, $ path) {
  возвращаемый массив (
    'twitter_pull_tweet_listing' => массив (
      'variable' => array (
        'description' => array (),
      ),
      'template' => 'templates / twitter_pull_tweet_listing',
    ),
  );
}

Внутри twitter_pull / templates: twitter_pull_tweet_listing.html.twig

Внутри моего блока:

$ tweet_template = array ('# theme' => 'twitter_pull_tweet_listing', '#attributes' => array ('params' => $ params));
$ output = drupal_render ($ tweet_template, array ('params' => $ params));
вывод $ output;

Я получаю следующую ошибку в моих журналах:

Ошибка пользователя: «content» - недопустимый ключ массива рендеринга в Drupal \ Core \ Render \ Element :: children () (строка 89 из C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element. PHP).

РЕДАКТИРОВАТЬ: еще одна ошибка:

Twig_Error_Loader: невозможно найти шаблон "modules / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig" (заглянул в: C: \ xampp \ htdocs \ drupal). в Twig_Loader_Filesystem-> findTemplate () (строка 202 из C: \ xampp \ htdocs \ drupal \ core \ vendor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php).

Я предполагаю, что эта ошибка происходит, потому что я не использую пространства имен и автозагрузку правильно. Где я могу разместить свой файл шаблона? Основываясь на сообщении об ошибке, я даже пытался поместить его в C: \ xampp \ htdocs \ drupal \ templates \, но он все равно не работал.

user1015214
источник
Что находится в twitter_pull_tweet_listing.html.twig?
Клайв
просто заполнитель: текст «это шаблон веточки»
user1015214
По какой-то конкретной причине вы передаете массив параметров в качестве второго аргумента drupal_render()? Он ожидает логическое значение
Клайв
Нет, это была ошибка. Я выбрал второй параметр drupal_render, и у меня все еще остается та же проблема. Я редактирую свой вопрос выше, чтобы включить вторую ошибку, которую я вижу.
user1015214
templates/templates/Часть в сообщении 2 ошибки заставляет меня думать , что вы должны попробовать 'template' => 'twitter_pull_tweet_listing',вместо 'template' => 'templates/twitter_pull_tweet_listing',вhook_theme()
Clive

Ответы:

24

В целом, в Drupal 8 вы должны пропустить строку шаблона и назвать шаблон так же, как ваш хук, преобразуя подчеркивания в тире. Это было изменено, потому что шаблоны являются форматом вывода по умолчанию для тематического вывода в D8. Так что в вашем случае это hook_theme():

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

... будет указывать на шаблон в templates/twitter-pull-tweet-listing.html.twig. (Это использует синтаксис короткого массива .)

Соответствующая запись изменения: https://www.drupal.org/node/2231673

А также, из блока или контроллера, пожалуйста, верните массив визуализации вместо строки. Таким образом, впоследствии можно будет манипулировать результатами, и необработанные данные будут по-прежнему доступны. Другими словами, по возможности избегайте звонков drupal_render()из своего кода. Это относится и к Drupal 7: https://www.drupal.org/node/930760#creating

Итак, из вашего блока:

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];
Cottser
источник
1
Хорошо знать, что это намеренно :)
Клайв
Спасибо за ответ! Но можете ли вы объяснить немного больше, почему я мог просто вернуть массив в качестве вывода? В какой-то момент для его запуска должен быть вызван друпал-рендер, так что, если я его не называю, то кто это делает?
user1015214
Кстати, вы можете сделать это и в Drupal 7. Я постараюсь найти несколько документов, чтобы добавить к ответу.
Котцер
1
Немного задерживается, но я добавил в ответ ссылку на drupal.org/node/930760#creating .
Котцер
1
Именно то, что мне было нужно, также четкое объяснение! Спасибо.
Йохан Хест