FatrBaby 2015-01-19 11:25:59 13787次浏览 3条评论 6 0 0

本文的目录结构使用Yii Path Alias描述

视图层中有许多公共部分,这里面一部分完全公用的东西我们可以放在layout里面,然而还有一部分是有差异的,比如这一个栏目的sidebar和另一个栏目的sidebar就有可能不一样。这个时候怎么来处理呢?有的人会选择制作多个layout,在不同地方切换layout,但这样代码的重用性没有发挥出来,而且不够灵活。yii里面有一个很方便的机制来解决这一问题,那就是 —— widget,小部件是也。

yii里面有一些自带的widget,他们放在web.widgetszii.widgets下面,比如有我们常用的CLinkPagerCMenu大家可以看一看。

要自己扩展widget,根据手册上的介绍,需要继承CWidget,并且覆盖run()方法。我们来开始扩展第一个widget:

  1. 创建widget存放目录:
    application(默认是protected)下创建目录widgets,用来存放widget类,然后创建widgets.views目录,用来存放widget的视图文件。

  2. 创建widget类:
    application.widgets下面创建一个名为TestWidget.php的文件,命名没太大讲究,保证唯一性,见名知意即可。在里面加入以下代码:

class TestWidget extends CWidget
{
    public $datetime = ''; 

    public function run()
    {
        $datetime = empty($this->datetime) ? date('Y-m-d H:i:s') : $this->datetime;
        $this->render('test', array('datetime'=>$datetime));
    }
}

解释一下这段代码:按照规则,类名TestWidget与文件名TestWidget.php相同,类TestWidget需要继承CWidget,然后重写(rewrite)run()方法,该方法会在widget被渲染是调用。在run()方法里调用$this->render()方法渲染test视图,将变量$datetime传递到视图(参见控制器的视图渲染)。可以在里面查询数据库,进行各种操作,将运算的结果传入视图。

  1. 创建视图文件:
    application.widgets.views下创建视图文件test.php,在里面加入代码:
now is <?php echo $datetime;?>

注:自己扩展的widget所需要渲染的视图需要放在application.widgets.views下,以php为扩展名。可以在视图里使用render传入的变量。

  1. 调用widget:
    准备工作做好了,可以在视图里使用<?php $this->widget('application.widgets.TestWidget');?>来调用widget。如果我们要对widget进行一些数据动态化的调用该怎么办呢?

还记得我们在类TestWidget里面定义的成员属性$datetime么?我们可以使用以下方法对其进行覆盖传值:

<?php $this->widget('application.widgets.TestWidget', array(
    'datetime'=>'2015/1/19',
));?>

注意:需要进行传值必须定义成widget类的成员属性,并且访问权限为public

你的widget输出了正确的结果么?祝你成功。

  • 评论于 2015-01-27 14:08 举报

    由于项目需要,YII 1.1整合smarty后,widget怎么用

    1 条回复
    评论于 2015-01-28 08:37 回复

    扩展一个smarty的plugin.因为要自动执行widget类的run()方法。

  • 评论于 2015-07-15 09:55 举报

    如果我要给widgets传的参数很多,那岂不是要在widgets里定义很多public成员属性。有方法可以解决这个问题吗?

    1 条回复
    评论于 2017-03-08 17:03 回复

    不需要手动定义的,CWidgetFactory中的createWidget方法已经通过遍历属性参数来定义widgets中的成员属性。

  • 评论于 2017-03-08 17:25 举报

    分享的简洁明了,很赞!

您需要登录后才可以评论。登录 | 立即注册