如何访问Twig中的现场数据?


15

我有一个自定义块类型的列表字段,如下所示:

left|Align left
right|Align right

我可以通过执行以下操作来访问Twig中的密钥:

{% block content %}
  {{ content.field_align }}  {# outputs 'right' #}
{% endblock %}

但是,如果我进行简单比较,则输出FALSE

{{ kint(content.field_align == 'right') }}

以下代码返回TRUE

{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}

是否有获取“真实”字符串的较短版本,所以我可以使用Twigs字符串过滤器并使它保持整洁?


Answers:


16

content 包含基于配置的格式化程序的渲染数组。

如果要访问实际值,则要通过实体对象访问它们。通常,例如,模板已可用node。对于您的情况,这有点特殊,因为block_content是在没有其自身模板的块内容中呈现的,因此您必须以如下方式使其可用yourtheme_preprocess_block($variables)

if (isset($variables['elements']['content']['#block_content'])) {
  $variables['block_content'] = $variables['elements']['content']['#block_content'];
}

然后,您可以使用访问字段值block_content.field_name.property。因此,在您的情况下,block_content.field_align.value。该属性适用value于大多数字段类型,对于引用,您可以将其target_id用于ID或entity引用的实体对象。是的,您可以直接访问该字段,但是请确保始终检查引用是否存在,否则可能会导致致命的错误或异常。例如,要访问术语参考的标签,您可以通过对其进行访问block_content.field_tags.entity.name.value

如果未指定字段增量,则默认为第一个。如果要访问其他增量,可以使用entity.field_name.1.value等等。您也可以在它们上循环。

所有这些都直接映射到PHP,您也可以$block_content->field_tags->entity->name->value在预处理以及具有block_content的其他地方进行操作。


感谢您的回答!当我从无法使用节点对象(子主题为“ Classy”)的块树枝模板进行此操作时,是否需要预处理值并以某种方式注入它们?
estrar

抱歉,我错过了block_content部分。更新了答案。
2015年

完善!我可以通过以下操作获得价值:block_content.field_name.value 谢谢您帮助我理解!
estrar

6

这是一种仅模板的替代方法,它允许您渲染渲染数组并检查其值(允许像检查打印变量一样检查变量,因为在Drupal 8 Twig中打印会自动渲染作为渲染数组的变量):

{{ kint(content.field_align|render == 'right') }}

如果以后要打印变量,则可以使用另一个选项来保存额外的渲染器:

{% set field_align = content.field_align|render %}
{{ kint(field_align == 'right') }}

{{ field_align }}

非常有用,很高兴知道!感谢您的输入。
estrar

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.