Есть форма. С нее данные отправляются в объект $UserProfile. Далее делаю функцию:
public function actionProfile($UserProfile=null)
{
$UserProfile = new UserprofileForm();
if ($UserProfile->load(Yii::$app->request->post())) //отправлен post запрос
{
if ($UserProfile->validate()) //данные проходят валидацию
{
if ((Yii::$app->user->identity->roles)!=='Admin'){
Yii::$app->session->setFlash('warning', 'У вас нет прав редактировать информацию. Доступна только смена пароля.');
}
else{
Yii::$app->session->setFlash('success', 'Данные записаны');
$fios=$UserProfile['fio'];
$model = UserprofileForm::find()->where(['id' => 1])->one();
$model->fio = $UserProfile['fio'];
$model->save();
}
}
else
{
Yii::$app->session->setFlash('error', 'Даные не прошли валидацию...');
}
}
$this->view->title = 'Профиль пользователя';
return $this->render('profile', compact('UserProfile'));
}
В таком случае, данные в методе save() не сохраняются и не обновляются. А точнее вообще не обрабатываются. Запрос find() проходит, а апдейт нет. Если сделать так:
$connection = Yii::$app->db;
$connection->createCommand()->update('user', ['fio' => $UserProfile['fio']], 'id = '.Yii::$app->user->identity->id.'')->execute();
return $this->refresh();
Запрос удачно отрабатывает. НО в yii2-отладчике, данный запрос не фиксируется, что не удобно для отладки. А если делать сразу save(), то он пытается обновить все поля, что пришли из формы, но этого мне не нужно. В форму пришло 3 поля, а обновить я хочу 2, например. Вопрос: Почему не отрабатывает запрос с первом случае, и как делать апдейт выборочных стобцов? т.к. названия полей в форме и названия столбцов в БД я делаю разные.
Для сохранения разного количества полей из формы необходимо использовать сценарии. Для каждого сценария описываем необходимые поля, которые надо сохранить. В экшене уже по условию переключаем сценарий у модели. Если в сценарии указано всего два поля, этот сценарий активен и для этих полей есть правила, эти поля будут провалидированы и сохранены.
Вероятно, это условие выгоднее описать в бихевиоре AccessControl
if ((Yii::$app->user->identity->roles)!=='Admin'){
Yii::$app->session->setFlash('warning', 'У вас нет прав редактировать информацию. Доступна только смена пароля.');
}
Если поля формы и модели отличаются, то нет необходимости грузить все данные из запроса в модель Yii::$app->request->post()
. Можно создать свой массив данных и по условию включать или исключать третье поле с данными. Тогда и сценарии не нужны. Но это плохая практика, при добавлении нового поля придется править и модель и экшен. А в экшене не должно быть упоминаний о полях модели.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Всем привет, слетела кодировка, почта была создана на хостинге pskz Помогите плиз
Как сделать условие если нету дочерных страниц выполнить другой запрос $args для того чтобь вывести соседные страницы а не дочерные
Необходимо сравнить 2 массива, и заменить элементы, которые присутствуют во 2-ом нулями