2018/10/12
前回はURLをたたいたら『送信完了』ページが表示され、そのままメールが送信される機能を作りました。
今回はそれをベースにお問い合わせフォームを作成します。
前提条件
以前CRUDアプリのチュートリアルで入力画面を作成しました。
お問い合わせフォームはこれをベースにして作成します。
目標
1) http://{ドメイン}/mail にアクセスしてお問い合わせフォームに入力して送信。
2) 送信完了ページが表示
3) メールが届いているか確認
※入力フォームで入力したメールアドレスに送信される
進め方
【1】ルーティングの設定
【2】入力フォームの作成
【3】送信完了画面の作成
【4】送信するメール本文の編集
【5】コントローラの内容を編集
【1】ルーティングの設定
Route::get('mail','MailController@index'); #① Route::post('mail','MailController@sendMail'); #②
①最初のアクセス時の処理を設定します。
http://{ドメイン}/mail/ にアクセスしたらMailControllerのindexメソッドが実行されます。
②入力されたデータをPOSTで送信するのでルーティングのHTTPメソッドはPOSTになります。
【2】入力フォームの作成
共通レイアウトのページ(default_mail.blade.php)とそれを継承する子のページ(mail/index.blade.php)を作成します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>@yield('title')</title> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"> <!-- オプションのテーマ --> <style> body { padding-top: 40px; padding-bottom: 40px; background-color: #eee; } .form-signin { max-width: 330px; padding: 15px; margin: 0 auto; } .form-signin .form-signin-heading, .form-signin .checkbox { margin-bottom: 10px; } .form-signin .form-control { position: relative; height: auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 10px; font-size: 16px; } .form-signin .form-control:focus { z-index: 2; } .form-signin input[type="text"] { margin-bottom: 10px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } </style> </head> <body> <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/users/">デモページ</a> </div> <div id="navbar" class="collapse navbar-collapse"> </div><!--/.nav-collapse --> </div> </nav> <div class="container" style="margin-top: 30px;"> <h2>@yield('title')</h2> @yield('content') </div><!-- /container --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> </body> </html>
・Bootstrapを使います。
これを継承した子のページが以下になります。
@extends('layouts.default_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"> <input type="text" name="title" id="title" class="form-control" placeholder="件名を入力してください" autofocus> <!--/.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"> <input type="email" name="email" id="email" class="form-control" placeholder="メールアドレスを入力してください" autofocus> <!--/.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"> <textarea class="form-control" name="body" id="body" rows="3" placeholder="お問い合わせ内容を入力してください" autofocus></textarea> <!--/.col-sm-10--></div> <!--/.form-group--></div> <!--↑↑本文↑↑--> <button class="btn btn-lg btn-primary btn-block" type="submit">送信</button> </form> @endsection
・入力フォームにはCRSF対策をほどこさないとエラーになります。
・入力されたデータはPOSTで送信します。
【3】送信完了画面の作成
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>お問い合わせフォーム</title> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"> <!-- オプションのテーマ --> <style> body { padding-top: 40px; padding-bottom: 40px; background-color: #eee; } .form-signin { max-width: 330px; padding: 15px; margin: 0 auto; } .form-signin .form-signin-heading, .form-signin .checkbox { margin-bottom: 10px; } .form-signin .form-control { position: relative; height: auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 10px; font-size: 16px; } .form-signin .form-control:focus { z-index: 2; } .form-signin input[type="text"] { margin-bottom: 10px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } </style> </head> <body> <nav class="navbar navbar-inverse navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/users/">デモページ</a> </div> <div id="navbar" class="collapse navbar-collapse"> </div><!--/.nav-collapse --> </div> </nav> <div class="container" style="margin-top: 30px;"> <h2>お問い合わせフォーム</h2> <div class="alert alert-success" role="alert">メール送信が完了しました。</div> </div><!-- /container --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> </body> </html>
コントローラでmailファサードのsendメソッド実行後、complete.blade.phpを返しているのですがこれが上手くいきません。
何故かBladeの継承の機能が使えませんでした。
なので、そのまま直書きで記述しています。
【4】送信するメール本文の編集
お問い合せいただき誠にありがとうございます。 お問い合わせいただいた内容は下記のとおりです。 ご確認ください。 ------------------------------------------------------------ 【件名】:{{$title}} 【メールアドレス】:{{$email}} 【ご質問内容】: {{$body}} ------------------------------------------------------------ もし間違いがある場合は文末の連絡先まで、ご一報ください。 よろしくお願いいたします。 < Laravel学習帳 > https://www.laraweb.net
・送信するメール本文もBladeで作成します。
【5】コントローラの内容を編集
<?php namespace App\Http\Controllers; use Mail; use Illuminate\Http\Request; use App\Http\Requests; class MailController extends Controller { public function index(){ return view('mail.index'); } public function sendMail(Request $request){ $data = $request->all(); # 1) Mail::send(['text' => 'mail.temp'], $data, function($message) use($data){ # 2) $message->to($data["email"])->subject($data["title"]); }); return view('mail.complete'); } }
1) 入力されたデータを「配列」として受け取りたい場合は、allメソッドを使用します。
2) メールファサード(Mail::)のsendメソッドを使用します。
- Mail::sendメソッドの構文 -
第1引数に送信に使用するviewを指定
第2引数に送信に使用するviewへ渡すデータを記載
第3引数のクロージャー内でメール送信処理
これでお問い合わせフォームは完成です。
Laravel5.2でメール送信(通常版)は以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。