Изменение файла макета в представлении в Yii2
Я делаю небольшой проект с использованием Yii2.
Предположим, что у меня такой же макет (верхний и нижний колонтитулы) в представлении (например, site
), за исключением login.php
в этом представлении. Я хочу, чтобы в этом файле был другой верхний/нижний колонтитул или его не было. Что я могу сделать, чтобы удалить верхний/нижний колонтитул только из этого файла представления.
Все, что я мог сделать, чтобы изменить макет в разных представлениях. Можно ли изменить макет в одном файле представления?
4 answers
Внутри относительного действия:
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 макета: один для сайта и один для веб-приложения. В качестве main.php файл - это макет по умолчанию, я создал site.php макет и в начале SiteController, сразу после объявления класса, я поставил
public $layout = 'site';
В результате только отображаемые представления SiteController используют 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; ?>