У меня есть проект, в котором пользователь выбирает макет и сохраняет его в базе данных. Как мне изменить этот макет в режиме реального времени?
Например; http://www.example.com/имя пользователя/ Контроллер / действие / идентификатор
По всему сайту с первым параметром имя пользователя, где на самом деле система будет знать, какой макет она выбрала.
Кто-нибудь может мне помочь?
РЕДАКТИРОВАНИЕ
Например; Когда пользователь заходит на сайт, я перехожу по следующей ссылке: www.example.com/index.php?Макет = 4545455, поэтому я мог бы знать, какой макет использовать, но как мне сохранить этот параметр Макет = 4545455 на всех маршрутах сайта? Хорошо, если я нажму на меню «О программе», оно будет отображаться по адресу www.example.com/index.php?r=site/about.
Вы можете установить макет внутри вашего контроллера входа в систему.
После успешного входа пользователя получите его макет из базы данных и установите макет как $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#using-layouts):
Вы можете использовать другой макет, настроив
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)