ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  CakePHP 2.x >  CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方

前回、XAMPP環境からメールの送信ができるように設定を変更しましたので(http://ssgiken.blog.fc2.com/blog-entry-26.html)、今日はいよいよメールフォームを作っていきます。
(XAMPP環境などローカル環境からメールを送信する設定が分からない方は先週の記事も読んでいただくと参考になるかと思います。)


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に登録する必要がありましたので、登録する処理を入れました。


では、まずテーブルと作ります。
ちなみに、今回私は「inquiries(inquiry)」で今回のお問い合わせフォームを作りました。

--------------(テーブル)
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)
public $inquiry = array(
  'transport' => 'Mail',
  'from' => array ( 'hogehoge@xxxxxx.com' => 'お問い合わせ' ),
  'to'   => array ( 'hogehoge@yyyyyyy.jp' ),
);
--------------


続いて、入力フォームの Viewを作りましょう。

--------------(/View/Inquiries/form.ctp)

お問い合せフォーム

<?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)
<?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)
<?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)
お問い合わせがありました。

【タイトル】
<?php echo $title; ?>

【本文】
<?php echo $body; ?>

【メール】
<?php echo $mail; ?>

【送信日】
<?php echo $created; ?>
--------------


署名のファイルを設置します。
こちらは、テキスト情報のため、中身はなんでも問題ありませんが、本番運用する場合はしっかり凝った方がいいファイルでしょうね。

--------------(/View/Layouts/Emails/text/inquiry.ctp)
<?php echo $content_for_layout;?>

hogehoge@xxxxxx.com
株式会社あいうえお
署名のファイルですよ
--------------

これでメールの送信が行えます。
関連記事
スポンサーサイト
[ 2013年07月22日 13:55 ] カテゴリ:CakePHP 2.x | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
07 | 2017/08 | 09
- - 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 - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。