我有一个Yii应用程序,在布局中我有一个静态侧边栏。我想根据控制器操作或视图更改侧边栏的内容。目前,在views/layouts/main.php
文件中,我有一个侧边栏定义为:
<div class="sidebar">hello!</div>
当控制器image
并且动作test
时,我想显示以下内容:
<div class="sidebar">Created at <? echo $image->created_at; ?></div>
$image对象在image
控制器和test
操作中定义。
简而言之,我想在控制器image
并且操作test
时显示侧边栏,但是,我不希望完全采用不同的布局。我怎样才能做到这一点?
这是
剪辑的工作。在布局中:
<div class="sidebar">
<?php if(!empty($this->clips['sidebar'])) {
echo $this->clips['sidebar'];
} else { ?>
hello
<?php } ?>
</div>
在您的视图中的某个地方:
<?php $this->beginClip('sidebar'); ?>
Created at <? echo $image->created_at; ?>
<?php $this->endClip(); ?>
您可以使用 getController()
进行简单的if-else
检查,getAction()
如下所示:
if(Yii::app()->getController()->getId()=='image' && Yii::app()->getController()->getAction()->getId()=='test'){
echo '<div class="sidebar">Created at '.$this->image->created_at.'</div>';
}
else
echo '<div class="sidebar">hello!</div>';
要在布局中访问$image
我们需要使其成为image
控制器本身的公共属性,然后在我们初始化$image
的操作test
中,我们将初始化公共$image
,例如:
class ImageController extends Controller{
public $image;
...
public function actionTest(){
$this->image=Example::model()->findByPk(1);// example
...
}
}
这将使我们能够访问布局中的图像,尽管使用 $this->image->property
.
同样在布局中$this
指的是当前控制器,因此我们也可以使用$this->id
而不是Yii::app()->getController()->getId()
来获取控制器 ID(此处为图像的名称)和$this->action
而不是Yii::app()->getController()->getAction()->getId()
来获取操作 ID。