You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Drupal嵌套段落中根据父区块字段选择条件显隐并设置必填字段?

解决Drupal嵌套段落的条件显示与必填字段设置问题

模块解决方案(适合新手,可视化配置)

由于Conditional Field模块不支持嵌套段落的场景,推荐使用以下模块组合实现需求:

  1. Paragraphs Visibility Conditions模块:专门用于控制段落的显示/隐藏,支持基于父实体字段值设置条件
    • 安装启用后,进入自定义区块类型的字段设置页面
    • 为icon_card_paragraph添加可见性条件:当select_card_type字段值等于icon_card时显示
    • 为image_card_paragraph添加可见性条件:当select_card_type字段值等于image_card时显示
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 20:12:35