Yii2. Вложенные шаблоны и блоки
06.05.2019
Теги: Web-разработка • Yii2 • Теория • Фреймворк • ШаблонСайта
Вложенные шаблоны
Допустим, нам нужно для главной страницы сайта выводить сайдбар, а для других страниц — не выводить. При этом подключение сайдбара нужно сделать в layout-шаблоне, а не в view-шаблоне, чтобы вид отвечал только за вывод контента. В этом случае нет необходимости создавать два идентичных layout-шаблона, у которых все одинаковое, за исключением сайдбара.
Вместо этого создаем layout-подшаблон для главной страницы views/layouts/index.php
:
<?php $this->beginContent('@app/views/layouts/main.php'); ?> <div class="row"> <div class="col-sm-9"> <?= $content ?> </div> <div class="col-sm-3"> <h3>Тут сайдбар</h3> </div> </div> <?php $this->endContent(); ?>
Содержимое, указанное между методами beginContent()
и endContent()
, будет вставлено в главный шаблон, путь к которому (или алиас) указан в качестве аргумента метода beginContent()
.
Используя данный подход, мы сначала получаем view-контент главной страницы в переменную $content
layout-подшаблона index.php
, а когда подключаем главный layout-шаблон main.php
, все содержимое index.php
попадает уже в переменную $content
главного layout-шаблона.
Осталось только указать, что для главной страницы мы будем использовать отдельный layout-шаблон:
class SiteController extends Controller { public function actionIndex() { $this->layout = 'index'; return $this->render('index'); } }
Использование блоков
Блоки позволяют «записать» контент в одном месте, а показать — уже в другом. Они часто используются совместно с шаблонами. Например, определим блок в view-шаблоне и покажем его в layout-шаблоне.
<?php /* @var $this yii\web\View */ use yii\helpers\Html; $this->title = 'Hello'; ?> <?php $this->beginBlock('some-content'); ?> <p>Lorem ipsum dolor sit amet</p> <?php $this->endBlock(); ?> <div class="site-hello"> <h1><?= Html::encode($this->title) ?></h1> <p>Вы можете изменять эту страницу, редактируя файл шаблона:</p> <code><?= __FILE__ ?></code> </div>
<?php /* @var $this \yii\web\View */ /* @var $content string */ use yii\helpers\Html; use app\assets\AppAsset; AppAsset::register($this); ?> <?php $this->beginPage() ?> <!DOCTYPE html> <html lang="<?= Yii::$app->language ?>"> <head> <meta charset="<?= Yii::$app->charset ?>"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title><?= Html::encode($this->title) ?></title> <?php $this->head() ?> </head> <body> <?php $this->beginBody(); // выводим содержимое блока с идентификатором some-content if (isset($this->blocks['some-content'])) { echo $this->blocks['some-content']; } echo $content; $this->endBody(); ?> </body> </html> <?php $this->endPage() ?>
beginBlock()
выставить в true
, содержимое блока будет показано в месте задания блока.
Поиск: Web-разработка • Yii2 • Фреймворк • Framework • Шаблон сайта • Вложенный шаблон • Подшаблон • Template • Layout • View • beginContent • endContent • Блок • Block • beginBlock • endBlock