Приветствую. Делаю редактирование профиля пользователя, не работает сохранение. Опытным путем выяснил, что не работает считывание полей формы в свойства модели ($model->load(Yii::$app->request->post())). Прошу помочь выяснить почему. Итак, привожу код: (все use и namespace не привожу - они на месте, оставляю только суть) UserController.php (контроллер) Код (PHP): public function actionProfile() { $model = new ProfileForm(); // создаем объект модели с формой ProfileForm if ($model->load(Yii::$app->request->post())) { // вот тут условие проходит, но функция не срабатывает - $model не содержит полей из формы if ($user = $model->update()) { return $this->redirect('/user/profile'); } } return $this->render('profile', [ 'model' => $model ]); } ProfileForm.php (модель формы) Код (PHP): class ProfileForm extends Model { public $username; public $email; public $firstname; public $middlename; public $lastname; public function update() { $user = \Yii::$app->user->identity; $user->country = $this->username; $user->country = $this->email; $user->firstname = $this->firstname; $user->middlename = $this->middlename; $user->lastname = $this->lastname; return $user->save() ? $user : null; } } profile.php (view формы профиля) Код (PHP): $user = \Yii::$app->user->identity; <?php $form = ActiveForm::begin(['id' => 'form-signup']); ?> <?= $form->field($model, 'username')->label('Имя пользователя')->textInput(['value' => $user->username, 'readonly' => true]) ?> <?= $form->field($model, 'email')->label('Ваш e-mail')->textInput(['value'=>$user->email, 'readonly' => true]) ?> <?= $form->field($model, 'firstname')->label('Имя')->textInput(['value'=>$user->firstname]) ?> <?= $form->field($model, 'middlename')->label('Отчество')->textInput(['value'=>$user->middlename]) ?> <?= $form->field($model, 'lastname')->label('Фамилия')->textInput(['value'=>$user->lastname]) ?> <?= Html::submitButton('Сохранить', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?> <?php ActiveForm::end(); ?> Объект \Yii:$app->user->identity реализуется в модели Users. Тут ничего интересного (привожу на всякий случай): Код (PHP): <?php namespace frontend\models; use yii\db\ActiveRecord; use yii\web\IdentityInterface; class Users extends ActiveRecord implements IdentityInterface { public static function tableName() { return 'users'; } public function setPassword($password) { $this->password_hash = md5($password); } public function validatePassword($password) { return $this->password_hash === md5($password); } public static function findIdentity($id) { return self::findOne($id); } public function getId() { return $this->id; } public static function findIdentityByAccessToken($token, $type = null) { } public function getAuthKey() { } public function validateAuthKey($authKey) { } } Итак, опытным путем выяснил, что проблема в контролере (в самом начале): Код (PHP): if ($model->load(Yii::$app->request->post())) { условие срабатывает. Но насколько я понимаю, функция $model = load($post_data) должна считать элементы массива $post_data и заполнить их в массиве $model при условии что у обоих элементов одинаковые индексы. То есть было: Код (PHP): $model [ ['username' => 'тут старые данные из базы'], ['email' => 'тут старые данные из базы'], ['firstname' => 'тут старые данные из базы'], ['middlename' => 'тут старые данные из базы'], ['lastname' => 'тут старые данные из базы'], ] Yii::$app->request->post() [ ['username' => 'тут новые данные из формы'], ['email' => 'тут новые данные из формы'], ['firstname' => 'тут новые данные из формы'], ['middlename' => 'тут новые данные из формы'], ['lastname' => 'тут новые данные из формы'], ] После if ($model->load(Yii::$app->request->post())) { должно стать: Код (PHP): [code=php]$model [ ['username' => 'тут новые данные из формы'], ['email' => 'тут новые данные из формы'], ['firstname' => 'тут новые данные из формы'], ['middlename' => 'тут новые данные из формы'], ['lastname' => 'тут новые данные из формы'], ] Но данные $model не обновляются. Я долго искал примеры использования функции load(), и как мне кажется, понял правильно как она работает. Но почему тогда не происходит сохранения? При создании нового пользователя я делал так же и все работало, а при редактировании не работает. Прошу помочь. Заранее спасибо.
Model::load заменяет только те поля, для которых заданы правила. Если особых правил не требуется, надо хотя бы правило safe в модели указать.
Вот это новость. Сколько статей и примеров прочитал, нигде не говорилось про какие-то дополнительные правила. Не могли бы вы привести пример того, о чем вы говорите? Что конкретно нужно сделать, чтобы заменялись поля в моей форме? Заранее спасибо.