vojtasim/laravel-grid

基本的Laravel数据网格系统,用于简化大型表的排序和筛选。不包含任何前端垃圾代码,因此外观由您负责

此包的官方仓库似乎已消失,因此已冻结此包

v1.8.3 2016-04-06 08:34 UTC

This package is not auto-updated.

Last update: 2020-07-10 19:39:41 UTC


README

基本的Laravel数据网格系统,用于简化大型表的排序和筛选。不包含任何前端垃圾代码,因此外观由您负责。

安装

composer require vojtasim/laravel-grid

config/app.php 中的提供者中添加以下行

\VojtaSim\LaravelGrid\DataGridServiceProvider::class,

然后添加DataGrid门面的别名

'DataGrid' => \VojtaSim\LaravelGrid\Facades\DataGrid::class,

然后您可以执行以下命令来发布视图文件

artisan vendor:publish --provider="\VojtaSim\LaravelGrid\DataGridServiceProvider"

视图

表单

首先,我们需要创建一个表单来容纳所有筛选输入。为此,请使用 @grid 指令,它接受两个参数。

  • 网格名称:用于控制器或 @grid - @endgrid 范围之外来引用特定网格
  • 路由:筛选和排序请求应发送到的路由

@grid('products', 'products.index') - @endgrid

排序

接下来,我们可以通过使用 @gridColumn 指令来添加排序列。此指令也接受两个参数。

  • 列名称
  • 文本翻译
<th>@gridColumn('name', 'products.name')</th>

如果您想通过相对模型列进行筛选,您将需要连接表并别名所需的列。

$query->select(['products.*', DB::raw('brands.name AS brand_name')])
      ->leftJoin('brands', 'products.brand_id', '=', 'brands.id');
<th>@gridColumn('brand_name', 'products.brand')

筛选

筛选输入通过 @gridTextFilter@gridSelectFilter 指令创建。

@gridTextFilter 只接受两个参数,即您希望筛选的列的名称以及筛选是否精确(意味着筛选是否使用 column like %value%column = value

@gridTextFilter('name', true/false)

@gridSelectFilter 有多种选项可以用于筛选列,所以让我们称它为

  1. 通过 key => value 对的数组作为选项进行筛选

    @gridSelectFilter('is_available', trans('products.availabilityStates'))

    'availabilityStates' => ['0' => '不可用', '1' => '可用],`

  2. 通过 Collection of models进行筛选

    @gridSelectFilter('supplier_id', $suppliers, ['id' => 'name'])

    第二个参数是模型集合,第三个是包含用作 keyvalue 的每个选项的键的数组的数组

  3. 通过ManyToMany关系进行筛选

    @gridSelectFilter('categories:id', $categories, ['id' => 'name'])

    在这里,列名称被替换为我们希望筛选的关系的名称。冒号后面的字符串是查询关系的列的名称。例如,您可以通过以下方式筛选类别

    @gridSelectFilter('categories:name', $categories, ['name' => 'name'])

  4. 通过计数进行筛选

    使用 @gridSelectFilter('relatedProducts:has', trans('products.relatedFilterStates'))

    在这个示例中,冒号后面的字符串是 has,这意味着 QueryBuilder 的 ->has() 函数将被用于查询关系。

    'relatedFilterStates' => ['=:0' => '未分配', '>:0' => '已分配'],

    每个选项的键必须由运算符和值组成,以正确过滤关系。

  5. 按多个值过滤

    1. - 3. 中的每个选项也可以按多个值进行过滤。为此,将第 4 个参数指定为 true

    @gridSelectFilter('is_available', trans('products.availabilityStates'), null, true)

    @gridSelectFilter('supplier_id', $suppliers, ['id' => 'name'], true)

    @gridSelectFilter('categories:name', $categories, ['name' => 'name'], true)

分页

@gridPerPage() - 用于显示“每页”选择的指令

<div class="panel-body">
	{!! $products->appends(grid_parameters())->links() !!}
	<div class="pull-right">
		<label>@lang('grid.itemsPerPage')</label>
		@gridPerPage([10, 20, 50, 100])
	</div>
</div>

辅助函数

grid_parameters([ string $gridName]) - 返回用于创建路由的当前排序和过滤参数。当需要创建自定义操作时,理想的选择。

route('products.custom_action', array_merge(['parameter' => 'value'], grid_parameters()))

grid_checkbox([ string $gridName]) - 用于创建用于批量操作的复选框名称的函数

<input type="checkbox" name="{{ grid_checkbox() }}" value="{{ $product->id }}">

grid_action([ string $gridName]) - 用于创建批量操作按钮名称的函数

<button type="submit" name="{{ grid_action() }}" value="destroy" class="btn btn-efault">
	<i class="fa fa-remove"></i>
	<span>@lang('products.destroy')</span>
</button>

grid_column_class(string|array $column [, $gridName]) - 用于获取指定列的 CSS 类的函数

返回 grid-filtered 和/或 grid-sorted

<colgroup>
	<col>
	<col class="{{ grid_column_class('name') }}">
	<col class="{{ grid_column_class(['brand_id', 'brand_name']) }}">
	<col class="{{ grid_column_class(['manufacturer_id', 'manufacturer_name']) }}">
	<col class="{{ grid_column_class('is_active') }}">
	<col>
</colgroup>

grid_clear_link([ string $gridName]) - 返回清除所有过滤和排序的链接的函数

控制器

在控制器中,您将主要使用 2 个函数:applyConditions()getSelected()。您还可以使用 getFilters() 来检索以 column => value 对的形式存在的过滤值数组(注意:未过滤的列不会包含在数组中)

示例 #1:应用条件和执行批量操作

use App\Http\Controllers\Controller, Illuminate\Http\Request, VojtaSim\LaravelGrid\Services\DataGrid;

// ...

public function index(Request $request, DataGrid $grid)
{
  if ($items = $grid->getSelected('products')) {
  
    // $items = {"action": (string), "selected": (array)}
    if (method_exists($this, ($method = "{$items->action}Products"))) {
		  return $this->{$method}($request, $items->selected);
	  }
  }
  
  $query = Product::with(['brand', 'categories', 'relatedProducts'])
			->select(['products.*', DB::raw('brands.name as brand_name')])
			->leftJoin('brands', 'products.brand_id', '=', 'brands.id');

	$products = $grid->applyConditions('products', $query);

	$brands = Products\Brand::orderBy('name', 'asc')->get();
	$categories = Products\Category::orderBy('name', 'asc')->get();

  return view('products.index', compact('products', 'brands', 'categories', 'manufacturers'));
}

示例 #2 - 获取过滤值

use App\Http\Controllers\Controller, Illuminate\Http\Request, VojtaSim\LaravelGrid\Services\DataGrid;

// ...

public function index(Request $request, DataGrid $grid)
{
  if ($items = $grid->getSelected('products')) {
  
    // $items = {"action": (string), "selected": (array)}
    if (method_exists($this, ($method = "{$items->action}Products"))) {
		  return $this->{$method}($request, $items->selected);
	  }
  }

	$query = Product::with(['manufacturer', 'productSeries',])
    ->select(['products.*',
      DB::raw('manufacturers.name as manufacturer_name'),
      DB::raw('printer_series.name as series_name')
    ])
    ->leftJoin('manufacturers', 'products.manufacturer_id', '=', 'manufacturers.id')
    ->leftJoin('printer_series', 'products.product_series_id', '=', 'product_series.id');
    
  $products = $grid->applyConditions('products', $query);
  
  $manufacturers = Manufacturer::orderBy('name', 'asc')->get();
  $series = Series::orderBy('name', 'asc')->get();
  
  if ($selectedManufacturers = $grid->getFilters('products', 'manufacturer_id')) {
    $series->whereIn('products_series.manufacturer_id', $selectedManufacturers);
  }
  
  $series = $series->get();
  
  return view('products.index', compact('products', 'manufacturers', 'series'));
}