Как отобразить шаблон в 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 \но это все равно не сработало.

 12
Author: user1015214, 2014-11-07

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' => [],
];
 27
Author: Cottser, 2015-06-04 02:02:49