Почему не сохраняется запись после того как пользователь настроил свой аккаунт?

Приветствую, на сайте есть аккаунт пользователей, его можно настраивать.. А именно менять и добавлять имя, фамилию, страну, номер телефона, пол и дату рождения. Но после того как пользователь прописал всё что ему нужно, в аккаунте не сохранились его настройки, и не выходит надпись 'Настройки успешно сохранены', в базе данных тоже не сохранились.. Что-то я видимо в коде упустила.. Помогите пожалуйста..

Вот скриншот настроек, что именно я хочу..
5c4c0f628d96a618190231.png

Вот структура моей базы данных:
5c4c0f8a7556c848479737.png

В этом контроллере подключены настройки, которые по идее должны были сохраняться на странице "profile":

ProfileController.php:

<?php

namespace app\controllers\user;

use app\components\Controller;
use app\helpers\UserSettingHelper;
use app\models\User;
use yii\data\Pagination;
use yii\helpers\ArrayHelper;
use yii\web\NotFoundHttpException;

class ProfileController extends Controller
{
    public function actionIndex()
    {
        $this->layout = 'page';
        $vars = [];

        $user = User::find()->where(['username' => $_GET['username']])->one();
        if ($user === null)
            throw new NotFoundHttpException();

        $setting = UserSettingHelper::get($user);

        $vars = ArrayHelper::merge($vars, [
            'user' => $user,
            'setting' => $setting,
        ]);

        return $this->render('index', $vars);
    }
}


Далее идёт страница сохранения настроек SettingController.php:

<?php

namespace app\controllers\user;

use app\components\Controller;
use app\helpers\UserSettingHelper;
use app\models\forms\SettingPageSaveForm;
use app\models\forms\SettingSecuritySaveForm;
use yii\filters\AccessControl;

class SettingController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        $this->layout = 'page';

        $setting = UserSettingHelper::get(\Yii::$app->user->identity);

        $page = new SettingPageSaveForm();
        $page->setAttributes($setting->attributes, true);
        if ($page->load(\Yii::$app->request->post())) {
            $page->saveSettings(\Yii::$app->user->identity);
        }

        $security = new SettingSecuritySaveForm();
        $security->setAttributes($setting->attributes, true);
        if ($security->load(\Yii::$app->request->post())) {
            $security->saveSettings(\Yii::$app->user->identity);
        }

        return $this->render('index', [
            'page' => $page,
            'security' => $security,
            'setting' => $setting,
        ]);
    }
}


Далее подключение компонентов UserSettingHelper.php:

<?php

namespace app\helpers;

use app\models\User;
use app\models\UserSetting;
use yii\helpers\Html;

class UserSettingHelper
{
    public static function get(User $user)
    {
        return UserSetting::find()->where([
            'user_id' => $user->id,
        ])->one();
    }

    public static function getAvatar(UserSetting $setting)
    {
        return $setting->avatar == '' ? '/images/page-avatar.png' : '/uploads/' . $setting->avatar;
    }

    public static function getFirstname(UserSetting $setting)
    {
        return Html::encode($setting->firstname);
    }

    public static function getName(UserSetting $setting)
    {
        return Html::encode($setting->name);
    }

    public static function getPhone(UserSetting $setting)
    {
        return Html::encode($setting->phone);
    }

}


Модель сохранения настроек SettingPageSaveForm.php

<?php
namespace app\models\forms;

use app\models\User;
use app\models\UserSetting;

class SettingPageSaveForm extends UserSetting
{
    public function scenarios()
    {
        return [
            self::SCENARIO_DEFAULT => ['name', 'firstname', 'country', 'phone', 'gender', 'birth_day', 'birth_month', 'birth_year']
        ];
    }

    public function saveSettings(User $user)
    {
        if (!$this->validate()) {
            \Yii::$app->getSession()->setFlash('warning', implode('<br />', $this->getFirstErrors()));
            return false;
        }

        $setting = UserSetting::find()->where([
            'user_id' => $user->id,
        ])->one();

        $setting->setAttributes([
            'name' => $this->name,
            'firstname' => $this->firstname,
            'country' => $this->country,
            'phone' => $this->phone,
            'gender' => $this->gender,
            'birth_day' => $this->birth_day,
            'birth_month' => $this->birth_month,
            'birth_year' => $this->birth_year
        ]);
        
        $setting->update(false);
        \Yii::$app->getSession()->setFlash('success', \Yii::t('app', 'Настройки успешно сохранены'));
    }
}


А вот и сам UserSetting.php, где прописаны се настройки:

<?php
namespace app\models;

use yii\db\ActiveRecord;

class UserSetting extends ActiveRecord
{
    const AUTH_CONFIRM_DISABLED = 0;
    const AUTH_CONFIRM_ENABLED = 1;

    const GENDER_UNKNOWN = 0;
    const GENDER_MALE = 1;
    const GENDER_FEMALE = 2;

    const COUNTRY_ABHAZIYA = 0;
    const COUNTRY_AVSTRALIYA = 1;

    public static function tableName()
    {
        return '{{%user_setting}}';
    }

    public function rules()
    {
        return [
            ['user_id', 'integer'],
            ['auth_confirm', 'in', 'range' => [self::AUTH_CONFIRM_ENABLED, self::AUTH_CONFIRM_DISABLED]],
            ['name', 'string', 'length' => [0, 255]],
            ['firstname', 'string', 'length' => [0, 255]],
            ['phone', 'match', 'pattern' => '/^\+7\s\([0-9]{3}\)\s[0-9]{3}\-[0-9]{2}\-[0-9]{2}$/', 'message' => ' Что-то не так'],
            ['gender', 'in', 'range' => array_keys(self::getGenderArray())],

            [['birth_day', 'birth_month', 'birth_year', 'country'], 'integer'],
            ['birth_day', 'in', 'range' => array_keys(self::getBirthDayArray())],
            ['birth_month', 'in', 'range' => array_keys(self::getBirthMonthArray())],
            ['birth_year', 'in', 'range' => array_keys(self::getBirthYearArray())],
            ['country', 'in', 'range' => array_keys(self::getCountryArray())],
            ['friends_limit', 'integer'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'user_id' => 'ID',
            'name' => \Yii::t('app', 'Имя'),
            'firstname' => \Yii::t('app', 'Фамилия'),
            'country' => \Yii::t('app', 'Страна'),
            'phone' => \Yii::t('app', 'Номер телефона'),
            'auth_confirm' => \Yii::t('app', 'Подтверждение авторизации'),
            'avatar' => \Yii::t('app', 'Аватар'),
            'status' => \Yii::t('app', 'Статус'),
            'info' => \Yii::t('app', 'Информация'),
        ];
    }

    public function getUser()
    {
        return $this->hasOne(User::className(), ['id' => 'user_id']);
    }

    public function getCountryString()
    {
        $countries = self::getCountryArray();
        return isset($countries[$this->country]) ? $countries[$this->country] : '';
    }

    public function getCountryArray()
    {
        return [
        self::COUNTRY_ABHAZIYA => \Yii::t('app', 'Абхазия'),
        self::COUNTRY_AVSTRALIYA => \Yii::t('app', 'Автралия'),
        ];
    }

    public function getGenderString()
    {
        $genders = self::getGenderArray();
        return isset($genders[$this->gender]) ? $genders[$this->gender] : '';
    }

    public static function getGenderArray()
    {
        return [
            self::GENDER_UNKNOWN => \Yii::t('app', ''),
            self::GENDER_MALE => \Yii::t('app', 'мужской'),
            self::GENDER_FEMALE => \Yii::t('app', 'женский'),
        ];
    }

    public static function getBirthYearArray()
    {
        $array = [
            '0' => ''
        ];
        for ($i = 1901; $i < 2004; $i++) {
            $array[$i] = $i;
        }
        return $array;
    }

    public static function getBirthDayArray()
    {
        $array = [
            '0' => ''
        ];
        for ($i = 1; $i <= 31; $i++) {
            $array[$i] = $i;
        }
        return $array;
    }

    public static function getBirthMonthArray()
    {
        return [
            0 => '',
            1 => \Yii::t('app', 'января'),
            2 => \Yii::t('app', 'февраля'),
            3 => \Yii::t('app', 'марта'),
            4 => \Yii::t('app', 'апреля'),
            5 => \Yii::t('app', 'мая'),
            6 => \Yii::t('app', 'июня'),
            7 => \Yii::t('app', 'июля'),
            8 => \Yii::t('app', 'августа'),
            9 => \Yii::t('app', 'сентября'),
            10 => \Yii::t('app', 'октября'),
            11 => \Yii::t('app', 'ноября'),
            12 => \Yii::t('app', 'декабря'),
        ];
    }

    public function getBirthDateString()
    {
        if ($this->birth_day != '0' && $this->birth_month != '0' && $this->birth_year != '0') {
            return $this->birth_day . ' ' . self::getBirthMonthArray()[$this->birth_month] . ' ' . $this->birth_year;
        }
        return false;
    }
}
  • Вопрос задан
  • 110 просмотров
Решения вопроса 2
@morricone85
первое что бросилось в глаза - класс ProfileController:

public function actionIndex()
{
$this->layout = 'page';
$vars = [];
$user = User::find()->where(['username' => $_GET['username']])->one();

....
}

$_GET['username'] - у вас чему равно?
Почему эти данные идут в метод index, а не скажем, в метод view?
Ответ написан
swallow_97
@swallow_97 Автор вопроса
Решение оказалось невероятно простым.. Просто-напросто я поменяла в базе данных настройки структуры. Сейчас она у меня выглядит вот так:
5c4c57260cd49151955058.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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