我想验证并插入单个表单中的多个记录。
我尝试了以下解决方案,但它没有验证每条记录。 Yii - multiple records in one form submission
我在表单中使用了类似的内容:
<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>
在我的控制器中,我做过类似的事情:
public function actionBatchCreate() {
$models=array();
// since you know how many models
$i=0;
while($i<5) {
$models[]=Modelname::model();
// you can also allocate memory for the model with `new Modelname` instead
// of assigning the static model
}
if (isset($_POST['Modelname'])) {
$valid=true;
foreach ($_POST['Modelname'] as $j=>$model) {
if (isset($_POST['Modelname'][$j])) {
$models[$j]=new Modelname; // if you had static model only
$models[$j]->attributes=$model;
$valid=$models[$j]->validate() && $valid;
}
}
if ($valid) {
$i=0;
while (isset($models[$i])) {
$models[$i++]->save(false);// models have already been validated
}
// anything else that you want to do, for example a redirect to admin page
$this->redirect(array('modelname/admin'));
}
}
$this->render('batch-create-form',array('models'=>$models));
}
答案 0 :(得分:1)
<?php
public function actionBatchCreate()
{
$arrItems = array();
$valid = true;
if(isset($_POST['Modelname'])) {
foreach ($_POST['Modelname'] as $i => $notUsed)
{
$objItem = new Modelname();
$objItem->attributes=$_POST['Modelname'][$i];
$valid = $objItem->validate() && $valid;
$arrItems[] = $objItem;
}
if($valid) {
foreach ($arrItems as $objItemValidated) {
$objItemValidated->save();
}
$this->redirect(array('modelname/admin'));
}
}
// optional create a initial empty row in View
if(!count($arrItems)) {
$arrItems[] = new Modelname();
}
$this->render('batch-create-form',array('models'=>$arrItems));
}
View-File batch-create-form.php
<table>
<?php foreach($models 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>