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

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.