Yii:对动态列进行排序和格式化

时间:2014-07-17 07:26:17

标签: sql-server sorting gridview yii dynamic-sql

我使用CSqlDataProvider从动态SQL查询中显示CGridView中的数据。有一些静态和一些动态列。现在我想在动态列中做一些像货币这样的特殊格式。但是,如果在查询执行之前我不知道列的编号/名称,我该怎么做呢。

此外,我希望能够对动态列进行排序,并且我还有同样的问题,即我没有所有列名称。

之前使用动态查询和gridview的任何人。请指点我正确的方向或提出一些想法如何去做。

简而言之,我能够在gridview(也是动态行)中成功显示数据并对所有静态列进行排序。只需要对动态行进行排序并格式化动态&静态列

GridView代码:

$tdata=$dataProvider->getData();
//Calculation to get column names
$grid_columns = array_keys($tdata[0]);

foreach($grid_columns as $i=>$ii)
{
//Applying Formula to get Total Row
$grid_final[$i] = array('name'=>$ii,'class'=>'bootstrap.widgets.TbTotalSumColumn'); 
}
//Grid View
$this->widget('bootstrap.widgets.TbExtendedGridView', array(
'sortableRows'=>true,
'afterSortableUpdate' => 'js:function(id, position){ console.log("id: "+id+", position:"+position);}',
'dataProvider'=>$dataProvider,
'type'=>'striped bordered',
'template' => "{items}\n{extendedSummary}",
'columns'=> $grid_final, 
 ));

控制器代码:

public function actionIndex()
{

     if(isset($_GET['month']))
     {

       $month=$_GET['month'];
     }
     else
      {
       $month= 7;
      }
   //SQL Query with Dynamic Columns      
    $sql = "SELECt ABC,X,Y,Z, @Column_Names
            FROM some_table
            WHERE [month] = :month";

$connection=Yii::app()->db;
$command=$connection->createCommand($sql);
$command->bindParam(':month',$month,PDO::PARAM_STR);
$dataProvider=new CSqlDataProvider($sql,array('keyField' => 'ABC','params' => array(
              ':month' => $month,
               ),'sort' => array(
              //Here how do i put column names which i don't know yet for sorting
                 'attributes' => array(
                    'ABC','X','Y','Z' )),'pagination'=>false));
    $this->render('index',array('dataProvider' => $dataProvider, 'month' => $month));
}

2 个答案:

答案 0 :(得分:0)

我在Yii中创建动态列,如下所示:

  1. 在some_table模型中,让我们将其命名为SomeTable,我声明了这样的最大列名数:

    public $ column1,$ column2,$ column3,$ column4;

  2. 我在该模型中创建了一个函数,让它命名为' search()'构建dataProvider,就像你的逻辑状态一样,但我确保@Column_Names看起来像这样:

    var_column1为column1,var_column2为column2,等等。

  3. 验证()中的
  4. ,在' search'
  5. 中声明所有这些列都是安全的
  6. 构造一个列数组,它由合并model->属性和所有声明的列及其选项组成,并将其分配给视图,就像使用$ grid_final变量一样
  7. 这里唯一的缺点是你需要知道列的最大数量,当然,如果你有包含大量列的表,那么声明分配变量的大问题。

答案 1 :(得分:0)

如果能够在渲染网格之前获取列,则还可以更改数据提供者的排序条件。 像这样:

$tdata=$dataProvider->getData();
//Calculation to get column names
$grid_columns = array_keys($tdata[0]);

$dataProvider->setSort(array('attributes'=> $grid_columns));

或者您当然可以根据您拥有的任何逻辑,使用特定设置或特定格式准备您自己的属性数组。问题是 - 一旦你在$grid_columns中有列,就可以根据需要更改dataProvider排序或gridColumn设置。