2018/10/12
前回Laravel5.2でお問い合わせフォームを作成しました。
今回はこれをベースにしていくつかの機能を追加します。
前提条件
メール送信機能の実装(Gメール)が終わっているとします。
前回作成したお問い合わせフォームをベースに話を進めます。
目標
1) バリデーション機能を追加
2) 確認画面を追加
3) 管理者にもメールを送信
進め方
【1】ルーティングの設定
【2】コントローラの編集
【3】ビューの作成
1) index.blade.php(入力フォーム)
2) confirm.blade.php(登録確認フォーム)
3) complate.blade.php(登録完了フォーム)
4) temp.blade.php(メール本文)
【4】エラーメッセージの日本語化
【1】ルーティングの設定
Route::get('mail', 'MailController@index'); Route::post('mail','MailController@confirm'); Route::post('mail/complete','MailController@complete');
入力フォームからはPOSTで送信します。
確認画面からもPOSTで送信します。
【2】コントローラの編集
/* * 入力フォーム */ public function index() { return view('mail.index'); }
http://{ドメイン}/mail でアクセスするとビュー関数でindex.blade.phpを返します。
/* * 確認フォーム */ public function confirm(Request $request) { $rules = [ # 1) 'title' => 'required', 'email' => 'required|email', 'body' => 'required', ]; $this->validate($request, $rules); # 2) $data = $request->all(); # 3) $request->session()->put($data); # 4) return view('mail.confirm', compact("data")); # 5) }
1) バリデーションを設定
2) バリデーションを実行
3) 入力データを配列に入れる
4) セッションへ保存
5) confirm.blade.phpを表示。入力されたデータも持っていく。
/* * 完了フォーム */ public function complete() { $data = session()->all(); # 1) Mail::send(['text' => 'mail.temp'], $data, function($message) use($data){ # 2) $message->to($data["email"])->subject($data["title"])->bcc('管理者のメールアドレス'); # 3) }); return view('mail.complete'); # 4) }
1) セッションの値を取得
2) メール送信処理
3) bccに管理者のメールアドレスを設定
4) complete.blade.phpを表示
【3】ビューの作成
resources/views/mail
以下にビューとメールの本文を作成していきます。
1) index.blade.php (入力フォーム)
2) confirm.blade.php (登録確認フォーム)
3) complate.blade.php (登録完了フォーム)
4) temp.blade.php (メール本文)
また、BootStrapのテーマFlat UIも入れます。
1) index.blade.php(入力フォーム)
@extends('layouts.master_mail') @section('title', 'お問い合わせフォーム') @section('content') <form class="form-horizontal" role="form" method="post" action="{{url('/mail')}}"> <input type="hidden" name="_token" value="{{csrf_token()}}">{{-- CSRF対策--}} <!--↓↓件名↓↓--> <div class="form-group"> <label for="name" class="control-label col-sm-2">件名:</label> <div class="col-sm-10 @if($errors->has('title')) has-error @endif"> <input type="text" name="title" id="title" value="{{ old('title') }}" class="form-control" placeholder="件名を入力してください" autofocus> @if($errors->has('title')) <p class="text-danger" style="margin-bottom: 30px;">{{ $errors->first('title') }}</p> @endif <!--/.col-sm-10--></div> <!--/.form-group--></div> <!--↑↑件名↑↑--> <!--↓↓メールアドレス↓↓--> <div class="form-group"> <label for="email" class="control-label col-sm-2">メールアドレス:</label> <div class="col-sm-10 @if($errors->has('title')) has-error @endif"> <input type="email" name="email" id="email" class="form-control" placeholder="メールアドレスを入力してください" value="{{ old('email') }}" autofocus> @if($errors->has('email')) <p class="text-danger" style="margin-bottom: 30px;">{{ $errors->first('email') }}</p> @endif <!--/.col-sm-10--></div> <!--/.form-group--></div> <!--↑↑メールアドレス↑↑--> <!--↓↓本文↓↓--> <div class="form-group"> <label for="tel" class="control-label col-sm-2">本文:</label> <div class="col-sm-10 @if($errors->has('title')) has-error @endif"> <textarea class="form-control" name="body" id="body" rows="3" placeholder="お問い合わせ内容を入力してください" autofocus>{{ old('body') }}</textarea> <!--<p id="phone-help" class="help-block">ハイフン"-"なしで数字だけ入力してください (例 09077557720)</p>--> @if($errors->has('body')) <p class="text-danger" style="margin-bottom: 30px;">{{ $errors->first('body') }}</p> @endif <!--/.col-sm-10--></div> <!--/.form-group--></div> <!--↑↑本文↑↑--> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="submit" class="btn btn-primary btn-block">送信</button> </div> <!--/form-group--></div> </form> @endsection
1) @if($errors->has('name属性')) でバリデーションにひかかったらエラー表示
2) {{ old('name属性') }} でバリデーションにひかかっても入力されたデータが消えないように
2) confirm.blade.php(登録確認フォーム)
@extends('layouts.master_mail') @section('title', 'お問い合わせフォーム') @section('content') <form class="form-horizontal" role="form" method="post" action="{{url('/mail/complete')}}"> <input type="hidden" name="_token" value="{{csrf_token()}}">{{-- CSRF対策--}} <table class="table table-striped"> <tr> <th>件名</th> <td>{{$data["title"]}}</td> </tr> <tr> <th>メールアドレス</th> <td>{{$data["email"]}}</td> </tr> <tr> <th>性別</th> <td>{{$data["body"]}}</td> </tr> </table> <button class="btn btn-lg btn-primary btn-block" type="submit">送信</button> </form> @endsection
コントローラでcompact("data")と記述した内容を表示
3) complate.blade.php(登録完了フォーム)
@extends('layouts.master_mail') @section('title', 'お問い合わせフォーム') @section('content') <h2>お問い合わせフォーム</h2> <div class="alert alert-success" role="alert">メール送信が完了しました。</div> @endsection
完了画面は前回作成したものをそのまま利用します。
Bladeの継承機能が使えない理由は原因解明中です。
4) temp.blade.php(メール本文)
お問い合せいただき誠にありがとうございます。 お問い合わせいただいた内容は下記のとおりです。 ご確認ください。 ------------------------------------------------------------ 【件名】:{{$title}} 【メールアドレス】:{{$email}} 【ご質問内容】: {{$body}} ------------------------------------------------------------ もし間違いがある場合は文末の連絡先まで、ご一報ください。 よろしくお願いいたします。 Laravel学習帳 https://www.laraweb.net
メール本文も特に変更はなし。
【4】エラーメッセージの日本語化
エラーメッセージが日本語で表示されるように編集します。
詳しい説明はこちら
'attributes' => [ 'title' => '件名', 'email' => 'メールアドレス', 'body' => '本文', ],
確認画面、バリデーションを追加したメールフォームに関しては以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。