Как отобразить шаблон в Drupal 8
Я пытаюсь отобразить шаблон в Drupal 8. В Drupal 7 я бы создал тему с помощью hook_theme, создал каталог шаблонов в своем модуле, вставил файл шаблона, и я мог бы отобразить его с помощью theme(). Как мне выполнить эквилент с помощью Drupal 8? Я попробовал следующее, но это приводит к ошибкам:
В twitter_pull.модуле
/** * Implements hook_theme(). */ function twitter_pull_theme($existing, $type, $theme, $path) { return array( 'twitter_pull_tweet_listing' => array( 'variables' => array( 'description' => array(), ), 'template' => 'templates/twitter_pull_tweet_listing', ), ); }
Внутри twitter_pull/шаблоны: twitter_pull_tweet_listing.html.ветка
Внутри моего блока:
$tweet_template = array('#theme' => 'twitter_pull_tweet_listing', '#attributes' => array('params' => $params)); $output = drupal_render($tweet_template, array('params' => $params)); print $output;
Я получаю следующая ошибка в моих журналах:
User error: "content" is an invalid render array key in Drupal\Core\Render\Element::children() (line 89 of C:\xampp\htdocs\drupal\core\lib\Drupal\Core\Render\Element.php).
РЕДАКТИРОВАТЬ: Еще одна ошибка:
Twig_Error_Loader: Unable to find template "modules/custom/twitter_pull/templates/templates/twitter_pull_tweet_listing.html.twig" (looked into: C:\xampp\htdocs\drupal). in Twig_Loader_Filesystem->findTemplate() (line 202 of C:\xampp\htdocs\drupal\core\vendor\twig\twig\lib\Twig\Loader\Filesystem.php).
Я предполагаю, что эта ошибка происходит из-за того, что я неправильно использую пространства имен и автоматическую загрузку. Куда мне поместить файл шаблона? Основываясь на сообщении об ошибке, я даже попытался поместить его в C:\xampp\htdocs\drupal\templates \но это все равно не сработало.
1 answers
В общем случае в 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' => [],
];