Layouts - uniqcle/Yii2 GitHub Wiki

Шаблоны - это часть представления, отвечающие за общие детали страницы.

Change Layout

Глобально для всего сайта

frontend/config/main.php

...
    'layout' => 'basic', //Глобальный способ установки шаблона
    'components' => [
...

Для всего раздела/контроллера

добавляем публичное свойства для класса controller pubic $layout = 'basic'

namespace frontend\controllers;

use Yii;
use frontend\controllers\AppController;

class UserController extends AppController
{
    public $layout = 'basic'; 

    public function actionIndex(){
        $this->view->title = "Title книжного магазина"; 

    	$this->view->registerMetaTag([
    		'name' => 'keywords', 
    		'content' => 'Ключевики'
    	]);

    	$this->view->registerMetaTag([
    		'name' => 'description', 
    		'content' => 'Описание страницы...'
    	]); 

        $test = 'test';
        return $this->render('index', compact('test') );
    }
}

Для отдельной страницы/action'a

В методе назначает свойство $this->layout = 'basic';

namespace frontend\controllers;

use Yii;
use frontend\controllers\AppController;

class UserController extends AppController
{
    //Для всего контроллера
    //public $layout = 'basic';

    public function actionIndex(){
        $test = 'test';
        return $this->render('index', compact('test') );
    }

    public function actionShow(){
        //Для action'a
        $this->layout = 'basic';
        return $this->render('show');
}
}

Основной шаблон frontend/views/layouts/main.php

/* 
В шаблон попадают 2 переменные
Объект $this - экземпляр класса View
Переменная $content, где находится наша страница 
*/ 

/* @var $this \yii\web\View */
/* @var $content string */

use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use frontend\assets\AppAsset;
use common\widgets\Alert;

//Подключаем некоторые AssetBundle на страницу 
AppAsset::register($this);
?>


<!-- Начинается буферизация вывода --> 
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
    <meta charset="<?= Yii::$app->charset ?>">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <?php $this->registerCsrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
   <!--ВАЖНО-->
    <?php $this->head() ?>

</head>


<body>
<!--ВАЖНО-->
<?php $this->beginBody() ?>

<div class="wrap">
    <?php
    //Виджет NavBar
    NavBar::begin([
        'brandLabel' => Yii::$app->name,
        'brandUrl' => Yii::$app->homeUrl,
        'options' => [
            'class' => 'navbar-inverse navbar-fixed-top',
        ],
    ]);
    $menuItems = [
        ['label' => 'Home', 'url' => ['/site/index']],
        ['label' => 'About', 'url' => ['/site/about']],
        ['label' => 'Contact', 'url' => ['/site/contact']],
    ];
    if (Yii::$app->user->isGuest) {
        $menuItems[] = ['label' => 'Signup', 'url' => ['/site/signup']];
        $menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
    } else {
        $menuItems[] = '<li>'
            . Html::beginForm(['/site/logout'], 'post')
            . Html::submitButton(
                'Logout (' . Yii::$app->user->identity->username . ')',
                ['class' => 'btn btn-link logout']
            )
            . Html::endForm()
            . '</li>';
    }
    //Виджет Nav
    echo Nav::widget([
        'options' => ['class' => 'navbar-nav navbar-right'],
        'items' => $menuItems,
    ]);

    NavBar::end();
    ?>

    <div class="container">
        <?= Breadcrumbs::widget([
            'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
        ]) ?>
        <?= Alert::widget() ?>
        <?= $content ?>
    </div>
</div>

<footer class="footer">
    <div class="container">
        <p class="pull-left">&copy; <?= Html::encode(Yii::$app->name) ?> <?= date('Y') ?></p>

        <p class="pull-right"><?= Yii::powered() ?></p>
    </div>
</footer>
<!--ВАЖНО-->
<?php $this->endBody() ?>

</body>
</html>
<!--ВАЖНО-->
<?php $this->endPage() ?>
<!-- Заканчивается буферизация вывода --> 

Вид frontend/views/site/about.php

/* @var $this yii\web\View */

use yii\helpers\Html;

// Подключаем виджет 
use frontend\widgets\newsList\newsList; 

$this->title = 'Title для страницы about';

//Мета-теги лучше подключать на каждой странице, поскольку могут быть разными
$this->registerMetaTag([
	'name' => 'description', 
	'content' => 'Description of the page...'
]);
//Передаем массив breadcrumbs в виджет
$this->params['breadcrumbs'] = [
	['label' => 'Тест 1', 'url' => ['site/index'] ], 
	'Тест 2', 
	'Тест 3'
];

?>
<div class="site-about">
    <h1><?= Html::encode($this->title) ?></h1>

	<div class="row">
		<div class="col-md-9">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia, maiores, molestias. In facere necessitatibus, excepturi praesentium accusantium modi blanditiis repellat quae. Amet perspiciatis placeat, culpa maiores recusandae magni nulla, minima.</div>
		<div class="col-md-3">
	        
	        <!-- Вызов виджета --> 
	        <?php echo newsList::widget(['showLimit' => 3]); ?>

		</div>
	</div>
</div>

Буферизация вывода

ob_start();
echo "Hello </br>"; 
echo "Hello </br>"; 
echo "Hello </br>"; 
echo "Hello </br>"; 
echo "Hello </br>"; 
echo "Hello </br>"; 
echo "Hello </br>"; 

$content = ob_get_contents();

ob_clean();

$content = strtr($content, 'o', 'O'); 

echo $content; 

Передача данных из View в Layout

Если необходимо в определенном View вывести определенный код, то добавляем этот код в View

...
<?php $this->beginBlock('block1'); ?>
  <h3>Заголовк страницы</h3>
  <p>Какой-то текст...</p>
<?php $this->endBlock(); ?>
...

А затем в Layout

...
        <?= Alert::widget() ?>

        <?php //debug($this->blocks); ?>

        <?php

            if( isset($this->blocks['block1'])){
                echo $this->blocks['block1'];
            }

        ?>

        <?= $content ?>
...
⚠️ **GitHub.com Fallback** ⚠️