188 lines
5.7 KiB
PHP
188 lines
5.7 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Admin;
|
||
|
||
use App\Http\Controllers\Controller;
|
||
use App\Models\Setting;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Illuminate\Support\Facades\Validator;
|
||
|
||
class SettingController extends Controller
|
||
{
|
||
/**
|
||
* 一覧(絞り込みなし・ページングのみ): /settings
|
||
*/
|
||
public function list(Request $request)
|
||
{
|
||
$perPage = \App\Utils::item_per_page ?? 20;
|
||
|
||
// リクエストから取得
|
||
$sort = $request->input('sort', 'setting_id');
|
||
$sort_type = $request->input('sort_type', 'asc');
|
||
|
||
// 許可されたカラムのみソート(安全対策)
|
||
$allowedSorts = ['setting_id', 'setting_key', 'setting_value']; // ← 必要に応じて増やす
|
||
|
||
if (!in_array($sort, $allowedSorts)) {
|
||
$sort = 'setting_id';
|
||
}
|
||
if (!in_array($sort_type, ['asc', 'desc'])) {
|
||
$sort_type = 'desc';
|
||
}
|
||
|
||
$list = Setting::orderBy($sort, $sort_type)->paginate($perPage);
|
||
|
||
return view('admin.settings.list', [
|
||
'list' => $list,
|
||
'sort' => $sort,
|
||
'sort_type' => $sort_type,
|
||
]);
|
||
}
|
||
|
||
|
||
/**
|
||
* 新規追加(GET/POST): /settings/add
|
||
*/
|
||
public function add(Request $request)
|
||
{
|
||
if ($request->isMethod('post')) {
|
||
$v = Validator::make($request->all(), $this->rules());
|
||
if ($v->fails()) {
|
||
return back()->withErrors($v)->withInput();
|
||
}
|
||
|
||
// チェックボックス(未送信時は false)
|
||
$data = $this->onlyFillable($request);
|
||
$data['printable_alert_flag'] = $request->boolean('printable_alert_flag');
|
||
|
||
DB::transaction(function () use ($data) {
|
||
Setting::create($data);
|
||
});
|
||
|
||
return redirect()->route('settings')->with('success', '設定を登録しました。');
|
||
}
|
||
|
||
// GET時:空フォーム表示
|
||
return view('admin.settings.add', [
|
||
'setting' => new Setting(), // フォーム初期化用
|
||
'isEdit' => false,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 編集(GET/POST): /settings/edit/{id}
|
||
*/
|
||
public function edit(Request $request, int $id)
|
||
{
|
||
$setting = Setting::findOrFail($id);
|
||
|
||
if ($request->isMethod('post')) {
|
||
$v = Validator::make($request->all(), $this->rules($id));
|
||
if ($v->fails()) {
|
||
return back()->withErrors($v)->withInput();
|
||
}
|
||
|
||
$data = $this->onlyFillable($request);
|
||
$data['printable_alert_flag'] = $request->boolean('printable_alert_flag');
|
||
|
||
DB::transaction(function () use ($setting, $data) {
|
||
$setting->update($data);
|
||
});
|
||
|
||
return redirect()->route('settings')->with('success', '設定を更新しました。');
|
||
}
|
||
|
||
// GET時:編集フォーム表示
|
||
return view('admin.settings.edit', [
|
||
'setting' => $setting,
|
||
'isEdit' => true,
|
||
]);
|
||
}
|
||
|
||
|
||
/**
|
||
* 詳細表示: /settings/info/{id}
|
||
*/
|
||
public function info(int $id)
|
||
{
|
||
$setting = Setting::findOrFail($id);
|
||
|
||
return view('admin.settings.info', [
|
||
'setting' => $setting,
|
||
'isInfo' => true,
|
||
'isEdit' => false,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 削除(一覧/編集 共通対応): /settings/delete または /settings/delete/{id}
|
||
*/
|
||
public function delete(Request $request, $id = null)
|
||
{
|
||
// 一覧画面(checkbox で複数削除)
|
||
$ids = $request->input('ids');
|
||
|
||
// 編集画面(単体削除)
|
||
if ($id) {
|
||
$ids = [$id];
|
||
}
|
||
|
||
// 削除対象が空
|
||
if (empty($ids)) {
|
||
return redirect()->route('settings')->with('error', '削除対象が選択されていません。');
|
||
}
|
||
|
||
// 削除処理
|
||
Setting::destroy($ids);
|
||
|
||
return redirect()->route('settings')->with('success', '設定を削除しました。');
|
||
}
|
||
|
||
|
||
// ===== バリデーション・ユーティリティ =====
|
||
|
||
/**
|
||
* バリデーションルール
|
||
*/
|
||
private function rules(?int $id = null): array
|
||
{
|
||
return [
|
||
'edit_master' => ['nullable','string','max:255'],
|
||
'web_master' => ['nullable','string','max:255'],
|
||
'auto_change_date' => ['nullable','date'],
|
||
'auto_chage_master' => ['nullable','string','max:255'], // ※カラム名は仕様通り
|
||
're-issue_alert_number' => ['nullable','integer','min:0'],
|
||
'image_base_url1' => ['nullable','string','max:255'],
|
||
'image_base_url2' => ['nullable','string','max:255'],
|
||
'printable_alert_flag' => ['nullable','boolean'],
|
||
'printable_number' => ['nullable','integer','min:0'],
|
||
'printable_alert_number' => ['nullable','integer','min:0'],
|
||
'printer_keep_alive' => ['nullable','integer','min:0'],
|
||
'operator_id' => ['nullable','integer','min:0'],
|
||
];
|
||
}
|
||
|
||
/**
|
||
* フォームから fillable のみ抽出
|
||
*/
|
||
private function onlyFillable(Request $request): array
|
||
{
|
||
return $request->only([
|
||
'edit_master',
|
||
'web_master',
|
||
'auto_change_date',
|
||
'auto_chage_master',
|
||
're-issue_alert_number',
|
||
'image_base_url1',
|
||
'image_base_url2',
|
||
'printable_number',
|
||
'printable_alert_number',
|
||
'printer_keep_alive',
|
||
'operator_id',
|
||
'printable_alert_flag',
|
||
|
||
]);
|
||
}
|
||
}
|