2

それが可能かどうか、またはこれを行うためのより簡単な方法があるかどうかを知りたいです。

多くのページでリレーショナルデータを使用したいのですが、今ではそれを使用するすべてのページに次のコードを配置しています。

<?php
    if(!Yii::app()->user->isGuest){
        $user = User::model()->findByPk(Yii::app()->user->id);
    }
?>

したがって、ビューで次を使用できます。

$user->account->name

現在のユーザーに関連するアカウントの名前を表示するには

次のことができればいいのですが。

Yii::app->user->account->name

状態の設定は、使用したいアカウント名だけでなく、使用したいすべてのリレーショナルデータの状態を追加したくないため、私が探しているものではありません。

 Solution

 |
 |
 |
 V

解決

私は両方の答えの良い点を組み合わせて、次のものを作成しました。

class WebUser extends CWebUser {
private $_user;

public function getAccount(){
    if(!$this->isGuest && (!isset($this->_user) || Yii::app()->user->id != $this->_user->id)){
        $this->_user = User::model()->findByPk(Yii::app()->user->id);
    }
    if(!empty($this->_user)){
        return $this->_user->account;
    } else {
        return false;
    }

  }
}

だから今私は以下を使うことができます:

Yii::app()->user->account->name

上記のメソッドは、ユーザーがログインしていてデータが保存されていない場合、またはユーザーのIDが異なる場合にデータを取得します。

それをコンポーネントに配置し、Afnanが話している部分を構成に必ず追加してください(main.php)

私はそれが私を最も助けたのでアフナンの答えを受け入れます(私が知る必要があった部分)

4

3 に答える 3

6

まあ、それが最善の解決策であるかどうかはわかりませんが、私は通常、拡張することによってこのようなことをしますCWebUser

私がすることは、拡張するコンポーネントフォルダにファイルを作成することですCWebUser

class CWebUserExtend extends CWebUser
{
    /**
     *
     * @return the type of user based on forien key of UserType
     */
    public function getUserAccname()
    {
        $user = User::model()->findByPk(yii::app()->user->id);
        if ($user === null)
            return 'error';            
        else
            return $user->account->name;            
    }
}

そしてmain.phpファイルで「ユーザー」インデックスを次のように変更します

'user'=>array(
            // enable cookie-based authentication
            'allowAutoLogin'=>true,
                        'class'=>'CWebUserExtend',//class that extends CWebUser
        ),

これはあなたが何かをすることを可能にするでしょう

Yii::app()->user->getUserAccname();

それが役に立てば幸い

于 2012-11-03T19:53:43.610 に答える
3

アフナンの答えに似ていますが、私の2セントです。私はAfnanが提案するようにwebuserクラスを拡張しaccountますが、データベースアクセスとモデルルールに使用するモデルも持っています。ExWebUserクラスに関数を設定して、これにアクセスします。

public function getAccount(){
    return Account::model()->findByPk($this->id);
}

Yii::app()->user->account->nameこれにより、やることがたくさんある場合にアクションごとのメソッドを使用するよりもはるかにクリーンに感じるアクセスが可能になります。

PS
これは、結果を拡張クラスのプライベート変数にキャッシュし、場合によってはメソッドにプリロードすることで、明らかに大幅に改善できますinit()

于 2012-11-03T23:58:45.980 に答える
0

助けてくれてありがとう !コードを次のように変更する必要があることに気づきました。

class WebUser extends CWebUser {
private $_user;

public function getAccount(){
    if(!$this->isGuest && (!isset($this->_user) || Yii::app()->user->id != $this->_user->id)){
        $this->_user = User::model()->findByPk(Yii::app()->user->id);
    }
    if(!empty($this->_user)){
        return $this->_user;
    } else {
        return false;
    }

  }
}

$this->_user私は次のようなユーザーの属性にアクセスするために戻るだけですYii::app()->user->account->name

于 2013-02-27T15:21:29.647 に答える