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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。


