[Site] お題投稿機能 その1

タグ :

作成サイト「koweboo」についてまとめるシリーズです。
今回はユーザーが投稿する「お題」の処理についてまとめます。
かなり長くなるので何回かに分けて書きます。
今回は「投稿」についてです。

作成サイト内の関連箇所 — 「お題一覧

基本仕様

そもそも「お題(requests)」というのは、このサイト内ではユーザーが募集する音声の種類みたいなものを指します。
ユーザーが音声をアップロードするには、サイトに投稿してあるお題を選んで、そのお題の内容に関係する音声をアップロードします。
お題はログインしているユーザーが自由に投稿できるものとします。

お題の英訳としては、「theme」や「problem」がありますが、今回は「request」という単語を使用します。
ラジオなどのリクエスト的な意味合いにしたいと思ったからです。
ユーザーがリクエストしたお題に対して他ユーザーが音声をアップロードする、という感じです。

お題の内容は以下になります。

  • お題タイトル (一覧で表示される題目)
  • お題ジャンル (セリフ、歌、BGMなど)
  • お題詳細   (お題の説明や詳しい内容)

テーブル作成

お題テーブルには以下のフィールドを設けます。

[requests]
フィールド名 名称 説明
id お題ID 主キー
user_id ユーザーID お題投稿ユーザーID
genre_id ジャンルID genresテーブル参照
title お題タイトル お題の題目
detail お題詳細 お題の説明など
created 投稿日時 投稿した日時(自動保存)
ジャンルIDには以下のジャンルテーブルの「id」が入ります。
[genres]
フィールド名 名称 説明
id ジャンルID 主キー
genre ジャンル セリフ、歌、BGMなど

基本ファイル生成

自動生成の「Bake」を使用します。
「requests」はMVC全て Bake し、「genres」はモデルのみを Bake します。
以下のファイルが生成されます。

[Model]
 - Request.php
 - Genre.php
[View]
 - [Requests]
   - add.ctp
   - edit.ctp
   - index.ctp
   - view.ctp
[Controller]
 - RequestsController.php

投稿フォーム作成

まずは、お題を投稿できるフォームを作成します。
投稿フォームは、お題の追加する部分である「add.ctp」を編集します。
コードは以下になります。

<?php
	echo $this->Form->create('Request'); 
	echo $this->Form->hidden('user_id', array(
		'value'=>$user_id,
	));
	echo $this->Form->input('genre_id');
	echo $this->Form->input('title');
	echo $this->Form->input('detail');
	echo $this->Form->end(__('Request!'));
?>

修正した部分は「user_id」を入力じゃ無くしただけです。
ユーザーIDは、お題投稿ユーザーのIDなので、今回の場合は必ずログインユーザーIDが入ることになります。
よって入力は不要となり、表示も必要無いので hidden 属性にて値を持たせることにします。
表示は以下のようになります。

site_request_add

CakePHP のスゴいところは、「genre_id」を input 属性で表示させると、自動でセレクトタグに変換してくれることです。
これは命名規則で「○○_id」という名前のデータはセレクトへ変換しているのだと思います。
この処理は CakePHP のヘルパー(FormHelper.php 980行目くらい)で処理してるっぽいです。
何にせよ便利ですね。

登録処理作成

続いてはコントローラにて登録処理を作成します。
コントローラ(RequestsController.php)のファンクション「add()」を編集します。

if ($this->request->is('post')) {
	$this->Request->create();
	if ($this->Request->save($this->request->data)) {
		$this->Session->setFlash(__('The request has been saved'));
		$this->redirect(array('action' => 'index'));
	} else {
		$this->Session->setFlash(__('The request could not be saved. Please, try again.'));
	}
}
// ジャンル取得
$genres = $this->Request->Genre->find('list', array(
	'fields'=>'genre'
));
$this->set('genres', $genres);
// ログインユーザーID取得
$user = $this->Auth->user();
$this->set('user_id', $user['id']);

上半分は全くいじっていません。
下半分にジャンルのセレクトタグの内容をデータベースから取得する処理と、ログインユーザーIDを取得する処理を追記しました。

ジャンルに関して便利なのが、取得したジャンルデータをビューへ渡すときに「genres」という変数名へ渡すだけで、セレクトの内容へ反映されます。
変数名を複数系にしているのは CakePHP の命名規則です。

ログインユーザーIDの取得は Auth 機能を利用します。
「$this->Auth->user()」を変数へ格納し、「id」要素を取り出してビューへ渡しているだけです。

モデルの編集

今回はモデルは全くいじりませんでした。
Bake で生成したままで使用できます。

次は一覧表示についてですが、続きは次回に。。。

Share

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

Comment

コメントを残す

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

  • Twitter
  • Facebook
  • Google Plus
  • RSS Feed