Невозможно получить доступ к параметру приложения из модели

Существует две модели: User и UserProfile. При сохранении нового пользователя для сохранения данных в обеих моделях / таблицах используется одна форма. Здесь действие контроллера.

public function actionCreate($role)
{
    $User = new User;
    $UserProfile = new UserProfile;
    Yii::app()->params['u_role'] = $role;
    if(isset($_POST['User'], $_POST['UserProfile']))
        {
            $User->attributes=$_POST['User'];
            $UserProfile->attributes=$_POST['UserProfile'];
            $valid=$User->validate(); 
            if($valid)  
                {
                    if($User->save(false))  
                    {
                        $UserProfile->user_id = $User->id;  
                        if ($UserProfile->save()) 
                            {
                                $model=User::model()->with('userProfiles')->findByPk($User->id);
                                $this->redirect(array('manage/list'));
                            }
                    }
                }
        }
        $this->render('create', array(
            'User'=>$User,
            'UserProfile'=>$UserProfile,
        ));     
}

Модель, отношения, представления и действие создания, кажется, работают нормально, я могу сохранить нового пользователя с данными в обеих таблицах. Проблема в том, что в модели User есть поле 'role', которое не предоставляется из формы, а предварительно задано, в зависимости от параметра, переданного действию контроллера ($role). Я устанавливаю это значение $ role в качестве параметра приложения в самом действии create

Yii::app()->params['u_role'] = $role;

А в пользовательской модели я использую функцию для определения значения поля на основе значения этого параметра приложения. Вот функция,

public function fixUrole()
    {
        $returnUrole;
        if (Yii::app()->params['u_role']=='adm')
        {
            $returnUrole=1;

        }
        else if (Yii::app()->params['u_role']=='mgr')
        {
            $returnUrole=2;
        }
        return $returnUrole;
    }

Который вызывается из beforeValidate()как ниже.

$this->role = $this->fixUrole();

Проблема в том, что что-то идет не так при получении значения с помощью параметров приложения. Если я жестко закодировал значение в функции fixUrole(), сохраняет / работает правильно. Но в противном случае функция возвращает "пусто". Что здесь не так? Кроме того, я не совсем уверен, правильно ли я делаю то, что хочу, так есть ли лучший способ сделать это?

Изменить: вот конфиг main.php

<?php

// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');

// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'MY APP NAME',

    // preloading 'log' component
    'preload'=>array(
        'log',
        'bootstrap'),

    // autoloading model and component classes
    'import'=>array(
        'application.models.*',
        'application.components.*',
    ),

    'modules'=>array(
        // uncomment the following to enable the Gii tool
        'gii'=>array(
            'class'=>'system.gii.GiiModule',
            'password'=>'enter',
            // If removed, Gii defaults to localhost only. Edit carefully to taste.
            'ipFilters'=>array('127.0.0.1','::1'),
            'generatorPaths' => array(
            'bootstrap.gii'
        ),
        ),/**/
    ),

    // application components
    'components'=>array(
        'user'=>array(
            //'allowAutoLogin'=>true,
              'class' => 'WebUser',
        ),
        'bootstrap' => array(
        'class' => 'ext.bootstrap.components.Bootstrap',
        'responsiveCss' => true,
        ),

        'db'=>array(
            'connectionString' => 'mysql:host=localhost;dbname=testdb1',
            'emulatePrepare' => true,
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
        ),
        'errorHandler'=>array(
            // use 'site/error' action to display errors
            'errorAction'=>'site/error',
        ),
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error, warning',
                ),
                // uncomment the following to show log messages on web pages

                array(
                    'class'=>'CWebLogRoute',
                ),
                /**/
            ),
        ),
    ),

    // application-level parameters that can be accessed
    // using Yii::app()->params['paramName']
    'params'=>array(
        // this is used in contact page
        'adminEmail'=>'webmaster@example.com',
         'u_role'=>'', 
    ),
);

2 ответа

Вы можете попробовать Yii::app()->session('u_role'), и этот урок также может вам помочь.

Я не думаю, что вы можете установить / изменить параметры во время выполнения (в вашем контроллере).

Обратите внимание, что этот метод предназначен для статических параметров конфигурации - он не предусматривает динамические параметры, измененные (или сохраненные) во время выполнения или для пользовательских настроек.

Проверьте правильность использования этой статьи: http://www.yiiframework.com/wiki/126/setting-and-getting-systemwide-static-parameters/

Другие вопросы по тегам