Для примера возьмем, что в таблице "Товары" 4 поля:
field_1, field_2, field_3, field_4
.
При добавления нового товара (например в админке) они все присутствуют в форме и все сохраняются при отправке формы.
А в общедоступной части сайта доступно редактирование товара, но только 2 поля
field_3, field_4
.
Если просто создать форму с 2 полями
field_3, field_4
, то злоумышленник зная какие еще есть поля, может отправить и поля
field_1, field_2
и они перезапишутся.
Как вариант сохранять изначальное состояние модели во временную переменную и потом явно перезаписывать поля которые не должны быть изменены из формы:
$model = $this->findModel($id);
$temp = clone $model;
if ($model->load(Yii::$app->request->post())) {
$model->field_1 = $temp->field_1;
$model->field_2 = $temp->field_2;
if ($model->save()) {
return $this->redirect('test');
}
}
Или создать отдельную модель для формы:
$form = new ProductUpdateForm;
if ($form->load(Yii::$app->request->post()) && $form->validate()) {
$model = $this->findModel($id);
$model->field_3 = $form->field_3;
$model->field_4 = $form->field_4;
if ($model->save(false)) {
return $this->redirect('test');
}
}
Но как-то это все не по феншую... может есть какой более правильный/лаконичный способ, через сценарии или еще как?
P.S.: В реальности в таблицах много полей, которым нужно разрешить заполнение и много тех, которым нужно запретить перезапись.