ii 2:我可以访问由另一个视图呈现的视图中的变量吗?


Yii 2: Can I access a variable in a view that's rendered by another view?

在Yii 2中,按照MVC模式,控制器将某些变量传递给视图。但是,有时视图本身会呈现另一个视图。

例如,在默认生成的CRUD视图中,create.php和update.php都呈现_form视图:

<?= $this->render('_form', [
    'model' => $model,
]) ?>

我是否可以使用控制器传递的变量来创建_form中的php ?

假设控制器是这样呈现的:

return $this->render( 'create', [
    'model' => $model,
    'myVar' => $myValue,
] );

现在我可以访问$myVar在create.php,但我不能在_form(这是由create.php呈现。有办法让我拿到这个吗?或者我需要像这样显式地传递它给form(在create.php中):

return $this->render( '_form', [
    'model' => $model,
    'myVar' => $myValue,
] );

render -函数使用extract()将参数转换为本地函数上下文中的常规变量,这是文件的include完成的地方。这就是你在视图中"接收"这些值的方式。

这意味着如果您在该视图中再次调用render(或任何其他变体),它将创建一个新的本地上下文,并且来自"上面"的本地变量将不在那里。这就是为什么需要将变量传递给每次调用的原因,正如您自己已经弄清楚的那样。

您需要不断地将它传递给您想要访问它的视图。

例子:

在控制器:

return $this->render('view1', ['var' => $value]);

In view1:

<?= $this->render('view2', ['var' => $var]) ?>

view2视图中可以访问变量var作为$var

我用它将一个变量从一个视图传递到另一个视图:

View1:

<?= $this->render('@app/views/layouts/_view2.php', ['hideCarousel' => TRUE]) ?>

View2:

<?php if (!isset($hideCarousel)): ?>
    ...
<?php endif; ?>