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