Laravel-Filamentphp中如何仅禁用周末或仅启用指定日期?
解决Filament DatePicker禁用周末/指定日期问题
一、仅禁用周末
Filament的DatePicker组件自带disabledDates()方法,通过闭包结合Carbon判断日期是否为周末即可实现需求:
DatePicker::make('issue_start_date') ->required() ->reactive() ->weekStartsOnSunday() // 新增:禁用周六、周日 ->disabledDates(function (Carbon $date) { return $date->isWeekend(); }) ->afterStateUpdated(function (callable $set, $state) { $month = date('M', strtotime($state)); $year = date('Y', strtotime($state)); ($month == null || $year === null) ? $set('name', null) : $set('name', $month . ' ' . $year); }) ->dehydrateStateUsing(function (callable $set, $state) { if ($state === null) $set('name', null); }),
Carbon的isWeekend()方法会自动识别周六和周日,返回true时该日期会被禁用。
二、禁用除指定日期外的所有日期
如果需要仅开放特定日期选择,同样用disabledDates()方法,判断当前日期不在允许列表内则禁用:
// 定义允许选择的日期集合,可根据业务逻辑动态生成(比如从数据库读取) $allowedDates = [ Carbon::parse('2024-05-10'), Carbon::parse('2024-05-15'), Carbon::parse('2024-05-20'), ]; DatePicker::make('issue_start_date') ->required() ->reactive() ->weekStartsOnSunday() // 新增:仅允许选择指定日期 ->disabledDates(function (Carbon $date) use ($allowedDates) { $allowedDateStrings = collect($allowedDates)->map(fn($d) => $d->toDateString())->toArray(); return !in_array($date->toDateString(), $allowedDateStrings); }) ->afterStateUpdated(function (callable $set, $state) { $month = date('M', strtotime($state)); $year = date('Y', strtotime($state)); ($month == null || $year === null) ? $set('name', null) : $set('name', $month . ' ' . $year); }) ->dehydrateStateUsing(function (callable $set, $state) { if ($state === null) $set('name', null); }),
这里先把允许的日期转为字符串格式,再对比当前日期是否在列表中,不在则禁用。
内容的提问来源于stack exchange,提问作者Amir Hussain
相关产品推荐
相关产品推荐

