Yii: сортировка и форматирование динамических столбцов

Я показываю данные в CGridView из динамического запроса SQL с использованием CSqlDataProvider. Есть некоторые статические и некоторые динамические столбцы. Теперь я хочу сделать специальное форматирование, например, валюта в динамических столбцах. Но как мне это сделать, когда я не знаю номер / имя столбца, пока запрос не будет выполнен.

Также я хочу иметь возможность сортировать динамические столбцы, и снова у меня та же проблема, что у меня нет всех имен столбцов.

Любой, кто раньше работал с динамическими запросами и 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 ответа

Я создаю динамические столбцы в Yii следующим образом:

  1. В модели some_table, давайте назовем ее SomeTable, я объявляю максимальное количество имен столбцов следующим образом:

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

  2. Я создаю функцию в этой модели, назовем ее "search()", которая создает dataProvider, как ваши логические состояния, но я уверен, что @Column_Names выглядит примерно так:

    var_column1 как column1, var_column2 как column2 и т. д.

  3. в validation() объявите все эти столбцы как безопасные при "поиске"
  4. создайте массив столбцов, сформированный из слияния атрибутов модели-> и всех объявленных столбцов с их параметрами, и назначьте его представлению, точно так же, как вы делаете это с переменной $grid_final

Единственным недостатком здесь является то, что вам нужно знать максимальное количество столбцов, и, конечно, большая проблема объявления распределения переменных, если у вас есть таблицы с распределением столбцов.

Если вы можете получить столбцы до визуализации сетки, вы также можете изменить условия сортировки поставщика данных. Что-то вроде этого:

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

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

Или, конечно, вы можете подготовить свой собственный массив атрибутов с конкретными настройками или определенным форматированием в соответствии с любой вашей логикой. Дело в том, что когда у вас есть столбцы в $grid_columns Вы можете изменить сортировку dataProvider или настройку gridColumn, как вам нужно.

Другие вопросы по тегам