我正在使用Yii-dynamic-active-record模型类来获取数据并将数据放入各种数据库表。现在我想使用cgridview快速构建这些数据的一些视图,但是我正在为这个类写一个搜索函数。
我知道我总是可以在视图中做一个foreach循环并制作我自己的html表,但是如果我能让Yii方式工作那对DRY来说很棒。
*所有的db表都有一个ID列,这是唯一真正需要显示的列...如果你能获得所有可能只是奖励积分的列。
谢谢:)
模型
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('ID',$this->ID);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
查看
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'entry-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'ID',
),
));
控制器
$tablename=$_GET['tname'];
$table=Entry::forTable($tablename);
$model=$table->findAll();
if(isset($_GET['Entry']))
$model->attributes=$_GET['Entry'];
$this->render('all',array(
'model'=>$model,
));
答案 0 :(得分:0)
我对你在这里所做的事情感到有些困惑,但我认为我有一个解决方案。首先,在控制器代码的第3行,您拨打$model = $table->findAll();
这可能不是您想要的,因为它会为您提供ActiveRecord[]
。您要做的是将$table
传递给gridview。所以你的控制器代码看起来像这样:
$tablename=$_GET['tname'];
$model=Entry::forTable($tablename);
if(isset($_GET['Entry']))
$model->attributes=$_GET['Entry'];
$this->render('all',array(
'model'=>$model,
));
然后您需要将表名传递给模型中的CActiveDataProvider
:
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('ID',$this->ID);
return new CActiveDataProvider($this->tableName(), array(
'criteria'=>$criteria,
));
}
现在对于“yucky”部分,您需要编辑CActiveRecord
的静态模型方法:
if(isset(self::$_models[$className]))
return self::$_models[$className];
else
{
if(class_exists($className)){
$model=self::$_models[$className]=new $className(null);
$model->_md=new CActiveRecordMetaData($model);
$model->attachBehaviors($model->behaviors());
}
else{
$model = Entry::forTable($className);
}
return $model;
}
这告诉它在不存在该名称的类时从Entry表加载。不鼓励这种做法,但这是我看到解决问题的唯一方法。