BannerResource.php 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace App\Filament\Resources;
  3. use App\Filament\Resources\BannerResource\Pages;
  4. use App\Models\Banner;
  5. use App\Service\DeepLService;
  6. use Filament\Forms\Components\FileUpload;
  7. use Filament\Forms\Components\Group;
  8. use Filament\Forms\Components\Radio;
  9. use Filament\Forms\Components\Section;
  10. use Filament\Forms\Components\Textarea;
  11. use Filament\Forms\Components\TextInput;
  12. use Filament\Forms\Form;
  13. use Filament\Resources\Resource;
  14. use Filament\Tables;
  15. use Filament\Tables\Columns\ImageColumn;
  16. use Filament\Tables\Columns\TextColumn;
  17. use Filament\Tables\Table;
  18. use SolutionForest\FilamentTranslateField\Forms\Component\Translate;
  19. class BannerResource extends Resource
  20. {
  21. protected static ?string $model = Banner::class;
  22. protected static ?int $navigationSort = 1;
  23. protected static ?string $navigationIcon = 'heroicon-o-photo';
  24. protected static ?string $navigationGroup = '其他設定';
  25. // protected static ?string $navigationGroup = '上稿內容管理';
  26. protected static ?string $navigationLabel = '首頁 Banner 管理';
  27. protected static ?string $modelLabel = '首頁 Banner 管理';
  28. // 預設排序
  29. protected static function booted()
  30. {
  31. static::addGlobalScope('ordered', function ($query) {
  32. $query->orderBy('order')->orderBy('id');
  33. });
  34. }
  35. public static function form(Form $form): Form
  36. {
  37. return $form
  38. ->schema([
  39. //
  40. Section::make('')->schema([
  41. Group::make()->schema([
  42. Translate::make()->schema(fn (string $locale) => [
  43. Textarea::make('title')->required($locale == 'zh_TW')->label('大字標題'),
  44. Textarea::make('content')->required($locale == 'zh_TW')->label('小字標題'),
  45. ])
  46. ->locales(['zh_TW', 'en'])
  47. ->actions([
  48. app(DeepLService::class)->createTranslationAction('Main', ['title', 'content']),
  49. ])->columnSpanFull(),
  50. Radio::make('type')->label('')->default(1)->options([1 => '圖片', 2 => '影片']),
  51. Group::make()->schema([
  52. FileUpload::make('img_url')->label('圖片')->directory('banners')->columnSpan(1)
  53. ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
  54. FileUpload::make('mobile_img')->label('手機板圖片')->directory('banners')->columnSpan(1)
  55. ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
  56. Translate::make()->schema(fn (string $locale) => [
  57. TextInput::make('img_alt')->required($locale == 'zh_TW')->label('圖片註釋'),
  58. ])
  59. ->locales(['zh_TW', 'en'])
  60. ->actions([
  61. app(DeepLService::class)->createTranslationAction('Main', ['img_alt']),
  62. ])->columnSpan(1),
  63. ])->columnSpanFull(),
  64. Radio::make('visible')->label('顯示/不顯示')->options([1 => '顯示', 0 => '不顯示'])->inline()->default(1)->columnSpan(2),
  65. TextInput::make('order')->label('排序')->default('0'),
  66. ])->columns(4)->columnSpanFull(),
  67. ]),
  68. ]);
  69. }
  70. public static function table(Table $table): Table
  71. {
  72. return $table
  73. ->columns([
  74. //
  75. ImageColumn::make('img_url')->label('圖片'),
  76. TextColumn::make('title')->label('標題'),
  77. ])
  78. ->filters([
  79. //
  80. ])
  81. ->actions([
  82. Tables\Actions\EditAction::make(),
  83. ])
  84. ->bulkActions([
  85. Tables\Actions\BulkActionGroup::make([
  86. Tables\Actions\DeleteBulkAction::make(),
  87. ]),
  88. ])->reorderable('order');
  89. }
  90. public static function getRelations(): array
  91. {
  92. return [
  93. //
  94. ];
  95. }
  96. public static function getPages(): array
  97. {
  98. return [
  99. 'index' => Pages\ListBanners::route('/'),
  100. 'create' => Pages\CreateBanner::route('/create'),
  101. 'edit' => Pages\EditBanner::route('/{record}/edit'),
  102. ];
  103. }
  104. }