2015-10-09 14 views
6

Tôi đang sử dụng Laravel 4.2, với các bảng dữ liệu jQuery phía máy chủ.jquery datatables, sắp xếp tùy chỉnh ở phía máy chủ

Gói: https://github.com/Chumper/Datatable

Làm cách nào để thêm phân loại tùy chỉnh?

thích các cột tiền tệ, thời gian, v.v.

+0

Làm thế nào về việc sử dụng một cái gì đó như thế này thay vì https://github.com/lazymofo/datagrid, hoặc mở rộng nó với https: // github này.com/ais-one/datagrid_ext –

+0

@AaronGong Có các tùy chọn khác có sẵn nhưng tôi có các bảng dữ liệu tích hợp trên một số trang và tôi không muốn viết lại. – Dev

+0

ok, chúc may mắn sau đó, tôi đã nhìn vào datatables quá và một vài công cụ crud tương tự khác, kết thúc với lazymofo datagrid. –

Trả lời

-2

Bạn chưa kiểm tra tài liệu chưa? Bởi vì nó được giải thích ở đó:

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

Tôi hỏi về sắp xếp tùy chỉnh, không phải thứ tự cột hay bất kỳ thứ gì khác. Sắp xếp tùy chỉnh trong câu trả lời của bạn ở đâu, vui lòng cho tôi biết. – Dev

+0

Bạn có ý nghĩa gì với việc sắp xếp tùy chỉnh? Xin vui lòng cho một lời giải thích hay ví dụ tốt hơn. – mimo

+0

https://www.datatables.net/plug-ins/sorting/currency - đó là dành cho giải pháp JS cuối của khách hàng, tôi trông giống nhau ở phía máy chủ. – Dev

0

LƯU Ý: điều này không sử dụng gói Chumper/Datatable, nhưng nó sử dụng dữ liệu jQuery nên có thể được sử dụng.

Đây là cách tôi đã làm. Đây là một kịch bản trong đó tôi đã có một bảng với các đội bóng đá Mỹ trong đó. Mỗi đội là một thành viên của một Hội nghị, đó là một phần của một bộ phận. Các đội có thể được sắp xếp theo tên nhóm, hội nghị hoặc bộ phận. Dưới đây là mã phía máy chủ được sử dụng để thực hiện việc này. Hơn nữa, chúng có thể được lọc theo hội nghị hoặc phân chia.

/* 
* 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); 
} 

Với bất kỳ may mắn nào, bạn có thể điều chỉnh ví dụ này cho phù hợp với hoàn cảnh của mình. Hi vọng điêu nay co ich!

-1

Bạn không chắc chắn nếu theo số custom sorting, bạn có nghĩa là sắp xếp các hàng bằng cách nhấp vào tiêu đề? Nếu đó là những gì bạn có nghĩa là sau đó bạn có thể xác định chúng ở phía khách hàng bằng cách xác định các thiết lập datatable.

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

Nhưng nếu bạn muốn duy trì một phân loại mặc định của một cột cụ thể khi tải DataTable, sau đó

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

Tôi hy vọng điều này sẽ giúp.

0

đây là cách tôi làm điều đó

n.b. nó không được tối ưu hóa. nhiều hơn hoặc ít hơn một đoạn mã hoàn toàn không có lỗi kiểm tra

chức năng điều khiển laravel (L5.2 của nó nhưng dễ dàng hạ cấp-thể 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); 

tái bút: mã này giả định rằng trường 'dữ liệu' của các cột có thể định sẵn được đặt tên chính xác như tên trường trong cơ sở dữ liệu của bạn. Bạn cũng sẽ cần phải sử dụng một render_function để render cột DataTable như bạn muốn

cột DataTable:

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

render_function dụ:

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

cách này bạn sẽ có cột hiển thị DataTable của bạn theo cách bạn muốn (ví dụ: giá = 10,50 đô la)

và chúng có thể sắp xếp được

Các vấn đề liên quan