Yii cgridview使用动态主动记录模型

时间:2013-09-06 05:49:56

标签: yii cgridview

我正在使用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,
));

1 个答案:

答案 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表加载。不鼓励这种做法,但这是我看到解决问题的唯一方法。