Как выбрать макет сайта по имени пользователя в yii2

У меня есть проект, в котором пользователь выбирает макет и сохраняет его в базе данных. Как мне изменить этот макет в режиме реального времени?

Например; http://www.example.com/имя пользователя/ Контроллер / действие / идентификатор

По всему сайту с первым параметром имя пользователя, где на самом деле система будет знать, какой макет она выбрала.

Кто-нибудь может мне помочь?

РЕДАКТИРОВАНИЕ

Например; Когда пользователь заходит на сайт, я перехожу по следующей ссылке: www.example.com/index.php?Макет = 4545455, поэтому я мог бы знать, какой макет использовать, но как мне сохранить этот параметр Макет = 4545455 на всех маршрутах сайта? Хорошо, если я нажму на меню «О программе», оно будет отображаться по адресу www.example.com/index.php?r=site/about.

0

Решение

Вы можете установить макет внутри вашего контроллера входа в систему.
После успешного входа пользователя получите его макет из базы данных и установите макет как $this->layout = "layout_name", При условии, что вы должны держать файлы макета готовыми внутри вашей папки просмотра

Замечания : Пожалуйста, обратитесь к ответу @ sm1979 для более подробной информации

2

Другие решения

Вы упомянули, что выбранный пользователем макет хранится в базе данных. Вы можете использовать эту информацию сразу после входа в систему и переопределить макет по умолчанию в компоненте приложения.

Фрагмент кода действия входа в систему может выглядеть примерно так:

....
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. Обратите внимание, что этот подход будет работать, только если вы не переопределяете свойство макета в каждом контроллере.

Это то, что Нитин Р также предложил. Разница лишь в том, что он предлагает установить $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, Первый управляет компоновкой, используемой всеми контроллерами, а второй переопределяет первый для отдельных контроллеров.

У меня недостаточно репутации, чтобы комментировать его ответ, поэтому я добавил новый ответ.

1

С помощью всего я получил следующее:

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) Метод я могу изменить макет в соответствии с тем, что в URL. (Например, www.example.com/index.php?layout=485121)

0
По вопросам рекламы [email protected]