[Site] トップページ (処理)

タグ :

作成サイト「koweboo」についてまとめるシリーズです。
今回は前記事に続いて「データ取得処理」についてです。

作成サイト内の関連箇所 — 「トップページ

データ取得処理

トップページに必要なデータ取得として、今回は「tops」テーブルに登録されているデータのみを取得します。
TopsController.php の「index()」へ処理を記述していきますが、処理が複雑化しそうなので、コンポーネント化して簡潔にしたいと思います。
コンポーネントする処理としては以下になります。

  • コメント投稿処理
  • 注目の音声取得
  • ピックアップのお題取得
  • ユーザー名取得(以前に作成したものを使用)

コンポーネントは過去記事「コンポーネント化する」で作成したファイル(/app/Controller/Component/TopicComponent.php)へ記述していきます。

まずはコメント投稿処理です。

function SaveComment($model) {
	if ($model->request->is('post')) {
		if($model->request->data['VoicesComment']['comment']) {
			$model->VoicesComment->create();
			if (!$model->VoicesComment->save($model->request->data)) {
				$model->Session->setFlash(__('The Comment could not be saved. Please, try again.'));
			}
			$model->redirect(array('action'=>'index'));
		}
	}
}

過去記事「音声機能 その3」のデータ取得処理のコメント投稿処理を流用しているだけですので、特に説明はいらないと思います。
引数でモデルを受け取るところに注意するくらいです。

続いては、注目の音声取得処理です。

function GetTopicVoiceOne($model) {
	// トップの音声ID取得
	$voice_id = $model->find('list', array(
		'conditions' => array(
			'not' => array('voice_id' => null)
		),
		'fields' => 'voice_id'
	));
	// 音声情報取得
	$model->Voice->contain('VoicesComment');
	$voice = array();
	$voice = $model->Voice->find('first', array(
		'conditions' => array('Voice.id' => $voice_id)
	));
	// 音声のお題情報取得
	$model->Voice->Request->contain();
	$voice += $model->Voice->Request->find('first', array(
		'conditions' => array(
			'Request.id' => $voice['Voice']['request_id']
		)
	));
	
	return $voice;
}

過去記事「音声機能 その2」では、モデルからデータの自動取得を行っていたので、処理は必要ありませんでしたが、今回は自力で取得します。
自力といっても「find()」関数を使用します。
取得するデータ構成は音声一覧と同じになるようにします(表示のコードを変更しなくてもいいように)。
また、今回のトップページに表示する注目の音声は、一つだけにしたいと思いますので、取得するデータは一つだけになります。

次は、ピックアップのお題取得です。

function GetTopicRequest($model) {
	// トップのお題ID取得
	$req_id = $model->find('list', array(
		'fields'=>'request_id'
	));
	// お題情報取得
	$model->Request->contain('Genre');
	$req_all = $model->Request->find('all', array(
		'conditions' => array('Request.id' => $req_id)
	));
	foreach($req_all as $data) {
		$req[$data['Request']['id']] = $data;
	}
	
	return $req;
}

基本的なデータ取得処理と同じなので、説明は不要だと思います。

さて、これらのコンポーネントを用いてコントローラでの処理を記述してみます。

public function index() {
	/* コメント投稿時 */
	$this->Topic->SaveComment($this);

	/* トップのデータ取得(注目のこえ、ピックアップお題) */
	$voice_data = $this->Topic->GetTopicVoiceOne($this->Top);
	$req_data = $this->Topic->GetTopicRequest($this->Top);

	/* 初期化 */
	foreach($req_data as $req) {
		$req_id[$req['Request']['id']] = $req['Request']['id'];
	}
	$req_id[$voice_data['Request']['id']] = $voice_data['Request']['id'];

	/* ユーザー名(注目のこえ、ピックアップお題、コメント) */
	$user_req = $this->Topic->GetUserName(
			$this->Top->Request,
			array('Request.id' => $req_id)
			);
	$user_voice = $this->Topic->GetUserName(
			$this->Top->Voice,
			array('Voice.id' => $voice_data['Voice']['id'])
			);
	$user_com = $this->Topic->GetUserName(
			$this->Top->Voice->VoicesComment,
			null
			);
	$voice_data['User']['id'] = $voice_data['Voice']['user_id'];
	$this->set('voice', $voice_data);
	$this->set('user', $user_req + $user_voice + $user_com);
	$this->set('requests', $req_data);

	/* 注目のこえのコメント数 */
	$comcnt[$voice_data['Voice']['id']] = 0;
	foreach($voice_data['VoicesComment'] as $com) {
		$comcnt[$voice_data['Voice']['id']]++;
	}
	$this->set('comcnt', $comcnt);
}

3行目で作成したコメント投稿コンポーネントを使用しています。
受け渡すモデルには「$this」を指定します。

6行目にて注目の音声取得コンポーネントを使用しています。
受け渡すモデルに「$this->Top」を指定することで、管理者がトップページ用に登録したデータのみを取得してきます。

7行目にてピックアップのお題取得コンポーネントを使用しています。
説明は上の処理と同様です。

16行目〜27行目では、それぞれのデータに対応するユーザー名(お題投稿ユーザー、音声アップロードユーザー、コメント投稿ユーザー)を取得します。
もっと効率の良い取得方法があるのかもしれませんが、極力取得するデータを少なくしたいが為に、このようになりました。

34行目〜38行目は過去記事「音声機能 その3」のデータ取得処理のコメント数取得処理を流用しました。
データ取得時($voice_data)に VoicesComment のデータも一緒に取得してきているので、ループ処理で同じように使用できます。

後は表示用のビューファイルを編集するだけですが、続きは次回に。。。

Share

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

Comment

コメントを残す

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

  • Twitter
  • Facebook
  • Google Plus
  • RSS Feed