KANTENNA.COM

Solarized

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現在マニュアルには違うカテゴリの内容が表示されてます・・・

Pocket詳解 CakePHP辞典
作者:滝下 真玄 | 価格:¥ 2,730

トラックバック(0)

コメント

コメントする
Name
Email Address
URL
TIME LINE
2012
02.10

[雑記]縦横がランダムな要素を隙間なく並べるのは無理なのか。

サイトマップ作ったんだけど、やりたかったことが出来なかった。

2012
02.08

[Ubuntu11.10]Winows XPユーザーがUbuntuを使ってみて

Windows XPとUbuntuのデュアルブート環境にしてみておもったこと。

2012
02.03

[jQuery]closest()とparents()

今から16年前Netscapeブラウザのソースコードの公開方法の会議の中で、初めてオープンソースという言葉が使われた今日、 みなさんいかがお過ごしでしょうか。

今回の投稿はそれとは関係のないjQueryのparents()とclosest()が 似てたので何が違うのか試した時のメモです。

2012
02.01

[jQuery Mobile]初期化イベントメモ

jQuery Mobileは読み込まれてから

mobileinit -> pagebeforecreate -> pagecreate -> pageinit

の順番でイベントが発生する。

2012
02.01

[WordPress]管理画面のフッタのフィルタとアクション。

時間も時間なので、あまり使用頻度の高くない微妙なネタを。

会員制サイトなどで不特定多数の人にログインさせる場合、フッタのバージョン情報は隠しておきたかったり、 こじゃれたメッセージを表示したいときとか使うアクションとフィルタ。

2012
01.28

[WordPress] ブログの情報を取得する方法とノーキャッシュ疑惑

ブログのget_bloginfo()で取れないデータが必要な場合に使うもの。

2012
01.26

[jQuery Mobile]ダイアログ

jQuery Mobileにおけるダイアログの扱いはウインドウではなくページ。 なので通常のページと同様に扱える。ダイアログウインドウを出す。じゃなくダイアログページに遷移する。的な。

2012
01.25

[Ubuntu11.10]Ubuntuのインストール後の設定

インストール完了後の環境構築。PC起動時いちいちBIOSからブートドライブ選んで ブートするのかと思ってたら起動時にOS選択画面が出てくる。

すばらしいですね。

2012
01.24