231 lines
9.6 KiB
PHP
231 lines
9.6 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers;
|
||
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\DB;
|
||
use Illuminate\Support\Facades\Mail;
|
||
use Illuminate\Support\Facades\Cache;
|
||
use Illuminate\Support\Str;
|
||
|
||
use App\Mail\UserEditVerifyMail;
|
||
|
||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||
use App\Http\Controllers\Controller;
|
||
|
||
class UserEditConfirmController extends Controller
|
||
{
|
||
use ValidatesRequests;
|
||
// GET: 確認画面表示(戻って修正するボタン等で利用)
|
||
public function show(Request $request)
|
||
{
|
||
$user_id = session('user_id');
|
||
if (!$user_id) {
|
||
return redirect('/login');
|
||
}
|
||
$user = DB::table('user')->where('user_id', $user_id)->first();
|
||
if (!$user) {
|
||
return redirect('/login');
|
||
}
|
||
|
||
// 直前のPOST値をold()やsession()->get('_old_input')で取得
|
||
$input = session()->get('_old_input', []);
|
||
|
||
// 利用者区分ラベル変換
|
||
$ward_residents_label = '';
|
||
if (isset($input['ward_residents'])) {
|
||
if ($input['ward_residents'] === '0') {
|
||
$ward_residents_label = '一般';
|
||
} elseif ($input['ward_residents'] === '1') {
|
||
$ward_residents_label = '学生';
|
||
} elseif ($input['ward_residents'] === '2') {
|
||
$ward_residents_label = '減免';
|
||
} else {
|
||
$ward_residents_label = $input['ward_residents'];
|
||
}
|
||
}
|
||
|
||
return view('user.confirm', [
|
||
'user' => $user,
|
||
'input' => $input,
|
||
'ward_residents_label' => $ward_residents_label,
|
||
'active_menu' => 'SWC-1-1', // この画面のID
|
||
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
|
||
]);
|
||
}
|
||
// 編集画面からのPOSTで入力内容確認画面を表示
|
||
public function confirm(Request $request)
|
||
{
|
||
$user_id = session('user_id');
|
||
if (!$user_id) {
|
||
return redirect('/login');
|
||
}
|
||
$user = DB::table('user')->where('user_id', $user_id)->first();
|
||
if (!$user) {
|
||
return redirect('/login');
|
||
}
|
||
|
||
// 本人確認書類画像が画像ファイルかチェック
|
||
$rules = [
|
||
'photo_filename1' => 'nullable|file|image',
|
||
'photo_filename2' => 'nullable|file|image',
|
||
];
|
||
$messages = [
|
||
'photo_filename1.image' => '本人確認書類(おもて)は画像ファイルを選択してください。',
|
||
'photo_filename2.image' => '本人確認書類(ウラ)は画像ファイルを選択してください。',
|
||
];
|
||
$this->validate($request, $rules, $messages);
|
||
|
||
$input = $request->all();
|
||
|
||
// ファイル保存処理(編集画面→確認画面POST時のみ)
|
||
if ($request->hasFile('photo_filename1') && $request->file('photo_filename1')->isValid()) {
|
||
$file1 = $request->file('photo_filename1');
|
||
$filename1 = uniqid('photo1_') . '.' . $file1->getClientOriginalExtension();
|
||
$file1->storeAs('photo', $filename1, 'public');
|
||
$input['photo_filename1'] = $filename1;
|
||
}
|
||
if ($request->hasFile('photo_filename2') && $request->file('photo_filename2')->isValid()) {
|
||
$file2 = $request->file('photo_filename2');
|
||
$filename2 = uniqid('photo2_') . '.' . $file2->getClientOriginalExtension();
|
||
$file2->storeAs('photo', $filename2, 'public');
|
||
$input['photo_filename2'] = $filename2;
|
||
}
|
||
|
||
// 利用者区分ラベル変換
|
||
$ward_residents_label = '';
|
||
if (isset($input['ward_residents'])) {
|
||
if ($input['ward_residents'] === '0') {
|
||
$ward_residents_label = '一般';
|
||
} elseif ($input['ward_residents'] === '1') {
|
||
$ward_residents_label = '学生';
|
||
} elseif ($input['ward_residents'] === '2') {
|
||
$ward_residents_label = '減免';
|
||
} else {
|
||
$ward_residents_label = $input['ward_residents'];
|
||
}
|
||
}
|
||
|
||
return view('user.confirm', [
|
||
'user' => $user,
|
||
'input' => $input,
|
||
'ward_residents_label' => $ward_residents_label,
|
||
'active_menu' => 'SWC-1-1', // この画面のID
|
||
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
|
||
]);
|
||
}
|
||
// 入力内容確認画面から「変更を確定する」ボタン押下時
|
||
public function submit(Request $request)
|
||
{
|
||
$user_id = session('user_id');
|
||
if (!$user_id) {
|
||
return redirect('/login');
|
||
}
|
||
$user = DB::table('user')->where('user_id', $user_id)->first();
|
||
if (!$user) {
|
||
return redirect('/login');
|
||
}
|
||
|
||
|
||
$token = Str::random(64);
|
||
$changeData = $request->except(['_token']);
|
||
$changeData['user_id'] = $user_id;
|
||
|
||
// 本人確認書類画像アップロード処理
|
||
if ($request->hasFile('photo_filename1') && $request->file('photo_filename1')->isValid()) {
|
||
$file1 = $request->file('photo_filename1');
|
||
$filename1 = uniqid('photo1_') . '.' . $file1->getClientOriginalExtension();
|
||
$file1->storeAs('photo', $filename1, 'public');
|
||
$changeData['photo_filename1'] = $filename1;
|
||
}
|
||
if ($request->hasFile('photo_filename2') && $request->file('photo_filename2')->isValid()) {
|
||
$file2 = $request->file('photo_filename2');
|
||
$filename2 = uniqid('photo2_') . '.' . $file2->getClientOriginalExtension();
|
||
$file2->storeAs('photo', $filename2, 'public');
|
||
$changeData['photo_filename2'] = $filename2;
|
||
}
|
||
// ※ public/storage/photo で画像が参照できない場合は、
|
||
// コマンドプロンプトで `php artisan storage:link` を実行してください。
|
||
|
||
Cache::put('change_request_' . $token, $changeData, now()->addDay());
|
||
|
||
$verifyUrl = route('user.edit.verify', ['token' => $token]);
|
||
|
||
// Mailableでメール送信
|
||
Mail::to($changeData['user_primemail'])->send(new UserEditVerifyMail($verifyUrl, $user));
|
||
|
||
return view('user.mail_sent', [
|
||
'active_menu' => 'SWC-1-1', // この画面のID
|
||
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
|
||
]);
|
||
}
|
||
|
||
// 認証URLクリック時(変更確定処理)
|
||
public function verify(Request $request)
|
||
{
|
||
$token = $request->query('token');
|
||
$changeData = Cache::get('change_request_' . $token);
|
||
|
||
if (!$changeData) {
|
||
return redirect()->route('user.edit')->withErrors(['register_expired' => '登録期間が過ぎています。もう一度登録してください。']);
|
||
}
|
||
|
||
// 変更内容をDBに保存(例: userテーブル更新)
|
||
// 更新データ生成(photo_filename1, photo_filename2, user_passは入力時のみ追加)
|
||
$updateData = [
|
||
'user_gender' => $changeData['user_gender'] ?? null,
|
||
'user_regident_zip' => $changeData['user_regident_zip_1'] . $changeData['user_regident_zip_2'],
|
||
'user_regident_pre' => $changeData['user_regident_pre'],
|
||
'user_regident_city' => $changeData['user_regident_city'],
|
||
'user_regident_add' => $changeData['user_regident_add'],
|
||
'user_birthdate' => $changeData['user_birthdate'],
|
||
'user_age' => $changeData['user_age'],
|
||
'user_homephone' => implode('-', $changeData['user_homephone'] ?? []),
|
||
'user_mobile' => implode('-', $changeData['user_mobile'] ?? []),
|
||
'user_primemail' => $changeData['user_primemail'],
|
||
'user_submail' => $changeData['user_submail'],
|
||
'ward_residents' => $changeData['ward_residents'],
|
||
'user_workplace' => $changeData['user_workplace'] ?? null,
|
||
'user_school' => $changeData['user_school'] ?? null,
|
||
'user_graduate' => $changeData['user_graduate'] ?? null,
|
||
'user_relate_zip' => $changeData['user_relate_zip_1'] . $changeData['user_relate_zip_2'],
|
||
'user_relate_pre' => $changeData['user_relate_pre'],
|
||
'user_relate_city' => $changeData['user_relate_city'],
|
||
'user_relate_add' => $changeData['user_relate_add'],
|
||
'updated_at' => now(), // 追加: 認証時の日時
|
||
];
|
||
if (!empty($changeData['photo_filename1'])) {
|
||
$updateData['photo_filename1'] = $changeData['photo_filename1'];
|
||
}
|
||
if (!empty($changeData['photo_filename2'])) {
|
||
$updateData['photo_filename2'] = $changeData['photo_filename2'];
|
||
}
|
||
if (!empty($changeData['user_pass'])) {
|
||
$updateData['user_pass'] = self::customPasswordHash($changeData['user_pass'], $changeData['user_id']);
|
||
}
|
||
DB::table('user')
|
||
->where('user_id', $changeData['user_id'])
|
||
->update($updateData);
|
||
|
||
// キャッシュ削除
|
||
Cache::forget('change_request_' . $token);
|
||
|
||
// 完了画面へ(ユーザー情報確認画面にリダイレクトし、成功メッセージ表示)
|
||
return redirect()->route('user.info')->with('success', '更新に成功しました。');
|
||
}
|
||
|
||
/**
|
||
* パスワードをSHA256→SALT連結→25回ストレッチでハッシュ化
|
||
*/
|
||
private static function customPasswordHash($password, $user_id)
|
||
{
|
||
$salt = $user_id . 'SOMSALT';
|
||
$hash = hash('sha256', $password);
|
||
$hash .= $salt;
|
||
for ($i = 0; $i < 25; $i++) {
|
||
$hash = hash('sha256', $hash);
|
||
}
|
||
return $hash;
|
||
}
|
||
}
|