Yii中创建自己的Widget.

一)

1.构建自己的widget testWidget.php

在目录 /protected/widget/test/testWidget.php

<?php

    class testWidget extends CWidget{
        
        public function init()
        {
            //当视图中执行$this->beginWidget()时候会执行这个方法
            //可以在这里进行查询数据操作
        }
     
        public function run()
        {
            //当视图中执行$this->endWidget()的时候会执行这个方法
            //可以在这里进行渲染试图的操作,注意这里提到的视图是widget的视图
            //注意widget的视图是放在跟widget同级的views目录下面,例如下面的视图会放置在
            //  /protected/widget/test/views/test.php
            $this->render('test', array(
                'str'=>'WIDGET视图变量',
            ));
        }
}

2.创建对应的widget view

/protected/widget/test/views/test.php

<?php  
    echo $str;

3.调用自定义的widget

<div class="msg">
<?php echo CHtml::encode($message); ?>
</div>

自定义widget开始
<div>
<?php
    $this->beginWidget('application.widget.test.testWidget');
?>
</div>


<?php $this->endContent(); ?>
</br>自定义widget结束</br>


<hr>
<?php
    Yii::import('application.mylib.MyTestClass');
    
    echo Yii::app()->controller->id;
    
    echo '<hr>';
    
    echo MyTestClass::getName();
?>

ps:

在控制器render视图的时候,如果不想用默认的layout,可以直接使用如下方式

$this->renderPartial('test',array()); 

  

  要创建一个新的挂件(widget),我们主要是要继承两个方法:CWidget::init()和 CWidget::run(), 
CWidget::init 调用是发生在我们使用 $this->beginWidget 将挂件插入到一个view里面, 
CWidget::run 调用是发生在我们使用 $this->endWidget 这个方法的时候。 
如果我们想捕捉和处理两者之间的方法核查办上显示的内容,我们可以在CWidget::init开始输出缓冲,然后在CWidget::run中检索缓冲输出 并作进一步处理。

 ------------------------------------------------------------------------------------------------------------------------------

二)

下面以一个随机广告图片为例说明Yii中Widget的用法

1. 调用Widget

<?php $this->widget('WidgetName'); ?>

或者
<?php $widget=$this->beginWidget('path.to.WidgetClass'); ?>
...可能会由小物件获取的内容主体...

<?php $this->endWidget(); ?>

也可以传参到Widget类 

<?php $userId = 1; ?>

<?php $this->widget('WidgetName',array('userId'=>$userId)); ?>

参数userId自动映射到Widget类的同名属性,所以在定义Widget时,别忘记了声明该属性。 

2. 创建Widget

自定义Widget类要继承CWidget,覆盖方法run 

<?php

class BannerMagic extends CWidget {
    public function run(){
    }

}

或者: 

class MyWidget extends CWidget {

    public function init() {
        // 此方法会被 CController::beginWidget() 调用
    }
     public function run() {
        // 此方法会被 CController::endWidget() 调用
    }

}

下面是是BannerMagicWidget实现 

<?php class BannerMagicWidget extends CWidget {

   public function run() {
     $random = rand(1,3);
     if ($random == 1) {
       $advert = "advert1.jpg";
     }  else if ($random == 2) {
       $advert = "advert2.jpg";
     }  else {
       $advert = "advert3.jpg";
     } 
     $this->render('bannermagic',array(
       "advert"=>$advert,
     ));
   }

}

存储到protected\components\BannerMagicWidget.php 

对应的view文件可能的内容如下: 

<img src="images/adverts/<?php echo $advert; ?>" alt="whatever" />

存储到protected\components\views\bannermagic.php 

3. 调用该Widget

<?php $this->widget('BannerMagicWidget'); ?>

来自:http://blog.csdn.net/zm2714/article/details/8651131

posted @ 2015-03-04 10:45  Brook-Xu  阅读(201)  评论(0)    收藏  举报