За последние 24 часа нас посетили 22662 программиста и 1282 робота. Сейчас ищут 819 программистов ...

Не работает сохранение данных из формы

Тема в разделе "Yii", создана пользователем justquestion, 26 авг 2016.

  1. justquestion

    justquestion Новичок

    С нами с:
    17 янв 2014
    Сообщения:
    6
    Симпатии:
    0
    Приветствую. Делаю редактирование профиля пользователя, не работает сохранение. Опытным путем выяснил, что не работает считывание полей формы в свойства модели ($model->load(Yii::$app->request->post())). Прошу помочь выяснить почему. Итак, привожу код:

    (все use и namespace не привожу - они на месте, оставляю только суть)

    UserController.php (контроллер)
    Код (PHP):
    1.   public function actionProfile()
    2.   {
    3.     $model = new ProfileForm(); // создаем объект модели с формой ProfileForm
    4.  
    5.     if ($model->load(Yii::$app->request->post())) { // вот тут условие проходит, но функция не срабатывает - $model не содержит полей из формы
    6.  
    7.       if ($user = $model->update()) {
    8.  
    9.         return $this->redirect('/user/profile');
    10.       }
    11.     }
    12.  
    13.     return $this->render('profile', [
    14.       'model' => $model
    15.     ]);
    16.   }
    ProfileForm.php (модель формы)
    Код (PHP):
    1. class ProfileForm extends Model
    2. {
    3.   public $username;
    4.   public $email;
    5.   public $firstname;
    6.   public $middlename;
    7.   public $lastname;
    8.  
    9.   public function update()
    10.   {
    11.     $user = \Yii::$app->user->identity;
    12.  
    13.     $user->country = $this->username;
    14.     $user->country = $this->email;
    15.     $user->firstname = $this->firstname;
    16.     $user->middlename = $this->middlename;
    17.     $user->lastname = $this->lastname;
    18.  
    19.     return $user->save() ? $user : null;
    20.   }
    21. }
    profile.php (view формы профиля)
    Код (PHP):
    1. $user = \Yii::$app->user->identity;
    2.  
    3. <?php $form = ActiveForm::begin(['id' => 'form-signup']); ?>
    4. <?= $form->field($model, 'username')->label('Имя пользователя')->textInput(['value' => $user->username, 'readonly' => true]) ?>
    5. <?= $form->field($model, 'email')->label('Ваш e-mail')->textInput(['value'=>$user->email, 'readonly' => true]) ?>
    6. <?= $form->field($model, 'firstname')->label('Имя')->textInput(['value'=>$user->firstname]) ?>
    7. <?= $form->field($model, 'middlename')->label('Отчество')->textInput(['value'=>$user->middlename]) ?>
    8. <?= $form->field($model, 'lastname')->label('Фамилия')->textInput(['value'=>$user->lastname]) ?>
    9.  
    10. <?= Html::submitButton('Сохранить', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
    11. <?php ActiveForm::end(); ?>
    Объект \Yii:$app->user->identity реализуется в модели Users. Тут ничего интересного (привожу на всякий случай):

    Код (PHP):
    1. <?php
    2.  
    3. namespace frontend\models;
    4.  
    5. use yii\db\ActiveRecord;
    6. use yii\web\IdentityInterface;
    7.  
    8. class Users extends ActiveRecord implements IdentityInterface
    9. {
    10.  
    11.   public static function tableName() {
    12.     return 'users';
    13.   }
    14.  
    15.   public function setPassword($password) {
    16.     $this->password_hash = md5($password);
    17.   }
    18.  
    19.   public function validatePassword($password) {
    20.     return $this->password_hash === md5($password);
    21.   }
    22.  
    23.   public static function findIdentity($id) {
    24.     return self::findOne($id);
    25.   }
    26.  
    27.   public function getId() {
    28.     return $this->id;
    29.   }
    30.  
    31.   public static function findIdentityByAccessToken($token, $type = null) {
    32.   }
    33.  
    34.   public function getAuthKey() {
    35.   }
    36.  
    37.   public function validateAuthKey($authKey) {
    38.   }
    39. }
    Итак, опытным путем выяснил, что проблема в контролере (в самом начале):
    Код (PHP):
    1. if ($model->load(Yii::$app->request->post())) {
    условие срабатывает. Но насколько я понимаю, функция $model = load($post_data) должна считать элементы массива $post_data и заполнить их в массиве $model при условии что у обоих элементов одинаковые индексы.

    То есть было:

    Код (PHP):
    1. $model [
    2. ['username' => 'тут старые данные из базы'],
    3. ['email' => 'тут старые данные из базы'],
    4. ['firstname' => 'тут старые данные из базы'],
    5. ['middlename' => 'тут старые данные из базы'],
    6. ['lastname' => 'тут старые данные из базы'],
    7. ]
    8.  
    9. Yii::$app->request->post() [
    10. ['username' => 'тут новые данные из формы'],
    11. ['email' => 'тут новые данные из формы'],
    12. ['firstname' => 'тут новые данные из формы'],
    13. ['middlename' => 'тут новые данные из формы'],
    14. ['lastname' => 'тут новые данные из формы'],
    15. ]
    После if ($model->load(Yii::$app->request->post())) {
    должно стать:

    Код (PHP):
    1. [code=php]$model [
    2. ['username' => 'тут новые данные из формы'],
    3. ['email' => 'тут новые данные из формы'],
    4. ['firstname' => 'тут новые данные из формы'],
    5. ['middlename' => 'тут новые данные из формы'],
    6. ['lastname' => 'тут новые данные из формы'],
    7. ]
    Но данные $model не обновляются. Я долго искал примеры использования функции load(), и как мне кажется, понял правильно как она работает. Но почему тогда не происходит сохранения? При создании нового пользователя я делал так же и все работало, а при редактировании не работает. Прошу помочь. Заранее спасибо.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Model::load заменяет только те поля, для которых заданы правила. Если особых правил не требуется, надо хотя бы правило safe в модели указать.
     
  3. justquestion

    justquestion Новичок

    С нами с:
    17 янв 2014
    Сообщения:
    6
    Симпатии:
    0
    Вот это новость. Сколько статей и примеров прочитал, нигде не говорилось про какие-то дополнительные правила.
    Не могли бы вы привести пример того, о чем вы говорите? Что конкретно нужно сделать, чтобы заменялись поля в моей форме?
    Заранее спасибо.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв