请原谅,如果这个问题已经在StackExchange上了,但我没有发现它不在Stack上,而不是在Google中。
从一个角度来看,问题很简单:我需要在Yii框架上实现表格输入。如果我不想在数据库表中添加多行,那没有问题。例如:
WorkController :: actionBatchCreate()。 Source: Yii - multiple records in one form submission
public function actionBatchCreate()
{
$models=array();
// since you know how many models
$i=0;
while($i < 5)
{
$models[]=Work::model();
$i++;
// you can also allocate memory for the model with `new Modelname` instead
// of assigning the static model
}
if (isset($_POST['Work']))
{
$valid=true;
foreach ($_POST['Work'] as $j=>$model)
{
if (isset($_POST['Work'][$j]))
{
$models[$j]=new Work; // 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('work/admin'));
}
}
$this->render('batchcreate',array('models'=>$models));
}
查看:batchcreate.php。 Source: Collecting Tabular Input
<div class="form">
<?php echo CHtml::beginForm(); ?>
<table>
<tr>
<th>Name</th>
<th>Measure</th>
<th>Count</th>
<th>Work</th>
<th>Mat</th>
<th>Mech</th>
</tr>
<?php foreach($models as $m=>$model): ?>
<tr>
<td><?php echo CHtml::activeTextField($model,"[$m]work_name"); ?></td>
<td><?php echo CHtml::activeTextField($model,"[$m]measure"); ?></td>
<td><?php echo CHtml::activeTextField($model,"[$m]count"); ?></td>
<td><?php echo CHtml::activeTextField($model,"[$m]work",array('size'=>8)); ?></td>
<td><?php echo CHtml::activeTextField($model,"[$m]material",array('size'=>8)); ?></td>
<td><?php echo CHtml::activeTextField($model,"[$m]mechanisms",array('size'=>8)); ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php echo CHtml::submitButton('Save'); ?>
<?php echo CHtml::endForm(); ?>
如actionBatchCreate()
中所示 - 它将创建5个模型工作(形式为5行)。如果我只需要在数据库中添加5条记录,那么它将完美无缺,而不是更少或更多。但如果我想增加更多 - 问题就开始了。由于$valid
变量,它不会保存空行,因此如果它们为空,它们将突出显示。如果我删除验证 - 它会将空记录添加到数据库中。
在我看来,第二个循环必须要做的事情:while(isset($models[$i]))
,必须添加另一个条件。例如:检查某些字段在表单中是否为空,如果为true - 忽略它,但我不知道如何从模型中获取值,因为我是Yii的新用户。
Halp,pl0x。
UPD :
我试图实现这个功能。我将$valid
变量更改为array()
,因此其成员将对应于每个模型:
public function actionBatchCreate()
{
$models=array();
$valid=array();
// since you know how many models
$i=0;
while($i < 5)
{
$models[]=Work::model();
$valid[$i]=0; // all false
$i++;
// you can also allocate memory for the model with `new Modelname` instead
// of assigning the static model
}
if (isset($_POST['Work']))
{
foreach ($_POST['Work'] as $j=>$model)
{
if (isset($_POST['Work'][$j]))
{
$models[$j]=new Work; // if you had static model only
$models[$j]->attributes=$model;
if($models[$j]->validate()===true)
{
$valid[$j]=1; // true
}
}
}
$i=0;
while(isset($models[$i]))
{
if($valid[$i]===1) // if valid[i] true, then save
{
$models[$i]->save();// models have already been validated
}
$i++;
}
// anything else that you want to do, for example a redirect to admin page
$this->redirect(array('work/admin'));
}
$this->render('batchcreate',array('models'=>$models));
}
结果它不会保存任何内容,只需跳转到$this->redirect(array('work/admin'));
行。
答案 0 :(得分:0)
作为一种快速解决方案,我可以提出下一种简单的表单数据处理方法:
if (isset($_POST['Work']))
{
foreach ($_POST['Work'] as $j => $model)
{
if (isset($_POST['Work'][$j]))
{
$models[$j] = new Work();
$models[$j]->attributes = $model;
$models[$j]->save();
}
}
}
请注意,我删除了if ($valid) {}
部分以及所有其他相关内容。这是因为$model->save()
实际上执行了数据验证,在您的情况下,您不需要单独的验证和保存过程。
答案 1 :(得分:0)
使用multimodelform扩展程序找到了解决方案。