From 77d3cc2ec3b5a429a34a72967ebd3a1cd13b666b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=A0=E7=9A=84=E5=90=8D=E5=AD=97?= <你的邮箱> Date: Thu, 2 Oct 2025 10:00:15 +0900 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=9C=80=E6=96=B0=E3=83=8B=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E3=82=B9=E7=99=BB=E9=8C=B2=E3=80=91=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Admin/NewsController.php | 60 +++-- resources/views/admin/news/add.blade.php | 164 +++++++++++-- resources/views/admin/news/edit.blade.php | 215 +++++++++++++++--- resources/views/admin/news/list.blade.php | 133 +++++++++-- 4 files changed, 490 insertions(+), 82 deletions(-) diff --git a/app/Http/Controllers/Admin/NewsController.php b/app/Http/Controllers/Admin/NewsController.php index 6af4b4e..bf639e4 100644 --- a/app/Http/Controllers/Admin/NewsController.php +++ b/app/Http/Controllers/Admin/NewsController.php @@ -61,11 +61,29 @@ class NewsController extends Controller if ($request->filled('from')) { $q->where('open_datetime','>=',$request->input('from')); } if ($request->filled('to')) { $q->where('open_datetime','<=',$request->input('to')); } - // 並び順:公開日時の降順 → 主キー降順 - $rows = $q->orderByDesc('open_datetime') - ->orderByDesc($this->pk) - ->paginate(20) - ->withQueryString(); + // {追加} 並び替え(ホワイトリスト) + $sort = (string)$request->query('sort', ''); + $dir = strtolower((string)$request->query('dir', 'desc')); + $dir = in_array($dir, ['asc','desc'], true) ? $dir : 'desc'; + + // 画面キー → 実カラム + $sortable = [ + 'id' => $this->pk, // ニュースID + 'news' => 'news', // ニュース内容 + 'open_datetime' => 'open_datetime', // 公開日時 + 'mode' => 'mode', // 表示モード + ]; + + if (isset($sortable[$sort])) { + $q->orderBy($sortable[$sort], $dir); + } else { + // 既定:公開日時降順 → 主キー降順 + $q->orderByDesc('open_datetime') + ->orderByDesc($this->pk); + } + + // ページング(現在のクエリを維持) + $rows = $q->paginate(20)->appends($request->except('page')); return view('admin.news.list', compact('rows')); } @@ -76,21 +94,29 @@ class NewsController extends Controller public function add(Request $request) { if ($request->isMethod('post')) { - // 入力チェック + $messages = [ + 'required' => ':attribute は、必ず入力してください。', + 'open_datetime.date_format' => '公開日時は :format 形式(YYYY-MM-DD HH:MM:SS)で入力してください。', + ]; + $attributes = [ + 'news' => 'ニュース内容', + 'open_datetime' => '公開日時', + 'mode' => '表示モード', + ]; $v = $request->validate([ 'news' => 'required|string', - 'open_datetime' => 'nullable|date_format:Y-m-d H:i:s', + 'open_datetime' => 'required|date_format:Y-m-d H:i:s', 'link_url' => 'nullable|string|max:255', 'image1_filename' => 'nullable|string|max:255', 'image2_filename' => 'nullable|string|max:255', 'mode' => 'required|integer|min:0|max:9', - ]); + ], $messages, $attributes); // 登録 $now = now(); DB::table($this->table)->insert([ 'news' => $v['news'], - 'open_datetime' => $v['open_datetime'] ?? null, + 'open_datetime' => $v['open_datetime'], 'link_url' => $v['link_url'] ?? null, 'image1_filename' => $v['image1_filename'] ?? null, 'image2_filename' => $v['image2_filename'] ?? null, @@ -118,20 +144,28 @@ class NewsController extends Controller if (!$news) { abort(404); } if ($request->isMethod('post')) { - // 入力チェック + $messages = [ + 'required' => ':attribute は、必ず入力してください。', + 'open_datetime.date_format' => '公開日時は :format 形式(YYYY-MM-DD HH:MM:SS)で入力してください。', + ]; + $attributes = [ + 'news' => 'ニュース内容', + 'open_datetime' => '公開日時', + 'mode' => '表示モード', + ]; $v = $request->validate([ 'news' => 'required|string', - 'open_datetime' => 'nullable|date_format:Y-m-d H:i:s', + 'open_datetime' => 'required|date_format:Y-m-d H:i:s', 'link_url' => 'nullable|string|max:255', 'image1_filename' => 'nullable|string|max:255', 'image2_filename' => 'nullable|string|max:255', 'mode' => 'required|integer|min:0|max:9', - ]); + ], $messages, $attributes); // 更新 DB::table($this->table)->where($this->pk, $id)->update([ 'news' => $v['news'], - 'open_datetime' => $v['open_datetime'] ?? null, + 'open_datetime' => $v['open_datetime'], 'link_url' => $v['link_url'] ?? null, 'image1_filename' => $v['image1_filename'] ?? null, 'image2_filename' => $v['image2_filename'] ?? null, diff --git a/resources/views/admin/news/add.blade.php b/resources/views/admin/news/add.blade.php index 2a94363..44abcf5 100644 --- a/resources/views/admin/news/add.blade.php +++ b/resources/views/admin/news/add.blade.php @@ -6,12 +6,12 @@
-

ニュース新規作成

+

新規

@@ -36,39 +36,106 @@
@csrf + + {{-- 基本情報 --}}
- - + +
-
-
- - + + {{-- 画像操作ボタン行:左=画像1、右=画像2 --}} +
+
+
+ + +
+
-
- - +
+
+ + +
+
-
- - + + {{-- 画像ボックス:左=画像1、右=画像2 --}} +
+
+
+
画像1
+
+ + +
+
+ +
+ + プレビューなし +
+
+
+
+ +
+
+
画像2
+
+ + +
+
+ +
+ + プレビューなし +
+
+
+
+ + {{-- 表示モード(デフォルト:非表示) --}} +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
- 戻る - + 戻る + +
@@ -77,13 +144,60 @@ @endsection +@push('styles') + +@endpush + @push('scripts') @endpush diff --git a/resources/views/admin/news/edit.blade.php b/resources/views/admin/news/edit.blade.php index 1ebe305..efb7297 100644 --- a/resources/views/admin/news/edit.blade.php +++ b/resources/views/admin/news/edit.blade.php @@ -1,12 +1,12 @@ @extends('layouts.app') -@section('title', 'ニュース編集') +@section('title', '編集') @section('content') {{-- ▼ コンテンツヘッダー(パンくず) --}}
-

ニュース編集

+

編集