Передача переменных в вид из контроллера в yii2
  • 5215

Как передать переменную во view или layout в yii2.

Автор: admin | 07 мая (Пн.) 2018г. в 13ч.40м.

Способы передачи переменных в файл вида.

Также отдельно рассмотрим особенности передачи переменной в шаблон layout.php.

Передача из экшена через render($view, $params = []).

Передача переменных из контроллера в файл видов view (yii\web\View) через метод контроллера render():

В контроллере:
namespace frontend\controllers;

class BlogController extends Controller
{

public function actionArticle($alias)
{
    //модель страницы блога
    $article = Article::find()->where('alias' => $alias)->one();

    return $this->render('article',compact('article'));
    
    //или более знакомый всем способ
    //return $this->render('article',['article' => $article]);
    
}​

В article.php принимаем перменную.

<?php
/* @var $this yii\web\View */

?>

<?= $article->title; ?>

Через $this->context :

Получить переменную (свойство контроллера) в видах из контроллера через $this->context :

В контроллере:

namespace frontend\controllers;

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


    public function actionArticle($alias)
    {
        //модель страницы блога
        $article = Article::find()->where('alias' => $alias)->one();

        $this->title = $article->title;
        
        return $this->render('article',compact('article'));
    }
    

В article.php принимаем перменную:

<?= $this->context->title; ?>

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

<?= Yii::$app->context->title; ?>

Через $this->view :

Передача переменной из контроллер а в вид через $this->view .Таким образом можно передать только публичные переменные, объявленные в классе yii\web\View:

Полный список этих свойств можно посмотреть на сайте https://www.yiiframework.com/doc/api/2.0/yii-web-view

Я лишь опишу те свойства, которыми чаще всего пользуюсь сам при передачи в вид из контроллера.
$metaTags - регистрация метатегов.

\Yii::$app->view->registerMetaTag([
                'name' => 'keywords',
                'content' => "ваши ключи",
            ], 'keywords');

$linkTags - регистрация ссылок в head.
Например, тег ссылки для favicon можно добавить следующим образом:

$title - тот самый тайтл, который генерируется в head блоке и очень важжен для seo.

 $this->view->registerLinkTag(['rel' => 'icon', 'type' => 'image/png', 'href' => '/myicon.png']);


Вот так регестрируется title в yii\web\View:

class BlogController extends Controller
{
    public function actionArticle($alias)
    {
        //модель страницы блога
        $article = Article::find()->where('alias' => $alias)->one();

        $this->view->title = $article->title;
        
        //или
        $this->getView()->title = $article->title;
        
        //или через глобальный контейнер Yii::$app
        Yii::$app->view->title = $article->title;
        
        //также
        Yii::$app->getView()->title = $article->title;
        
        
        return $this->render('article',compact('article'));
    }

В article.php принимаем перменную.

<?= $this->$title; ?>

$params - любые параметры или переменные yii\web\View . Устанавливаем значение через $this->view->params['ключ'] .
Не путать с Yii::$app->params , это разные массивы.

Вот так с помощью массива params компонента yii\web\View можно передать любые ваши данные
в вид или шаблон layout.php

\Yii::$app->getView()->params['my_data'] = "Мои данные";

В view или layout:

echo $this->params['my_data'];

Также если на сайте есть yii\widgets\Breadcrumbs "хлебные крошки" , то переносим их из view в контроллер:

Было в виде:

<?php

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

use yii\helpers\Html;

$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-about">
    <h1><?= Html::encode($this->title) ?></h1>
</div>

Убрали из вида:

<?php

/* @var $this yii\web\View */
use yii\helpers\Html;
?>
<div class="site-about">
    <h1><?= Html::encode($this->title) ?></h1>
</div>

Перенесли в контроллер. Теперь breadcrumbs генерируем в экшене контроллера:

class BlogController extends Controller
{
    public function actionArticle($alias)
    {
        //модель страницы блога
        $article = Article::find()->where('alias' => $alias)->one();

        $this->view->title = 'About';
        $this->view->params['breadcrumbs'][] = $this->view->title;
        
        
        return $this->render('article',compact('article'));
    }

Через глобальный массив \Yii::$app->params[] :

Можно передать данные через глобальный массив \Yii::$app->params[] -

class BlogController extends Controller
{
    public function actionArticle($alias)
    {
        //модель страницы блога
        $article = Article::find()->where('alias' => $alias)->one();

        \Yii::$app->params['title'] = 'About';
        
        
        return $this->render('article',compact('article'));
    }

В файле вида получить и вывести так:

<?php echo Yii::$app->params['title']; ?>

В Yii::$app->params можно не только устанавливать значения, но и прописывать их заранее
для хранения каких-то неизменных настроек, которые хранятся в файле, указанном в настройках config/main.php
или config.php в базовой сборке.
<?php
  
  //тут пути всех файлов params.php
    $params = array_merge(
        require(__DIR__ . '/../../common/config/params.php'),
        require(__DIR__ . '/../../common/config/params-local.php'),
        require(__DIR__ . '/params.php'),
        require(__DIR__ . '/params-local.php')
    );

    return [
        'id' => 'your-app-backend',
        'name' => 'Your APP Backend',
        'basePath' => dirname(__DIR__),
        'bootstrap' => ['log'],
        'controllerNamespace' => 'backend\controllers',
        'modules' => [],
        'components' => [
            ...
        ],
        
        //тут передается массив параметров в свойство 'params'
        'params' => $params,​

Вот так выглядит param.php, в котором хронятся какие-то данные:

<?php
  return [
    'adminEmail' => 'my_mail@example.com',
 ];

Вы можете получить параметр с помощью Yii::$app->params где угодно:

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

или динамически записать туда свои данные и вывести во view или layout файлах

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

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

Передача данных с помощью сессий.

Также можно передавать переменные, вернее данные через сессии:

//Устанавливаем где угодно
\Yii::$app->session['any_var'] = "Что то храним в сессии";


//Выводим где-нибудь, например в файле видов или шаблоне
echo \Yii::$app->session['any_var'];​

Особенности передачи в layout.php.

В layout.php можно передать переменную так же как и во всех примерах, кроме первого, когда
мы рендерим файл вида из контроллера $this->render.

Получить экземпляр контроллера из вида можно так:

\Yii::$app->controller;

Посмотреть список доступных данные можно так:

var_dump(\Yii::$app->controller);

Так, например можно получить название нашего приложения из файла config.php

<?php
$params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

return [
    'id' => 'app-frontend',
    'name' => 'Мой сайт',
    'language' => 'ru-RU',        
        
echo \Yii::$app->controller->module->name;//выведится "Мой сайт"

Хотя можно и таким образом добраться до этих данных:
 \Yii::$app->name;

Иногда нужно передавать данные из одного виджета в другой. Чтобы это было возможным,
нужно чтобы виджет, который принимал данные был выше в коде, чем тот, в котором
эти данные принимаются.

Вот, например sidebar.php и два виджета

<aside class="col-md-3 col-sm-4 col-xs-12 col-xxs-12">
    
        <?= CategoriesSideBarWidget::widget([
            'title' => 'Разделы блога',
            'list' => $array
        ]); ?>
    
    
   
        <?= TagsSideBarWidget::widget([
            'title' => 'Ключевые слова',
            'list' => $array
        ]); ?>

В первом виджете передаем данные:

    public function run()
    {
//        echo \Yii::$app->getView()->params['to_any_widget'];
        \Yii::$app->params['to_TagsSideBarWidget'] = "Данные";
        ...

Принимаем данные во втором:

public function run()
    {
        
        echo \Yii::$app->params['to_any_widget']);
        ...
Также для передачи данных можно использовать сессии \Yii::$app->session :
\Yii::$app->session['to_any_widgets'] = "Данные";

echo \Yii::$app->session['to_any_widgets'];​

И тут опять же нужно соблюдать последовательность при занесении данных и извлечении их.
Иначе получим null.

Ну и для поднятия настроения - небольшой ролик про веселых обезъян :)

Приветствую!

Меня зовут Сергей. Я - автор этого блога.

Если Вам был полезен материал на моем сайте, поддержите пожалуйста мой проект, чтобы о нем узнали другие люди - кликните plizz :) на иконку в соц. сети, чтобы поделиться материалом с другими.