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

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

Например; http://www.example.com/username/ controller / action / id

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

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

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

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

3 ответа

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

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

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

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

....
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):

Вы можете использовать другой макет, настроив yii\base\Application::$layout или же yii\base\Controller::$layout, Первый управляет компоновкой, используемой всеми контроллерами, а второй переопределяет первый для отдельных контроллеров.

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

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

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)

Другие вопросы по тегам