2016-11-21 2 views
0

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

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

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

Может ли кто-нибудь мне помочь?

EDITED

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

+1

Что вы сделали до сих пор? –

+0

показать свою модель пользователя –

+0

@AnanthaRajuC \t Я отредактировал вопрос, если он улучшил понимание – Maicon

ответ

2

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

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

+0

Я отредактировал вопрос, видите, улучшает ли он – Maicon

+0

, вам не нужно передавать этот параметр 'layout' везде, просто установите макет как я упоминал в контроллере входа. макет будет применяться во время сеанса –

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

Это то, что также предложил Nitin P. Единственное отличие заключается в том, что он предлагает установить $this->layout = "layout_name", который, я считаю, установит макет только для этого конкретного контроллера, а не для всех контроллеров. Из Yii2 Guide (http://www.yiiframework.com/doc-2.0/guide-structure-views.html#using-layouts):

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

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

+0

, вы правы, '$ this-> layout' будет устанавливать только макет текущего контроллера. –

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