msieprawski/resource-table

该软件包最新版本(v0.71)没有提供许可证信息。

Laravel DataTable 的替代方案

v0.71 2015-07-10 09:13 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:35:18 UTC


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 updatecomposer 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:设置可搜索列

假设您的新闻可以是 eventhot_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 许可证下授权