使用动态活动记录模型的Yii-cgridview

使用动态活动记录模型的Yii-cgridview,yii,cgridview,Yii,Cgridview,我使用model类获取数据并将其放入各种数据库表中。现在我想使用cgridview快速构建这些数据的一些视图,但是我在为这个类编写搜索函数时遇到了麻烦 我知道我总是可以在视图中执行foreach循环,并创建自己的html表,但是如果我可以使用Yii方式,这对DRY来说将是非常好的 *所有db表都有一个ID列,这是唯一真正需要显示的列。。。如果你能得到所有的专栏,那将是额外的分数 谢谢:) 模型 看法 控制器 $tablename=$_GET['tname']; $table=Entry::for

我使用model类获取数据并将其放入各种数据库表中。现在我想使用cgridview快速构建这些数据的一些视图,但是我在为这个类编写搜索函数时遇到了麻烦

我知道我总是可以在视图中执行foreach循环,并创建自己的html表,但是如果我可以使用Yii方式,这对DRY来说将是非常好的

*所有db表都有一个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,
));

我对你在这里所做的有点困惑,但我认为我有一个解决办法。首先,在控制器代码的第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,
));
然后需要将表名传递给模型中的
cactivedaptrovider

public function search()
{
    $criteria=new CDbCriteria;
    $criteria->compare('ID',$this->ID);

    return new CActiveDataProvider($this->tableName(), array(
        'criteria'=>$criteria,
    ));
}
现在,对于“令人讨厌”的部分,您需要编辑
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.php”是动态活动记录,上面的搜索函数在该类中。我认为在cgridview中有一些神奇的Yii东西,假设模型类名是db表(或者可能是搜索函数中的$this),我不确定如何克服这一点。对于上面的例子,我得到一个错误500,说在数据库中找不到条目表。我用一个有效的解决方案编辑了我的答案,但是有点“恶心”。我尝试了你的解决方案三次,但我一直得到一个错误500,说:include(my_first_table.php):未能打开流:没有这样的文件或目录include(first_form.php):无法打开流:没有这样的文件或目录(/vendor/yiisoft/yii/framework/YiiBase.php:421)我需要完整的堆栈跟踪来查找问题,yii应该输出一个错误页面,其中包含从源到问题的所有调用,如果不这样做,请尝试启用调试模式。
public function search()
{
    $criteria=new CDbCriteria;
    $criteria->compare('ID',$this->ID);

    return new CActiveDataProvider($this->tableName(), array(
        'criteria'=>$criteria,
    ));
}
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;
}