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

Render field directly in page.html.twig

如何直接在 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).

那么我该如何渲染它呢?

在 Drupal 8 和 Twig 中,您可以渲染很多东西,例如:

渲染字段值

例如节点标题

{{ node.title.value }}

渲染字段实体值

例如分类术语的字段categories

{{ node.field_categories.entity.name.value }}

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

您不能在 Twig 中打印段落实体,但您可以打印每个字段

{{ 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) }}

希望对您有所帮助!

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

如建议答案中所述,使用 Bamboo Twig 绝对可以胜任。一开始似乎有点尴尬,你必须启用它的一个子模块才能实现这一点。

另一种更常见的解决方案是使用 Twig Tweak module with which you could do the following (copying from their 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'}}) }}