2

我想知道是否有一种理想的方法可以在每个视图文件中运行相同的代码。

不必修改所有控制器和所有操作并添加代码片段,有没有办法让任何视图(而不是部分视图)始终调用控制器和操作?

我在所有视图中需要的是获取当前登录用户并获取其他相关表中的数据的代码。

以下是其中一个视图的操作方法之一

public function actionIndex()
{
    // the following line should be included for every single view
    $user_profile = YumUser::model()->findByPk(Yii::app()->user->id)->profile;

    $this->layout = 'column2';
    $this->render('index', array('user_profile' => $user_profile));

}
4

2 回答 2

3

是的,可以使用 Layout 和 Base Controller。

如果你来自 Yii 代码生成器,文件夹中应该有一个Controller类。components

如果您的控制器ExampleController extends Controller而不是CController,

Controller您可以分配:

public function getUserProfile() {
  return YumUser::model()->findByPk(Yii::app()->user->id)->profile;
}

在您的布局文件中:

<?php echo CHtml::encode($this->getUserProfile()); ?>

因为$this指的是控制器,而控制器继承了名为$user_profile.

但是,您应该分配和其他在登录会话profile时不会发生变化的事情。setState这样,您可以执行以下操作:

 <p class="nav navbar-text">Welcome, <i><?php echo Yii::app()->User->name; ?></i></p>

在 MySQLUserIdentity 中设置状态的示例(由我完成)。

class MySqlUserIdentity extends CUserIdentity
{

  private $_id;

  public function authenticate()
  {
    $user = User::model()->findByAttributes( array( 'username' => $this->username ) );
    if( $user === null )
      $this->errorCode = self::ERROR_USERNAME_INVALID;
    else if( $user->password !== md5( $this->password ) )
      $this->errorCode = self::ERROR_PASSWORD_INVALID;
    else
    {
      $this->_id = $user->id;
      $this->setState( 'username', $user->username );
      $this->setState( 'name', $user->name );
      $this->setState( 'surname', $user->surname );
      $this->setState( 'email', $user->email );
      $this->errorCode = self::ERROR_NONE;
    }
    return !$this->errorCode;
  }

  public function getId()
  {
    return $this->_id;
  }
}
于 2013-05-17T15:28:14.483 回答
3

正如评论中发布的那样,将重复的逻辑放在控制器中是不好的。记住 MVC 逻辑厚模型、明智视图和瘦控制器。为了显示登录的用户数据,我建议创建一个小部件。您可以将该小部件放置在您的布局或任何视图中。

最简单的一个是

class MyWidget extends CWidget
{
    private $userData = null;

    public function init()
    {
        $this->userData = YumUser::model()->findByPk(Yii::app()->user->id)->profile;
        // Do any init things here
    }

    public function run()
    {
        return $this->render('viewName', array('user_profile' => $userData));
    }
}

然后在任何视图(或实际上也是视图的布局)中,您可以使用它:

$this->widget('path.to.widget.MyWidget');

有关更多信息,请参阅有关 Yii 小部件的文档

于 2013-05-17T16:04:19.990 回答