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」アクションを追加。

<?php

App::uses('CakeEmail', 'Network/Email');

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']);

                //管理者宛てにメールを送信
                $cakeemail = new CakeEmail('noticeadmin');
                $cakeemail->subject('お問い合わせがありました');
                $cakeemail->send("お問い合わせがありましたので確認してください。");

            } else {

                $this->render('reinput');

            }

        } else {

            $this->redirect('index');

        }

    }

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

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

    }

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

        $results = $this->Contact->findById($this->request->query['id']);

        $this->set('contact', $results);

    }

}
 

51行目から58行目が追加箇所。
54行目で対象のデータを検索。
「findById」メソッドは引数で与えられた内容の主キーを持つデータを検索。
56行目で見つかったデータをセットしてビューで利用できる状態に。

(3) ビューの追加

「detail」ビューを追加する。

<table>
    <tr>
        <td>お名前</td>
        <td><?php echo $contact['Contact']['username']; ?></td>
    </tr>
    <tr>
        <td>メールアドレス</td>
        <td><?php echo $contact['Contact']['email']; ?></td>
    </tr>
    <tr>
        <td>コメント</td>
        <td><?php echo $contact['Contact']['comment']; ?></td>
    </tr>
    <tr>
        <td>お問い合わせ日時</td>
        <td><?php echo $contact['Contact']['created']; ?></td>
    </tr>
</table>

いつものように「detail.ctp」として保存する。

(4) 動作の確認

まずはお問い合わせ一覧()を表示する。

f:id:altere5:20131117031203p:plain

非常にわかりにくいが「お名前」欄がリンクとなっている。 試しに上から2番目の問い合わせを選択する。

f:id:altere5:20131117031312p:plain

選択されたお問い合わせの情報が表示される。