Laravel9 | 確認画面有り版のお問合せフォームを作成する

先日、お問合せフォーム作成のメモを公開しましたが、今回は先日のお問合せフォームをベースに送信内容の確認画面を追加したバージョンの内容です。

フォームコントローラ改修

確認ページ用のアクション追加

# /app/Http/Controllers/FormController.php

/**
 * 確認ページ
 */
public function confirm()
{
  return view('form.confirm');
}

メール送信処理

入力ページと確認ページに追加するsubmitボタンのname属性 “submitBtnVal” の値によりcase文で処理を振り分けるようにします。

# /app/Http/Controllers/FormController.php

/**
 * メール送信
 */
public function sendMail(ContactFormRequest $request)
{
  // 
  $form_data = $request->validated();

  // submitボタンの値により分岐させる
  $submitBtnVal = $request->input('submitBtnVal');
  switch ( $submitBtnVal ) {
    case 'confirm':
      // 値を持たせた状態で確認画面へリダイレクト
      return to_route('form.confirm')->withInput();
      break;
    case 'back':
      // 値を持たせた状態で入力画面へリダイレクト
      return to_route('form')->withInput();
      break;
    case 'complete':
      // 送信先メールアドレス
      $email_admin = 'admin@example.com';
      $email_user  = $form_data['email'];

      // 管理者宛メール
      Mail::to($email_admin)->send( new FormAdminMail($form_data) );
      // ユーザー宛メール
      Mail::to($email_user)->send( new FormUserMail($form_data) );
      
      // ログ
      // Log::debug($form_data['name']. ' さまよりお問い合わせ');

      // 
      return to_route('form.complete');
      break;
    default:
        // エラー
  }
    
}

ルーティング設定

postのリクエスト先を入力ページから確認ページへ変更と確認ページ表示用のルーティング設定を追加します。

// お問合せフォーム
Route::get('/form', [FormController::class, 'index'])->name('form');
Route::post('/form/confirm', [FormController::class, 'sendMail']);
Route::get('/form/confirm', [FormController::class, 'confirm'])->name('form.confirm');
Route::get('/form/complete', [FormController::class, 'complete'])->name('form.complete');

Bladeテンプレート修正・追加

入力ページ修正

action変更

actionの指定を確認ページに変更します。

<form action="{{ route('form.confirm') }}" method="POST">...</form>

submitボタン

submitボタンにname属性とvalue属性を追加します。

<button type="submit" name="submitBtnVal" value="confirm">確認画面へ</button>

確認ページ追加

入力ページのテンプレートをベースに作成し必要箇所を変更します。

@extends('layouts.default')
@section('title', 'お問い合わせ確認')

@section('content')

<section>

{{-- ▼▼ フォーム --}}
<form action="{{ route('form.confirm') }}" method="POST">
  @csrf

  {{-- ▼ 会社名 --}}
  <div>
    <label for="company">会社名(必須)</label>
    {{ old('company') }}
    <input id="company" type="hidden" name="company" value="{{ old('company') }}">
  </div>

  {{-- ▼ お名前 --}}
  <div>
    <label for="name">お名前(必須)</label>
    {{ old('name') }}
    <input id="name" type="hidden" name="name" value="{{ old('name') }}">
  </div>

  {{-- ▼ フリガナ --}}
  <div>
    <label for=name_kana>フリガナ(必須)</label>
    {{ old('name_kana') }}
    <input id="name_kana" type="hidden" name="name_kana" value="{{ old('name_kana') }}">
  </div>

  {{-- ▼ 電話番号 --}}
  <div>
    <label for="phone">電話番号</label>
    {{ old('phone') }}
    <input id="phone" type="hidden" name="phone" value="{{ old('phone') }}">
  </div>

  {{-- ▼ メールアドレス --}}
  <div>
    <label for="email">メールアドレス(必須)</label>
    {{ old('email') }}
    <input id="email" type="hidden" name="email" value="{{ old('email') }}">
  </div>

  {{-- ▼ お問い合わせ内容 --}}
  <div>
    <label for="body">お問い合わせ内容(必須)</label>
    {{ old('body') }}
    <input id="body" type="hidden" name="body" value="{{ old('body') }}">
  </div>

  {{-- ▼ 戻る・送信ボタン --}}
  <div>
    <button type="submit" name="submitBtnVal" value="back">戻る</button>
    <button type="submit" name="submitBtnVal" value="complete">送信</button>
  </div>

</form>
{{-- ▲▲ フォーム --}}

</section>
@endsection

修正・追加ファイルのソース

フォームコントローラ、ルーティング設定、入力ページテンプレート、確認ページテンプレートの4つのファイルのソースです。

/app/Http/Controllers/FormController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;       // 追加(ログを利用する場合)
use Illuminate\Support\Facades\Mail;      // 追加
use App\Http\Requests\ContactFormRequest; // 追加
use App\Mail\FormAdminMail;               // 追加
use App\Mail\FormUserMail;                // 追加

class FormController extends Controller
{
    /**
     * 入力ページ
     */
    public function index()
    {
        return view('form.index');
    }


    /**
     * 確認ページ
     */
    public function confirm()
    {
        return view('form.confirm');
    }


    /**
     * 完了ページ
     */
    public function complete()
    {
        return view('form.complete');
    }


    /**
     * メール送信
     */
    public function sendMail(ContactFormRequest $request)
    {
        // 
        $form_data = $request->validated();

        // submitボタンの値により分岐させる
        $submitBtnVal = $request->input('submitBtnVal');
        switch ( $submitBtnVal ) {
            case 'confirm':
                // 値を持たせた状態で確認画面へリダイレクト
                return to_route('form.confirm')->withInput();
                break;
            case 'back':
                // 値を持たせた状態で入力画面へリダイレクト
                return to_route('form')->withInput();
                break;
            case 'complete':
                // 送信先メールアドレス
                $email_admin = 'admin@example.com';
                $email_user  = $form_data['email'];

                // 管理者宛メール
                Mail::to($email_admin)->send( new FormAdminMail($form_data) );
                // ユーザー宛メール
                Mail::to($email_user)->send( new FormUserMail($form_data) );
                
                // ログ
                // Log::debug($form_data['name']. ' さまよりお問い合わせ');

                // 
                return to_route('form.complete');
                break;
            default:
                // エラー
        }
        
    }
}

/routes/web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\FormController; // 追加

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('index');
});


// お問合せフォーム
Route::get('/form', [FormController::class, 'index'])->name('form');
Route::post('/form/confirm', [FormController::class, 'sendMail']);
Route::get('/form/confirm', [FormController::class, 'confirm'])->name('form.confirm');
Route::get('/form/complete', [FormController::class, 'complete'])->name('form.complete');

/resources/views/form/index.blade.php

@extends('layouts.default')
@section('title', 'お問い合わせ')

@section('content')

<section>

{{-- ▼▼ エラーメッセージ --}}
@if($errors->any())
<div>
  <ul>
    @foreach($errors->all() as $error)
    <li>{{ $error }}</li>
    @endforeach
  </ul>
</div>
@endif
{{-- ▲▲ エラーメッセージ --}}

{{-- ▼▼ フォーム --}}
<form action="{{ route('form.confirm') }}" method="POST">
  @csrf

  {{-- ▼ 会社名 --}}
  <div>
    <label for="company">会社名(必須)</label>
    <input id="company" type="text" name="company" value="{{ old('company') }}">
    @if($errors->has('company'))
    <p>{{ $errors->first('company') }}</p>
    @endif
  </div>

  {{-- ▼ お名前 --}}
  <div>
    <label for="name">お名前(必須)</label>
    <input id="name" type="text" name="name" value="{{ old('name') }}">
    @if($errors->has('name'))
    <p>{{ $errors->first('name') }}</p>
    @endif
  </div>

  {{-- ▼ フリガナ --}}
  <div>
    <label for=name_kana>フリガナ(必須)</label>
    <input id="name_kana" type="text" name="name_kana" value="{{ old('name_kana') }}">
    @error('name_kana')
    <p>{{ $message }}</p>
    @enderror
  </div>

  {{-- ▼ 電話番号 --}}
  <div>
    <label for="phone">電話番号</label>
    <input id="phone" type="text" name="phone" value="{{ old('phone') }}">
    @error('phone')
    <p>{{ $message }}</p>
    @enderror
  </div>

  {{-- ▼ メールアドレス --}}
  <div>
    <label for="email">メールアドレス(必須)</label>
    <input id="email" type="email" name="email" value="{{ old('email') }}">
    @if($errors->has('email'))
    <p>{{ $errors->first('email') }}</p>
    @endif
  </div>

  {{-- ▼ お問い合わせ内容 --}}
  <div>
    <label for="body">お問い合わせ内容(必須)</label>
    <textarea id="body" type="text" name="body">{{ old('body') }}</textarea>
    @if($errors->has('body'))
    <p>{{ $errors->first('body') }}</p>
    @endif
  </div>

  {{-- ▼ 確認ボタン --}}
  <div>
  <button type="submit" name="submitBtnVal" value="confirm">確認画面へ</button>
  </div>

</form>
{{-- ▲▲ フォーム --}}

</section>
@endsection

/resources/views/form/confirm.blade.php

@extends('layouts.default')
@section('title', 'お問い合わせ確認')

@section('content')

<section>

{{-- ▼▼ フォーム --}}
<form action="{{ route('form.confirm') }}" method="POST">
  @csrf

  {{-- ▼ 会社名 --}}
  <div>
    <label for="company">会社名(必須)</label>
    {{ old('company') }}
    <input id="company" type="hidden" name="company" value="{{ old('company') }}">
  </div>

  {{-- ▼ お名前 --}}
  <div>
    <label for="name">お名前(必須)</label>
    {{ old('name') }}
    <input id="name" type="hidden" name="name" value="{{ old('name') }}">
  </div>

  {{-- ▼ フリガナ --}}
  <div>
    <label for=name_kana>フリガナ(必須)</label>
    {{ old('name_kana') }}
    <input id="name_kana" type="hidden" name="name_kana" value="{{ old('name_kana') }}">
  </div>

  {{-- ▼ 電話番号 --}}
  <div>
    <label for="phone">電話番号</label>
    {{ old('phone') }}
    <input id="phone" type="hidden" name="phone" value="{{ old('phone') }}">
  </div>

  {{-- ▼ メールアドレス --}}
  <div>
    <label for="email">メールアドレス(必須)</label>
    {{ old('email') }}
    <input id="email" type="hidden" name="email" value="{{ old('email') }}">
  </div>

  {{-- ▼ お問い合わせ内容 --}}
  <div>
    <label for="body">お問い合わせ内容(必須)</label>
    {{ old('body') }}
    <input id="body" type="hidden" name="body" value="{{ old('body') }}">
  </div>

  {{-- ▼ 戻る・送信ボタン --}}
  <div>
    <button type="submit" name="submitBtnVal" value="back">戻る</button>
    <button type="submit" name="submitBtnVal" value="complete">送信</button>
  </div>

</form>
{{-- ▲▲ フォーム --}}

</section>
@endsection

動作環境情報

"macOS Ventura" 13.1
"Docker Desktop" 4.15.0
"Laravel Sail"
"Laravel Framework" 9.43.0

関連記事

コメント

タイトルとURLをコピーしました