0

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

1 回答 1

0

我对您在这里所做的事情感到有些困惑,但是我想我有一个解决方案。首先,在控制器代码的第 3 行中,您称$model = $table->findAll();这可能不是您想要的,因为它会为您提供一个ActiveRecord[]. 你想要做的是将你的传递给$tablegridview。所以你的控制器代码看起来像这样:

$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,
    ));
}

现在对于“恶心”部分,您需要将静态模型方法编辑为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;
}

这告诉它在该名称的类不存在时从条目表中加载。不鼓励这种做法,但这是我认为解决您的问题的唯一方法。

于 2013-09-06T12:03:48.523 回答