Примечание: это не использовать в/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);
}
В любом случае вы можете настроить этот пример в соответствии с вашей ситуацией. Надеюсь это поможет!
Как насчет использования чего-то подобного вместо https://github.com/lazymofo/datagrid или расширения его с помощью этого https: // github.com/ais-one/datagrid_ext –
@AaronGong Существуют и другие доступные опции, но у меня есть интегрированные данные на нескольких страницах, и я не хочу переписывать. – Dev
ОК, удачи тогда, я тоже смотрел на datatables и еще несколько похожих похожих материалов, в итоге оказался lazymofo datagrid. –