在 Smarty 模板開發中,html_select_date() 是快速生成日期下拉選單的利器。本文系統整理其全參數用法,並針對「日月不聯動」缺陷提供 JavaScript 補完方案。
| 屬性名 | 類型 | 預設值 | 功能描述 |
|---|---|---|---|
| prefix | string | "Date_" | 生成 select 的 name 前綴,避免表單衝突 |
| start_year | string | 當前年份 | 起始年份,支援相對格式如 "-10" 表示 10 年前 |
| end_year | string | 當前年份 | 結束年份,支援相對格式如 "+5" 表示 5 年後 |
| field_order | string | "MDY" | 三個 select 排序,M=月 D=日 Y=年 |
| month_format | string | "%B" | 月份顯示格式:%B完整名稱、%b縮寫、%m數字 |
| day_format | string | "%02d" | 日期顯示格式:%02d 雙位數字、%b 二進制(罕用) |
| 屬性名 | 類型 | 功能描述 |
|---|---|---|
| display_days | boolean | 控制日期 select 是否顯示 |
| display_months | boolean | 控制月份 select 是否顯示 |
| display_years | boolean | 控制年份 select 是否顯示 |
| year_as_text | boolean | true=文字輸入框 false=下拉選單 |
| reverse_years | boolean | true 時年份倒序顯示 |
| year_size | string | >1 顯示下拉,0/1 顯示上下箭頭控制 |
| month_size | string | 同 year_size,控制月份顯示模式 |
| day_size | string | 同 year_size,控制日期顯示模式 |
{html_select_date prefix="StartDate" time=$time start_year="-5" end_year="+1" display_days=false}
輸出結果(假設當前年份 2000):
<select name="StartDateMonth"> <option value="1">January</option> <option value="12" selected>December</option> </select> <select name="StartDateYear"> <option value="1995">1995</option> <option value="2000" selected>2000</option> <option value="2001">2001</option> </select>
核心痛點: 生成的日期 select 與月份、年份無聯動關係,會出現 2 月 30 日等非法日期。
JavaScript 聯動補完實現:
function showdays(year, month) {
var day = "day";
if (month.value == 0) {
document.getElementById(day).length = 1;
return;
}
var daysInMonth;
if ([1,3,5,7,8,10,12].includes(parseInt(month.value))) {
daysInMonth = 31;
} else if (month.value == 2) {
var y = parseInt(year.value);
daysInMonth = (y % 4 === 0 && y % 100 !== 0) || (y % 400 === 0) ? 29 : 28;
} else {
daysInMonth = 30;
}
document.getElementById(day).length = 1;
createlist(1, daysInMonth + 1, day);
}
aria-label、id 關聯 label 標籤掌握 html_select_date() 的參數組合與邊界限制,能讓你在維護舊專案時遊刃有餘;而前端聯動補完技巧則是解決其先天不足的關鍵拼圖。