Я делаю небольшой проект, используя Yii2.
Предположим, что у меня есть такой же макет (заголовок, нижний колонтитул) в представлении (например, site
), кроме 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; ?>