groupedadoun / datatables-lw
mediconesystems/livewire-datatables的分支
Requires
- php: ^7.2.5
- illuminate/support: ^7.0|^8.0
- livewire/livewire: ^1.2|^2.0
- maatwebsite/excel: ^3.1
Requires (Dev)
- laravel/legacy-factories: ^1.0.4
- orchestra/testbench: ^4.0|5.0|6.0
- phpunit/phpunit: ^8.0|9.0
This package is auto-updated.
Last update: 2021-10-05 07:34:12 UTC
README
Livewire Datatables的分支Livewire Datatables
特性
- 使用模型或查询构建器提供数据
- 使用预设或自定义回调修改和格式化列
- 使用列或计算列排序数据
- 使用布尔值、时间、日期、选择或自由文本进行过滤
- 显示/隐藏列
实时演示应用
演示应用仓库
要求
安装
您可以通过composer安装此包
composer require mediconesystems/livewire-datatables
可选
您不必这样做,但如果您喜欢,可以发布配置文件和blade模板资产
php artisan vendor:publish
这将使您能够修改blade视图并应用自己的样式,datatables视图将发布到resources/livewire/datatables。配置文件包含整个应用中使用的默认时间和日期格式
- 如果您在项目中使用Purge CSS,这将非常有用,以确保所有livewire-datatables类都被包含
内置的许多动态组件都使用Alpine JS,所以要消除页面加载时的闪烁,请确保您在CSS中有以下内容
[x-cloak] { display: none; }
某个地方
基本用法
- 在blade视图中使用
livewire-datatable
组件,并传入一个模型
... <livewire:datatable model="App\User" /> ...
模板语法
- 有多种方法可以通过传递额外的属性到组件来修改表格
<livewire:datatable model="App\User" include="id, name, dob, created_at" dates="dob" />
属性
属性 | 参数 | 结果 | 示例 |
---|---|---|---|
model | String 完整模型名称 | 定义表格的基础模型 | model="App\Post" |
include | String|Array 列定义的数组 | 指定要显示在表格中的列,可以使用|分隔符指定标签 | ```include="name, email, dob |
exclude | String|Array 列定义的数组 | 列将从表格中排除 | :exclude="['created_at', 'updated_at']" |
hide | String|Array 列定义的数组 | 列存在,但初始为隐藏 | hidden="email_verified_at" |
dates | String|Array 列定义的数组[和可选格式,使用|分隔的字符串] | 列值按照默认日期格式格式化,或者可以在字符串中包含格式,使用|分隔符 | ```:dates="['dob |
times | String|Array 列定义的数组[可选格式,使用|分隔的字符串] | 列值按照默认时间格式格式化,或者可以在字符串中包含格式,使用|分隔符 | ```'bedtime |
searchable | 列名的字符串|数组 | 定义包含在全局搜索中的列 | searchable="name, email" |
排序 | 列定义的字符串 [以及可选的 'asc' 或 'desc' (默认: 'desc'),用 | 分隔的字符串] | 指定初始表格排序的列和方向。默认为第 0 列降序 | ```sort="name |
hide-header | 布尔值 默认: false | 如果此值为 true ,则移除包含列标题的表格顶部行 |
|
hide-pagination | 布尔值 默认: false | 如果此值为 true ,则移除分页控件 |
|
per-page | 整数 默认: 10 | 每页行数 | per-page="20" |
exportable | 布尔值 默认: false | 允许导出表格 | <livewire:datatable model="App/Post" exportable /> |
hideable | 字符串 | 提供显示/隐藏列的能力,接受字符串 'inline'、'buttons' 或 'select' | <livewire:datatable model="App/Post" hideable="inline" /> |
beforeTableSlot | 字符串 | 在组件中立即在表格之前包含的 blade 视图,因此可以访问公共属性 | |
afterTableSlot | 字符串 | 在组件中立即在表格之后包含的 blade 视图,因此可以访问公共属性 | demo |
组件语法
创建一个扩展 Mediconesystems\LivewireDatatables\LivewireDatatable
的 livewire 组件
php artisan livewire:datatable foo
--> 'app/Http/Livewire/Foo.php'
php artisan livewire:datatable tables.bar
--> 'app/Http/Livewire/Tables/Bar.php'
通过声明公共属性 $model
或 公共方法 builder()
返回 Illuminate\Database\Eloquent\Builder
实例来提供数据源
php artisan livewire:datatable users-table --model=user
--> 'app/Http/Livewire/UsersTable.php' withpublic $model = User::class
声明一个公共方法 columns
,该方法返回包含一个或多个 Mediconesystems\LivewireDatatables\Column
的数组
列
可以使用以下任何静态方法构建列,然后使用流畅的方法链分配其属性。还有其他特定类型的列;NumberColumn
、DateColumn
、TimeColumn
,使用正确的数据类型将启用特定于类型的格式化和过滤
类 | 描述 |
---|---|
Column | 基于字符串的通用列。过滤器将是一个文本输入 |
NumberColumn | 基于数字的列。过滤器将是一个数值范围 |
BooleanColumn | 值将自动格式化为是/否图标,过滤器将是是/否 |
DateColumn | 值将自动格式化为默认日期格式。过滤器将是一个日期范围 |
TimeColumn | 值将自动格式化为默认时间格式。过滤器将是一个时间范围 |
class ComplexDemoTable extends LivewireDatatable { public function builder() { return User::query(); } public function columns() { return [ NumberColumn::name('id') ->label('ID') ->linkTo('job', 6), BooleanColumn::name('email_verified_at') ->label('Email Verified') ->format() ->filterable(), Column::name('name') ->defaultSort('asc') ->searchable() ->filterable(), Column::name('planet.name') ->label('Planet') ->searchable() ->filterable($this->planets), DateColumn::name('dob') ->label('DOB') ->filterable() ->hide() ]; } }
列方法
方法 | 参数 | 结果 | 示例 |
---|---|---|---|
静态 name | 字符串 $column | 从列定义构建列,可以是 Eloquent 或 SQL 点表示法(见下文) | Column::name('name') |
静态 raw | 字符串 $rawSqlStatement | 从原始 SQL 语句构建列。必须包含 "... AS 别名" | Column::raw("CONCAT(ROUND(DATEDIFF(NOW(), users.dob) / planets.orbital_period, 1) AS `Native Age`") |
静态 callback | 数组|字符串 $columns, 闭包|字符串 $callback | 将第一个参数中的列传递给回调,以允许自定义变更。回调可以是表格类的方法或内联的 | (见下文) |
静态 作用域 | 字符串 $scope, 字符串 $alias | 从父模型的作用域构建列 | Column::scope('selectLastLogin', '最后登录') |
静态 删除 | [字符串 $primaryKey 默认: 'id'] | 添加一个带有删除按钮的列,它将调用 $this->model::destroy($primaryKey) |
Column::delete() |
静态 复选框 | [字符串 $column 默认: 'id'] | 添加一个带有复选框的列。组件的公共属性 $selected 将包含已检查行中命名的列的数组, |
Column::checkbox() |
标签 | 字符串 $name | 更改列的显示名称 | Column::name('id')->label('ID') |
格式 | [字符串 $format] | 根据类型格式化列值。日期/时间将使用默认格式或参数 | Column::name('email_verified_at')->filterable(), |
hide | 将列标记为初始时隐藏 | Column::name('id')->hidden() |
|
sortBy | 字符串|表达式 $column | 通过列的排序更改查询 | Column::name('dob')->sortBy('DATE_FORMAT(users.dob, "%m%d%Y")'), |
truncate | [整数 $length (默认: 16)]截断列到 $length 并在工具提示中提供全文。使用 view('livewire-datatables::tooltip) |
Column::name('biography')->truncate(30) |
|
linkTo | 字符串 $model, [整数 $pad] | 将值替换为指向 "/$model/$value" 的链接。对于ID列很有用。可选的零填充。使用 view('livewire-datatables::link) |
Column::name('id')->linkTo('user') |
round | [整数 $precision (默认: 0)] | 将值四舍五入到指定的精度 | Column::name('age')->round() |
defaultSort | [字符串 $direction (默认: 'desc')] | 将列标记为默认搜索列 | Column::name('name')->defaultSort('asc') |
searchable | 将列包含在全局搜索中 | Column::name('name')->searchable() |
|
filterable | [数组 $options], [字符串 $filterScope] | 根据列类型添加到列的过滤器,如果传递了选项数组,则将其用于填充选择输入。如果列是作用域列,则必须也传递过滤器作用域的名称 | Column::name('allegiance')->filterable(['Rebellion', 'Empire']) |
view | 字符串 $viewName | 将列值、整个行值和任何其他参数传递给视图模板 | (见下文) |
editable | 将列标记为可编辑 | (见下文) | |
alignCenter | 居中对齐列标题和内容 | Column::delete()->alignCenter() |
|
alignCenter | 右对齐列标题和内容 | Column::delete()->alignRight() |
|
editable | 将列标记为可编辑 | (见下文) | |
excludeFromExport | 阻止列作为可编辑 | Column::name('email')->exclude |
监听器
组件将监听 refreshLivewireDatatable
事件,允许您从外部组件刷新表格。
Eloquent 列名称
使用Eloquent关系中的列可以通过正常的Eloquent点表示法包含,例如 planet.name
,Livewire Datatables将自动添加必要的表连接来包含该列。如果关系是“多”类型(HasMany
、BelongsToMany
、HasManyThrough
),则Livewire Datatables将创建一个聚合子查询(比连接和分组更高效。感谢@reinink)。默认情况下,聚合类型对于数值列将是count
,对于字符串列将是group_concat
,但可以使用冒号分隔符来覆盖。
NumberColumn::name('students.age:sum')->label('Student Sum'), NumberColumn::name('students.age:avg')->label('Student Avg'), NumberColumn::name('students.age:min')->label('Student Min'), NumberColumn::name('students.age:max')->label('Student Max'),
自定义列名
仍然可以完全控制您的表格,您可以使用自己喜欢的查询定义一个builder
方法,使用自己的连接、分组等,然后使用正常的SQL语法命名列。
public function builder() { return User::query() ->leftJoin('planets', 'planets.id', 'users.planet_id') ->leftJoin('moons', 'moons.id', 'planets.moon_id') ->groupBy('users.id'); } public function columns() { return [ NumberColumn::name('id') ->filterable(), Column::name('planets.name') ->label('Planet'), Column::raw('GROUP_CONCAT(planets.name SEPARATOR " | ") AS `Moon`'), ... }
回调
回调使您在表格中显示之前可以执行任何您喜欢的数据突变。
- 回调是在数据库查询的分页结果上执行的,所以不应该占用太多内存。
- 回调将接收所选列作为其参数。
- 回调可以如下定义,也可以作为Datatable类的公共方法定义,通过将名称作为字符串传递给回调方法的第二个参数来引用。
- 您可以定义导出时列的名称。
class CallbackDemoTable extends LivewireDatatable { public model = User::class public function columns() { return [ Column::name('users.id'), Column::name('users.dob')->format(), Column::callback(['dob', 'signup_date'], 'column_name', function ($dob, $signupDate) { $age = $signupDate->diffInYears($dob); return $age > 18 ? '<span class="text-red-500">' . $age . '</span>' : $age; }), ... } }
视图
您可以指定一个列的输出直接流入一个单独的blade视图模板。
- 模板使用通常的Laravel视图辅助语法指定。
- 视图将接收列的值作为
$value
,以及整个查询行作为$row
。
class CallbackDemoTable extends LivewireDatatable { public model = User::class public function columns() { return [ Column::name('users.id'), Column::name('users.dob')->view('tables.dateview'), Column::name('users.signup_date')->format(), ]; }
'tables/dateview.blade.php' <span class="mx-4 my-2 bg-pink-500"> <x-date-thing :value="$value" /> </span>
可编辑列
您可以使用editable
标记一列。这使用上面的view()
方法将数据传递给一个Alpine/Livewire组件,该组件可以直接更新底层数据库数据。要求列使用标准的Laravel命名定义column
。这是一个示例。可以使用上面的回调或视图方法构建更全面的具有验证等功能的自定义可编辑列。
class EditableTable extends LivewireDatatable { public $model = User::class; public function columns() { return [ Column::name('id') ->label('ID') ->linkTo('job', 6), Column::name('email') ->editable(), ... ]; } }
样式
我知道提供一个带有大量有偏见标记和样式的包并不酷。大多数其他包似乎都走上了传递可选类作为参数或配置变量的道路。我的看法是,因为这只是blade与tailwind,所以您可以发布模板并对它们做任何您喜欢的事情 - Livewire和Alpine的运动部件应该很明显。
您也可以在您表格的类中覆盖render方法,为不同的表格提供不同的模板。