kreyu/data-table-bundle

简化数据表创建过程

安装量: 13,742

依赖项: 0

建议者: 0

安全: 0

星标: 70

关注者: 10

分支: 15

开放问题: 19

类型:symfony-bundle

v0.22.1 2024-09-22 14:50 UTC

README

Packagist Version

简化在Symfony应用程序中创建数据表的过程。

警告

此包仍处于开发初期阶段,可能将会发生改变,甚至可能发生重大改变。它是生产就绪的,并且在第一个稳定版本发布之前,不保证向后兼容性。

文档

查看官方文档

特性

  • 类型类,用于基于类的配置,类似于Symfony表单组件
  • 排序过滤分页——数据表的经典三要素
  • 个性化,用户可以决定列的顺序和可见性
  • 持久性,保存应用的数据(例如过滤条件)在请求之间
  • 导出,可以选择是否应用分页、过滤和个性化
  • 主题化,使用Twig对包的每个部分进行主题化
  • 数据源无关性,支持Doctrine ORM开箱即用
  • 异步性,得益于与Hotwire Turbo的集成

用例

想象一个包含许多列表的应用程序,例如产品、分类、标签、客户等。在大多数情况下,我们返回一个数据列表到视图,并直接在Twig中进行渲染。现在,想象一下,分类详情视图应显示其自己的产品列表。一段时间后,客户要求对表格进行排序和过滤。

随着系统的增长,这会变得越来越难以维护。使用此包,您可以定义每个实体的数据表,包括它们的列、过滤器、操作和导出器,每个都使用一个简单的PHP类。重复使用数据表(及其组件)与使用Symfony表单组件重复使用表单一样简单。

但是,如果您正在使用像SonataAdminBundle或EasyAdminBundle这样的管理面板生成器,您绝对不需要此包。那些生成器已经以自己的方式涵盖了数据表的定义。

有时应用程序足够复杂,以至于管理员生成器要么太简单,要么太有限。这就是此包大放异彩的地方——您可以在委派所有数据表相关的工作给包的同时,构建一个完全定制的应用程序。

与表单组件的相似性

所有设计都旨在对使用过Symfony表单组件的Symfony开发者友好。

注意

这些组件之间有很多相似之处——甚至包括源代码!正因为如此,使用这个包以及贡献内容都应该是很容易的。

感谢所有为Symfony Form 组件的创造者和贡献者,因为他们提出了这种基于类型的配置理念,而这个包只是遵循了它的原则。

尽管如此,因为Form组件可以在框架之外使用,而这个包只作为Symfony包工作,所以核心尽可能简化。

数据表及其组件——列、过滤器、操作和导出器——使用类型类定义,就像表单一样

class ProductDataTableType extends AbstractDataTableType
{
    public function buildDataTable(DataTableBuilderInterface $builder, array $options): void
    {
        $builder
            ->addColumn('id', NumberColumnType::class)
            ->addColumn('name', TextColumnType::class);
        
        $builder
            ->addFilter('id', NumericFilterType::class)
            ->addFilter('name', StringFilterType::class);
        
        $builder    
            ->addAction('create', ButtonActionType::class)
            ->addRowAction('update', ButtonActionType::class)
            ->addBatchAction('delete', ButtonActionType::class);
        
        $builder
            ->addExporter('csv', CsvExporterType::class)
            ->addExporter('xlsx', XlsxExporterType::class);
    }
}

使用这些类型类创建数据表看起来也可能非常熟悉

class ProductController extends AbstractController
{
    use DataTableFactoryAwareTrait;
    
    public function index(Request $request): Response
    {
        $dataTable = $this->createDataTable(ProductDataTableType::class, $query);
        $dataTable->handleRequest($request);
        
        return $this->render('product/index.html.twig', [
            'products' => $dataTable->createView(),
        ])
    }
}

在Twig中渲染数据表就像执行一个单一函数一样简单

{# templates/product/index.html.twig #}
<div class="card">
    {{ data_table(products, { title: 'Products' }) }}
</div>

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件