[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」を表示させてみると以下のようになります。

site_request_index_1

お題一覧表示

続いて表示のためのビュー(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をユーザー名に変更」を参照ください。
以下のように表示されます。

site_request_index_2

ユーザー名がちゃんと取得できています。

お題についてはまだまだ色々な機能があります。
お題の画像、お題に対してアップロードされた音声数など。
これらはまだまとめるのに時間が掛かるので後日にします。。。

Share

  • このエントリーをはてなブックマークに追加

Comment

コメントを残す

*がついている欄は必須項目です。

  • Twitter
  • Facebook
  • Google Plus
  • RSS Feed