如何在Drupal嵌套段落中根据父区块字段选择条件显隐并设置必填字段?
解决Drupal嵌套段落的条件显示与必填字段设置问题
模块解决方案(适合新手,可视化配置)
由于Conditional Field模块不支持嵌套段落的场景,推荐使用以下模块组合实现需求:
- Paragraphs Visibility Conditions模块:专门用于控制段落的显示/隐藏,支持基于父实体字段值设置条件
- 安装启用后,进入自定义区块类型的字段设置页面
- 为
icon_card_paragraph添加可见性条件:当select_card_type字段值等于icon_card时显示 - 为
image_card_paragraph添加可见性条件:当select_card_type字段值等于image_card时显示
- Required Condition模块:用于设置字段的条件必填规则
- 启用后,编辑
icon_card_paragraph段落类型内的card_internal_link字段,设置必填条件:当父区块的select_card_type等于icon_card时,该字段为必填
- 启用后,编辑
如果上述模块适配有问题,可采用自定义代码方案:
自定义代码解决方案(灵活可控)
1. 表单修改:控制段落字段的显示/隐藏
在自定义主题或模块的.module文件中添加以下代码:
/** * Implements hook_form_alter(). */ function YOUR_MODULE_OR_THEME_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { // 匹配自定义区块的编辑表单ID,替换为你的区块类型对应表单ID if (strpos($form_id, 'custom_block_type_edit_form') !== FALSE) { $selected_type = $form_state->getValue('select_card_type', ''); // 设置icon_card_paragraph的显示规则 $form['icon_card_paragraph']['#states'] = [ 'visible' => [ ':input[name="select_card_type"]' => ['value' => 'icon_card'], ], ]; // 设置image_card_paragraph的显示规则 $form['image_card_paragraph']['#states'] = [ 'visible' => [ ':input[name="select_card_type"]' => ['value' => 'image_card'], ], ]; // 添加AJAX实时刷新 $form['select_card_type']['#ajax'] = [ 'callback' => 'YOUR_MODULE_OR_THEME_card_type_ajax_callback', 'wrapper' => 'card-paragraphs-wrapper', 'event' => 'change', ]; // 包裹段落字段用于AJAX刷新 $form['card_paragraphs_container'] = [ '#type' => 'container', '#attributes' => ['id' => 'card-paragraphs-wrapper'], '#weight' => $form['icon_card_paragraph']['#weight'], ]; $form['card_paragraphs_container']['icon_card_paragraph'] = $form['icon_card_paragraph']; $form['card_paragraphs_container']['image_card_paragraph'] = $form['image_card_paragraph']; unset($form['icon_card_paragraph']); unset($form['image_card_paragraph']); } } /** * AJAX回调函数 */ function YOUR_MODULE_OR_THEME_card_type_ajax_callback(&$form, \Drupal\Core\Form\FormStateInterface $form_state) { return $form['card_paragraphs_container']; }
替换代码中的YOUR_MODULE_OR_THEME为自定义模块/主题名称,custom_block_type_edit_form为实际区块编辑表单ID(可通过浏览器检查元素查看表单id属性)。
2. 表单验证:控制字段条件必填
继续在.module文件中添加验证代码:
/** * Implements hook_form_FORM_ID_alter(). */ function YOUR_MODULE_OR_THEME_form_custom_block_type_edit_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { $form['#validate'][] = 'YOUR_MODULE_OR_THEME_card_link_required_validate'; } /** * 自定义表单验证函数 */ function YOUR_MODULE_OR_THEME_card_link_required_validate(&$form, \Drupal\Core\Form\FormStateInterface $form_state) { $selected_type = $form_state->getValue('select_card_type'); if ($selected_type === 'icon_card') { $icon_paragraph = $form_state->getValue('icon_card_paragraph'); if (!empty($icon_paragraph) && empty($icon_paragraph[0]['subform']['card_internal_link'][0]['target_id'])) { $form_state->setErrorByName('icon_card_paragraph][0][subform][card_internal_link', t('Card internal link is required when using icon card.')); } } }
替换对应名称和表单ID后,代码会在选择icon_card时,检查对应段落内的card_internal_link字段是否填写,未填写则抛出验证错误。
注意事项
- 若使用主题实现,需在
.info.yml中声明dependencies: ['paragraphs'] - 修改代码后需清除Drupal缓存生效
内容的提问来源于stack exchange,提问作者Tejas_More
相关产品推荐
相关产品推荐

