Задать вопрос
@Belka2007

Как в Yii2 при редактирование модели запретить перезапись полей которые отсутствуют в форме?

Для примера возьмем, что в таблице "Товары" 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.: В реальности в таблицах много полей, которым нужно разрешить заполнение и много тех, которым нужно запретить перезапись.
  • Вопрос задан
  • 683 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Я бы обратил своё внимание на "сценарии".
Один сценарий для создания новой записи, второй для редактирования существующей.
Соответствующие правила валидации для каждого сценария.
https://www.yiiframework.com/doc/guide/2.0/ru/stru...

p.s.
Если просто создать форму с 2 полями field_3, field_4, то злоумышленник зная какие еще есть поля, может отправить и поля field_1, field_2 и они перезапишутся.

А как же RBAC?

P.S.S
Не имеет смысла и может привести к ошибкам валидации.
if (******** && $form->validate()) {
    ******
    if ($model->save(true)) {
        *****
    }
}

Тем более, что валидация в методе save() включена по умолчанию.
public boolean save ( $runValidation = true, $attributeNames = null )
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Если просто создать форму с 2 полями field_3, field_4, то злоумышленник зная какие еще есть поля, может отправить и поля field_1, field_2 и они перезапишутся.

По идее у Вас для каждой формы будет или своя модель или сценарии, которые сформируют кастомные правила валидации. Если это форма добавления товара, которую заполняет пользователь, то разумно сделать обычную модель, которая унаследована от Model, а не от ActiveRecods
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы