HOME>WEBプログラム覚書>[PHP]CakePHPのcheckboxとhasAndBelongsToMany(HABTM)

[PHP]CakePHPのcheckboxとhasAndBelongsToMany(HABTM)

CakePHPのcheckboxとhasAndBelongsToMany(HABTM)は僕のスペックだと軽くハマれるわ。

チェックボックスを表示

Model::find('list', array('Model.id', 'Model.name'))って感じで 取得したデータをチェックボックスで表示したかったんだけど いまいち情報が不足。

真っ先に思いつくForm::checkbox()は、単純に1つだけとかforeachでまわすときに使うものっぽい。 上記のようなリストを引数に自動生成するにはForm::input()を利用する。 マニュアルにはさらって書いてあるから見逃してました。

select を出力するにあたり「multiple」が true にセットしてあった場合、その select の入力は複数選択が許可されます。「multiple」の代わりに「checkbox」を指定することで、関連したチェックボックスのリストを出力することができます。select を出力するにあたり「multiple」が true にセットしてあった場合、その select の入力は複数選択が許可されます。「multiple」の代わりに「checkbox」を指定することで、関連したチェックボックスのリストを出力することができます。

フォーム要素の自動生成 :: フォーム :: 主要なヘルパー :: マニュアル :: 1.2 Collection :: The Cookbook

typeはselectのままでmultipleをcheckboxにするという予想外の設定方法。

PHP

  1. <?php
  2. echo $form->input('Tag', array(
  3.                                 'type' => 'select',
  4.                                 'multiple' => 'checkbox',
  5.                                 'options' => $tags,//Model::find('list', array('Model.id', 'Model.name'))で取得したデータ
  6.                                 'selected' => $checked //array(1, 3, 5, 7, 9)
  7.                                 ));
  8. ?>

こんな感じでOK。

関連モデルのデータ (HABTM) を保存する

checkboxを使う場合ってhasAndBelongsToMany(HABTM)が設定されてることが多い。 まとめて保存するにはModel::saveAll()を利用する。

App/models/post.php

post_idとtag_idをもつpost_tagsテーブルをつくって投稿とタグにHABTMを設定する。

PHP

  1. <?php
  2. class Post extends AppModel
  3. {
  4.     var $hasAndBelongsToMany = array(
  5.         'Tag' => array(
  6.             'className' => 'Tag',
  7.             'joinTable' => 'post_tags',
  8.             'foreignKey' => 'post_id',
  9.             'associationForeignKey' => 'tag_id',
  10.             'fields' => array('Tag.id', 'Tag.name'),
  11.             )
  12.     );
  13. }
  14. ?>

App/views/posts/add.php

新規投稿画面。

PHP

  1. <?php
  2. echo $form->create();
  3. echo $form->input('name');
  4. echo $form->input('Tag', array(
  5.                                 'type' => 'select',
  6.                                 'multiple' => 'checkbox',
  7.                                 'options' => $tags,//Tag::find('list', array('Tag.id', 'Tag.name'))で取得したデータ
  8.                                 'selected' => $checked //array(1, 3, 5, 7, 9)
  9.                                 ));
  10. echo $form->end('追加');
  11. ?>

App/controllers/posts_controller.php

PHP

  1. <?php
  2. function add()
  3. {
  4.     $this->Production->saveAll($this->data);
  5. }
  6. ?>

このときの$this->dataの中身は下記のようになっている。

PHP

  1. <?php
  2. array(
  3.      'Production' => array(
  4.                           'name' => '投稿テスト'
  5.                           ),
  6.  
  7.      'Tag'        => array(
  8.                           'Tag' => array(
  9.                                            0 => '1',
  10.                                            1 => '5',
  11.                                            2 => '7'
  12.                                            )
  13.                            )
  14. );
  15. ?>

一応ちゃんと保存されているのでこの形式でsaveAll()すればよいと思うんだけど array[Tag][Tag][]って形式がなんか釈然としない・・・ほんとにあってるのか不安w

2009/12/18現在マニュアルには違うカテゴリの内容が表示されてます・・・

投稿日 2009年12月18日 02:22
カテゴリ PHP
タグ CakePHP | サンプルコード | フレームワーク
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1193

コメント

コメントする
Name
Email Address
URL