Il existe deux modèles, User et UserProfile. Lors de la sauvegarde d'un nouvel utilisateur, un seul formulaire est utilisé pour sauvegarder les données dans les modèles/tables. Voici l'action du contrôleur.Impossible d'accéder au paramètre d'application à partir du modèle
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,
));
}
Le modèle, les relations, vues et créer l'action semble fonctionner très bien, je peux enregistrer le nouvel utilisateur avec des données à la fois les tables. Le problème est qu'il existe un champ dans le modèle User, 'role' qui n'est pas fourni à partir du formulaire mais prédéfini, en fonction du param passé à l'action du contrôleur ($ role). Je suis en train cette valeur de rôle $ en tant que param d'application dans l'action se créer
Yii::app()->params['u_role'] = $role;
Et dans le modèle de l'utilisateur, je me sers d'une fonction pour déterminer la valeur du champ en fonction de la valeur de cette application param. Voici la fonction,
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;
}
Ce qui est appelé à partir beforeValidate()
, comme ci-dessous.
$this->role = $this->fixUrole();
Le problème est qu'il y a un problème lors de l'obtention de la valeur en utilisant les paramètres d'application. Si je code en dur une valeur dans la fonction fixUrole()
, elle enregistre/fonctionne correctement. Mais sinon, la fonction renvoie «vide». Qu'est-ce qui ne va pas ici? En outre, je ne suis pas tout à fait sûr si je fais ce que je veux dans le bon sens, alors y at-il une meilleure façon de le faire?
Edit: Voici la config 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'=>'[email protected]',
'u_role'=>'',
),
);
Vous utilisez else et else-si seulement. Avez-vous essayé d'ajouter une dernière instruction pour vérifier que les deux premiers échouent? –
Oui. Il retourne vide. Essayé switch-case aussi où il retourne la valeur par défaut. Je suppose que le problème est que Yii :: app() -> params ['u_role'] renvoie un blanc dans la fonction fixUrole(). – redGREENblue
pouvez-vous poster votre fichier de configuration main.php ici? –