2014-07-17 11 views
6

Wyświetlam dane w CGridView z dynamicznego kwerendy SQL przy użyciu CSqlDataProvider. Istnieje pewna statyczna i dynamiczna kolumna. Teraz chcę zrobić specjalne formatowanie, takie jak waluta w dynamicznych kolumnach. Ale jak to zrobić, gdy nie znam liczby/nazwy kolumn, dopóki nie zostanie wykonane zapytanie.Yii: Sortowanie i formatowanie kolumn dynamicznych

Chcę również móc sortować dynamiczne kolumny i znowu mam ten sam problem, że nie mam wszystkich nazw kolumn.

Ktoś, kto pracował z dynamicznymi zapytaniami i gridview. Proszę wskazać mi właściwy kierunek lub podać kilka pomysłów, jak to zrobić.

W skrócie mogę wyświetlić dane w widoku siatki (również w wierszach dynamicznych) i posortować wszystkie statyczne kolumny. Wystarczy posortować dynamicznych wierszy i format dynamiczne & statyczne kolumny

kod dla 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, 
)); 

Kod Kontroler:

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)); 
} 
+0

Czy możesz dodać jeszcze jeden kod? – kasoft

+0

@ user3265427 Dodano kod kontrolera .. Zobacz także rozszerzony kod. Pokazałem obliczenia dla zmiennej $ grid_final dla kolumn w siatce – neophyte

+0

@ user3265427 potrzebujesz więcej informacji? – neophyte

Odpowiedz

0

tworzyć dynamiczne kolumny w Yii tak:

  1. W modelu some_table, nazwijmy go SomeTable, deklaruję maksymalną liczbę r nazw kolumn takich jak to:

    public kolumna 1, kolumna 2, kolumna 3, kolumna 4;

  2. utworzyć funkcję w tym modelu, nazwijmy go „szukaj()”, która buduje dataProvider, jak swoich stanów logicznych, ale upewnij się, że @Column_Names wygląda mniej więcej tak:

    var_column1 jako kolumna1, var_column2 jak Kolumna2 itp

  3. w walidacji(), zgłosić wszystkie te kolumny jako bezpieczne na „szukaj”
  4. skonstruować tablicę kolumny utworzoną z połączenia model-> atrybuty i wszystkie zadeklarowane kolumny z ich opcji i przypisać do widoku, dokładnie tak jak w przypadku zmiennej $ grid_final

Jedyną wadą jest to, że musisz znać maksymalną liczbę kolumn i oczywiście duży problem z deklarowaniem wielu zmiennych, jeśli masz tabele z wieloma kolumnami.

+0

Nie znam maksymalnej liczby kolumn, ale znam nazwy kolumn obok dynamicznych kolumn, jeśli to pomaga. Mam na myśli jej znane kolumny, kolumny_nierozszerzone_dynamiczne, kolumny_znane – neophyte

0

Jeśli można uzyskać kolumny przed renderowaniem siatki, można również zmienić warunki sortowania w przeglądarce danych. coś takiego:

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

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

Można też oczywiście przygotowywać tablicę atrybutów ze specyficznymi ustawieniami lub specyficznego formatowania według dowolnego logiki masz. Rzecz w tym, że - kiedy już masz kolumny w $grid_columns, możesz zmienić sortowanie dataProvider lub ustawienie gridColumn według potrzeb.

Powiązane problemy