Yii 中的动态布局


Dynamic layout in Yii

我有一个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。