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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
belka2007
Сообщения: 12
Зарегистрирован: 2012.11.01, 22:01

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

Сообщение belka2007 »

Для примера возьмем, что в таблице "Товары" 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 = $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.: В реальности в таблицах много полей, которым нужно разрешить заполнение и много тех, которым нужно запретить перезапись.
Последний раз редактировалось belka2007 2018.11.05, 17:56, всего редактировалось 2 раза.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks »

Правильно это делать через сценарии или подобный механизм , когда безопасные атрибуты решают что загружать из вне в модель.
Yii2 universal module sceleton - for basic and advanced templates
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

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

Сообщение chesar »

Если можно избежать сценариев, лучше их не использовать. В вашем случае, две разные формы и для них следует использовать 2 разные модели.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

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

Сообщение proctoleha »

Для того, чтобы абстрагироваться от названий полей, как вариант, добавить в таблицу булево поле no_change, например, и перед сохранением, в beforeSave(), проверять роль пользователя, и если он не админ, и поле изменять нельзя, то значение этого поля равно значению из oldAttributes
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

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

Сообщение Alexum »

Простой пример того, о чём написал maleks:

Код: Выделить всё

// Можно для каждого атрибута указывать 'on' => ['сценарий1','сценарий2'], но ИНОГДА проще и нагляднее собрать разные массивы, тем более, что условия можно сделать сложнее, сценарии заменить на проверку ролей и т.п.
   public function rules()
    {
        $rules = [];
        $scenario = $this->getScenario();
        if ($scenario === 'сценарий1') {
            $rules = [
                ... один набор разрешённых к изменению атрибутов
            ];
        } elseif($scenario === 'сценарий2') {
            $rules = [
              ... другой набор разрешённых к изменению атрибутов
            ];
        }
        
	 ...тут можно общие для всех правила добавить 
	
        return $rules;
    }
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

Alexum писал(а): 2018.10.29, 11:18 но ИНОГДА проще и нагляднее собрать разные массивы
Массивы обычно проще указать в методе scenarios()
Ответить