[Site] お題投稿機能 その2
作成サイト「koweboo」についてまとめるシリーズです。
今回はユーザーが投稿する「お題」の処理についてまとめます。
前記事(投稿)に続きまして、今回は「一覧表示」についてです。
作成サイト内の関連箇所 — 「お題一覧」
お題一覧データ取得
一覧は index を編集して作成します。
まずはコントローラにてお題一覧に必要なデータを取得します。
一覧に必要なデータは以下になります。
- お題ID
- お題タイトル
- お題投稿ユーザーID
- お題投稿ユーザー名
お題IDは、ページ遷移用のパラメータとして使用します。
お題詳細ページへ遷移させる URL は 「requests/view/(request_id)」という感じになります。
お題タイトルはそのまま。
厄介なのが、お題投稿ユーザー名の取得です。
とりあえずソースを見てください。
public function index($genre_id = null) { // お題データの取得 $this->Request->recursive = 0; $param = array(); if($genre_id) { $param += array( 'conditions' => array( 'Request.genre_id' => $genre_id ) ); } $param += array( 'order' => array('created' => 'desc') ); $this->paginate = $param; $requests = $this->paginate(); if(empty($requests)) { // データが無い場合 $this->set('requests', false); } else { // お題データ受け渡し $this->set('requests', $requests); } // ジャンルID受け渡し $this->set('genre_id', $genre_id); // ユーザーID取得 $this->Request->contain('User'); $user_id = $this->Request->find('list', array( 'fields' => 'user_id' )); // ユーザー名取得 $this->Request->User->contain('Name'); $users = $this->Request->User->find('all', array( 'conditions' => array('User.id' => $user_id), 'fields' => 'id' )); // ユーザー名まとめ $data = array(); foreach($users as $user) { $data[$user['User']['id']] = array( 'id' => $user['Name'][0]['user_id'], 'name' => $user['Name'][0]['name'] ); } $this->set('user', $data); }
-
[ソース解説]
-
データ取得時の find()オプションには以下を指定します。
-
オプション 内容 説明 conditions ‘Request.genre_id’ => $genre_id ジャンルIDを指定 order ‘created’ => ‘desc’ 投稿の新しい順 -
まずはジャンルの指定についてです。
一覧に表示するジャンルのデフォルトは「すべて」です。
ジャンルの指定は URL のパラメータによって指定され、5行目にてジャンル指定の有無を確認し、無い場合は指定せずにデータを取得します。
パラメータが 1 なら「セリフ」、2 なら「歌」というように取得する段階でジャンル別に取得するようにします。続いてユーザー名の取得についてです。
お題テーブル内に「user_id」があるので、Bake 時にユーザーテーブルへのアソシエーションがされます。
余分なデータ取得を極力防ぐため、まずはお題投稿したユーザーのIDを取得し、その ID を条件として名前テーブルからユーザー名を取得しています。
そして最後に扱いやすいように配列を整理します。
デバッグ出力にて「$data」を表示させてみると以下のようになります。
お題一覧表示
続いて表示のためのビュー(index.ctp)を編集します。
先程コントローラで取得したデータをそのまま表示させるだけです。
<?php foreach ($requests as $request): ?> <tr> <td><?php echo h($request['Request']['id']); ?></td> <td> <?php echo $this->Html->link( $user[$request['User']['id']]['name'], array( 'controller' => 'users', 'action' => 'view', $request['User']['id'] ) ); ?> </td> <td> <?php echo $this->Html->link( $request['Request']['title'], array( 'controller' => 'requests', 'action' => 'view', $request['Request']['id'] ) ); ?> </td>
このソースでの一番のこだわりは、7行目です。
詳しくは過去記事「[Site] ユーザーIDをユーザー名に変更」を参照ください。
以下のように表示されます。
ユーザー名がちゃんと取得できています。
お題についてはまだまだ色々な機能があります。
お題の画像、お題に対してアップロードされた音声数など。
これらはまだまとめるのに時間が掛かるので後日にします。。。
Comment