我有一个项目,用户选择布局并将其保存在数据库中,如何选择实时更改此布局?
例如; http://www.example.com/的用户名 /控制器/动作/ ID
在整个网站中,我将使用第一个参数用户名,这实际上是系统将知道它所选择的布局。
有人能帮助我吗?
EDITED
例如;当用户访问该网站时,我通过以下链接:www.example.com/index.php? layout = 4545455 ,这样我就可以知道要使用哪种布局,但如何保留所有路线网站上的此参数 layout = 4545455 ?好吧,如果我点击关于菜单,它将与网址www.example.com/index.php?r=site/about
答案 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::$layout
或yii\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)