如何将变量传递给布局?

Mil*_*kov 12 php yii

我知道如何将变量从控制器传递到视图中:

$this->render('view_name', array('variable_name'=>'variable_value'));
Run Code Online (Sandbox Code Playgroud)

但是我想把一些变量传递给布局.控制器和布局之间的唯一连接似乎是控制器类中的public $ layout属性,如下所示:

public $layout='//layouts/column2';
Run Code Online (Sandbox Code Playgroud)

但是,我没有看到将变量传递给它的方法?

Pet*_*rus 14

或者,您可以在Controller中添加属性,例如

class SiteController extends CController {

    public $myvar;
//...
Run Code Online (Sandbox Code Playgroud)

然后在布局中输出它(// layouts/column2)

echo isset($this->myvar) ? $this->myvar : '';
Run Code Online (Sandbox Code Playgroud)

  • 好点,猜测我认为他不想修改控制器类,但如果他这样做,那将是他们想要的方法.更好的是,如果您已经在使用"Controller.php"组件,则可以在那里进行修改,并且任何控制器都可以使用它.我想如果你想得到真正的幻想,你可以用其他属性覆盖render方法:) (2认同)
  • @Mem**更正**:或者您可以在视图文件中获取控制器的id` $ this-> id`. (2认同)
  • 在Yii2中,如上所述创建Controller属性,但在布局中使用`Yii :: $ app-> controller-> myvar` (2认同)

ldg*_*ldg 7

我似乎并没有真正根据我的意思轻松做到这一点,所以如果你依靠它来传递大量数据,你可能想要考虑一种不同的方式来设置你的应用程序.

你能做到的几种方法是使用Yii params via

Yii::app()->params['myvar'] = $mixed;
Run Code Online (Sandbox Code Playgroud)

您可以在控制器中设置并在布局中访问.否则,您可以使用常规的PHP全局变量,以及所需的所有问题.

在您的控制器中,您可以执行以下操作:

global $testvar;
$testvar = 'hello';
Run Code Online (Sandbox Code Playgroud)

并在布局中:

echo $GLOBALS['testvar'];
Run Code Online (Sandbox Code Playgroud)

(即使它不在函数中,你仍然需要通过GLOBALS检索它.)

您可以通过这种方式传递对象以获得更多结构化数据,但您仍在使用全局变量.另一种可能甚至不太理想的方法是通过会话var,例如,Yii::app()->session['myvar']或Yii" flash消息 ".


小智 -2

从你的控制器你可以做这样的事情:

$this->render('/mail/registration',array('url'=>$url, 'description'=>'some description'));
Run Code Online (Sandbox Code Playgroud)

并从您的视图中访问变量,如下所示:

<h3><?php echo $url; ?></h3>
Run Code Online (Sandbox Code Playgroud)

这是你的答案;您可以从布局中访问这些相同的变量,如下所示:

<h3><?php echo $data['url']; ?></h3>
Run Code Online (Sandbox Code Playgroud)

  • 刚刚在Yii2.0中尝试过。$data 在布局中未定义 (2认同)