seblhaire / tablebuilder
一个用于轻松构建表格的Laravel库,它可以与轻量级js构建器交互,并从Eloquent对象关系映射的数据库表中构建数据,也可以用于静态数据。
Requires
- php: >=8.2
- illuminate/http: ^11.0
README
一个用于轻松构建表格的Laravel库,它可以与轻量级js构建器交互,并从Eloquent对象关系映射的数据库表中构建数据,也可以用于静态数据。
它使用
- 基于jQuery JavaScript框架的JavaScript表格构建器。
- Moment.js日期工具库。
- Bootstrap 4或5 CSS框架。
- FontAwesome图标
数据会自动分页,可以进行搜索和排序。您还可以轻松添加其他参数来选择数据。演示网站在此处提供。
安装
-
composer require seblhaire/tablebuilder -
Composer会自动将包与Laravel关联。但您仍然可以显式地将提供者和外观添加到您的
config/app.php文件中。
'providers' => [ ... Seblhaire\TableBuilder\TableBuilderHelperServiceProvider::class, ... ], 'aliases' => [ ... "TableBuilderHelper" => Seblhaire\TableBuilder\TableBuilderHelper::class ]
- 发布包(可选)。
$ php artisan vendor:publish
- 有关JavaScript和样式表的说明,请参阅下一节。
JavaScript和样式表
在网页上,每个JS库和CSS样式表都可以单独链接。如果您选择这种经典方式,请首先下载并安装上述提到的库。然后按照上述说明发布包文件,并在您的模板中放置以下标签
<script type="text/javascript" src="js/vendor/seblhaire/tablebuilder/tablebuilder.js"></script> <link rel="stylesheet" type="text/css" property="stylesheet" href="css/vendor/seblhaire/tablebuilder/tablebuilder.css"/>
但网站通常使用许多库和样式表,浏览器必须下载许多文件才能正确渲染网站。现代网站包含一个单一的压缩JavaScript文件,该文件连接必要的脚本;样式表也有同样的原则。使用Laravel,您可以使用Laravel Mix来编译文件。
使用NPM包管理器:npm install bootstrap jquery moment @fortawesome/fontawesome-free
然后您的js源文件应该如下所示
global.jQuery = require('jquery'); var $ = global.jQuery; var jQuery = global.JQuery; window.$ = $; window.jQuery = jQuery; require('bootstrap'); global.moment = require('moment'); require('../../vendor/seblhaire/tablebuilder/resources/js/tablebuilder.js');
对于您的样式表
@import '~bootstrap/scss/bootstrap'; @import "~@fortawesome/fontawesome-free/scss/fontawesome"; @import "~@fortawesome/fontawesome-free/scss/regular"; @import "~@fortawesome/fontawesome-free/scss/solid"; @import "~@fortawesome/fontawesome-free/scss/brands"; @import "../../vendor/seblhaire/tablebuilder/resources/css/tablebuilder";
配置文件
表格构建器库是可定制的。默认值可以在配置文件中更改,或者在通过外观函数传递选项时更改(参见下一节)。如果您想修改默认配置文件,请发布包文件并访问config/tablebuilder.php。
用法
TableBuilder包附带一个简单的外观。
TableBuilderHelper::initTable
初始化一个可以传递给视图的表格对象。
TableBuilderHelper::initTable($objectId, $url, $options)
其中
$objectId:必须插入表格的<div>标签的id。$url:用于加载数据的路由。如果使用静态数据,则设置为空。$options:选项数组。'searchable':在表格顶部插入搜索字段。默认为true。'itemsperpage':每页默认项目数。0表示不进行分页。默认为20。'pagechoices':每页项目选择。'encoding':数据的编码。默认为'utf8'。'additionalparams':传递给查询的静态附加参数。'paramsFunction':传递动态附加参数的函数名称,例如表单内容。'tableClass':<table>的类:默认为'TableBuilder table table-condensed table-hover table-striped'。'headersclass':在表格之前用于搜索输入和分页的<div>的类名。默认'TableBuilderHeads'。'searchdivclass':包含搜索输入的<div>的类名。默认:'TableBuilderSearch form-group'。'searchresetbuttondivclass':包含搜索输入重置按钮的<div>的类名。默认:input-group-append。'searchresetbuttonclass':搜索输入重置按钮的类名。默认:btn btn-outline-secondary'eltspageclass':底部<div>的类名。默认:'TableBuilderEltsPage'。'paginationclass':包含表格分页的<div>的类名。默认:'TableBuilderPagination'。'pagecontclass':包含每页元素的<div>的类名。默认:'TableBuilderEltPageCont'。'bottomclass':包含按钮的底部<div>的类名。默认:'TableBuilderBottom'。'footerclass':在数据行之后显示的页脚的类名。默认:'TableBuilderFooter'。'buttonclass':动作按钮的默认类名。默认:'btn btn-secondary'。'rowcontextualtrigger':数据中触发特定行类使用的特殊字段名称。默认:trclass。详细信息见下文。'ajaximgname':在表格数据加载时显示的沙漏图标所用的 FontAwesome 类。默认:'far fa-hourglass'。'uparrow':在可排序列上显示的向上箭头所用的 FontAwesome 类。默认:'fas fa-arrow-up'。'downarrow':在可排序列上显示的向下箭头所用的 FontAwesome 类。默认:'fas fa-arrow-down'。'leftarrow':显示左侧分页箭头的 FontAwesome 类。默认:'fas fa-angle-left fa-2x'。'dblleftarrow':显示双左分页箭头的 FontAwesome 类。默认:'fas fa-angle-double-left fa-2x''rightarrow':显示右侧分页箭头的 FontAwesome 类。默认:'fas fa-angle-right fa-2x'。'dblrightarrow':显示双右分页箭头的 FontAwesome 类。默认:'fas fa-angle-double-right fa-2x'。'buttondivarrow':按钮旁边的方块箭头的 FontAwesome 类。默认:'fas fa-level-up-alt fa-2x fa-flip-horizontal buttondivarrow'。'ajaxerrormsg':加载错误时显示的文本。文本可以是字符串或翻译键。见下文。'nodatastr':从数据库检索不到数据时显示的文本。文本可以是字符串或翻译键。见下文。'chkheadlabel':选择列头部(当选中时)显示的文本。文本可以是字符串或翻译键。见下文。'searchLabel':搜索输入中显示的文本。文本可以是字符串或翻译键。见下文。'searchresetlabel':鼠标悬停在搜索重置按钮上时显示的文本。文本可以是字符串或翻译键。见下文。'eltLabel':显示在元素总数旁边的文本。文本可以是字符串或翻译键。见下文。'eltsParPageLabel':显示在每页元素选择器旁边的文本。文本可以是字符串或翻译键。见下文。'buttons':定义多个选择的参数数组。例如:[['id' => 'toto', 'em' => 'fas fa-search', 'action' => "multiselect",'text' => 'Test multselect'], ['id' => 'toto2', 'em' => 'fas fa-bolt', 'action' => "multiselect2",'text' => 'Test multselect 2']],其中参数包括以下内容'id':按钮的唯一标识符。'class':按钮的类,如果与上面的'buttonclass'不同'img':按钮的图片uri。与'em'参数不兼容。'em':用于显示按钮图片的 FontAwesome 类。'action':处理行数据的函数名称,将对每行选中的行应用。'text':按钮标签的文本。动作可以定义如下
var multiselect = function(data){ console.log(data); }'eltsPerPageChngCallback':当每页元素改变时必须触发函数的名称。
默认为空。var eltspagechanged = function(iNbPages){ alert(iNbPages + ' selected') }'aftertableload':必须在数据加载后触发的函数名称。
默认为空。var aftertableload = function(tableobject, data){ console.log(tableobject); console.log(data); }
总结一下,在您的控制器中插入
$oTable = TableBuilderHelper::initTable('tabtest', route("tabletest"), [
'buttons' => [['id' => 'toto', 'em' => 'fas fa-search', 'action' => "multiselect", 'text' => 'Test multselect']],
'itemsperpage' => 20,
'eltsPerPageChngCallback' => 'eltspagechanged',
'aftertableload' => 'aftertableload'
]);
...
return view('tablebuilder::example', array('oTable' => $oTable));
表格列定义将在下一节中解释。在您的 blade 模板中,在您希望表格出现的位置插入以下内容
{!! $oTable->output() !!}
此指令插入显示表格所需的所有元素。此外,如插入数据库或更改参数之类的操作可能需要刷新表格数据;在您的函数中插入 $oTable->outputReload()
<script type="text/javascript">
.....
jQuery('#user, #filter').bind('change', function(){ <?= $oTable->outputReload() ?>});
......
</script>
如果您需要获取表格变量,只需使用 !!{o$Table->tablevar()}!!。
TableBuilderHelper::initColumn
初始化可以添加到表格对象的列对象。
TableBuilderHelper::initColumn($type, $dataBindTo, $options)
$type:设置列类型为以下类型之一'data', 'date', 'image', 'link', 'mail', 'numeric', 'status', 'checkbox', 'action'。每种类型将在下一节中描述。$dataBindTo:要显示的数据字段。$options:根据数据类型的不同,值数组
要插入一个简单的数据列,按以下步骤操作
$datacolumn = TableBuilderHelper::initColumn('data','titre', ['title' => 'Titre', 'sortable' => true]);
然后必须将其附加到表格
$oTable->addColumn($datacolumn);
您也可以使用这种紧凑语法
$oTable->addColumn(TableBuilderHelper::initColumn('data','titre', ['title' => 'Titre', 'sortable' => true]));
数据列(类型 = 'data')
数据列是默认的、正常的单元格,用于显示数据。选项列表是
sortable:列可以排序。默认:false。您可能需要在多个列上排序数据(例如:姓氏和名字)。为此我们有两个参数customAsc允许设置升序排序的标准。例如:lastname:asc;firstname:asc。如果此参数设置为null,则排序字段将是$dataBindTo的值。customDesc具有与降序排序相同的功能。例如:lastname:desc;firstname:desc。
defaultOrder:允许选择表格的默认顺序(每张表一列)。选择asc或desc以使用此列,否则null。title:添加到列标题的标签。默认:null。completetitle:鼠标悬停在表头时可以显示的更长的标题。默认:null。width:列宽度(例如:100px)。默认:null。classes:附加到数据单元格的 CSS 类。默认:null。
日期列(类型 = 'date')
日期列用于显示日期。在您的数据库中,日期存储为年-月-日时分秒(小时为24小时制),例如:2020-11-12 20:24:58。时间可以省略。此列只是将内部数据库格式转换为人类可读格式。日期转换基于 Moment.js 格式。选项列表是;
sortable:列可以排序。默认:false。您可能需要在多个列上排序数据(例如:姓氏和名字)。为此我们有两个参数customAsc允许设置升序排序的标准。例如:lastname:asc;firstname:asc。如果此参数设置为null,则排序字段将是$dataBindTo的值。customDesc具有与降序排序相同的功能。例如:lastname:desc;firstname:desc。
defaultOrder:允许选择表格的默认顺序(每张表一列)。选择asc或desc以使用此列,否则null。title:添加到列标题的标签。默认:null。completetitle:鼠标悬停在表头时可以显示的更长的标题。默认:null。width:列宽度(例如:100px)。默认:null。classes:附加到数据单元格的 CSS 类。默认:null。format:在 Moment.js 语法中的日期格式。默认:DD/MM/YYYY HH:mm:ss
图像列(类型 = 'image')
图像列允许将表格数据转换为图像或字体图标。数据可以是图像的 URI 或字体类。
sortable:列可以排序。默认:false。您可能需要在多个列上排序数据(例如:姓氏和名字)。为此我们有两个参数customAsc允许设置升序排序的标准。例如:lastname:asc;firstname:asc。如果此参数设置为null,则排序字段将是$dataBindTo的值。customDesc具有与降序排序相同的功能。例如:lastname:desc;firstname:desc。
defaultOrder:允许选择表格的默认顺序(每张表一列)。选择asc或desc以使用此列,否则null。title:添加到列标题的标签。默认:null。completetitle:鼠标悬停在表头时可以显示的更长的标题。默认:null。width:列宽度(例如:100px)。默认:null。classes:附加到数据单元格的CSS类。默认:centercell。tag:用于渲染数据的标签。可以是img、em、b或i。默认:em
链接列(类型 = 'link')
链接列将URL数据转换为可点击的链接,这些链接将在新标签页或窗口中打开。
sortable:列可以排序。默认:false。您可能需要在多个列上排序数据(例如:姓氏和名字)。为此我们有两个参数customAsc允许设置升序排序的标准。例如:lastname:asc;firstname:asc。如果此参数设置为null,则排序字段将是$dataBindTo的值。customDesc具有与降序排序相同的功能。例如:lastname:desc;firstname:desc。
defaultOrder:允许选择表格的默认顺序(每张表一列)。选择asc或desc以使用此列,否则null。title:添加到列标题的标签。默认:null。completetitle:鼠标悬停在表头时可以显示的更长的标题。默认:null。width:列宽度(例如:100px)。默认:null。classes:附加到数据单元格的 CSS 类。默认:null。shorten:在显示时缩短链接。maxlength:缩短的最大长度。默认:45。target:链接目标属性值。默认:_blank。
邮件列(类型 = 'mail')
邮件列将电子邮件数据转换为可点击的链接,可以复制到剪贴板或打开您的邮件应用。
sortable:列可以排序。默认:false。您可能需要在多个列上排序数据(例如:姓氏和名字)。为此我们有两个参数customAsc允许设置升序排序的标准。例如:lastname:asc;firstname:asc。如果此参数设置为null,则排序字段将是$dataBindTo的值。customDesc具有与降序排序相同的功能。例如:lastname:desc;firstname:desc。
defaultOrder:允许选择表格的默认顺序(每张表一列)。选择asc或desc以使用此列,否则null。title:添加到列标题的标签。默认:null。completetitle:鼠标悬停在表头时可以显示的更长的标题。默认:null。width:列宽度(例如:100px)。默认:null。classes:附加到数据单元格的 CSS 类。默认:null。copycell:切换单元格复制到剪贴板。如果为false,则链接打开邮件应用。默认:true。copytext:鼠标悬停时显示的文本。文本可以是字符串或翻译密钥。默认:tablebuilder::messages.clicktoselect。参见图下。
数字(类型 = 'numeric')
数字列将数字字段格式化为可读的值。
sortable:列可以排序。默认:false。您可能需要在多个列上排序数据(例如:姓氏和名字)。为此我们有两个参数customAsc允许设置升序排序的标准。例如:lastname:asc;firstname:asc。如果此参数设置为null,则排序字段将是$dataBindTo的值。customDesc具有与降序排序相同的功能。例如:lastname:desc;firstname:desc。
defaultOrder:允许选择表格的默认顺序(每张表一列)。选择asc或desc以使用此列,否则null。title:添加到列标题的标签。默认:null。completetitle:鼠标悬停在表头时可以显示的更长的标题。默认:null。width:列宽度(例如:100px)。默认:null。classes:附加到数据单元格的 CSS 类。默认:null。thousandsep:分隔每个千位组的分隔符。默认:'。decimals:要显示的小数位数。默认:0。decimalsep:小数分隔符。默认:.。currency:要在数字值旁边显示的货币。默认:无值。如果需要货币出现在值之前,则必须设置参数currencyposafter为false。
状态列(类型 = 'status')
状态列允许根据列值显示图标。
sortable:列可以排序。默认:false。您可能需要在多个列上排序数据(例如:姓氏和名字)。为此我们有两个参数customAsc允许设置升序排序的标准。例如:lastname:asc;firstname:asc。如果此参数设置为null,则排序字段将是$dataBindTo的值。customDesc具有与降序排序相同的功能。例如:lastname:desc;firstname:desc。
defaultOrder:允许选择表格的默认顺序(每张表一列)。选择asc或desc以使用此列,否则null。title:添加到列标题的标签。默认:null。completetitle:鼠标悬停在表头时可以显示的更长的标题。默认:null。width:列宽度(例如:100px)。默认:null。classes:附加到数据单元格的CSS类。默认:centercell。aIcons:用于设置图标的参数数组数组。数组键是可能的列值。例如:["0" => ['class' => 'fas fa-square', 'title' => 'no', 'style' => 'color:red'], "1" => ['class' => 'fas fa-square', 'title' => 'yes', 'style' => 'color:green']]。参数值是class:用于选择Font Awesome图标的类。style:附加样式,例如设置颜色。title:鼠标悬停时显示的文本。
复选框列(类型 = 'checkbox')
复选框列允许切换二进制值(开/关、真/假、是/否等)。可以触发操作来修改值。
sortable:列可以排序。默认:false。您可能需要在多个列上排序数据(例如:姓氏和名字)。为此我们有两个参数customAsc允许设置升序排序的标准。例如:lastname:asc;firstname:asc。如果此参数设置为null,则排序字段将是$dataBindTo的值。customDesc具有与降序排序相同的功能。例如:lastname:desc;firstname:desc。
defaultOrder:允许选择表格的默认顺序(每张表一列)。选择asc或desc以使用此列,否则null。title:添加到列标题的标签。默认:null。completetitle:鼠标悬停在表头时可以显示的更长的标题。默认:null。width:列宽度(例如:100px)。默认:null。classes:附加到数据单元格的CSS类。默认:centercell。action:设置值的函数名。函数有一个单独的event参数,它可以访问3个值event.data.elt:访问复选框输入。event.data.elt.prop('checked')为true时复选框被选中,否则为false。event.data.content:提供被点击数据的整行。event.data.index:行号,从0开始。
var checkboxclick = function(event){ console.log(event.data.elt.prop('checked')); console.log(event.data.content); console.log(event.data.index); }isEnabledCallback:如果为1或true,则操作被禁用。
操作列(类型 = 'action')
操作列提供一组操作按钮。操作按钮可以在列定义中全局定义,也可以逐行定义(见下一节)
title:添加到列标题的标签。默认:null。completetitle:鼠标悬停在表头时可以显示的更长的标题。默认:null。width:列宽度(例如:100px)。默认:null。classes:附加到数据单元格的CSS类。默认:TableBuilderActions。actions:参数数组数组。例如:[['em' => 'far fa-edit', 'text' => '编辑用户', 'js' => "loaduser"], ['em' => 'fa fa-trash', 'text' => '处理用户', 'js' => "procesuser"]]。如果需要分隔字段组,请插入数组['placeholder' => true]。参数是js:javascript操作名称。参数是当前行数据。操作可以在显示表格的页面的<script>标签中定义如下
var loaduser = function(data){ console.log(data); } var procesuser = function(data){ alert(data.name); // name is a field in the data you display in your table }text:鼠标悬停时显示的标题。em:按钮图标的类。
TableBuilderHelper::initDataBuilder
最后一个外观函数提供了一个数据构建器助手,它有助于验证POST数据并构建Eloquent查询,以构建表格中显示的数据。
TableBuilderHelper::initDataBuilder($request, $othervalidationrules)
$request: 控制器提供的Illuminate\Http\Request对象。$othervalidationrules: 额外数据的验证规则。默认为[]。
表传递的参数包括
itemsperpage: 整数值。sortBy: 字符串:排序顺序。start: 整数,起始项。searchTerm: 搜索词。
函数的结果是 Seblhaire\TableBuilder\TableDataBuilder 类的对象。
public function loadTable(Request $request){
$oTable = TableBuilderHelper::initDataBuilder($request);
此对象有多个方法
$oTable->addMethodToDisplay('actions', function($user){ $actions = [ ['em' => 'far fa-edit', 'text' => '编辑用户', 'js' => "loaduser"],* addLine($aLine): 向表中添加静态数据。 $aLine` 必须是一个键值对数组。
setQuery($param): 设置用于构建表格数据的对象。$param是 Eloquent 模型对象或查询构建器。$user = new \App\User; //or $user = \App\User::where('category', 'admin'); $oTable->setQuery($user);setWithTrashed($bval): 启用/禁用 Eloquent withTrashed 方法。setFields($columnslist): 设置查询需要从数据库获取的列。$oTable->setFields('id, number, title');setSearchFunction($wherefn): 当搜索字段不为空时设置构建搜索查询的函数
对于静态数据的表$search = $oTable->searchTerm(); $wherefn = function ($query) use ($search){ if ($search != ''){ $query->where(function($query) use ($search){ return $query->where('email', 'like', '%' . $search .'%') ->orWhere('name', 'like', '%' . $search .'%'); }); } } $oTable->setSearchFunction($wherefn);$wherefn = function ($data){ return (strpos($data['code'], $this->searchTerm) !== false) || (strpos($data['country'], $this->searchTerm) !== false); } $oTable->setSearchFunction($wherefn);addMethodToDisplay($fieldname, $func): 你可能需要向表中添加不来自数据库的数据。$fieldname是输出中返回的名称。$func是一个用于构建内容的函数,表格行结果作为唯一参数。
如果你想给某些行添加类,你可以使用这个方法来添加样式。你的额外列必须具有配置选项$oTable->addMethodToDisplay('addressurl', function($user){ //return a link to a online map to locate address return AddressUrlResolver($user->address); })tablebuilder.table.rowcontextualtrigger的名称。
此方法显示工资超过 $10,000 的用户行。在最后一个示例中,这里是如何向数据添加操作。$oTable->addMethodToDisplay(config('tablebuilder.table.rowcontextualtrigger'), function($user){ if ($user->wage > 10000){ return 'table-danger'; } return ''; });$oTable->addMethodToDisplay('actions', function($user){ $actions = [['em' => 'far fa-edit', 'text' => 'Edit user, 'js' => "loaduser"]]; if ( ... ){ $actions[] = [....]; }else{ $actions[] =[ ... ]; } return $actions; });setFooter($txt):在表底部添加文本,以总结数据。output(): 返回表格结果。setTotal($iTotal): 设置总值。nblines(): 获取每页的行数。start(): 获取起始编号。reverseOrder(): 获取反转顺序值。sortBy(): 获取排序参数值。searchTerm(): 获取搜索词参数。total(): 获取行数。footer(): 获取页脚值。hasFooter(): 检查是否有页脚值。
翻译键
Laravel 在处理过程中非常早地加载配置文件。因此,配置文件不能包含 __('translation.key')。为了解决这个问题,我们制作了一个助手,可以直接打印字符串或将翻译键发送到翻译助手。翻译键可以用字符 # 分隔。例如:"#tablebuilder::messages.required#"。原始翻译存储在 vendor/seblhaire/tablebuilder/resources/lang 下。如果您发布包文件,您可以在 resources/lang/vendor/tablebuilder/ 中找到翻译。
请随意将键翻译成您自己的语言,并将其发送给作者或合并请求到 GitHub。
有问题?有贡献?
请随意向作者发送功能请求或合并请求,或者简单地提问。
