2015-10-09 2 views
6

Я использую Laravel 4.2 с таблицами данных jQuery на стороне сервера.jquery datatables, пользовательская сортировка на стороне сервера

Пакет: https://github.com/Chumper/Datatable

Как я могу добавить пользовательскую сортировку?

как для столбцов валюты, времени и т.д.

+0

Как насчет использования чего-то подобного вместо https://github.com/lazymofo/datagrid или расширения его с помощью этого https: // github.com/ais-one/datagrid_ext –

+0

@AaronGong Существуют и другие доступные опции, но у меня есть интегрированные данные на нескольких страницах, и я не хочу переписывать. – Dev

+0

ОК, удачи тогда, я тоже смотрел на datatables и еще несколько похожих похожих материалов, в итоге оказался lazymofo datagrid. –

ответ

-2

Вы не проверили документацию? Потому что это объяснено там:

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

Я спрашиваю о пользовательской сортировке, а не о столбце или о чем-либо еще. Где пользовательская сортировка в вашем ответе, пожалуйста, дайте мне знать. – Dev

+0

Что вы имеете в виду с пользовательской сортировкой? Пожалуйста, дайте лучшее объяснение или пример. – mimo

+0

https://www.datatables.net/plug-ins/sorting/currency - то есть для решения JS на стороне клиента, я смотрю то же самое на стороне сервера. – Dev

0

Примечание: это не использовать в/DataTable пакета Chumper, но он использует JQuery DataTables так может быть полезен.

Вот как я это сделал. Это был сценарий, в котором у меня был стол с американскими футбольными командами. Каждая команда была участницей Конференции, которая была частью Отдела. Команды могут быть отсортированы по имени команды, конференции или подразделению. Ниже приведен код сервера, используемый для его реализации. Кроме того, они могут быть отфильтрованы конференцией или подразделением.

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

В любом случае вы можете настроить этот пример в соответствии с вашей ситуацией. Надеюсь это поможет!

-1

Не уверен, что по custom sorting вы имеете в виду сортировку строк, нажав на заголовки? Если это то, что вы имеете в виду, вы можете определить их на стороне клиента, указав параметры данных.

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

Но если вы хотите сохранить сортировку по умолчанию определенного столбца, когда DataTable нагрузки, то

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

Я надеюсь, что это помогает.

0

это как я это делаю

n.b. он не оптимизирован. более или менее полный фрагмент кода без проверки ошибок

функции контроллера Laravel (это L5.2, но легко понизить-состоянии до 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); 

P.S. этот код предполагает, что поле данных «данные» столбцов данных называется точно так же, как имя поля в вашей базе данных. Вы также должны использовать render_function для визуализации DataTable колонки, как вы хотите

DataTable колонки:

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

render_function пример:

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

таким образом, вы будете иметь ваши DataTable отображение столбцов (например, цена = 10.50 $)

и они будут сортироваться

 Смежные вопросы

  • Нет связанных вопросов^_^