使用 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,

在这里你会得到填充的复选框