如何在Drupal 8中渲染模板


12

我正在尝试在Drupal 8中渲染模板。在Drupal 7中,我将使用hook_theme创建主题,在模块中创建模板目录,将模板文件放入其中,然后可以使用theme()显示它。如何使用Drupal 8?我尝试了以下操作,但出错了:

在twitter_pull.module中

/ **
 *实现hook_theme()。
 * /
功能twitter_pull_theme($ existing,$ type,$ theme,$ path){
  返回数组(
    'twitter_pull_tweet_listing'=>数组(
      '变量'=>数组(
        '描述'=> array(),
      ),
      '模板'=>'模板/ 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;

我的日志中出现以下错误:

用户错误:“内容”是Drupal \ Core \ Render \ Element :: children()中的无效渲染数组键(C:\ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element的第89行。 php)。

编辑:另一个错误:

Twig_Error_Loader:无法找到模板“ modules / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig”(查找到:C:\ xampp \ htdocs \ drupal)。在Twig_Loader_Filesystem-> findTemplate()中(C:\ xampp \ htdocs \ drupal \ core \ vendor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php的第202行)。

我认为发生此错误是因为我没有使用名称空间并正确自动加载。模板文件放在哪里?根据错误消息,我什至尝试将其放在C:\ xampp \ htdocs \ drupal \ templates \中,但仍然无法正常工作。


twitter_pull_tweet_listing.html.twig中有什么?
克莱夫(Clive)

只是一个占位符:文本“这是一个树枝模板”
user1015214 2014年

要将参数数组作为第二个参数传递的任何特殊原因drupal_render()?该公司预计,一个布尔
克莱夫

不,那是一个错误。我取出了drupal_render的第二个参数,但我仍然遇到相同的问题。我正在编辑上面的问题,以包括我看到的第二个错误。
user1015214 2014年

templates/templates/在第二个错误消息部分让我觉得你应该尝试'template' => 'twitter_pull_tweet_listing',,而不是'template' => 'templates/twitter_pull_tweet_listing',hook_theme()
克莱夫

Answers:


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' => [],
];

1
很高兴知道这是故意的:)
Clive

感谢你的回答!但是您能解释一下为什么我只能将数组作为输出返回吗?在某个时间点需要调用drupal render来运行它,所以如果我不调用它,谁来做?
user1015214 2014年

您也可以在Drupal 7中做到这一点。我将尝试查找一些文档以添加到答案中。
科特瑟

1
有点延迟,但我在答案中添加了指向drupal.org/node/930760#creating的链接。
Cottser 2014年

1
正是我需要的,也清楚了移植!谢谢。
Johan Haest 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.