使用DynamicModel问题预先填充checkboxList

时间:2016-02-10 11:02:57

标签: yii2 checkboxlist

我创建了一个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?关于为什么所选复选框未在表单提交中预先填充的任何想法?

1 个答案:

答案 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,

在这里,您将获得填充复选框