amunyua / datatable
这是一个laravel 4的包,用于处理服务器和客户端的表格,可在https://datatables.net.cn/找到
Requires
- php: >=5.3.0
- illuminate/config: ^7.30
- illuminate/support: ^7.30
- illuminate/view: ^7.30
Requires (Dev)
- mockery/mockery: ^1.3.1
- orchestra/testbench: ^5.16
- phpunit/phpunit: ^8.5.8|^9.3.3
This package is auto-updated.
Last update: 2024-09-05 15:26:20 UTC
README
这是一个用于https://datatables.net.cn/上服务器和客户端表格的laravel 4包
我开发这个包是因为我对https://github.com/bllim/laravel4-datatables-package上的现有包不满意,所以我开发了这个包,我认为它更优秀。
##重要
如果你升级到v2.2版本,请确保你调整了app.php中的新别名
// aliases array: //old //'Datatable' => 'Chumper\Datatable\Facades\Datatable', //new 'Datatable' => 'Chumper\Datatable\Facades\DatatableFacade',
##已知问题
- 目前还没有我知道的问题
##待办事项
- 修复即将到来的错误
- 代码文档化
##功能
此包支持
- 支持集合和查询构建器
- 易于添加和排序列
- 包含HTML侧面的简单助手
- 在你的列中使用你自己的函数和展示器
- 在你的自定义定义列中搜索(仅集合!)
- 定义你的特定搜索和排序字段
- 为表格添加自定义javascript值
- 已测试!(好吧,可能不是完全的,但我尽力了 :) )
##请注意!
此包的集合部分和查询部分之间存在一些差异。差异如下
有关详细说明,请参阅下面的视频。http://www.youtube.com/watch?v=c9fao_5Jo3Y
请让我知道任何问题或你希望在问题部分中拥有的功能。如果你能提供一个指向问题的测试,我将不胜感激。
##安装
此包可在https://packagist.org.cn上找到,只需将其添加到你的composer.json文件中
"chumper/datatable": "2.*"
它还有一个ServiceProvider,可在Laravel4中使用。将以下行添加到app.php中
// providers array: 'Chumper\Datatable\DatatableServiceProvider', // aliases array: 'Datatable' => 'Chumper\Datatable\Facades\DatatableFacade',
然后你可以通过Datatable
别名访问它。
要覆盖默认配置选项,可以发布配置文件。
php artisan config:publish chumper/datatable
你现在可以编辑这些选项在app/config/packages/chumper/datatable/config.php。
##基本用法
你可以使用两种方式使用此插件:在一个路由内或在两个路由内
###两个路由
- 创建两个路由:一个用于向用户传递视图,另一个用于传递datatable数据,例如
Route::resource('users', 'UsersController'); Route::get('api/users', array('as'=>'api.users', 'uses'=>'UsersController@getDatatable'));
- 你的主路由将向用户传递一个视图。此视图应包含对datatables本地副本的引用。在下面的示例中,文件是从datatables/media目录复制的,并写入public/assets。请注意,脚本必须位于调用Datatable之前
<link rel="stylesheet" type="text/css" href="/assets/css/jquery.dataTables.css"> <script type="text/javascript" src="/assets/js/jquery.js"></script> <script type="text/javascript" src="/assets/js/jquery.dataTables.min.js"></script> {{ Datatable::table() ->addColumn('id','Name') // these are the column headings to be shown ->setUrl(route('api.users')) // this is the route where data will be retrieved ->render() }}
- 创建一个控制器函数以以可由Datatables读取的方式返回你的数据
public function getDatatable() { return Datatable::collection(User::all(array('id','name'))) ->showColumns('id', 'name') ->searchColumns('name') ->orderColumns('id','name') ->make(); }
你现在应该有一个正在工作的表格在你的页面上。
###一个路由
在你的路由中,你应该使用Datatable::shouldHandle方法,该方法将检查插件是否应该处理请求
if(Datatable::shouldHandle()) { return Datatable::collection(User::all(array('id','name'))) ->showColumns('id', 'name') ->searchColumns('name') ->orderColumns('id','name') ->make(); }
插件将随后查询相同的URL以获取信息。shouldHandle方法只是检查ajax请求和sEcho是否设置。
##HTML示例
Datatable::table() ->addColumn('id',Lang::get('user.lastname')) ->setUrl(URL::to('auth/users/table')) ->render();
使用单独的表格和脚本
$table = Datatable::table() ->addColumn('Email2','Email', "Test") ->noScript(); // to render the table: $table->render() // later in the view you can render the javascript: $table->script();
这将生成一个包含两列(id, lastname -> 你的翻译)的HTML表格,并设置ajax请求的URL。
注意:此包不会包含
datatable.js
,这是你的工作。原因是例如我使用Basset,每个人都想用自己的方式做...
如果您想为表格提供自己的模板,只需提供laravel风格的视图路径。
Datatable::table() ->addColumn('id',Lang::get('user.lastname')) ->setUrl(URL::to('auth/users/table')) ->render('views.templates.datatable');
##服务器示例
Datatable::collection(User::all()) ->showColumns('id') ->addColumn('name',function($model) { return $model->getPresenter()->yourProperty } )->make();
这将从集合 User::all()
生成服务器端datatable处理程序。它将添加 id
列,并添加一个自定义列 name
。请注意,我们需要将一个函数作为第二个参数传递,它将 始终 与集合持有的对象一起调用。在这种情况下,将是 User
模型。
您现在还可以访问所有关系,因此对于书籍模型来说,显示作者关系将变得容易。
Datatable::collection(User::all()) ->showColumns('id') ->addColumn('name',function($model) { return $model->author->name; } )->make();
注意:如果您将数组集合传递给
collection
方法,您将在函数中获得一个数组,而不是模型。
列的顺序始终由用户定义,并且与用户添加列到Datatable的顺序相同。
##查询或集合?
查询()和collection()之间有一个区别。集合将在执行任何操作(如搜索或排序)之前进行编译,以便也可以包含您的自定义字段。也就是说,集合方法在性能上不如查询方法,因为搜索和排序将在查询数据库之前进行处理。
因此,如果您有大量条目(100k+),则集合的性能不佳,因为我们需要编译所有条目以提供准确的集合。另一方面,查询无法正确地在自定义字段函数上执行搜索或orderBy。
TLTR:如果您没有自定义字段,则使用query()将更快。如果您有自定义字段但不想在这些字段上提供搜索和/或排序,则使用query()。如果您从其他地方获取数据,则选择collection。如果您有自定义字段并希望在它们上提供搜索和/或排序,则需要使用集合。
请注意,如果使用query与集合相比,搜索和排序功能之间也存在显著差异。请参阅以下视频以获取更多详细信息。
http://www.youtube.com/watch?v=c9fao_5Jo3Y
##可用函数
此包分为两个较小的部分
- Datatable::table()
- Datatable::collection()
- Datatable::query()
后两者用于服务器端,第一个是一个用于生成所需表格和javascript调用的辅助工具。
###集合 & 查询
collection($collection)
将内部引擎设置为集合。为了进一步提高性能,您可以限制列数和行数,例如:
$users = User::activeOnly()->get('id','name');
Datatable::collection($users)->...
query($query)
这将设置内部引擎为一个Eloquent查询... 例如:
$users = DB::table('users');
Datatable::query($users)->...
查询引擎比集合引擎快得多,但也有一些功能缺失,有关更多信息,请参阅上表。
showColumns(...$columns)
这将向结果添加命名列。
注意:您需要按您在模型或数组中访问它的格式传递名称。例如:在数据库中:
last_name
,在模型中lastname
-> showColumns('lastname')
您可以提供任意数量的名称。
searchColumns(..$fields)
将启用表格,以便仅允许在给定的列中进行搜索。请注意,集合的行为与构建器对象不同。
注意:如果您想使用查询引擎在数字列上搜索,则也可以传递一个搜索列,如下所示:
//mysql
->searchColumns(array('id:char:255', 'first_name', 'last_name', 'address', 'email', 'age:char:255'))
//postgree
->searchColumns(array('id:text', 'first_name', 'last_name', 'address', 'email', 'age:text'))
这将把列转换为给定的类型,当在这些列上搜索时
orderColumns(..$fields)
将启用表格,以便仅允许在给定的列中进行排序。请注意,集合的行为与构建器对象不同。
addColumn($name, $function)
将添加一个自定义字段到结果集中,在函数中,您将获得该行的整个模型或数组。例如:
Datatable::collection(User::all()) ->addColumn('name',function($model) { return $model->author->name; } )->make();
您还可以添加预定义的列,例如日期列(DateColumn)、函数列(FunctionColumn)或文本列(TextColumn)。例如:
$column = new TextColumn('foo', 'bar'); // Will always return the text bar //$column = new FunctionColumn('foo', function($model){return $model->bar}); // Will return the bar column //$column = new DateColumn('foo', DateColumn::TIME); // Will return the foo date object as toTimeString() representation //$column = new DateColumn('foo', DateColumn::CUSTOM, 'd.M.Y H:m:i'); // Will return the foo date object as custom representation Datatable::collection(User::all()) ->addColumn($column) ->make();
请查看特定列以获取更多信息。
setAliasMapping()
这将指示Datatable返回与列名映射的数据。所以,而不是
{ "aaData":[ [3,"name","2014-02-02 23:28:14"] ], "sEcho":9, "iTotalRecords":2, "iTotalDisplayRecords":1 }
您将得到如下响应:
{ "aaData":[ {"id":2,"name":"Datatable","created_at":"Sun, Feb 2, 2014 7:17 PM"} ], "sEcho":2, "iTotalRecords":2, "iTotalDisplayRecords":1 }
make()
这将处理请求的输入数据并提供结果集。
没有此命令,则不会返回任何响应。
clearColumns()
这将重置所有列,主要用于测试和调试,对您来说并不太有用。
如果您没有通过
showColumn
或addColumn
提供任何列,则不会显示任何列。查询或集合中的列不会影响显示哪些列。
getOrder()
这将返回一个数组,包含将要显示的列,主要用于测试和调试,对您来说并不太有用。
getColumn($name)
将通过名称获取一个列,主要用于测试和调试,对您来说并不太有用。
###特定的QueryEngine方法
setSearchWithAlias()
如果您想在查询引擎中使用别名列,但在搜索时没有获得正确的结果,那么您应该尝试这个标志。例如:
Datatable::from(DB::table("users")->select('firstname', "users.email as email2")->join('partners','users.partner_id','=','partners.id')) ->showColumns('firstname','email2') ->setSearchWithAlias() ->searchColumns("email2")
在SQL中,不允许在where部分(用于搜索)中使用别名,因此结果计数将不正确。
使用此标志,您将启用搜索部分的别名(在searchColumns中使用email2)。
请注意,此标志将使您的应用程序变慢,因为我们需要两次获取结果来手动计数。
setSearchOperator($value = "LIKE")
使用此方法,您可以设置搜索操作符,例如PostgreSQL中的"ILIKE"(不区分大小写)。
setExactWordSearch
这将建议引擎只搜索给定的搜索字符串。
###特定的CollectionEngine方法
setSearchStrip() & setOrderStrip()
如果您使用搜索功能,则可以建议在搜索此列之前删除所有列的HTML和PHP标签。
如果返回链接到模型详细资料,但仍然想提供此列的搜索功能,这可能会很有用。
setCaseSensitive($boolean = 'false')
设置搜索方法为区分大小写或不区分大小写,默认为false。
###表格
noScript()
设置此属性后,表格将不会渲染JavaScript部分。
您可以使用以下方法手动渲染:
script($view = null)
如果没有提供视图或默认视图,则将渲染JavaScript,并将类名、选项和回调函数传递。
示例
$table = Datatable::table() ->addColumn('Email2','Email', "Test") ->noScript(); // to render the table: $table->render() // later in the view you can render the javascript: $table->script();
setUrl($url)
这将设置URL和选项,以便通过ajax获取内容。
setOptions($name, $value) OR setOptions($array)
这将设置单个选项或选项数组,用于jQuery调用。
setCallbacks($name, $value) OR setCallbacks($array)
这将设置单个回调函数或回调函数数组,用于jQuery调用。DataTables回调函数的描述见https://datatables.net.cn/usage/callbacks。例如:
->setCallbacks( 'fnServerParams', 'function ( aoData ) { aoData.push( { "name": "more_data", "value": "my_value" } ); }' )
addColumn($name)
将向表格添加一列,其中列名将在表格标题中渲染。因此,您可以提供应显示的字符串。
如果您想使用服务器端表格的别名映射功能,则需要添加一个如下的数组
Datatable::table() ->addColumn(array( 'id' => 'ID', 'name' => 'Name', 'created_at' => 'Erstellt' )) ->render();
请注意,将关联数组传递给addColumn函数将自动在表格上启用别名功能
setAliasMapping(boolean)
在此,您可以显式设置表格是否应该使用别名。
countColumns()
这将返回稍后要渲染的列数。主要用于测试和调试。
getData()
将返回将作为数组渲染到表格中的数据。
getOptions()
获取所有选项作为一个数组。
render($view = template.blade)
渲染表格。您可以通过传递视图名称来自定义此操作。请参阅包内的模板以获取有关如何将数据传递给视图的更多信息。
setData($data)
期望一个数组的数组,并在表格显示时渲染这些数据。
setCustomValues($name, $value) 或 setCustomValues($array)
将设置单个自定义值或自定义值的数组,这些值将传递给视图。您可以在自定义视图文件中访问这些值。例如,如果您想点击行中的任何位置跳转到一条记录(其中记录ID位于表格的第一列)
在调用视图中
{{ DataTable::table() ->addColumn($columns) ->setUrl($ajaxRouteToTableData) ->setCustomValues('table-url', $pathToTableDataLinks) ->render('my.datatable.template') }}
在表格视图(例如,'my.datatable.template')中
@if (isset($values['table-url'])) $('.{{$class}}').hover(function() { $(this).css('cursor', 'pointer'); }); $('.{{$class}}').on('click', 'tbody tr', function(e) { $id = e.currentTarget.children[0].innerHTML; $url = e.currentTarget.baseURI; document.location.href = "{{ $values['table-url'] }}/" + $id; }); @endif
##贡献者
##更改日志
- 2.0.0:
- 分离查询和集合引擎
- 添加单列搜索
- 代码清理
##应用
https://github.com/hillelcoren/invoice-ninja (由 Hillel Coren)
##许可协议
此包遵循MIT许可协议