• Yii中的CComponent应用实例


    首先我们先了解一下如何创建一个CComponent,手册讲述如下:

    CComponent 是所有组件类的基类。 
    CComponent 实现了定义、使用属性和事件的协议。 
    属性是通过getter方法或/和setter方法定义。访问属性就像访问普通的对象变量。读取或写入属性将调用应相的getter或setter方法,例如:

    1
    2
    $a=$component->text;     // equivalent to $a=$component->getText();
    $component->text='abc'// equivalent to $component->setText('abc');


    getter和setter方法的格式如下, 

    1
    2
    3
    4
    // getter, defines a readable property 'text'
    public function getText() { ... }
    // setter, defines a writable property 'text' with $value to be set to the property
    public function setText($value) { ... }

    更多请参考手册中的CComponent部份,在这里不是详述重点

    下面是应用需求,在一个网站前端,常常会有一个则栏,而这个侧栏所需要的数据是一样的,并且有两个数据封装,按照过往手法是写一个通用方法,在需要的页面内通过调用方法进行数据组装,并附值到模板,但相比起组件还是不够灵活。在CComponent是以对象方式访问方法。

    1.下面是代码实现方式

    在extensions新建component目录,并创建SSidebarComponent类继承Yii 的CComponent接口

    class SSidebarComponent extends CComponent
    {
    }

    为了方便查询并减小代码重复,我们先创建一个CDbCriteria的通用查询原型

    private function _criteria()
    {
        $uid = Yii::app()->user->id;
        $criteria = new CDbCriteria();
        $criteria->condition = 'user_id = :uid';
        $criteria->params = array(':uid'=>$uid);
        $criteria->order = 'id asc';
        return $criteria;
    }

    按照CComponent约定的方式即setter,我们创建第一个数据对象,即以$component->account即可返回user_account_track表的查询结果

    public function getAccount()
    {     
        return UserAccountTrack::model()->findAll($this->_criteria());
    }

    创建第二个数据对象方法

    public function getWebsite()
    {  
       return UserTrack::model()->findAll($this->_criteria());
    }

    同理即以$component->account即可返回usertrack表的查询结果

    如果您想在调用时对CComponent某个属性进行附值,即setter

    public $id;
    public function setId($value){
        $this->id = $value;
    }

    这样设置后当你引用组件时就可以通过以下方法附值

    $component->id = '1';

    2.下面讲解调用过程

    被动加载在你的控制器下引用组件,如我要在task这个index下使用侧栏,优点,按需加载,资源消耗小,缺点:手工加载

    public function actionIndex($id = null)
    {
        $component = Yii::createComponent(array('class'=>'ext.component.SSidebarComponent'));//引用组件
                 
        $component->id = $id;//如果需要附值,就是这样
                 
        $account = $component->account;//实际是调用getAccount()的方法及返回值
        $website = $component->website;//实际是调用getWebsite()的方法及返回值           
                 
        $this->render('publiclist',array(
            'website'=>$website,//附值变量到模板
            'account'=>$account,//附值变量到模板
        ));
    }

    主动加载,优点,全站调用,以对象方法调用资源,缺点:资源消耗增多

    /**
     *config/main.php配置
     */
    component=>array(
        'sidebar'=>array(
            'class'=>'ext.component.SSidebarComponet',
        ),
    ),
       
    /**
     *controller调用
     */
    public function actionIndex()
    {
        Yii::app()->sidebar->account;
    }

    OK现在已实现数据的调用过程,是不是比传统的方法更灵活,代码写得更规范了

  • 相关阅读:
    浏览器渲染原理
    element 表单清空提示语(单个 )
    同步异步
    数组的浅克隆
    ... 运算符
    解构赋值
    vue 中el-input 为number 如何控制不允许输入负号
    Android SDK Manager 更新代理配置
    Android 设计中的.9.png
    Android 编程下的 Secret Code
  • 原文地址:https://www.cnblogs.com/achengmu/p/3950426.html
Copyright © 2020-2023  润新知