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

Drupal 8日期选择列表如何添加年月日时分单位标识?

解决Drupal 8日文站点日期选择控件添加单位的问题

嘿,这个问题我之前帮客户处理过类似的,刚好能给你一套靠谱的解决方案!核心思路就是用hook_form_alter()修改日期选择控件的选项显示文本,但完全保留提交的数值不变,这样既满足日文的显示习惯,又不会影响表单的正常提交和日期存储。

具体实现步骤

1. 准备自定义模块(如果还没有的话)

你需要一个自定义模块(比如命名为japanese_date_format),如果已经有在用的自定义模块,直接复用即可。

2. 编写hook_form_alter代码

在自定义模块的.module文件里添加以下代码:

/**
 * Implements hook_form_alter().
 */
function japanese_date_format_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  // 递归遍历表单所有元素,给日期选择控件添加日文单位
  _japanese_date_format_add_units_to_date_selects($form);
}

/**
 * 递归处理表单元素,为日期选择选项追加日文单位
 */
function _japanese_date_format_add_units_to_date_selects(&$element) {
  // 定位到日期相关的select控件
  if (isset($element['#type']) && $element['#type'] === 'select' && !empty($element['#options'])) {
    $unit = '';
    // 通过元素name里的关键字判断属于哪个日期组件
    $name_parts = explode('_', $element['#name']);
    
    if (in_array('year', $name_parts)) {
      $unit = '年';
    }
    elseif (in_array('month', $name_parts)) {
      $unit = '月';
    }
    elseif (in_array('day', $name_parts)) {
      $unit = '日';
    }
    elseif (in_array('hour', $name_parts)) {
      $unit = '時';
    }
    elseif (in_array('minute', $name_parts)) {
      $unit = '分';
    }

    // 给数字选项添加单位,跳过空选项(比如"- 请选择 -")
    if (!empty($unit)) {
      foreach ($element['#options'] as $value => $label) {
        if ($value !== '' && is_numeric($label)) {
          $element['#options'][$value] = $label . $unit;
        }
      }
    }
  }

  // 递归处理子元素,确保深层嵌套的日期控件也能被处理
  foreach (element_children($element) as $child_key) {
    _japanese_date_format_add_units_to_date_selects($element[$child_key]);
  }
}

3. 代码关键说明

  • 递归遍历:日期字段可能藏在表单深层结构里(比如多值字段、嵌套容器),递归能确保所有相关的select控件都被处理到。
  • 单位匹配:通过元素#name属性里的关键字(year/month/day/hour/minute)判断当前是哪个日期组件,匹配对应的日文单位。
  • 不影响提交:只修改选项的显示文本(label),选项的value值保持原来的数字不变,这样表单提交时Drupal能正常识别并存储日期。
  • 跳过空选项:避免给默认的选择提示(比如"- 请选择 -")添加单位,保持界面友好。

4. 启用模块并生效

保存代码后,启用你的自定义模块,然后清除Drupal的缓存,刷新页面就能看到日期选择控件里的数字都加上对应的日文单位啦!

额外注意事项

  • 如果你的日期字段使用了非默认的widget,只要它是用select控件展示日期组件的,这个代码都能生效。
  • 如果月份已经通过字符串翻译转成了日文数字,代码里的is_numeric($label)会自动识别并添加“月”单位,完全兼容你的现有设置。

内容的提问来源于stack exchange,提问作者Patrick Kenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:24:07