2016-02-10 57 views
1

我創建了一個DynamicModel來構建一個包含checkboxList的搜索表單,其中的項目由模型的記錄填充。表單工作正常,但表單顯示在結果頁面上,並且所有字段都使用除checkboxList之外的先前選定的值填充。使用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在模型中的另一種方式?關於爲什麼選擇的複選框未在表單提交中預填充的任何想法?

回答

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 
    ]);   
} 

這是怎麼回事,因爲當觀點第一次渲染時,所有複選框都是空的,但是當提交表單時,模型會被POST數據填滿,即所有的屬性都被設置,然後總是渲染POST模型,即模型填充數據。

現在有了上面的情況,你不會渲染POST模型,你總是渲染空的新模型。

這是您需要空白複選框的情況。

第二種情況:

如果您需要複選框被隨後預填充 通過 'model' => $posted_model,

在這裏,在表單字段

<?= $form->field($model, 'report_types') 
    ->inline(false) 
    ->checkboxList($report_types); 
?> 

刪除[]和替換線X你會得到填充複選框

+1

非常感謝你的迴應。我可以通過從表單中的'report_types []'中刪除''''來解決它。從文件傳遞到文件時,變量名稱應該沒有關係。克隆模型也是不必要的,但我很感激。我很迷茫。謝謝 – Dubby