如何根据yii2中的用户名选择网站布局

时间:2016-11-21 02:03:25

标签: php yii2 yii-routing

我有一个项目,用户选择布局并将其保存在数据库中,如何选择实时更改此布局?

例如; http://www.example.com/用户名 /控制器/动作/ ID

在整个网站中,我将使用第一个参数用户名,这实际上是系统将知道它所选择的布局。

有人能帮助我吗?

EDITED

例如;当用户访问该网站时,我通过以下链接:www.example.com/index.php? layout = 4545455 ,这样我就可以知道要使用哪种布局,但如何保留所有路线网站上的此参数 layout = 4545455 ?好吧,如果我点击关于菜单,它将与网址www.example.com/index.php?r=site/about

3 个答案:

答案 0 :(得分:2)

您可以在登录控制器中设置布局。 当用户成功登录时,从数据库获取其布局并将布局设置为$this->layout = "layout_name"。前提是您需要在视图文件夹中保留布局文件

注意:请参阅@ sm1979的回答了解更多详情

答案 1 :(得分:1)

您已经提到用户选择的布局存储在数据库中。您可以在登录后立即使用该信息,并覆盖应用程序组件中的默认布局。

登录操作的代码段可能是这样的:

....
if ($model->load(Yii::$app->request->post()) && $model->login()) {
    //you can use Yii::$app->user->id and get the corresponding layout info
    //using something like below, assuming UserLayouts as the model
    //corresponding to the table storing user's layout choice  
    $layout = UserLayouts::find()->where(['user_id' => Yii::$app->user->id])->one();

    Yii::$app->layout = $layout->id; //you should fetch the field which is the name of the layout file

    //redirect to landing page for member
    ...
}

这将为特定会话的所有控制器设置特定用户的布局,因此您不必在URL中传递布局信息。请注意,只有在不覆盖每个Controller中的布局属性时,此方法才有效。

这是Nitin P也提出的建议。唯一不同的是他建议设置$this->layout = "layout_name",我认为这只会设置特定控制器的布局而不是所有控制器。来自Yii2指南(http://www.yiiframework.com/doc-2.0/guide-structure-views.html#using-layouts):

  

您可以通过配置yii\base\Application::$layoutyii\base\Controller::$layout来使用其他布局。前者控制所有控制器使用的布局,而后者控制前者用于单个控制器。

我没有足够的声誉评论他的答案,所以我添加了新答案。

答案 2 :(得分:0)

在所有人的帮助下,我得到了以下内容:

class MainController extends \yii\base\Controller {

    public function init()
    {
        parent::init();
    }

    public function beforeAction($action) { 
        if(Yii::$app->request->get('layout')) {
            $this->layout = 'set_layout';
        }

        return parent::beforeAction($action);
    }
 } 


class SiteController extends MainController
{
  // code here 
}

我已经创建了一个主控制器,我创建的所有控件都将继承它。使用beforeAction ($ action)方法,我可以根据网址中的内容更改布局。 (例如www.example.com/index.php?layout=485121)