20個のテーブルを持つプロジェクトがあります。すべてのテーブルのデータの管理は同じになります。テーブルの列のみが異なります。したがって、すべてのテーブルに共通のモデル、共通のコントローラー、および共通のビューフォルダーを作成し、その後、各テーブルのこのすべてのクラスのみを拡張します。
models / 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,
));
}
}
models / 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'),
);
}
}
components / 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
...}
controllers / CountryController.php
class CountryController extends CrudController
{
public $crudModel='Country';
public $crudModelString='country';
}
インデックスアクションでは正しく機能しますが、?r = country / view&id=278はエラーを送信します
The table "Crud" for active record class "Crud" cannot be found in the database.
テーブル名を静的メソッドに送信し、このコードを正しく機能させるにはどうすればよいですか?