デモとして、よくある profile テーブルを作りました。カラムは以下。sex カラムをラジオボタンで hobby カラムをチェックボックスで作ります。
id int(11) NOT NULL AUTO_INCREMENT
sex tinyint(1) NOT NULL
birth date NOT NULL
hobby varchar(255) NOT NULL
body text NOT NULL
まず、Gii で Profile モデルを作成後、中身を編集していきます。
rules()
とりえあず sex カラムは 0 か 1 なので CRangeValidator でいけたのですが、問題はhobby カラムです。チェックボックスなのでバリデーションを通すと配列が返ってくるので CRangeValidator は使えないと判断し、あと、各配列の値をちゃんとチェックしたいので、自作で checkHobby というバリデーションを作りました (バリデーションの自作は Create your own Validation Rule が参考になります) 。checkHobby()
これが hobby カラムで使うカスタムバリデーションです。何をやっているかというと、まず getHobbyOptions() の値を 「|」 で区切って正規表現で使うパターンを作ります。上記のコードの場合は '/^(買い物|スポーツ|旅行|インターネット|読書|映画鑑賞)$/u' みたいになる。そのあと、フォームから入力された hobby カラムの値を一つ一つパターンにマッチするかして、マッチしなければエラーメッセージを表示する、という流れです。getSexOptions(), getHobbyOptions()
これは、ビューで使うもの。beforeSave()
バリデーションでは、hobby カラムを一時的に配列から文字列に変換しただけなので、hobby カラムを含めたすべてのバリデーションが通れば、hobby カラムの値を配列から、文字列に変換して保存します。例えば、フォームで買い物、旅行、映画鑑賞がチェックされていれば '買い物, 旅行, 映画鑑賞' という文字列になり保存されます。次はコントローラ。
actionCreate()
$model->sex はフォームの sex カラムのデフォルト値を設定しています。これをしないと、ラジオボタンが未選択になってしまいます。actionUpdate()
$this->loadModel($id) は findByPk()でデータを1件取得しているものと思ってくださいそのあとの $model->hobby = explode(', ', $model->hobby); は、hobby カラムは文字列として保存したので、それをフォームのチェックボックスにしっかり適用できるように配列に変換しています。
save()
これは典型的なデータを保存するコードの流れです。actionCreate(), actionUpdate() ともに変わらないので、まとめています。最後にビュー。 ビューのコードを説明する前にまず css の話。css を自作していなければYiiにもともと入っている main.css, forms.css を使うかと思いますが、これがやや曲者です。ラジオボタンや、チェックボックスを CHtml ヘルパーで作ってみればわかるかと思いますが、ラベル、フォームやらがすべて縦に並ぶんですね...。以下のような感じです (Yii バージョン 1.1.10現在) 。
0 件のコメント:
コメントを投稿