mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-12 02:56:55 +01:00
63 lines
2.8 KiB
Plaintext
63 lines
2.8 KiB
Plaintext
表形式入力の収集
|
|
========================
|
|
|
|
ときとして、ユーザの入力をバッチモードで集めたいと思う事があります。
|
|
すなわち、ユーザは複数のモデルインスタンスの情報を入力でき、それらを一度にまとめて送信できる、という方式です。
|
|
こういった場合の入力フィールドは HTML テーブルで提供される事が多いので、ここではこれを **表形式力** (tabular input) と呼びます。
|
|
|
|
表形式入力では、まず初めに、データを挿入するか更新するかに従って、モデルインスタンスの配列を新規に作成またはデータベースから読み出します。
|
|
次に、ユーザの入力したデータを `$_POST` 変数から収集して、各モデルへ割り当てます。
|
|
単一のモデルの場合とのわずかな違いは、入力データの収集のために、`$_POST['ModelClass']` ではなく `$_POST['ModelClass'][$i]` を用いる点です。
|
|
|
|
~~~
|
|
[php]
|
|
public function actionBatchUpdate()
|
|
{
|
|
// 一括で更新をするために複数のアイテムを収集します。
|
|
// 各アイテムは 'Item' モデルクラス だと仮定します。
|
|
$items=$this->getItemsToUpdate();
|
|
if(isset($_POST['Item']))
|
|
{
|
|
$valid=true;
|
|
foreach($items as $i=>$item)
|
|
{
|
|
if(isset($_POST['Item'][$i]))
|
|
$item->attributes=$_POST['Item'][$i];
|
|
$valid=$item->validate() && $valid;
|
|
}
|
|
if($valid) // 全てのアイテムが検証を通ったら
|
|
// 何かをする …
|
|
}
|
|
// 表形式入力を収集するためのビューを表示
|
|
$this->render('batchUpdate',array('items'=>$items));
|
|
}
|
|
~~~
|
|
|
|
アクションが準備できたので、HTML テーブルとして入力フィールドを表示するための `batchUpdate` ビューの作成に取り掛かる必要があります。
|
|
|
|
~~~
|
|
[php]
|
|
<div class="form">
|
|
<?php echo CHtml::beginForm(); ?>
|
|
<table>
|
|
<tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr>
|
|
<?php foreach($items as $i=>$item): ?>
|
|
<tr>
|
|
<td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
|
|
<td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>
|
|
<td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>
|
|
<td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</table>
|
|
|
|
<?php echo CHtml::submitButton('Save'); ?>
|
|
<?php echo CHtml::endForm(); ?>
|
|
</div><!-- form -->
|
|
~~~
|
|
|
|
上記では、[CHtml::activeTextField] がコールされた際の二番目のパラメータとして、`"name"` の代わりに `"[$i]name"` を使用している事に注意してください。
|
|
|
|
もし何か検証にエラーがある場合は、単一モデルでの入力の際に述べたのと同様に、対応する入力フィールドが自動的にハイライトされます。
|
|
|
|
<div class="revision">$Id$</div> |