直接在page.html.twig中渲染字段

时间:2017-07-27 07:38:35

标签: drupal twig drupal-8

如何直接在page.html.twig中渲染字段?

当我尝试渲染它时:

{{ node.field_my_field.value }}

我明白了:

Exception: Object of type Drupal\entity_reference_revisions\EntityReferenceRevisionsFieldItemList cannot be printed

当我添加.value时,它仍然无法正确渲染(我使用带子字段的段落)但是会出现以下错误: 用户错误:“target_id”是

中无效的渲染数组键
Drupal\Core\Render\Element::children() (line 97 of core/lib/Drupal/Core/Render/Element.php).
User error: "target_revision_id" is an invalid render array key in Drupal\Core\Render\Element::children() (line 97 of core/lib/Drupal/Core/Render/Element.php).
User error: "_loaded" is an invalid render array key in Drupal\Core\Render\Element::children() (line 97 of core/lib/Drupal/Core/Render/Element.php).
User error: "_accessCacheability" is an invalid render array key in Drupal\Core\Render\Element::children() (line 97 of core/lib/Drupal/Core/Render/Element.php).

那我怎么渲染呢?

2 个答案:

答案 0 :(得分:3)

在Drupal 8& Twig你可以渲染很多东西:

渲染字段值

例如,节点标题

{{ node.title.value }}

渲染字段实体值

例如,分类术语categories

的字段
{{ node.field_categories.entity.name.value }}

渲染段落(实体)的字段值

您无法在Twig中打印Paragraph实体,但可以打印每个字段

{{ node.field_my_field.entity.field_title.value }}

在上一个示例中,field_title是我的段落的字段。

为了更进一步,您可以使用模块Bamboo Twig渲染显示模式   - Project page
  - Article about Bamboo Twig
  - Official Documentation

使用Bamboo Twig

以显示模式渲染实体

安装模块并启用子模块bamboo_twig_loader

{# Render node with nid 1 #}
{{ bamboo_render_entity('node', 1) }}

{# Render the teaser of node with nid 2 #}
{{ bamboo_render_entity('node', 2, 'teaser') }}

使用Bamboo Twig

渲染字段
{# Render the title of node 1  #}
{{ bamboo_render_field('title', 'node', 1) }}

希望它会对你有所帮助!

答案 1 :(得分:0)

为了在树枝模板中渲染字段,您需要一个 contrib 模块;除非你使用 hook_preprocess_page() 实现。

正如建议的答案中已经提到的那样,使用 Bamboo Twig 绝对可以完成您的工作。不过,您必须启用其中一个子模块才能实现这一点,一开始似乎有点尴尬。

另一种更常见的解决方案是使用 Twig Tweak 模块,您可以使用它执行以下操作(从他们的 cheat sheet 复制):

{{ drupal_field('field_image', 'node', 1) }}
{{ drupal_field('field_image', 'node', 1, 'teaser') }}
{{ drupal_field('field_image', 'node', 1, {type: 'image_url', settings: {image_style: 'large'}}) }}