Yii2. Передача данных в шаблон

12.05.2019

Теги: Web-разработкаYii2КонфигурацияПеременнаяТеорияФреймворкШаблонСайта

Передача данных из контроллера в view-шаблон

Передавая данные через второй параметр метода render(), мы явно передаем данные в view-шаблон. Данные должны быть представлены как ассоциативный массив в виде пар ключ-значение. При рендеринге вида, php вызывает встроенную функцию extract(), чтобы переменные из массива «распаковались» в переменные view-шаблона.

class PageController extends Controller {

    public function actionIndex($id) {
        $page = Page::findOne($id);
        $title = $page->title;
        $content = $page->content;
        // в view-шаблоне будут доступны переменные $title и $content
        return $this->render('index', ['title' => $title, 'content' => $content]);
    }
}
<?php
/* @var $this yii\web\View */
?>

<h1><?= $title; ?></h1>
<div class="content"><?= $content; ?></div>

Передача данных через контекст

Для передачи через контекст, объявляем переменную в классе контроллера:

class PageController extends Controller {
    // эта переменная будет доступна через контекст
    public $pageTitle;

    public function actionIndex($id) {
        $page = Page::findOne($id);
        $this->pageTitle = $page->title;
        $content = $page->content;
        return $this->render('index', ['content' => $content]);
    }
}

В view-шаблоне получаем доступ к объекту контроллера через свойство context, а через него — к публичному свойству:

<h1><?= $this->context->pageTitle; ?></h1>
<div class="content"><?= $content; ?></div>

Или через глобальный контейнер Yii::$app:

<h1><?= Yii::$app->context->pageTitle; ?></h1>
<div class="content"><?= $content; ?></div>

Передача данных через параметры

Свойство $params определено в классе \yii\base\View и наследуется классом \yii\web\View:

class View extends Component implements DynamicContentAwareInterface {
    /**
     * @var mixed Пользовательские параметры, которые являются общими для всех шаблонов.
     */
    public $params = [];
}

Мы можем использовать его для передачи любых данных из контроллера в view-шаблон или layout-шаблон. Поскольку это свойство доступно во всех шаблонах, можно использовать его для передачи данных между view и layout шаблонами.

Установливаем значение произвольного параметра в контроллере:

class PageController extends Controller {

    public function actionIndex($id) {
        $page = Page::findOne($id);
        $this->view->params['pageTitle'] = $page->title;
        // $this->getView()->params['pageTitle'] = $page->title;
        // Yii::$app->view->params['pageTitle'] = $page->title;
        // Yii::$app->getView()->params['pageTitle'] = $page->title;
        $content = $page->content;
        return $this->render('index', ['content' => $content]);
    }
}

И выводим его в view-шабоне или layout-шаблоне:

<h1><?= $this->params['pageTitle']; ?></h1>
<div class="content"><?= $content; ?></div>
Не путать с Yii::$app->params, это разные массивы, см. ниже.

Передача через глобальные параметры

Установливаем значение глобального параметра в контроллере:

class PageController extends Controller {

    public function actionIndex($id) {
        $page = Page::findOne($id);
        Yii::$app->params['pageTitle'] = $page->title;
        $content = $page->content;
        return $this->render('index', ['content' => $content]);
    }
}

Выводим глобальный параметр в view-шабоне или layout-шаблоне:

<h1><?= Yii::$app->params['pageTitle']; ?></h1>
<div class="content"><?= $content; ?></div>

В Yii::$app->params можно не только устанавливать значения, но и прописывать их заранее для хранения каких-то неизменных настроек:

<?php
/*
 * Файл config/params.php
 */
return [
    'adminEmail' => 'admin@example.com',
    'senderEmail' => 'noreply@example.com',
    'senderName' => 'Example.com mailer',
    /*
     * Название магазина, например «Lamoda» или «WildBerries»
     */
    'shopName' => 'Магазин одежды и обуви',
    /*
     * Значения по умолчанию для мета-тегов title, keywords и description
     */
    'defaultTitle' => 'Интернет-магазин модной одежды и обуви',
    'defaultKeywords' => 'одежда, обувь, мужская, женская, детская, зимняя, летняя',
    'defaultDescription' => 'Коллекции женской, мужской, детской одежды и обуви',
];
<?php
/*
 * Файл config/web.php
 */

$params = require __DIR__ . '/params.php';
$db = require __DIR__ . '/db.php';

$config = [
    'id' => 'basic',
    /*...*/
    'components' => [
        /*...*/
    ],
    'params' => $params,
];

return $config;

Эти параметры можно получить где угодно:

echo Yii::$app->params['adminEmail'];

Или динамически записать туда свои данные:

Yii::$app->params['adminEmailNew'] = 'adminEmailNew@example.com';

Дополнительно

Поиск: Web-разработка • Yii2 • Переменная • Фреймворк • Шаблон сайта • View • Layout • Params • Context • Конфигурация

Каталог оборудования
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.