我创建了一个DynamicModel来构建一个搜索表单,其中包含一个checkboxList,其中的项目由模型的记录填充。表单工作正常,但表单显示在结果页面上,除了checkboxList之外,所有字段都填充了先前选择的值。
控制器:
$model = DynamicModel::validateData(
['date_from',
'date_to',
'client_site',
'report_types',
]);
$model->addRule(['client_site'], 'integer');
$model->addRule(['client_site', 'report_types'], 'required');
$model->addRule(['date_from','date_to'], 'string');
$model->load(Yii::$app->request->post()) && $model->validate();
$reportTypes = ArrayHelper::map(ReportType::find()->asArray()->all, 'id', 'name');
return $this->render('print-report-form', [
'report_types' => $reportTypes,
'model' => $model,
]);
查看:
<?= $form->field($model, 'report_types[]')
->inline(false)
->checkboxList($reportTypes);
?>
我是否需要以另一种方式在模型中绑定$ reportTypes?关于为什么所选复选框未在表单提交中预先填充的任何想法?
答案 0 :(得分:1)
首先,在视图表单字段中存在错误,变量名称错误,应该是
<?= $form->field($model, 'report_types[]')
->inline(false)
->checkboxList($report_types);
?>
然后在controller
$model = DynamicModel::validateData(
['date_from',
'date_to',
'client_site',
'report_types',
]);
$model->addRule(['client_site'], 'integer');
$model->addRule(['client_site', 'report_types'], 'required');
$model->addRule(['date_from','date_to'], 'string');
$posted_model = clone $model;
$reportTypes = ArrayHelper::map(ReportType::find()->asArray()->all, 'id', 'name');
if($posted_model->load(Yii::$app->request->post()) && $posted_model->validate())
{
// save data or do as per your requirement with $posted_model
// if nothing to be done, and just rendering back to form then
return $this->render('print-report-form', [
'report_types' => $reportTypes,
'model' => $model, // line X
]);
}
else
{
return $this->render('print-report-form', [
'report_types' => $reportTypes,
'model' => $model, // line X
]);
}
这种情况正在发生,因为当视图第一次渲染时,所有复选框都是空的,但是当提交表单时,模型会填充POSTed数据,即所有属性都已设置,然后总是渲染POSTed模型,即模型充满了数据。
现在,在上述情况下,您没有呈现POSTed模型,您总是呈现空的新模型。
这是您需要空复选框的情况。
第二种情况:
如果您需要预先填充复选框,那么
删除表单字段中的[]
<?= $form->field($model, 'report_types')
->inline(false)
->checkboxList($report_types);
?>
并替换第X行
'model' => $posted_model,
在这里,您将获得填充复选框