【问题标题】:Yii: Sorting and formatting dynamic columnsYii:对动态列进行排序和格式化
【发布时间】:2014-09-07 22:59:46
【问题描述】:

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

我还希望能够对动态列进行排序,但我又遇到了同样的问题,即我没有所有列名。

以前使用过动态查询和网格视图的任何人。请指出正确的方向或提供一些想法。

简而言之,我能够成功地在 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));
}

【问题讨论】:

  • 你能再贴一些代码吗?
  • @user3265427 添加了控制器代码..还查看代码扩展..我已经显示了网格中列的变量 $grid_final 的计算
  • @user3265427 您需要更多信息吗?
  • 抱歉,我想我没有找到解决方案。我以为有一个别名可以按数字访问列,例如:c1、c2、c3,但找不到了。
  • 是否可以查询表并仅获取列名..所以我之前运行此查询以获取列名..然后执行主查询..

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


【解决方案1】:

我在 Yii 中这样创建动态列:

  1. 在 some_table 模型中,我们将其命名为 SomeTable,我声明最大列名数如下:

    公开 $column1, $column2, $column3, $column4;

  2. 我在该模型中创建了一个函数,我们将其命名为“search()”,用于构建 dataProvider,就像您的逻辑状态一样,但我确保 @Column_Names 看起来像这样:

    var_column1 作为 column1,var_column2 作为 column2,等等

  3. 在validation() 中,将所有这些列声明为“搜索”上的安全列
  4. 通过合并模型->属性和所有声明的列及其选项构造一个列数组,并将其分配给视图,就像使用 $grid_final 变量一样

这里唯一的缺点是您需要知道最大列数,当然,如果您的表具有分配列,那么声明变量分配的大问题。

【讨论】:

  • 我不知道最大列数,但如果有帮助,我知道动态列旁边的列的名称。我的意思是它类似于 known_columns、unknown_dynamic_columns、known_columns
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2022-12-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多