• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Okipa/laravel-table: Generate tables from Eloquent models.

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称(OpenSource Name):

Okipa/laravel-table

开源软件地址(OpenSource Url):

https://github.com/Okipa/laravel-table

开源编程语言(OpenSource Language):

PHP 92.0%

开源软件介绍(OpenSource Introduction):

Laravel Table

Latest Stable Version Total Downloads Build Status Coverage Status License: MIT

Generate tables from Eloquent models

Easily render tables from Eloquent models in your views.

This package is shipped with a pre-configuration for Bootstrap 4.* and FontAwesome 5 but can be fully reconfigured to work with any UI framework.

Found this package helpful? Please consider supporting my work!

Donate Donate

Compatibility

Laravel version PHP version Package version
^7.0 ^7.4 ^4.0
^7.0 ^7.4 ^3.0
^6.0 ^7.4 ^2.0
^5.8 ^7.2 ^1.3
^5.5 ^7.1 ^1.0

Upgrade guide

Usage

Create your table class with the following command:

php artisan make:table UsersTable --model=App/Models/User

Set your table configuration in the generated file, which can be found in the app\Tables directory:

namespace App\Tables;

use Okipa\LaravelTable\Abstracts\AbstractTable;
use Okipa\LaravelTable\Table;
use App\Models\User;

class UsersTable extends AbstractTable
{
    protected function table(): Table
    {
        return (new Table())->model(User::class)
            ->routes([
                'index' => ['name' => 'users.index'],
                'create' => ['name' => 'user.create'],
                'edit' => ['name' => 'user.edit'],
                'destroy' => ['name' => 'user.destroy'],
            ])
            ->destroyConfirmationHtmlAttributes(fn(User $user) => [
                'data-confirm' => __('Are you sure you want to delete the user :name ?', [
                    'name' => $user->name
                ])
            ]);
    }

    protected function columns(Table $table): void
    {
        $table->column('id')->sortable(true);
        $table->column('name')->sortable()->searchable();
        $table->column('email')->sortable()->searchable();
        $table->column('created_at')->dateTimeFormat('d/m/Y H:i', 'Europe/Paris')->sortable();
        $table->column('updated_at')->dateTimeFormat('d/m/Y H:i', 'Europe/Paris')->sortable();
    }
}

Send the table to your view:

use \Illuminate\View\View;
use \App\Tables\UsersTable;

class UsersController
{
    public function index(): View
    {
        $table = (new UsersTable())->setup();
    
        return view('templates.users.index', compact('table'));
    }
}

Finally, display it in the view:

{{ $table }}

Table of contents

Installation

  • Install the package with composer:
composer require okipa/laravel-table

Configuration

Optionally publish the package configuration:

php artisan vendor:publish --tag=laravel-table:config

Templates

Optionally publish the package templates:

php artisan vendor:publish --tag=laravel-table:views

Translations

All words and sentences used in this package are translatable.

See how to translate them on the Laravel official documentation: https://laravel.com/docs/localization#using-translation-strings-as-keys.

Here is the list of the words and sentences available for translation:

  • Create
  • Show
  • Edit
  • Destroy
  • Number of rows
  • Search by:
  • Reset research
  • Actions
  • No results were found.
  • Showing results <b>:start</b> to <b>:stop</b> on <b>:total</b>

Advanced configuration example

namespace App\Tables;

use App\News;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Illuminate\Database\Eloquent\Builder;
use Okipa\LaravelTable\Table;
use Okipa\LaravelTable\Abstracts\AbstractTable;

class NewsTable extends AbstractTable
{
    protected Request $request;

    protected int $categoryId;

    public function __construct(Request $request, int $categoryId)
    {
        $this->request = $request;
        $this->categoryId = $categoryId;
    }

    protected function table(): Table
    {
        return (new Table())->model(News::class)
            ->identifier('news-table')
            ->request($this->request)
            ->routes([
                'index' => ['name' => 'news.index'],
                'create' => ['name' => 'news.create'],
                'edit' => ['name' => 'news.edit'],
                'destroy' => ['name' => 'news.destroy'],
                'show' => ['name' => 'news.show'],
            ])
            ->rowsNumber(50) // Or set `null` to display all the items contained in database
            ->activateRowsNumberDefinition(false)
            ->query(function (Builder $query) {
                // Some examples of what you can do
                $query->select('news.*');
                // Add a constraint
                $query->where('category_id', $this->categoryId);
                // Get value stored in a json field
                $query->addSelect('news.json_field->>json_attribute as json_attribute');
                // Get a formatted value from a pivot table
                $query->selectRaw('count(comments.id) as comments_count');
                $query->leftJoin('news_commment', 'news_commment.news_id', '=', 'news.id');
                $query->leftJoin('comments', 'comments.id', '=', 'news_commment.comment_id');
                $query->groupBy('comments.id');
                // Alias a value to make it available from the column model
                $query->addSelect('users.name as author');
                $query->join('users', 'users.id', '=', 'news.author_id');
            })
            ->disableRows(fn(News $news) => in_array($news->id, [1, 2]), ['disabled', 'bg-secondary', 'text-white'])
            ->rowsConditionalClasses(fn(News $news) => $news->id === 3, ['highlighted', 'bg-success'])
            ->rowsConditionalClasses(
                fn(News $news) => $news->category,
                fn(News $news) => 'category-' . Str::snake($news->category)
            )
            // Append all request params to the paginator
            ->appendData($this->request->all());
    }
    
    protected function columns(Table $table): void
    {
        $table->column('id')->sortable(true);
        $table->column()->title(__('Illustration'))->html(fn(News $news) => $news->image_src
            ? '<img src="' . $news->image_src . '" alt="' .  $news->title . '">'
            : null);
        $table->column('title')->sortable()->searchable();
        $table->column('content')->stringLimit(30);
        $table->column('author')->sortable(true)->searchable('user', ['name']);
        $table->column('category_id')
            ->title(__('Category'))
            ->prependHtml('<i class="fas fa-hand-point-right"></i>')
            ->appendsHtml('<i class="fas fa-hand-point-left"></i>')
            ->button(['btn', 'btn-sm', 'btn-outline-primary'])
            ->value(fn(News $news) => config('news.category.' . $news->category_id))
        $table->column()
            ->title(__('Display'))
            ->link(fn(News $news) => route('news.show', $news))
            ->button(['btn', 'btn-sm', 'btn-primary']);
        $table->column('created_at')->dateTimeFormat('d/m/Y H:i', 'Europe/Paris')->sortable();
        $table->column('updated_at')->dateTimeFormat('d/m/Y H:i', 'Europe/Paris')->sortable();
        $table->column('published_at')->dateTimeFormat('d/m/Y H:i', 'Europe/Paris')->sortable(true, 'desc');
    }

    protected function resultLines(Table $table): void
    {
        $table->result()
            ->title('Total of comments')
            ->html(fn(Collection $paginatedRows) => $paginatedRows->sum('comments_count'));
    }
}

Tips

  • Columns displaying combination: The following table column methods can be chained to display a result as wished. If you can't get the wanted result, you should use the html method to build a custom display.
    • button
    • link
    • prependHtml
    • appendsHtml
    • stringLimit
    • value

Table API

⚠️ All the following methods are chainable with \Okipa\LaravelTable\Table object except the column and the result methods (returning respectively \Okipa\LaravelTable\Column and \Okipa\LaravelTable\Result objects).

model

Set the model used during the table generation.

Notes:

  • Signature: model(string $tableModelNamespace): \Okipa\LaravelTable\Table
  • Required

Use case example:

(new Table())->model(User::class);

identifier

Set the table identifier, in order to automatically generate its id and to customize all the interaction fields in case of multiple tables used on a single view: the interactions with the table like sorting, searching an more will only have an impact on the identified table.

Notes:

  • Signature: identifier(string $identifier): \Okipa\LaravelTable\Table
  • Optional

Use case example:

(new Table())->identifier('users-table');

request

Set the request used for the table generation.

Notes:

  • Signature: request(Request $request): \Okipa\LaravelTable\Table
  • Optional: by default the table uses the current request given by the request() helper to get the number of lines to show and the searching, sorting or pagination data. However, if you need to pass a particular request, this method is for you.

Use case example:

Pass the request to your table:

class UsersController
{
    public function index(\Illuminate\Http\Request $request)
    {
        $table = new UsersTable($request);
        // ...
    }
}

Then, use the custom request in your table:

namespace App\Tables;

use App\Models\Users;
use Illuminate\Http\Request;
use Okipa\LaravelTable\Abstracts\AbstractTable;
use Okipa\LaravelTable\Table;

class UsersTable extends AbstractTable
{
    protected Request $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    protected function table(): Table
    {
        return (new Table())->model(User::class)->request($this->request);
    }

    // ...
}

routes

Set the routes used during the table generation.
The routes declarations will be used for the following features:

  • index (required): this is where you will be redirected when you will change the number of displayed rows, when you will sort the table on a specific column, or when you will execute a search request.
  • create (optional): if declared, the create button will be displayed and will trigger this route on click.
  • show (optional): if declared, the show button will be displayed on each row (unless it is a disabled row) and will trigger this route on click.
  • edit (optional): if declared, the edit button will be displayed for each row (unless it is a disabled row) and will trigger this route on click.
  • destroy (optional): if declared, the destroy button will be displayed on each row (unless it is a disabled row) and will trigger this route on click.

Note:

  • Signature: routes(array $routes): \Okipa\LaravelTable\Table
  • Required
  • Routes have to be defined with the following structure:
// Example
[
    'index' => [
        // Required
        'name' => 'users.index',
        // Optional
        'params' => [
            // Set route params (or not)
        ]
    ]
    // You will have to respect the same structure for any declared route.
];
  • As the current model instance is always provided as a param to the show, edit and destroy routes, you do not have to pass it to the params.
  • You also should declare your routes carefully to avoid errors. See the examples bellow:
    // Assuming your declared your route with implicit binding:
    Route::get('parent/{$parent}/user/edit/{$user}/child/{$child}', 'UsersController@edit')->name('user.edit');
    // You will have to declare your params with keys as following:
    (new Table())->model(User::class)->routes([
        // ...
        'edit'    => ['name'=> 'user.edit', 'params' => ['parent' => $parent, 'child' => $child]],
        // ...
    ]);
    // Because the route will be generated with the table related model as first param (the params order differs from the declaration):
    route('user.edit', [$user, 'parent' => $parent, 'child' => $child]);
    // Now imagine your route is declared with the table related model as first param like this:
    Route::get('/user/edit/{$user}/child/{$child}/{otherParam}', 'UsersController@edit')->name('user.edit');
    // In this case only, you will be able to declare your routes without keys:
    (new Table())->model(User::class)->routes([
        // ...
        'edit'    => ['name'=> 'user.edit', 'params' => [$child, 'otherParam']],
        // ...
    ]);
    // Because the route params are given in the same order as the route declaration:
    route('user.edit', [$user, $child, 'otherParam']);

Use case example:

(new Table())->routes([
    'index' => ['name' => 'news.index'],
    'create' => ['name' => 'news.create', 'params' => ['param1' => 'value1']],
    'edit' => ['name' => 'news.edit', 'params' => ['param2' => 'value2']],
    'destroy' => ['name' => 'news.destroy'],
    'show' => ['name' => 'news.show'],
]);

rowsNumber

Override the config default number of rows displayed on the table.
The default number of displayed rows is defined in the config('laravel-table.behavior.rows_number') config value.
Set null to display all the models contained in database.

Note:

  • Signature: rowsNumber(?int $rowsNumber): \Okipa\LaravelTable\Table
  • Optional

Use case example:

(new Table())->rowsNumber(50);
// Or
(new Table())->rowsNumber(null);

activateRowsNumberDefinition

Override the default rows number definition activation status.
Calling this method displays a rows number input that enable the user to choose how much rows to show.
The default rows number definition activation status is managed by the config('laravel-table.behavior.activate_rows_number_definition') value.

Note:`

  • Signature: activateRowsNumberDefinition($activate = true): \Okipa\LaravelTable\Table
  • Optional

Use case example:

(new Table())->activateRowsNumberDefinition(false);

上一篇:
spiral/roadrunner-laravel: 发布时间:2022-08-13
下一篇:
BinarCode/laravel-restify: The fastest way to make a powerful JSON:API compatibl ...发布时间:2022-08-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap