2015-10-09 21 views
6

Używam Laravel 4.2, z tabelami danych jQuery po stronie serwera.datatables jquery, niestandardowe sortowanie po stronie serwera

Opakowanie: https://github.com/Chumper/Datatable

Jak mogę dodać własne sortowania?

jak dla kolumn waluty, czasu itp

+0

Co powiesz na użycie czegoś podobnego zamiast https://github.com/lazymofo/datagrid, lub rozszerzenie go za pomocą tego https: // github.com/ais-one/datagrid_ext –

+0

@AaronGong Istnieją inne opcje, ale mam zintegrowane elementy danych na kilku stronach i nie chcę przepisywania. – Dev

+0

OK, powodzenia, patrzyłem również na datatables i kilka innych podobnych rzeczy, skończyło się na lazymofo datagrid. –

Odpowiedz

-2

Czy nie sprawdził dokumentację? Bo to tam wyjaśnione:

public function getDatatable() { return Datatable::collection(User::all(array('id','name'))) ->showColumns('id', 'name') ->searchColumns('name') ->orderColumns('id','name') ->make(); } 
+0

Pytam o sortowanie niestandardowe, a nie kolejność kolumn czy cokolwiek innego. Gdzie w Twojej odpowiedzi jest niestandardowe sortowanie, daj mi znać. – Dev

+0

Co masz na myśli przy niestandardowym sortowaniu? Proszę podać lepsze wyjaśnienie lub przykład. – mimo

+0

https://www.datatables.net/plug-ins/sorting/currency - czyli dla rozwiązania JS na końcu klienta, wyglądam tak samo po stronie serwera. – Dev

0

UWAGA: to nie skorzystać z pakietu/DataTable Chumper, ale robi użyć DataTables jQuery więc może się przydać.

Oto jak to zrobiłem. Był to scenariusz, w którym miałem stolik z amerykańskimi drużynami futbolowymi. Każda drużyna była członkiem Konferencji, która była częścią Dywizji. Zespoły mogą być sortowane według nazwy zespołu, konferencji lub działu. Poniżej znajduje się kod po stronie serwera służący do implementacji tego. Ponadto mogą być filtrowane przez konferencję lub podział.

/* 
* Route::get('api/v1/teams-table', '[email protected]'); 
*/ 
public function dataTable() { 
    // get the input parameters 
    $i = Input::all(); 

    // parse the parameters and set default values 
    $draw = isset($i[ 'draw' ]) ? $i[ 'draw' ] : 1; 
    $start = isset($i[ 'start' ]) ? $i[ 'start' ] : 0; 
    $length = isset($i[ 'length' ]) ? $i[ 'length' ] : 10; 
    $search = isset($i[ 'search' ][ 'value' ]) && '' != $i[ 'search' ][ 'value' ] ? $i[ 'search' ][ 'value' ] : false; 
    $ordrby = isset($i[ 'order' ]) ? $i[ 'columns' ][ $i[ 'order' ][ 0 ][ 'column' ] ][ 'name' ] : ''; 
    $ordrdr = isset($i[ 'order' ]) ? $i[ 'order' ][ 0 ][ 'dir' ] : 'asc'; 
    $total = Team::count(); 
    $filter = $total; 


    // get the data 
    if ('' == $search) { 
     switch($ordrby) { 
      case 'name': 
       $teams = Team::with('conferences', 'logo', 'conferences.division') 
        ->skip($start) 
        ->take($length) 
        ->orderBy('name', $ordrdr) 
        ->get(); 
       break; 
      case 'conference': 
       $teams = Team::with('conferences', 'logo', 'conferences.division') 
        ->join('conference_team', 'conference_team.team_id', '=', 'teams.id')->join('conferences', 'conferences.id', '=', 'conference_team.conference_id') 
        ->orderBy('conferences.abbr', $ordrdr) 
        ->skip($start) 
        ->take($length) 
        ->get(); 
       break; 
      case 'division': 
       $teams = Team::with('conferences', 'logo', 'conferences.division') 
        ->skip($start) 
        ->take($length) 
        ->conference() 
        ->division() 
        ->orderBy('abbr', $ordrdr) 
        ->get(); 
       break; 
      default: 
       $teams = Team::with([ 'conferences', 'logo', 'conferences.division' ]) 
        ->skip($start) 
        ->take($length) 
        ->get(); 
     } 
    } else { 
     $teams = Team::with('conferences', 'logo', 'conferences.division') 
      ->skip($start) 
      ->take($length) 
      ->where('name', 'LIKE', '%' . $search . '%') 
      ->orWhereHas('conferences', function($q) use ($search) { 
       $q->where('abbr', 'LIKE', '%' . $search . '%') 
        ->orWhereHas('division', function($qu) use ($search) { 
         $qu->where('abbr', 'LIKE', '%' . $search . '%'); 
        }); 
      }) 
      ->get(); 
     $filter = Team::with('conferences', 'logo', 'conferences.division') 
      ->where('name', 'LIKE', '%' . $search . '%') 
      ->orWhereHas('conferences', function($q) use ($search) { 
       $q->where('abbr', 'LIKE', '%' . $search . '%') 
        ->orWhereHas('division', function($qu) use ($search) { 
         $qu->where('abbr', 'LIKE', '%' . $search . '%'); 
        }); 
      }) 
      ->count(); 
    } 

    // loop through the retrieved data and format it to be returned as JSON 
    $data = []; 
    foreach ($teams as $t) { 
     $show = URL::route('admin.team.show', $t->slug); 
     $edit = URL::route('admin.team.depth_chart', $t->slug); 
     $data[] = [ 
      'checkbox' => '<label><input type="checkbox" class="ace" value="' . $t->id . '" /><span class="lbl"></span></label>', 
      'logo'  => '<img src="' . $t->logo->filename . '" alt="' . $t->name . ' logo" height="40">', 
      'name'  => [ 
       'display' => link_to_route('admin.team.show', $t->name, [ $t->slug ]), 
       'filter' => $t->name, 
       'sort' => $t->name, 
      ], 
      'conference' => [ 
       'display' => link_to_route('admin.conference.show', $t->conferences[ 0 ]->abbr, [ $t->conferences[ 0 ]->slug ]), 
       'filter' => $t->conferences[ 0 ]->name . ' ' . $t->conferences[ 0 ]->abbr, 
       'sort' => $t->conferences[ 0 ]->abbr, 
      ], 
      'division' => [ 
       'display' => link_to_route('admin.division.show', $t->conferences[ 0 ]->division->abbr, [ $t->conferences[ 0 ]->division->slug ]), 
       'filter' => $t->conferences[ 0 ]->division->name . ' ' . $t->conferences[ 0 ]->division->abbr, 
       'sort' => $t->conferences[ 0 ]->division->abbr, 
      ], 
      'site'  => '<a target="_blank" href="' . $t->url . '">website <i class="fa fa-external-link"></i></a>', 
      'actions' => sprintf($this->actions, $show, $edit, $show, $edit), 
     ]; 
    } 

    $tdata = [ 
     'draw'   => $draw, 
     'recordsTotal' => $total, //consider caching or setting fixed value for this 
     'recordsFiltered' => $filter, 
     'data'   => $data, 
    ]; 

    return Response::json($tdata); 
} 

Przy odrobinie szczęścia możesz dostosować ten przykład do swojej sytuacji. Mam nadzieję że to pomoże!

-1

Nie masz pewności, czy przez custom sorting masz na myśli sortowanie wierszy przez kliknięcie nagłówków? Jeśli to masz na myśli, możesz zdefiniować je po stronie klienta, definiując ustawienia danych.

oSettings = $("#{{$table->getId()}}").dataTable().fnSettings(); 
oSettings.aaSorting = [[6, 'desc']]; 

Ale jeśli chcesz zachować domyślnego sortowania danej kolumnie po DataTable ładunki, a następnie

Datatable::table() 
     ->addColumn($theader)  // these are the column headings to be shown 
     ->setOptions('order', array([$ordercolumn ,"desc"])) 
     ->setUrl(route('route.name', $form_id)) 
     ->render() 

Mam nadzieję, że to pomaga.

0

Tak to robię:

n.b. nie jest zoptymalizowany. mniej lub bardziej kompletne fragment kodu bez kontroli błędów

funkcję kontrolera laravel (to L5.2, ale łatwo downgrade'u-stanie 4.2):

$response = array(); 
    $query = MyModel::query(); 

    $response['recordsTotal'] = MyModel::count(); 
    $response['draw'] = Input::get('draw', 0); 

    $query->where('searchField', 'LIKE', '%' . Input::get('search', array('value' => ''))['value'] . '%'); 
    $response['recordsFiltered'] = $query->count(); 

    $query->take(Input::get('length', 1)); 
    $query->offset(Input::get('start', 0)); 


    $columns = Input::get('columns'); 
    $orders = Input::get('order', []); 

    $data = $data->toArray(); 
    foreach($orders as $order){ 
     $idx = $order['column']; 
     $column = $columns[$idx]; 

     $orderFactor = 1; 
     if($order['dir'] == 'desc') 
      $orderFactor = -1; 
     $dname = $column['data']; 
     if(count($data)>0){ 
      if(isset($data[0][$dname])){ 
       usort($data, function($record1, $record2) use($dname, $orderFactor){ 
        // here you implement your custom sorting 
        // like if($dname === 'price') return compare_price($record1[$dname], $record2[$dname]) * $orderFactor; 
        // but I hope you're not storing prices as strings in your database. you won't need this custom sorting 
        // 
        return strcmp($record1[$dname], $record2[$dname]) * $orderFactor; 
       }); 
      } 
     } 
    } 
    $response['data'] = $data; 
    return Response::json($response); 

PS: ten kod zakłada, że ​​pole "data" w datowalnych kolumnach jest dokładnie nazywane nazwą pola w bazie danych. Potrzebny będzie również korzystać z render_function renderować kolumnę DataTable jak chcesz

DataTable kolumny: Przykład

columns: [ 
    { data: 'price', orderable: true, searchable: true, render: render_price }, 
    { data: 'anotherField' }, 
    [...] 
], 

render_function:

function render_price(price, type, row) { 
     return price + ' USD'; 
    } 

ten sposób będziesz mieć swoje DataTable kolumny wyświetlające tak, jak chcesz (np. cena = 10,50 $)

i będą one sortowalne

Powiązane problemy