使用 DynamicModel 问题预填充 checkboxList
Pre-population of checkboxList with DynamicModel issue
我创建了一个 DynamicModel 来构建一个搜索表单,其中包含一个复选框列表,其中的项目由模型的记录填充。该表单工作正常,但是该表单出现在结果页面上,并且所有字段都填充了先前选择的值,除了 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 绑定到模型中?关于为什么未在表单提交中预先填充所选复选框的任何想法?
首先是视图表单域出错,变量名错误,应该是
<?= $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,
在这里你会得到填充的复选框
我创建了一个 DynamicModel 来构建一个搜索表单,其中包含一个复选框列表,其中的项目由模型的记录填充。该表单工作正常,但是该表单出现在结果页面上,并且所有字段都填充了先前选择的值,除了 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 绑定到模型中?关于为什么未在表单提交中预先填充所选复选框的任何想法?
首先是视图表单域出错,变量名错误,应该是
<?= $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,
在这里你会得到填充的复选框