jquery数据表,服务器端的自定义排序[关闭]
Posted
技术标签:
【中文标题】jquery数据表,服务器端的自定义排序[关闭]【英文标题】:jquery datatables, custom sorting on server side [closed] 【发布时间】:2016-01-07 07:13:53 【问题描述】:我使用的是 Laravel 4.2,带有服务器端 jQuery 数据表。
包裹:https://github.com/Chumper/Datatable
如何添加自定义排序?
比如货币、时间等列
【问题讨论】:
用类似github.com/lazymofo/datagrid的东西怎么样,或者用github.com/ais-one/datagrid_ext扩展它 @AaronGong 还有其他可用选项,但我已经在几页上集成了数据表,我不想重写。 好的,祝你好运,我也在查看数据表和其他一些类似的杂物,最终得到了lazymofo datagrid。 【参考方案1】:注意:这没有使用 Chumper/Datatable 包,但它确实使用了 jQuery 数据表,所以可能会有一些用处。
这就是我的做法。这是一个场景,我有一张桌子,里面有美式橄榄球队。每个团队都是会议的成员,会议是一个部门的一部分。可以按团队名称、会议或部门对团队进行排序。下面是用于实现这一点的服务器端代码。此外,它们可以按会议或部门过滤。
/*
* Route::get( 'api/v1/teams-table', 'APIController@teamsTable' );
*/
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 . '" >',
'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 );
如果运气好的话,您可以调整此示例以适应您的情况。希望这会有所帮助!
【讨论】:
【参考方案2】:我就是这样做的
n.b.它没有优化。或多或少是一个完整的代码sn-p,没有错误检查
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);
附言此代码假定数据表列的“数据”字段的名称与数据库中的字段名称完全相同。 您还需要使用 render_function 来根据需要呈现数据表列
数据表列:
columns: [
data: 'price', orderable: true, searchable: true, render: render_price ,
data: 'anotherField' ,
[...]
],
render_function 示例:
function render_price(price, type, row)
return price + ' USD';
这样您的数据表将按照您想要的方式显示列(例如价格 = 10.50 美元)
它们将是可排序的
【讨论】:
【参考方案3】:如果您尝试按任意顺序对集合或查询结果进行排序,您可以执行以下操作:
$orders = Order::all()->SortBy('currency','desc');
或
$customers = Customers::where('age',$age)->orderBy('currency','desc')->get();
顺便问一下,既然已经有 Laravel 8,为什么还要使用 Laravel 4?
【讨论】:
"对了,既然已经有 Laravel 8,为什么你还在使用 Laravel 4?"因为这是一个 6 岁的问题?【参考方案4】:不确定custom sorting
是否是指通过单击标题对行进行排序?如果这就是您的意思,那么您可以通过定义数据表设置在客户端定义它们。
oSettings = $("#$table->getId()").dataTable().fnSettings();
oSettings.aaSorting = [[6, 'desc']];
但是如果你想在数据表加载时保持特定列的默认排序,那么
Datatable::table()
->addColumn($theader) // these are the column headings to be shown
->setOptions('order', array([$ordercolumn ,"desc"]))
->setUrl(route('route.name', $form_id))
->render()
我希望这会有所帮助。
【讨论】:
【参考方案5】:您没有检查文档吗?因为那里有解释:
public function getDatatable() return Datatable::collection(User::all(array('id','name'))) ->showColumns('id', 'name') ->searchColumns('name') ->orderColumns('id','name') ->make();
【讨论】:
我问的是自定义排序,而不是列顺序或其他任何内容。您的答案中的自定义排序在哪里,请告诉我。 自定义排序是什么意思?请给出更好的解释或例子。 datatables.net/plug-ins/sorting/currency - 用于客户端 JS 解决方案,我在服务器端看起来相同。以上是关于jquery数据表,服务器端的自定义排序[关闭]的主要内容,如果未能解决你的问题,请参考以下文章