altere5's blog

I thought what I'd do was, I'd pretend I was one of those deaf-mutes. ( or shou'd i ? )

CakePHPのお勉強 7回目 お問い合わせ内容の確認

サンプルとしてお問い合わせ機能を作ってきました。
しかしよく考えると致命的な問題があった。

そもそも今のままではお問い合わせ内容が分からない。

というわけで今回は登録されているお問い合わせ内容を確認できるようにする。

イメージとしては一覧画面で対象のお問い合わせをクリックして詳細を見るような感じ。

(1) 一覧画面の修正

まずは一覧画面に修正を行う。
「お名前」欄にURLリンクを設定しクリックする事で内容確認画面を開くようにする。

<table>
    <tr>
        <th>お名前</th>
        <th>メールアドレス</th>
        <th>お問い合わせ日時</th>
    </tr>

    <?php foreach ($contacts as $contact): ?>
    <tr>
        <td><a href="/contacts/detail/?id=<?php echo $contact['Contact']['id']; ?>"><?php echo $contact['Contact']['username']; ?></a></td>
        <td><?php echo $contact['Contact']['email']; ?></td>
        <td><?php echo $contact['Contact']['created']; ?></td>
    </tr>
    <?php endforeach; ?>

    <?php unset($post); ?>

</table>

修正個所は10行目。
名前を表示している部分にAタグを設定しリンク先を「detail」アクションとしGET変数で対象のIDを引き渡すように変更。

(2) コントローラの修正

コントローラに「detail」アクションを追加。

続きを読む

CakePHPのお勉強 6回目 メールによる通知

ここまでの作業でお問い合わせの入力、そして一覧での確認ができるようになった。
とはいえ、いつお問い合わせが行われるか分からない事を考えるといちいち一覧を確認するのは現実的ではない。

そこで今回は、お問い合わせがあった場合はメールで通知するようにする。

(1) メールの送信設定

CakePHPのメールの設定は「Config/email.php」の中に設定する。

    public $noticeadmin = array(
        'transport' => 'Mail',
        'from' => array('送信元アドレス' => '送信元名'), 
        'replyTo' => array('返信先アドレス' => '返信先名'), 
        'to' => array('送信先アドレス' => '送信先名'), 
        'charset' => 'utf-8',
        'headerCharset' => 'utf-8',
        'emailFormat' => 'text',
    );

この設定を「email.php」に追加する。

(2) 送信処理の追加

コントローラの「thanks」アクションにメールの送信処理を追加。

続きを読む

CakePHPのお勉強 5回目 お問い合わせ一覧の表示

さて、ここまで入力に関する処理を色々と試しました。
ただこのままだとどんな問い合わせがあったかさっぱりわかりません。
そこで今回は問い合わせの一覧を表示してみたいと思います。

(1) コントローラへ一覧表示の処理を追加

コントローラに一覧表示の処理として「contactlist」アクションを追加する。

<?php

class ContactsController extends AppController {

    // indexアクション
    public function index() {}

    // thanksアクション
    public function thanks() {

        if($this->request->is('post')) {

            $this->Contact->set($this->request->data);

            if($this->Contact->validates()) {

                $this->Contact->create();
                $this->Contact->save($this->request->data);

                //POSTデータを受け取った場合の処理を記述
                $this->set('username', $this->request->data['username']);

            } else {

                $this->render('reinput');

            }

        } else {

            $this->redirect('index');

        }

    }

    // contactlistアクション
    public function contactlist() {

        $this->set('contacts', $this->Contact->find('all'));

    }

}
 

37行目から42行目に一覧表示用の処理を追加。
ここでは「find」メソッドを使い登録済みの全データを取得しビューから参照可能なようにセット。

(2) 一覧表示用のビューを追加

次に一覧表示で利用するビューを追加する。

続きを読む

CakePHPのお勉強 4回目 入力内容のチェック再び

前回の作業で入力内容のチェックができた。
但し、結構不便な状態。

例えば、全て入力したけどメールアドレスだけが間違っていた場合。

f:id:altere5:20131116192842p:plain

全部消えてしまいます。
普通にこんなフォーム合ったらキレますね。

そこでこの部分を修正。

(1) 再入力用のフォームを準備

なぜ入力内容が消えてしまうかというと入力タグのデフォルト値が設定されていない為。
そこで再入力時には専用のビューを準備しデフォルト値に入力済みの値をセットする。

<form action="/contacts/thanks" method="POST">
    <div class="input text">
        <label for="username">お名前</label>
        <input type="text" name="username" id="username" value="<?php echo $this->request->data['username']; ?>" />
    </div>
    <b><?php echo $this->Form->error('contact.username'); ?></b>
    <div class="input text">
        <label for="email">メールアドレス</label>
        <input type="text" name="email" id="email" value="<?php echo $this->request->data['email']; ?>" />
    </div>
    <b><?php echo $this->Form->error('contact.email'); ?></b>
    <div class="input text">
        <label for="comment">コメント</label>
        <input type="text" name="comment" id="comment" value="<?php echo $this->request->data['comment']; ?>" />
    </div>
    <b><?php echo $this->Form->error('contact.comment'); ?></b>
    <div class="submit">
        <input type="submit" value="確認" />
    </div>
</form>
 

それぞれのINPUTタグのデフォルト値に入力値をセット。
これだけ。

(2) 表示時に利用するビューの変更

このままでは「reinput.ctp」が呼ばれることがないので、入力エラーが発生した場合に利用するよう設定を変更。

<?php

class ContactsController extends AppController {

    // indexアクション
    public function index() {}

    // thanksアクション
    public function thanks() {

        if($this->request->is('post')) {

            $this->Contact->set($this->request->data);

            if($this->Contact->validates()) {

                $this->Contact->create();
                $this->Contact->save($this->request->data);

                //POSTデータを受け取った場合の処理を記述
                $this->set('username', $this->request->data['username']);

            } else {

                $this->render('reinput');

            }

        } else {

            $this->redirect('index');

        }

    }

}
 

25行目で呼び出すビューを「reinput」に変更。 これでエラーが発生した場合は「reinput」を使った表示になり、入力した値も補完される。

(3) 動きを確認

実際にエラーを発生させて確認する。

f:id:altere5:20131116194924p:plain

ちゃんと入力内容が補完されていい感じ。

CakePHPのお勉強 3回目 入力内容のチェック

前回の作業でお問い合わせ内容の保存ができた。

但し、登録時に何もチェックをしていないのでメールアドレス欄に何を入れても登録する事ができてしまう。
そこで今回は入力内容をチェックし不正な入力は受け付けないようにする。

(1) チェックルールの設定

入力チェックのチェックルールはモデルに記入する。

<?php

class Contact extends AppModel{

    public $validate = array(
        'username' => array(
            'rule' => 'notEmpty', 
            'required' => true, 
            'message' => '「お名前」は必ず入力して下さい',
        ),
        'email' => array(
            'rule'=> 'email', 
            'required' => true, 
            'message' => '「メールアドレス」は正しく入力して下さい',
        ),
        'comment' => array(
            'rule' => 'notEmpty', 
            'required' => true, 
            'message' => '「コメント」は必ず入力して下さい',
        ),
    );

}
 

5行目から21行目に追加した部分がチェックルール。
例えば、5行目から10行目の部分では「username」つまり「お名前」欄についてのルールを設定。
この場合は「notEmpty」なので空は禁止、「required」が「true」なので入力は必須となる。
「message」の部分はこのルールを満たさない場合、つまりエラーとなった場合に利用するエラーメッセージとなる。
11行目から15行目の部分は「email」つまり「メールアドレス」欄のチェックルール。
この「email」はあらかじめ組み込まれたルールでこのほかにもいくつかのあらかじめ組み込まれたルールがあるので必要に応じて使う事ができる。
但し、ルールの一部は多少国による違い等で利用しづらいものもあるので注意。

メールアドレスのルールも少し問題があるが今回は気にしない

(2) 入力チェックの実行

続きを読む