我知道如何将变量从控制器传递到视图中:
$this->render('view_name', array('variable_name'=>'variable_value'));
但是我想将一些变量传递给布局。控制器和布局之间的唯一连接似乎是控制器类中的public $ layout属性,如下所示:
public $layout='//layouts/column2';
但是,我没有看到将变量传递给它的方法吗?
答案 0 :(得分:13)
或者,您可以在Controller中添加属性,例如
class SiteController extends CController {
public $myvar;
//...
然后在布局中输出它(// layouts / column2)
echo isset($this->myvar) ? $this->myvar : '';
答案 1 :(得分:6)
我似乎并没有真正根据我所知道的那样轻松做到这一点,所以如果你依靠它来传递大量数据,你可能会想到一种不同的方式来设置你的应用
你能做到的几种方法是通过
使用Yii参数Yii::app()->params['myvar'] = $mixed;
您可以在控制器中设置并在布局中进行访问。否则,您可以使用常规的PHP全局变量,以及所需的所有问题。
在您的控制器中,您可以执行以下操作:
global $testvar;
$testvar = 'hello';
并在布局中:
echo $GLOBALS['testvar'];
(即使它不在函数中,你仍然需要通过GLOBALS检索它。)
您可以通过这种方式传递对象以获得更多结构化数据,但您仍在使用全局变量。另一种可能更不可取的方法是通过会话var,例如Yii::app()->session['myvar']
或Yii“flash message”。
答案 2 :(得分:4)
在控制器中传递变量,然后在VIEW中(尚未布局) 创建
$this->params['myvar'] = 'hello';
现在在布局中,您可以使用
访问整个数组echo $this->params['myvar'];
希望这会对你有所帮助。
答案 3 :(得分:0)
在Yii2中进行了多组调试后,我发现布局文件中可以访问的唯一变量(不包括全局变量)是 _file _ (当前布局文件的路径)和 _params_ (包含变量 content 的数组,它是从传递给控制器的文件缓冲的HTML输出)。
除了 @ldg (我认为最有用和最有用,但资源支出)和 @Petra Barus 提供的答案。
我还提出了一个很好的解决方案,将布局划分为显式文件并在渲染文件中调用它们:
echo $this->renderPhpFile(Yii::getAlias('@app/views/layouts/somelayout.php'), [
'var' => $variableThatIsAccessibleInRenderedFile,
]);
答案 4 :(得分:-1)
您可以从控制器执行以下操作:
$this->render('/mail/registration',array('url'=>$url, 'description'=>'some description'));
并从您的视图中访问变量,如下所示:
<h3><?php echo $url; ?></h3>
这是你的答案;您可以从布局中访问这些相同的变量,如下所示:
<h3><?php echo $data['url']; ?></h3>