CakePHP2.1でデータの新規作成(実践編その1)

今日から、実際に簡単なアプリケーションを作成しながら、CakePHP2.1の勉強を進めていきたいと思います。私の趣味は、映画やドラマのコレクションです。WOWOWやスターチャンネルで好きな映画やドラマをブルーレイに保存しているのですが、数が多くなりすぎると既に保存してある映画を再度録画したり、保存した映画を見たいと思ったらどこに収納したか分からなくなるといったことが起きています。そこで、保存した動画やコレクションの整理用にサイトを作成したいと思います。入力は基本的にパソコンでやると思いますが、収集したブルーレイやDVD、CD等の情報は、携帯で簡単に調べられるようにしたいと思います。

データベーステーブルの作成

1. まずデータベーステーブルを作成します。テーブルのフィールドには、タイトル名、作成日、更新日、保存場所、整理番号、種別(洋画、邦画、ドラマ、ドキュメンタリー、ライブ、スポーツ、音楽、書籍、ゲーム)、備考、画像の8フィールドで作成したいと思います。せっかくですので、書籍やゲームも整理できるようにしてみます。備考には、それぞれの種類に応じていろいろな情報を格納できるように連想配列をシニアライズして保存したいと思います。

2. テーブルは3つ作成します。1つは基本となるcollectionsテーブル、種別分けのためのcol_assortsテーブル、画像を保存するためのcol_imagesテーブルです。

3. まずはcollectionsテーブルを作成します。

CREATE TABLE `collections` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 `title` VARCHAR( 100 ) NOT NULL ,
 `created` DATETIME NOT NULL ,
 `modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
 `col_code` VARCHAR( 100 ) NOT NULL ,
 `save_space` VARCHAR( 255 ) NULL ,
 `assort_id` INT NULL ,
 `picture_id` INT NULL ,
 `note` TEXT NULL ,
 );

4. 次に種別分けのためのテーブルを作成します。

CREATE TABLE `col_assorts` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `as_name` VARCHAR( 255 ) NOT NULL
 );

5. 最後に画像を保存するためのテーブルを作成します。

CREATE TABLE `col_images` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `finename` VARCHAR( 255 ) NOT NULL ,
 `content` MEDIUMBLOB NOT NULL
 );

コントローラの作成

6. データ入力用のコントローラを作成します。ファイル名はテーブル名と同じ(複数形を単数形に変換)文字にControllerを付加したファイル名です。こうすることにより、CakePHPが自動的にモデルを生成してくれますので、モデルのことを考えずに済みます。

app/Controller/CollectionController.php

<?php
 class CollectionController extends AppController{
 public function add(){
 }
 }

ビューファイルの作成

7. データ入力画面を作成します。CakePHPはオートレンダリング機能がありますので、命名規則に則ってビューファイルを作成しておけば、コントローラで表示するビューを指定する必要はありません。それでは、命名規則に則り、Viewフォルダに新しくCollectionフォルダを作成し、その中にadd.ctpファイルを作成します。その中にCakePHPのフォームヘルパーを使ってフォームを作成します。下記のように記述します。

app/View/Collection/add.ctp

<h1>新規入力</h1>
 <?php
 //フォームの開始を宣言する
 echo $this->Form->create('Collection');
 //入力フォームの生成
 echo $this->Form->input('title');
 echo $this->Form->input('created');
 echo $this->Form->input('col_code');
 echo $this->Form->input('save_space');
 //フォームの終了宣言
 echo $this->Form->end('送信');
 ?>

8. それでは、ここまでのところをブラウザで確認してみましょう。たったこれだけの行程で、CakePHPが最適なフォームを生成します。

9. 次にこのフォームから入力データを受け取り、実際にデータベースにデータを保存するためのコードを作成します。CollectionController.phpのaddアクションを下記のように修正します。

<?php
 class CollectionController extends AppController{
 public function add(){
 //データがPOSTされたら
 if($this->request->is('post')){
 //データを保存
 $this->Collection->save($this->request->data);
 }
 }
 }

10. 尚、このままだとデータ入力後もそのまま同じ画面になりますので、データが保存されたかどうか分かりません。データが入力されたら、index.ctpに移動するようにindexアクションを作成します。

app/Controller/CollectionController.php

<?php
 class CollectionController extends AppController{
 public function index(){
 //Collectionモデルから全てのデータを検索
 $data=$this->Collection->find('all');
 //データの連想配列をセット
 $this->set('Collections',$data);
 }
 public function add(){
 //データがPOSTされたら
 if($this->request->is('post')){
 //データを保存
 $this->Collection->save($this->request->data);
 //indexページへ移動する
 $this->redirect('index');
 }
 }
 }

indexページの作成

11. データ表示用のindex.ctpを作成します。

app/View/Collection/index.ctp

<h1>私のコレクション</h1>
 <table cellpadding="0" cellspacing="0">
 <tr>
 <th><?php echo "ID";?></th>
 <th><?php echo "タイトル";?></th>
 <th><?php echo "作成日";?></th>
 <th><?php echo "更新日";?></th>
 <th><?php echo "コード番号";?></th>
 <th><?php echo "保管場所";?></th>
 </tr>
 <?php
 foreach ($Collections as $row): ?>
 <tr>
 <td><?php echo h($row['Collection']['id']); ?>&nbsp;</td>
 <td><?php echo h($row['Collection']['title']); ?>&nbsp;</td>
 <td><?php echo h($row['Collection']['created']); ?>&nbsp;</td>
 <td><?php echo h($row['Collection']['modified']); ?>&nbsp;</td>
 <td><?php echo h($row['Collection']['col_code']); ?>&nbsp;</td>
 <td><?php echo h($row['Collection']['save_space']); ?>&nbsp;</td>
 </tr>
 <?php endforeach; ?>
 </table>

12. それでは、データを入力してみましょう。

13. indexページへ移動して、データが入力されたのが確認できました。

本日のコード解説

$this->Form->create(‘モデル名’,’オプション’)

フォームの開始を宣言するフォームヘルパーです。オプションに従いformタグを生成し、その後に出てくる入力タグに付加する値を準備します。モデル名は、デフォルトで使用するモデル名を指定します。モデルを使わないinputを使いたいときはnullを指定します。オプションは連想配列で指定します。オプションで指定可能な値の一覧を表示します。

  • action
    formタグの『 action』に設定するURL。stirng又は、arrayの値。
  • type
    フォームのタイプを指定します。初期値は’put’又は、’post’です。formタグの『method』に結びつく値です。『put』『post』『get』『delete』『file』が設定できます。
  • enctype
    formタグの『enctype』に設定される文字列。尚、typeが『file』の場合は自動的に『multipart/form-data』が設定されます。
  • default
    初期値はtrueですので、Ajaxを許可する場合は、falseに設定します。

 $this->Form->end(‘オプション’)

submitボタンの配置と共にフォームの終了宣言をします。submitは非表示にすることも出来ます。また、トークンキーが発行されている場合はトークンをhiddenタグで付加します。

$this->Form->input(‘フィールド名’,’オプション’)

入力フォームを生成します。inputタグだけでなく、全ての入力フォームについて生成することが出来ます。豊富なオプションを持っていますが、省略しても対象フィールドの型を参照して最適なフォームのタイプを選び出します。オプションは連想配列で指定します。オプションで指定できるオプション値を下記の表記します。

  • type
    インプットタグの種類を指定します。初期値は’text’ですので、省略すると’text’が指定されます。『text』『textarea』『password』『file』『select』『radio』『checkbox』『date』『time』『datetime』『hidden』があります。
  • before
    入力タグの前に挿入したい文字列を指定します。
  • between
    ラベルタグと入力タグの前に挿入したい文字列を指定します。
  •  after
    入力タグの後に挿入したい文字列を指定します。
  • separator
    『radio』の時に、各項目の間に挿入したい文字列を指定します。
  • options
    『select』『radio』の時に、各項目を設定します。配列で指定した場合はvalueと 表示文字列が同一になり、連想配列で指定した場合は、キーがvalue、値が表示文字列になります。
  • multiple
    『select』の場合、複数入力が可能場合にtureを指定します。
  • maxlength
    『text』『textarea』の文字列の最大入力数を指定します。
  • div
    入力フォームをラップするdivタグを設定します。falseで表示しません。初期値はtypeの値と同じです。
  • label
    入力フォームに付加するlabelタグを設定します。falseで出力しません。初期値はフィールド名です。
  • legend
    『radio』を囲むlegendタグを設定します。falseで出力しません。初期値はフィールド名です。
  • id
    付加するDomidを設定します。初期値はモデル名フィールド名です。
  • error
    エラーが発生した場合のメッセージを設定します。省略するとバリデーションエラーを表示します。
  • default
    『select』で最初に選ばれる値を指定します。
  • selected
    『select』『date』『time』『datetime』で選択された項目を指定します。
  • rows
    『textarea』の桁数を指定します。
  • cols
    『textarea』の行数を指定します。
  • empty
    『select』『date』『time』『datetime』で、tureにすると空白を指定できるようになります。
  • timeFormat
    時間のフォーマット(12時間制/24時間制)を指定します。初期値は’12’です。また『none』で非表示になります。
  • dateFormat
    年月日の並び順を設定します。『DMY』『MDY』『YMD』が選べます。
  • monthNames
    月を名前で表示する場合はture、数字で表示する場合はfalseを指定します。
  • class
    タグに指定するクラスを指定します。

$this->request->is(‘post’)

POST形式でのHTTPリクエストであるかどうかを調べます。CakePHP1.2、1.3ではRequestHandlerコンポーネントでしたが、多くのRequestHandlerコンポーネントが非推奨となり、将来のバージョンでは削除されることになっています。

$this->モデル名->save(‘データ’,’バリデート’,’フィールドリスト’)

1レコード分のデータを保存します。データベーステーブルへのインサートとアップデートは、どちらも本メソッドを使用します。

$this->redirect(‘URL’,’ステータスコード’,’$exit’)

別のURLにリダイレクトします。ステータスコードでエラーステータスを発行することも出来ます。exit()も発行する場合は、第3引数をtrueにします。

データの新規作成まで出来たところで、本日は、以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ