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 • Конфигурация