Layouts - uniqcle/Yii2 GitHub Wiki
Шаблоны - это часть представления, отвечающие за общие детали страницы.
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') );
}
}
В методе назначает свойство $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">© <?= 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 вывести определенный код, то добавляем этот код в 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 ?>
...