2013-08-30 3 views
0

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'=>'', 
    ), 
); 
+0

Vous utilisez else et else-si seulement. Avez-vous essayé d'ajouter une dernière instruction pour vérifier que les deux premiers échouent? –

+0

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

+0

pouvez-vous poster votre fichier de configuration main.php ici? –

Répondre

0

Je ne pense pas que vous pouvez définir/modifier les params lors de l'exécution (dans votre contrôleur).

Notez que cette méthode est pour paramètres de configuration statiques - il est ne fournit pas des paramètres dynamiques modifiés (ou a persisté) lors de l'exécution ou les paramètres par utilisateur.

Ne pas vérifier cet article pour une utilisation correcte: http://www.yiiframework.com/wiki/126/setting-and-getting-systemwide-static-parameters/

+0

Alors, quelle sera la bonne façon de réaliser ce que j'essaie de faire ici? – redGREENblue

+0

En outre, selon ce lien, il semble qu'il est possible de définir/obtenir des paramètres à l'exécution. http://www.yiiframework.com/wiki/242/yii-registry-how-to-use-it-does-it-exist-at-all/ – redGREENblue

+0

C'est un environnement global. Vous ne devez pas utiliser de paramètres pour les paramètres par utilisateur. Vous devriez le faire via le modèle. –

Questions connexes