msieprawski / resource-table
Laravel DataTable 的替代方案
Requires
- php: >=5.4.0
- illuminate/support: ~5
README
关于
这个 Laravel 软件包是为了替代 DataTable 而创建的。它不使用 AJAX 或任何 JavaScript。它非常轻量且可扩展。使用它生成数据表,无需关注搜索/排序/分页结果。它会自己完成!我会尽我最大的努力持续开发它,因为我会在我的项目中使用它。
待办事项
- 可搜索列的默认值
- 更多可搜索列类型 (日期,日期时间,范围)
- 添加一些测试
兼容性
当前软件包与 Laravel 5 兼容
功能概述
- 支持 Eloquent ORM 和 Fluent 查询构建器
- 能够连接表并根据连接的列排序结果
- 可搜索列 - 选择或文本字段!
- 支持过滤回调
- 自定义分页布局 (在 Laravel 5 中称为演示者)
- 翻译
- 更多即将到来...
安装
将以下内容添加到您的 composer.json
文件中
"msieprawski/resource-table": "*"
然后使用 Laravel 注册此服务提供程序
'Msieprawski\ResourceTable\ResourceTableServiceProvider',
并为方便使用添加类别名
'ResourceTable' => 'Msieprawski\ResourceTable\ResourceTable',
当需要时,不要忘记使用 composer update
和 composer dump-autoload
!
用法
您只需创建一个带有准备好的构建器对象的 ResourceTable
。然后添加列并调用 make()
。就是这样!
示例
示例 1:简单使用
$news = DB::table('news') ->select(['news.id', 'news.subject']); echo ResourceTable::of($news) ->addColumn([ 'index' => 'id', 'label' => 'ID', 'sortable' => true, ]) ->addColumn([ 'index' => 'subject', 'label' => 'Subject', 'sortable' => true, ]) ->make();
示例 2:添加列
$news = DB::table('news') ->select(['news.id', 'news.subject']); echo ResourceTable::of($news) ->addColumn([ 'index' => 'id', 'label' => 'ID', 'sortable' => true, ]) ->addColumn([ 'index' => 'subject', 'label' => 'Subject', 'sortable' => true, ]) ->addColumn([ 'index' => 'operations', 'label' => 'Operations', 'sortable' => false, 'renderer' => function ($row) { return '<a href="'.url('news/'.$row->id.'/delete').'">Delete</a>'; } ]) // Or you can use a string which is a name of renderer class // NOTE: all renderer objects must have callable "render" method - an $row stdClass will be given with all row data ->addColumn([ 'index' => 'operations', 'label' => 'Operations', 'sortable' => false, 'renderer' => 'Your\Full\Namespace\To\Renderer', ]) ->make();
示例 3:连接表
$news = DB::table('news') ->select(['news.id', 'news.subject', 'categories.name AS category_name']) ->leftJoin('categories', 'news.category_id', '=', 'categories.id'); return ResourceTable::of($news) ->addColumn([ 'index' => 'id', 'label' => 'ID', 'sortable' => true, ]) ->addColumn([ 'index' => 'category_name', 'label' => 'Category', 'sortable' => true, ]) ->addColumn([ 'index' => 'subject', 'label' => 'Subject', 'sortable' => true, ]) ->addColumn([ 'index' => 'operations', 'label' => 'Operations', 'sortable' => false, 'renderer' => function ($row) { return '<a href="'.url('news/'.$row->id.'/delete').'">Delete</a>'; } ]) ->make();
示例 4:设置自定义条件
$news = DB::table('news') ->select(['news.id', 'news.subject']); echo ResourceTable::of($news) ->addColumn([ 'index' => 'id', 'label' => 'ID', 'sortable' => true, ]) ->addColumn([ 'index' => 'subject', 'label' => 'Subject', 'sortable' => true, ]) ->perPage(20) ->page(2) ->paginate(true) ->sort('id', 'DESC') ->filter(true) ->customView('my.custom.view.name') ->make();
其中 perPage(20)
设置每页资源数。方法 page(2)
设置当前页。方法 orderBy('id', 'DESC')
设置默认排序。
示例 5:设置可搜索列
假设您的新闻可以是 event
或 hot_topic
类型。
$news = DB::table('news') ->select(['news.id', 'news.subject', 'news.type']); echo ResourceTable::of($news) ->addColumn([ 'index' => 'id', 'label' => 'ID', 'sortable' => true, ]) ->addColumn([ 'index' => 'subject', 'label' => 'Subject', 'sortable' => true, 'searchable' => true, ]) ->addColumn([ 'index' => 'type', 'label' => 'Type', 'sortable' => true, 'searchable' => true, 'type' => 'select', 'options' => [ 'event' => 'Event', 'hot_topic' => 'Hot topic', ] ]) ->make();
示例 6:自定义过滤逻辑
$news = DB::table('news') ->select(['news.subject']); echo ResourceTable::of($news) ->addColumn([ 'index' => 'subject', 'label' => 'Subject', 'sortable' => true, 'searchable' => true, 'filter' => function($value) { // Do whatever you want with given value! return trim(mb_strtolower(($value)); }, // You can specify column name to search 'filter_column' => 'subject_alias', ]) ->make();
资源表将生成一个包含两行的 thead
标签。第一行将包含标准 th
列,但第二行将包含文本输入或选择字段(取决于列配置)。当前资源表版本支持以下列类型
- 字符串 - 脚本将查找与模式
index LIKE '%value%'
匹配的值 (默认使用) - 选择 - 脚本将查找与模式
index = 'value'
匹配的值
注意
资源表将自动将 所有
选项注入到您的所有选择类型列中,键为 _all
。
创建分页演示者
假设您不想使用默认内置的 Bootstrap 3 分页 HTML 结构来创建您的分页。使用资源表,您可以创建自己的分页或使用内置的 AdminLTEPresenter
。因此,如果您使用 Admin LTE 管理员主题,您不必担心分页 HTML!默认情况下,资源表使用 Bootstrap 3 演示者,这是 Laravel 5 的默认设置。
使用 Admin LTE 分页演示者
$collection = ResourceTable::of($news) ->addColumn... ... ->setPaginationPresenter('Msieprawski\ResourceTable\Presenters\AdminLTEPresenter');
注意
请记住使用类的完整路径!
创建自己的分页演示者
您可以在任何地方创建自己的分页演示者,但建议在您的 app
目录下创建 Presenters
目录。在这个例子中,我在 app/Presenters
目录下创建了 MyCustomPresenter
。
<?php namespace App\Presenters; use Msieprawski\ResourceTable\Presenters\DefaultPresenter; class MyCustomPresenter extends DefaultPresenter { protected function getAvailablePageWrapper($url, $page, $rel = null) { $rel = is_null($rel) ? '' : ' rel="'.$rel.'"'; return '<li class="my-custom-class-here"><a href="'.htmlentities($url).'"'.$rel.'>'.$page.'</a></li>'; } }
所有自定义演示者都必须扩展 DefaultPresenter
类。请随意查看它的工作原理(它基于 Laravel 的 BootstrapThreePresenter)。只需复制负责您想要定制的元素的方法,并更改它!就是这样!
创建自定义演示者后 - 不要忘记在 ResourceTable
中设置它
$collection = ResourceTable::of($news) ->addColumn... ... ->setPaginationPresenter('App\Presenters\MyCustomPresenter');
模板化
资源表允许您创建自己的模板!但如果您不需要使用自己的模板,则可以自由使用以下内置视图之一
simple
(默认)bootstrap
(支持 Bootstrap 3)advanced_example
- 这只是一个高级模板示例,您可以用它作为您自己的模板的蓝图!
使用内置表格模板
如果您想使用核心模板,只需在您的 ResourceTable
对象上调用 view()
方法
$collection = ResourceTable::of($news) ->addColumn... ... ->view('bootstrap');
创建自定义表格模板
创建自己的 blade 视图文件,命名您想要的名称。在这个例子中,我将在 tables
目录下创建一个名为 my_table.blade.php
的文件。假设我需要在 <tbody>
中的每个 <tr>
节点上放置自定义属性
@if ($collection_generator->renderFilterForm()) <form method="GET" action="{{ $table->filterFormAction() }}"> <div class="resource-table-buttons"> <a href="{{ $collection_generator->resetFormUrl() }}" class="btn btn-default">Reset form</a> <button type="submit" class="btn btn-success">Search</button> </div> @endif <table class="my-resource-table"> {!! $table->head() !!} <tbody> @if (empty($collection)) <tr><td colspan="{{ count($columns) }}">No records found.</td></tr> @else @foreach ($collection as $row) <!-- Here is my custom attribute --> <tr data-id="{{ $row->id }}"> @foreach ($columns as $column) <td>{!! $column->content($row) !!}</td> @endforeach </tr> @endforeach @endif </tbody> </table> @if ($collection_generator->renderFilterForm()) </form> @endif @if ($paginator) {!! $paginator->render() !!} @endif
在每一个视图模板中,您都可以自由使用以下变量
$collection
- 包含所有结果的数组 (实际上是一个数组的数组)$columns
- 包含表格列对象的数组(查看Msieprawski\ResourceTable\Helpers\Column
以获取可用方法)$paginator
- Laravel 内置的分页演示者(目前是Illuminate\Pagination\BootstrapThreePresenter
)$table
- 表生成器对象(查看Msieprawski\ResourceTable\Generators\Table
以获取可用方法)$collection_generator
- 集合生成器对象(查看Msieprawski\ResourceTable\Generators\Collection
以获取可用方法)
最后,告诉您的 ResourceTable
对象使用您的自定义模板
$collection = ResourceTable::of($news) ->addColumn... ... ->customView('tables.my_table');
自动生成的可搜索列内容
假设您想在自定义模板中使用 $column->searchableContent()
,但想为每个输入或占位符添加自定义类。这非常简单
@foreach ($columns as $column) @if (!$column->searchable()) <td></td> @else <td>{!! $column->searchableContent(['control_class' => 'form-control input-sm my-custom-class', 'placeholder' => 'Custom placeholder for '.$column->label()]) !!}</td> @endif @endforeach
为每个 ResourceTable 对象设置默认配置
如果您想为每个 ResourceTable 对象设置 bootstrap
视图或您想设置每页 100 个元素,您可以使用 ResourceTable 可用的静态函数
ResourceTable::setPaginationPresenter()
- 设置自定义或内置分页演示者对象名称ResourceTable::setView()
- 如果您想使用内置模板,请使用此方法ResourceTable::setCustomView()
- 如果您已创建自己的模板,请使用此方法ResourceTable::setPaginate()
- 启用/禁用分页ResourceTable::setPerPage()
- 每页显示多少个结果ResourceTable::setPage()
- 硬编码特定页面 (不确定我为什么创建了这个)ResourceTable::setFilter()
- 启用/禁用结果过滤器ResourceTable::setRendererNamespace()
- 设置默认渲染器类命名空间以防止类名过长。您可以在AppServiceProvider
对象的boot
方法中调用它
public function boot() { ResourceTable::setView('bootstrap') ResourceTable::setPaginationPresenter('App\Presenters\MyCustomPresenter') }
翻译
ResourceTable 有内置的波兰语和英语翻译。如果您为更多语言创建了翻译,请与我联系 - 我很高兴与其他人分享!如果您想使用自己的翻译或覆盖现有翻译,请遵循 Laravel 提供的说明 这里。请使用 resource-table
作为包名称,并使用 default.php
作为翻译文件。
<?php return [ 'No_records' => 'No records found.', 'Search' => 'Search', 'Reset_form' => 'Reset form', 'All' => 'All', 'Search_for' => 'Search for', ];
许可证
MIT 许可证下授权