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' => 'お問い合わせ',
));
