input('sort', 'print_area_id'); $sort_type = $request->input('sort_type', 'asc'); $list = PrintArea::orderBy($sort, $sort_type)->paginate(20); return view('admin.print_areas.list', [ 'list' => $list, 'sort' => $sort, 'sort_type' => $sort_type, ]); } // 新規 public function add(Request $request) { if ($request->isMethod('post')) { $validated = $request->validate([ 'print_area_name' => 'required|string|max:32', 'park_id' => 'required|integer', ]); $validated['operator_id'] = auth()->id(); // 現在のログインユーザーを記録 PrintArea::create($validated); return redirect()->route('print_areas')->with('success', '登録しました。'); } $parks = Park::pluck('park_name', 'park_id'); return view('admin.print_areas.add', compact('parks')); } // 編集 public function edit(Request $request, $print_area_id) { $record = PrintArea::findOrFail($print_area_id); if ($request->isMethod('post')) { $validated = $request->validate([ 'print_area_name' => 'required|string|max:32', 'park_id' => 'required|integer', ]); $validated['operator_id'] = auth()->id(); // 更新者を記録 $record->update($validated); return redirect()->route('print_areas')->with('success', '更新しました。'); } $parks = Park::pluck('park_name', 'park_id'); return view('admin.print_areas.edit', compact('record', 'parks')); } // 詳細 public function info(Request $request, $print_area_id) { $record = PrintArea::with('park')->findOrFail($print_area_id); return view('admin.print_areas.info', compact('record')); } /** * 印刷範囲マスタ削除処理 */ public function delete(Request $request, $id = null) { // 一覧画面(checkboxで複数削除) $ids = $request->input('pk'); // 編集画面(単体削除) if ($id) { $ids = [$id]; } // 削除対象が空 if (empty($ids)) { return redirect() ->route('print_areas') ->with('error', '削除対象が選択されていません。'); } // バリデーション:配列 or 単一でも整数確認 $request->validate([ 'pk' => 'nullable', 'pk.*' => 'integer', ]); try { // 削除処理 $deleted = PrintArea::destroy($ids); if ($deleted > 0) { return redirect() ->route('print_areas') ->with('success', '削除しました。'); } else { return redirect() ->route('print_areas') ->with('error', '削除に失敗しました。'); } } catch (\Exception $e) { \Log::error('印刷範囲削除エラー: ' . $e->getMessage()); return redirect() ->route('print_areas') ->with('error', '削除中にエラーが発生しました。'); } } public function export(Request $request) { // ファイル名を日本語付きで指定(Excelで問題なく開けるようにUTF-8にBOMも付加) $filename = 'シール印刷範囲マスタ' . now()->format('YmdHis') . '.csv'; $data = PrintArea::with('park')->get(); // UTF-8 BOM (Excel用) $bom = "\xEF\xBB\xBF"; // CSVヘッダー $csv = implode(",", ['印刷範囲ID', '印刷範囲名', '駐輪場ID', '駐輪場名']) . "\n"; foreach ($data as $item) { $csv .= implode(",", [ $item->print_area_id, $item->print_area_name, $item->park_id, optional($item->park)->park_name, ]) . "\n"; } return response($bom . $csv) ->header('Content-Type', 'text/csv; charset=UTF-8') // filename* にすれば日本語名も安全に動作 ->header('Content-Disposition', "attachment; filename*=UTF-8''" . rawurlencode($filename)); } // CSVインポート(仮) public function import(Request $request) { // 実装未 return redirect()->route('print_areas')->with('success', 'CSVインポート処理(未実装)'); } }