CakeEmailを使った確認画面付きの問い合わせフォーム
開発環境:CakePHP2.5.1
サイトを構築する際、大抵必要になる問い合わせフォーム。
CakePHPは確認画面を挟まず、入力してすぐ完了とするような作りが多いですが、問い合わせフォームとなるとやはり確認画面は欲しいものです。
ここでは、入力画面→確認画面→管理者にメール送信→完了画面の流れのフォームの作り方を見ていきましょう。
コントローラーの準備
まずはコントローラー側ですが、ひとまず各画面ごとのアクションを書いておきます。
<?php App::uses('AppController', 'Controller'); class ContactsController extends AppController { // 入力画面 public function index() { } // 確認画面 public function confirm() { } // 送信処理 public function send() { } // 完了画面 public function comp() { } }
ビューの設定
続いてビューの設定をしていきます。
入力画面(index.ctp)は下記のようにします。
<h2>問い合わせはこちらからどうぞ</h2> <?php echo $this->Form->create('Contact', array('action' => 'confirm')) . PHP_EOL; ?> <?php echo $this->Form->input('name') . PHP_EOL; ?> <?php echo $this->Form->input('email') . PHP_EOL; ?> <?php echo $this->Form->textarea('message') . PHP_EOL; ?> <?php echo $this->Form->end('確認画面へ進む') . PHP_EOL; ?>
確認画面(confirm.ctp)は下記のようにします。
<h2>入力内容をご確認ください</h2> <?php echo $this->Form->create('Contact', array('action' => 'send')) . PHP_EOL; ?> <div> <?php echo $this->Form->value('name') . PHP_EOL; ?> <?php echo $this->Form->hidden('name'); ?> </div> <div> <?php echo $this->Form->value('email') . PHP_EOL; ?> <?php echo $this->Form->hidden('email'); ?> </div> <div> <?php echo $this->Form->value('message') . PHP_EOL; ?> <?php echo $this->Form->hidden('message'); ?> </div> <?php echo $this->Form->button('前に戻る', array('type' => 'button', 'onClick' => 'history.back()')) . PHP_EOL; ?> <?php echo $this->Form->end('送信する') . PHP_EOL; ?>
入力された内容はvalueメソッドを使い、次の画面に渡すためにhiddenメソッドを使っています。
また、入力をやり直すためにbuttonメソッドを使い、history.back()のJSを指定しています。その時、typeにbuttonを指定するのがポイントです。
モデルの指定
上記のようにビューを指定すると、Contactモデルを使うことになるので、そちらの設定をします。
まずはコントローラー側でモデルの呼び出し設定をします。
<?php class ContactsController extends AppController { public $uses = array('Contact'); }
次にモデル側ですが、今回はDBを使わないので、次のように設定しておきます。
<?php App::uses('AppModel', 'Model'); class Contact extends AppModel { public $useTable = false; }
本来はモデルでバリデーションの設定を行うのですが、今回は割愛します。(後日追加する予定)
CakeEmailでメール送信
最後にメールを送信する処理になります。
まず、app/Config/email.php.defaultをemail.phpにリネームします。
そして、そのファイルを開いてみると、デフォルトで色々と記載されています。
今回はdefaultの部分を使ってやっていきます。
<?php public $default = array( 'transport' => 'Mail', 'from' => 'from@example.com', );
fromに送信元のメールアドレスを記載しておきます。
次に送信されるメールのテンプレートを準備します。
app/View/Emails/text/contacts.ctpを作成し、以下の様に書いておきます。
名前:<?php echo $name . PHP_EOL; ?> メールアドレス:<?php echo $email . PHP_EOL; ?> メッセージ:<?php echo $message . PHP_EOL; ?>
最後にコントローラー側の設定です。
<?php App::uses('AppController', 'Controller'); App::uses('CakeEmail', 'Network/Email'); class ContactsController extends AppController { // 送信処理 public function send() { $email = new CakeEmail('default'); $email->config(array( 'template' => 'contacts', 'viewVars' => array( 'name' => $this->request->data['Contact']['name'], 'email' => $this->request->data['Contact']['email'], 'message' => $this->request->data['Contact']['message'], ), 'to' => 'to@example.com', 'subject' => 'お問い合わせ', )); if ($email->send()) { $this->redirect('comp'); } else { // メール送信失敗の処理 } } }
まず、App::usesでCakeEmailを使うことを明示しておきます。
そして、CakeEmail(‘default’)でemail.phpで設定したdefaultを使うことを指定します。
configの部分は各種設定で、templateはテンプレートの種類、viewVarsはテンプレートに渡す変数、toは宛先、subjectは件名になります。
そして、$email->send()でメールが送信されます。
複数の宛先に送信
複数の宛先に送付するには、toに配列で渡せばOKです。
<?php $email->config(array( 'template' => 'contacts', 'to' => array('to@example.com', 'to2@example.com'), 'subject' => 'お問い合わせ', ));