Drupal 9中如何获取嵌套Paragraph下拉字段值实现条件判断?
解决Drupal 9嵌套段落中获取下拉字段值的问题
你遇到的核心问题是直接从content渲染数组中取值,而content存储的是经过处理的渲染结构,并非原始字段值。以下是两种正确获取嵌套段落下拉字段值的方法:
方法一:在Twig模板中直接访问实体字段
在paragraph--my_fields.html.twig模板中,通过父段落实体直接访问子段落的字段值(注意替换成你实际的字段机器名):
{% set classes = [ 'paragraph', 'paragraph--type--' ~ paragraph.bundle|clean_class, view_mode ? 'paragraph--view-mode--' ~ view_mode|clean_class, not paragraph.isPublished() ? 'paragraph--unpublished' ] %} {% block paragraph %} {% block content %} {# 检查父段落中是否存在my_repeater_1子段落字段且有值 #} {% if paragraph.field_my_repeater_1 is not empty %} {# 获取第一个子段落实体(若为多值字段可循环处理) #} {% set sub_paragraph = paragraph.field_my_repeater_1.0.entity %} {# 获取下拉字段的原始键值(1或2) #} {% set dropdown_value = sub_paragraph.field_my_dropdown.value %} {% if dropdown_value == "1" %} DO X {% elseif dropdown_value == "2" %} DO Y {% endif %} {% endif %} {% endblock %} {% endblock paragraph %}
关键说明:
paragraph.field_my_repeater_1:父段落中指向my_repeater_1子段落的字段机器名,需替换为你实际使用的名称.0.entity:由于段落字段默认是多值类型,.0取第一个子段落,.entity获取子段落的实体对象.field_my_dropdown.value:直接获取下拉字段的原始键值(对应你配置的1或2)
方法二:通过预处理函数传递字段值
如果需要更复杂的逻辑,可在主题的.theme文件中添加预处理函数,将字段值传递到模板:
function YOUR_THEME_preprocess_paragraph__my_fields(&$variables) { $paragraph = $variables['paragraph']; // 检查父段落是否包含目标子段落字段 if ($paragraph->hasField('field_my_repeater_1') && !$paragraph->get('field_my_repeater_1')->isEmpty()) { $sub_paragraph = $paragraph->get('field_my_repeater_1')->entity; // 检查子段落是否包含下拉字段 if ($sub_paragraph->hasField('field_my_dropdown') && !$sub_paragraph->get('field_my_dropdown')->isEmpty()) { $variables['my_dropdown_value'] = $sub_paragraph->get('field_my_dropdown')->value; } } }
之后在paragraph--my_fields.html.twig中直接使用传递过来的值:
{% set classes = [ 'paragraph', 'paragraph--type--' ~ paragraph.bundle|clean_class, view_mode ? 'paragraph--view-mode--' ~ view_mode|clean_class, not paragraph.isPublished() ? 'paragraph--unpublished' ] %} {% block paragraph %} {% block content %} {% if my_dropdown_value is defined %} {% if my_dropdown_value == "1" %} DO X {% elseif my_dropdown_value == "2" %} DO Y {% endif %} {% endif %} {% endblock %} {% endblock paragraph %}
注意事项
- 所有字段机器名需与你实际配置的一致(比如
field_my_repeater_1、field_my_dropdown) - 若
my_repeater_1是多值字段(可添加多个子段落),需用for循环遍历每个子段落:{% for item in paragraph.field_my_repeater_1 %} {% set sub_paragraph = item.entity %} {% set dropdown_value = sub_paragraph.field_my_dropdown.value %} {# 针对每个子段落的下拉值执行逻辑 #} {% endfor %}
内容的提问来源于stack exchange,提问作者Jack L
相关产品推荐
相关产品推荐

