Yii自定义CRUD。扩展不同表的通用模型

时间:2012-04-09 13:24:58

标签: yii

我有20个表的项目。 管理所有表中的数据将是相同的。 只有表中的列才会有所不同。 所以我想为所有表格制作通用模型,通用控制器和通用视图文件夹 之后只扩展每个表的所有类

模型/ Crud.php

<?php

class Crud extends CActiveRecord
{
    public $crudTable = '';
    public $crudColumns = array();

    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return '{{'.$this->crudTable.'}}';        
    }

    public function rules()
    {
        $rules = array();

        foreach ($this->crudColumns as $k=>$v) {
            foreach ($v ['rules'] as $vv) {
                $rules[] = array_merge(array($k), $vv);    
            }
            if($v['search']) $rules[] = array_merge(array($k), array('safe', 'on'=>'search'));
        }

        return $rules;
    }

    public function relations()
    {
        return array(
        );
    }

    public function attributeLabels()
    {
        $attributeLabels = array();

        foreach ($this->crudColumns as $k=>$v) 
        {
            $attributeLabels[$k] = $v['attributeLabel'];
        }
        return $attributeLabels;
    }

    public function search()
    {
        $criteria=new CDbCriteria;

        foreach ($this->crudColumns as $k=>$v) 
        {
            if($v['search'])
            {
                $criteria->compare($k,$this->$k,(($v['search'] == 'partial') ? 'partial' : false));                
            }
        }

        return new CActiveDataProvider($this, array(
            'criteria'=>$criteria,
        ));
    }
}

模型/ Country.php

class Country extends Crud
{
    public $crudTable = 'country';
    public $crudColumns = array(    
        'id' => array(
            'atributeLabel' =>'ID',
            'rules' => array (
                array('numerical', 'integerOnly'=>true)
            ),
            'search'=>true,
            'grid'=>true,                 
            'view'=>true,
            'form'=>true,                
        ),
        'title' => array(
            'atributeLabel' =>'Title',
            'rules' => array (
                array('required'),
                array('length', 'max'=>128)                                    
            ),
            'search'=>'partial',
            'grid'=>true,
            'view'=>true,
            'form'=>true,                                            
        ),                                 
        'code' => array(
            'atributeLabel' =>'Code',
            'rules' => array (
                array('required'),
                array('length', 'max'=>2)                                    
            ),
            'search'=>'partial',
            'grid'=>true,
            'view'=>true,
            'form'=>true,                                            
        ),        
        'description' => array( 
            'atributeLabel' =>'Description',
            'rules' => array (
                array('safe'),
            ),
            'search'=>'partial',
            'view'=>true,
            'form'=>true,                            
        ),                                 
        'onoff' => array(
            'atributeLabel' =>'Onoff',
            'rules' => array (
                array('numerical', 'integerOnly'=>true),
            ),
            'search'=>true,
            'grid'=>true,                
            'view'=>true,
            'form'=>true,                            
        )
    );

    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'providers' => array(self::HAS_MANY, 'Provider', 'country_id'),
        );
    }
}

组件/ CrudController.php

class CrudController extends CController
{
    public $crudModel='';    
    public $crudModelString='';
    public $menu=array();
    public $breadcrumbs=array();

    public function filters()
    {
        return array(
            'accessControl', // perform access control for CRUD operations
        );
    }

    public function accessRules()
        {
        return array(
            array('allow',  // allow all users to perform 'list' and 'show' actions
                'actions'=>array('index', 'view'),
                'users'=>array('*'),
            ),
            array('allow', // allow authenticated users to perform any action
                'users'=>array('@'),
            ),
            array('deny',  // deny all users
                'users'=>array('*'),
            ),
        );
    }

    public function actionIndex()
    {
        $model=new $this->crudModel('search');
        $model->unsetAttributes();  // clear any default values
        if(isset($_GET[$this->crudModel]))
            $model->attributes=$_GET[$this->crudModel];

        $this->render('/crud/index',array(
            'model'=>$model,
        ));
    }        

    public function actionView($id)
    {
        $this->render('/crud/view',array(
            'model'=>$this->loadModel($id),
        ));
    }

...
Some code
...

    public function loadModel($id)
    {
        $model=Crud::model()->findByPk($id);
        if($model===null)
            throw new CHttpException(404,'The requested page does not exist.');
        return $model;
    }

...
Some code
...}

控制器/ CountryController.php

class CountryController extends CrudController
{
    public $crudModel='Country';
    public $crudModelString='country';    
}

它在索引操作中正常工作,但是?r = country / view&amp; id = 278向我发送错误

The table "Crud" for active record class "Crud" cannot be found in the database.

如何将表名发送到静态方法并使此代码正常工作?

1 个答案:

答案 0 :(得分:3)

像这样更改loadModel

public function loadModel($id)
{
    $model=Crud::model($this->crudModel)->findByPk($id);
    if($model===null)
        throw new CHttpException(404,'The requested page does not exist.');
    return $model;
}

这将加载相应表格的模型。

相关问题