Ответ 1
Внутри относительного действия:
public function actionYourAction($id)
{
$this->layout = 'yourNewLayout';
return $this->render('yourView', [
'model' =>$model,
]);
}
Я делаю небольшой проект, используя Yii2.
Предположим, что у меня одинаковый макет (заголовок, нижний колонтитул) в представлении (например, site
), за исключением a login.php
в этом представлении. Я хочу, чтобы в этом файле был другой или нет верхний/нижний колонтитул. Что я могу сделать, удалив верхний/нижний колонтитул только из этого файла вида.
Все, что я мог сделать, чтобы изменить макет в разных представлениях. Можно ли изменить макет в одном файле вида?
Внутри относительного действия:
public function actionYourAction($id)
{
$this->layout = 'yourNewLayout';
return $this->render('yourView', [
'model' =>$model,
]);
}
Я немного опаздываю на вечеринку, но вы можете изменить свой макет из своего вида. Вам не нужно объявлять его в своем контроллере. Я лично считаю, что лучше сделать это с точки зрения, потому что вы можете легко увидеть, что происходит дальше. Если вы вносите изменения в HTML, вы попадаете в файл представления и можете легко увидеть, какой макет он использует. Помещая это в Контроллер, вы (или кто-то позже) может пропустить изменение макета, вложенное в действие вашего контроллера.
Так как $this
относится к вашему представлению в Yii2, а не к вашему контроллеру, как в Yii1, старый $this->layout
больше не работает из вашего представления.
Теперь, в Yii2, вы ссылаетесь на контроллер с вашего вида, используя $this->context
.
$this->context->layout = 'your-layout';
В моем проекте мне захотелось 2 макета: один для сайта и один для webapp. Поскольку файл main.php является макетом по умолчанию, я создал макет site.php и в начале siteController, сразу после объявления класса, я положил
public $layout = 'site';
Результат состоит в том, что только viewController, обработанный сайтом, использует макет site.php. Это сработало для меня.
Я тоже поздно опаздываю на вечеринку, но сегодня борюсь с этим материалом... Для меня, чтобы создать отдельный макет только потому, что я хочу пропустить нижний колонтитул или заголовок, кажется, много кода для небольшой победы. Если я могу придерживаться основной компоновки, я могу просто добраться до контроллера и действия в настоящее время загружен и пропустил этот путь (напишите это в main.php):
$contr = Yii::$app->controller->id;
$action = Yii::$app->controller->action->id;
$skipFooter = $contr == 'site' && $action == 'login'; //...or enter here what U want
... и затем позже:
<?php if (!$skipFooter): ?> //Never at login...
<footer class="footer">
<div class="container">
<p class="pull-left">© YourSite.com <?= date('Y') ?></p>
<p class="pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php endif; ?>