CakePHPクッキング

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' => 'お問い合わせ',
));
The following two tabs change content below.

柴田 篤志

愛知県一宮市在住のWEBシステム屋(SE・プログラマ)。PHP、 CakePHPを利用して日々開発中。CakePHPをこれから始める方、ある程度CakePHPで開発をしている初級〜中級者の方を対象に、CakePHPでの開発をスピードアップするための情報をまとめています。CakePHPの案件のご依頼、御見積はこちらへご連絡ください。

最新記事 by 柴田 篤志 (全て見る)

WordPressとCakePHPの共存

サイトを作るのに便利なWordPress。プラグインも数多く用意されて

サイトマップの作成方法

Googleのウェブマスターツールに渡すためのサイトマップの作成方法で

INSERTしたIDを取得する

データを保存した後にINSERTされたデータのIDを使って何かの処理を

ファイルの存在確認やフォルダー内のファイル一覧取得

特定のファイルの存在を確認したい場合や特定のフォルダー内にあるファイル

リンクの最後に常にスラッシュをつける方法

URLの最後に常にスラッシュをつけるかつけないかを統一する方法は、UR

countやsumを使う時のフィールド名を指定する

CakePHPでcountやsumなどを使う場合、ちょっとした工夫が必

Formの便利な使い方

問い合わせフォームや会員機能など、WEBサイトを作る際に必ず必要になる

ヘルパーをオーバーライドする

CakePHPで便利な機能が詰まったヘルパーですが、時々もう少しこうだ

特定の時だけSQLの条件を追加するならSet::mergeを使う

SQLの条件を追加したい時に使うのがarray_mergeなどですが、

ページネーションではDISTINCTではなく、GROUP BYを使う

重複したデータを省く時に使うDISTINCTですが、ページ送りで使う時

Model内で別のModelを呼び出す

モデル内で別のモデルを使いたいケースがあった場合、次のようにすることで

CakePHPでGoogleAnalyticsAPIを使う

CakePHPでGoogleAnalyticsを使う方法について見てい

独自のfindを定義するfindMethods

findをより便利に、よりスッキリ書くのに、findMethodsを使

TCPDFを使ってCakePHPでPDFを作成

CakePHPでPDFを作成するには幾つかの方法がありますが、今回はT

JavaScriptをコードの最下部に配置

SEOの観点からJavaScriptのコードは一番下に記述したいところ

無限スクロールをさせる

TwitterやFacebookのタイムラインを見ていて、ページの下に

PHPExcelの導入

ExcelにDBのデータを表示して一覧を作ったり、請求書などのフォーマ

Warning: SplFileInfo::openFile〜の警告が表示されたら

ShellとWEBの両方で同一のModelを呼び出す時に「Warnin

連結されていないデータを抽出

通常、テーブルを連結してデータを取得するには、アソシエーションを利用し

データを取得する

データを取得したい時に少し変わった条件で取得したい場合があります。

PAGE TOP ↑