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
相关产品推荐
相关产品推荐

