CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方
2017/03/11
XAMPP環境からメール送信の設定
前回、「ローカル環境の XAMPPからメールを送信できるように設定する」でXAMPP環境からメールの送信ができるように設定を変更しましたので、今日はいよいよメールフォームを作っていきます。
(XAMPP環境などローカル環境からメールを送信する設定が分からない方は先週の記事も読んでいただくと参考になるかと思います。)
CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方
CakePHPで確認画面を出すプラグイン
CakePHPのお問い合わせフォーム製造は bakeで一括処理ができない部分もありますので、作成作業が必要にはなりますが、それほど難しい作業ではありませんので、私でも難しいものではありませんでした。
ただ、CakePHPは、基本的に入力確認画面が存在していないため、それを良しとするかどうかで難易度が大きく違ってきます。
日本においては「フォームと言えば入力確認画面があるもの」として認識されていますので、お問い合わせフォームで入力確認画面がないとユーザから不親切と思われてしまうことでしょう。
ということで、入力確認画面があるフォームを生成する方法を探してみたところ、便利なプラグインがありました。
ヘルパー機能を使って、入力画面と共通の画面を利用して入力確認画面を生成するというプラグインです。非常に便利です。
Xformヘルパーのインストールに関しては、下記のページにありましたが、これだけではその利用方法がよく分からなかったのですが、
http://d.hatena.ne.jp/cakephper/20120222/1329874432
下記のサイトに使い方も含めてまとめられていましたので、こちらが非常に参考になりました。
http://drawxcode.com/2012/12/cakephp-2%E3%81%A7fom%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/
また、CakePHPを使う際に非常に便利な CakePHP Plusというプラグインも設定することになります。
http://d.hatena.ne.jp/cakephper/20120209/1328776671
ただ、この解説ページでは、実際のメール送信、入力情報の保存までは書かれていませんので、それについては下記のページを参考にしました。
http://log.noiretaya.com/151
また、上記ページでは入力内容を保存していませんが、問い合わせ内容を管理するために DBに登録する必要がありましたので、登録する処理を入れました。
CakePHPで確認画面付きフォームのサンプルコード
では、まずテーブルと作ります。
ちなみに、今回私は「inquiries(inquiry)」で今回のお問い合わせフォームを作りました。
————–(テーブル)
1 2 3 4 5 6 7 8 9 |
CREATE TABLE IF NOT EXISTS `inquiries` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(50) CHARACTER SET utf8 DEFAULT NULL, `body` text CHARACTER SET utf8, `mail` varchar(256) CHARACTER SET utf8 NOT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; |
————–
続いて、CakePHPからメール送信処理が行えるよう「/config/email.php」ファイルを作成します。
「/config/email.php.default」のファイル名を「email.php」に変更し、下記の部分を追加します。
from、toの値はここで設定をしておかないと動きませんが、controllerの中で設定することもできますので、適当な値を入れておいても問題ありません。
————–(/config/email.php)
1 2 3 4 5 |
public $inquiry = array( 'transport' => 'Mail', 'from' => array ( 'hogehoge@xxxxxx.com' => 'お問い合わせ' ), 'to' => array ( 'hogehoge@yyyyyyy.jp' ), ); |
————–
続いて、入力フォームの Viewを作りましょう。
————–(/View/Inquiries/form.ctp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<h2>お問い合せフォーム</h2> <?php echo $this->Form->create('Inquiry'); ?> <?php echo $this->Xformjp->input('Inquiry.title', array ( 'rows' => '2', 'label' => 'タイトル' ) );?> <?php echo $this->Xformjp->input('Inquiry.body', array ( 'rows' => '2', 'label' => '本文' ) );?> <?php echo $this->Xformjp->input('Inquiry.mail', array ( 'label' => 'メール' ) );?> <?php if ($this->params['xformHelperConfirmFlag']) { echo $this->Formhidden->hiddenVars(); echo $this->Xformjp->submit('修正する', array( 'name' => 'back', 'div' => false)); echo $this->Xformjp->submit('送信する', array( 'name' => 'submit', 'div' => false)); } else { echo $this->Xformjp->submit('入力内容を確認する', array( 'name' => 'confirm')); } ?> <?php echo $this->Form->end() ;?> |
————–
Modelは、バリデーションの設定を記述します。
今回は、入力チェックのみしかしていませんが、メールチェックや、文字数チェックなど必要に応じて追加してください。
また、今回は、入力された情報をテーブルに保存するように作成しますので下記のようになりますが、テーブルを使用しない場合は、「public $useTable = false;」の 1行を追加してください。
————–(/Model/Inquiry.php)
1 2 3 4 5 6 7 8 9 |
<?php class Inquiry extends AppModel { public $validate = array( 'title' => array ( 'rule' => 'notEmpty' ), 'body' => array ( 'rule' => 'notEmpty' ), 'mail' => array ( 'rule' => 'notEmpty' ) ); } ?> |
————–
続いて、controllerを作ります。
メール送信処理を使う場合は 3行目の「App::uses(‘CakeEmail’, ‘Network/Email’ );」が必要になってきます。
————–(/Controller/InquiriesController.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
<?php App::uses('AppController', 'Controller'); App::uses('CakeEmail', 'Network/Email' ); class InquiriesController extends AppController { public $helpers = array ( 'form', 'Xform.Xformjp', 'Cakeplus.Formhidden' ); public function form() { if ($this->request->is('post')) { if (!empty($this->request->data)) { //valideteチェック $this->Inquiry->set($this->request->data); if($this->Inquiry->validates()){ //submitのタイプの判定 if (isset($_POST['confirm'])) { $type = 'confirm'; } elseif (isset($_POST['submit'])) { $type = 'submit'; } elseif (isset($_POST['back'])) { $type = 'back'; } //sbumit tyep ごとに処理を分ける switch ($type) { case 'back': //修正などがあった時のback処理 break; case 'confirm': //確認画面の処理 //これを宣言するとフォームがフリーズしてくれる $this->params['xformHelperConfirmFlag'] = true; break; case 'submit': //送信する $vars = $this -> request -> data['Inquiry']; $vars['update_date_set'] = date ( 'Y-m-d H:i:s', time() ); $email = new CakeEmail (); $email -> config ( 'inquiry' ) // 送信元 //->from(array($this->request->data['Contact']['email'] => '○○お問い合わせ')) // 送信先 // ->to() // BCC, お問い合わせした人にもコピーを送りたい時とか // ->bcc($this->request->data['Contact']['email']) // テンプレート変数設定 -> viewVars( $vars ) // 使用するテンプレートの設定, 本文の方 contact, レイアウト contact -> template('inquiry', 'inquiry') // メール件名 -> subject('お問い合わせ') ; if ($this->Inquiry->save($this->request->data)) { if ( $email -> send () ) { $this -> Session -> setFlash ( '問合せ完了' ); $this -> redirect ( array ( 'action' => 'index' ) ); } else { $this -> Session -> setFlash ( 'お問い合わせに失敗しました' ); } } else { $this->Session->setFlash( 'データの保存に失敗しました' ); } break; } } } } } } |
————–
入力項目とは別に項目を設定する場合などは、「$vars[‘update_date_set’] = date ( ‘Y-m-d H:i:s’, time() );」のような感じで $varsに入れていきましょう。
確認メールの中で値を受け取るときは、配列のキーで設定した項目名がそのまま変数名として受け取れます。
また、確認メールで「<pre class=”cake-error”><a href=”javascript:void(0);” onclick=”document.getElementById(‘cakeErr51dd21afcee1f-trace’)……..」のように、メール本文に何か入力した覚えがない文字列が出てきている場合は、おそらく、その変数が設定されていません、というエラーメッセージです。
HTMLのタグの部分を、HTMLファイルにコピペして表示させたりすると書かれている内容が分かると思います。
続いて、確認メールのテンプレートです。
ここでは、変数は、入力項目として設定されている変数名をそのまま記述すれば OKです。
————–(/View/Emails/text/inquiry.ctp)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
お問い合わせがありました。 【タイトル】 <?php echo $title; ?> 【本文】 <?php echo $body; ?> 【メール】 <?php echo $mail; ?> 【送信日】 <?php echo $created; ?> |
————–
署名のファイルを設置します。
こちらは、テキスト情報のため、中身はなんでも問題ありませんが、本番運用する場合はしっかり凝った方がいいファイルでしょうね。
————–(/View/Layouts/Emails/text/inquiry.ctp)
1 2 3 4 5 |
<?php echo $content_for_layout;?> hogehoge@xxxxxx.com 株式会社あいうえお 署名のファイルですよ |
————–
これでメールの送信が行えます。
sendmailが設定されていない環境からメールを送信する方法
XAMPP環境などのローカル環境からメールを送信する方法として、ローカル環境にメール送信の環境を整えるという方法もありますが、ローカル環境の sendmailを使わずにメールを送信する方法もあります。
その方法として「Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説(http://blog.s-giken.net/235.html)」と言う記事を書いていますので参考にしてください。
これは、サーバの sendmailで送るとスパム判定さてしまうので、それの対処方法を書いた記事ではありますが、外部の SMTPサーバを経由してメールを送信する方法ですので、ローカル環境などのメールを送信する環境がないサーバからも送信することが出来る方法になります。
(2015.06.14 追記)
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説
CakePHP4のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。
-
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ
CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。
-
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!
-
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3でOGPを設定する方法を解説。metaタグを編集するHTMLヘルパーを利用してOGPのタグを編集する。また、エレメントとして分割することでメンテナンス性も向上させる。
-
CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力する方法
CakePHP3でPHPExcelを利用してエクセルを編集、出力するサンプルソース+解説。PHPExcelのインストール方法の解説からファイル保存とダウンロードの方法なども解説。
-
CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつ、テンプレートファイル、設定情報ファイルの場所とそれらをカスタマイズする方法を説明します。
-
cakephp3 カスタムバリデーションを簡易的に実装する方法
CakePHP3の独自のバリデーションをテーブルクラス内に簡単に記述する方法を解説。他のテーブルクラスでは使えないが、記述する量は少なく実装できるため、他で使わない処理を書くのには便利。
-
国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法
CakePHP4で定数に変数を埋め込み、翻訳機能「__()」で変数に値を入れる方法を紹介。定型の文章の一部だけを置換したい場合に利用すると便利。
-
CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法
アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。
-
CakePHP 2.3でファイルをアップロード・その2 ファイル名を乱数で設定
CakePHPのアップロードするファイル名を乱数で変更しセキュリティを高める方法を解説。