Yii2 生態中最受歡迎的日期時間選擇器擴展非 kartik-v/yii2-widget-datetimepicker 與 kartik-v/yii2-widget-datepicker 莫屬。它們基於 Bootstrap DateTimePicker,支援 ActiveForm 雙向綁定、獨立 Widget 模式、多語言、多主題、範圍選擇、內聯模式等豐富特性。本文從 Composer 安裝到實戰落地,提供完整配置清單與避坑指南。
# 日期時間選擇器(含時間) composer require kartik-v/yii2-widget-datetimepicker "@dev" # 僅日期選擇器 composer require kartik-v/yii2-widget-datepicker "@dev" # 若需中文語言包(已內置),無需額外安裝
注意: 使用 @dev 穩定性較好;正式項目可鎖定具體版本(如 ^1.4)。
// config/main.php 或 main-local.php
return [
'language' => 'zh-CN', // 關鍵:全局語言設為中文,組件自動讀取對應翻譯
'components' => [
// ...
],
];
use kartik\datetime\DateTimePicker;
use yii\widgets\ActiveForm;
$form = ActiveForm::begin();
echo $form->field($model, 'created_at')->widget(DateTimePicker::class, [
'options' => [
'placeholder' => '請選擇日期時間',
'class' => 'form-control',
],
'pluginOptions' => [
'autoclose' => true, // 選擇後自動關閉
'todayHighlight' => true, // 高亮今天
'format' => 'yyyy-mm-dd hh:ii:ss', // 顯示格式
'todayBtn' => true, // 顯示「今天」按鈕
'startView' => 2, // 0=時,1=日,2=月,3=年,4=十年
'minView' => 0, // 最小視圖:0=時分
'pickerPosition' => 'bottom-left',
'language' => 'zh-CN', // 顯式指定(可省略,繼承應用 language)
],
// 'pluginEvents' => [ // 事件綁定示例
// 'changeDate' => 'function(e) { console.log("日期變更:", e.date); }',
// ],
]);
ActiveForm::end();
use kartik\date\DatePicker;
echo $form->field($model, 'birth_date')->widget(DatePicker::class, [
'options' => ['placeholder' => '請選擇出生日期'],
'pluginOptions' => [
'autoclose' => true,
'todayHighlight' => true,
'format' => 'yyyy-mm-dd',
'todayBtn' => 'linked', // linked: 點擊跳轉到今天月份
'startView' => 2,
'minView' => 2, // 最小視圖:月
'language' => 'zh-CN',
],
]);
適用於前端頁面、AJAX 動態渲染、無模型綁定場景。
use kartik\datetime\DateTimePicker;
echo '';
echo DateTimePicker::widget([
'name' => 'Article[created_at]', // 表單提交字段名
'value' => $model->isNewRecord ? date('Y-m-d H:i:s') : $model->created_at, // 更新時必填
'options' => [
'placeholder' => '點擊選擇...',
'id' => 'article-created-at',
],
'pluginOptions' => [
'autoclose' => true,
'format' => 'yyyy-mm-dd hh:ii:ss',
'todayHighlight' => true,
'language' => 'zh-CN',
],
// 客戶端事件
'pluginEvents' => [
'changeDate' => 'function(e) {
$("#article-created-at-hidden").val(e.date.getTime() / 1000);
}',
],
]);
// 視圖
echo DatePicker::widget([
'name' => 'date_from',
'value' => $dateFrom,
'options' => ['id' => 'date-from'],
'pluginOptions' => ['format' => 'yyyy-mm-dd', 'autoclose' => true],
'pluginEvents' => [
'changeDate' => 'function(e) {
$("#date-to").data("datepicker").setStartDate(e.date);
}',
],
]);
echo DatePicker::widget([
'name' => 'date_to',
'value' => $dateTo,
'options' => ['id' => 'date-to'],
'pluginOptions' => ['format' => 'yyyy-mm-dd', 'autoclose' => true],
'pluginEvents' => [
'changeDate' => 'function(e) {
$("#date-from").data("datepicker").setEndDate(e.date);
}',
],
]);
echo DatePicker::widget([
'name' => 'inline_date',
'type' => DatePicker::TYPE_INLINE, // 關鍵
'pluginOptions' => ['format' => 'yyyy-mm-dd'],
]);
echo DateTimePicker::widget([
'name' => 'custom_dt',
'template' => '{input}{button}', // 隱藏移除按鈕
'buttonOptions' => ['class' => 'btn btn-outline-secondary', 'label' => ''],
'pluginOptions' => ['format' => 'yyyy-mm-dd hh:ii'],
]);
'pluginOptions' => [
'format' => 'yyyy-mm-dd',
'autoclose' => true,
'daysOfWeekDisabled' => [0, 6], // 禁用週末
'datesDisabled' => ['2024-01-01', '2024-02-10'], // 禁用具體日期
'startDate' => date('Y-m-d'), // 不可選今天之前
'endDate' => '+1 year', // 限制一年內
],
| 現象 | 原因 | 解決 |
|---|---|---|
| 顯示英文月份/星期 | 應用 language 未設為 zh-CN | 配置文件設置 'language' => 'zh-CN' 或 Widget 顯式指定 'language' => 'zh-CN' |
| 選擇時間後輸入框為空 | 格式不匹配 / 模型屬性格式化 | 確保 pluginOptions.format 與模型 dateFormat/datetimeFormat 一致;使用 DateTimePicker::widget(['value' => ...]) 而非 'value' => $model->attr 直接賦值 |
| 彈出層被截斷/定位錯誤 | 父容器 overflow: hidden 或 z-index 衝突 | 設置 'pickerPosition' => 'bottom-left';或將 Widget 移至 body 根節點(container 選項) |
| Composer 安裝失敗/版本衝突 | 依賴 krajee-base 版本不符 | 先 composer update krajee/yii2-krajee-base 再安裝 datetimepicker |
| 日期無法清空 | 缺少 clearBtn | 啟用 'clearBtn' => true(需較新版本支援) |
預設會註冊 kartik\datetime\DateTimePickerAsset,包含 CSS/JS。若需合併壓縮,可配置 Asset Bundles 或使用 yii\web\AssetManager 的 bundles 映射到 CDN/本地壓縮版本。
kartik-v 日期時間組件功能強大、API 穩定、中文支援完善。掌握「ActiveForm 雙向綁定、獨立 Widget、語言配置、範圍聯動、內聯模式、禁用日期」等核心用法,即可覆蓋 95% 以上的業務場景。建議在項目基礎組件庫中封裝統一的 DatePickerWidget / DateTimePickerWidget,統一主題、格式、語言、事件,實現「一行代碼接入,全站風格一致」。