pawellen / data-tables-listing
提供轻松使用 datatables (http://www.datatables.net/) 的列表包
Requires
- php: >=5.3.2
- symfony/framework-bundle: >=2.0
This package is auto-updated.
Last update: 2024-09-14 11:11:18 UTC
README
数据表列表插件允许您轻松创建记录列表,使用 Symfony 表单风格。此插件使用流行的 JQuery DataTables 插件 (http://www.datatables.net/)
安装
- 使用 composer 安装插件
{ "pawellen/data-tables-listing": "dev-master" }
- 更新您的 AppKernel.php
$bundles = array ( (...) new PawelLen\DataTablesListing\DataTablesListingBundle() ); 2,5. Configuration: data_tables_listing: default_template: LenPanelBundle::listing_div_layout.html.twig include_assets: datatables_js: false datatables_css: false include_jquery: false jquery_js: "//code.jqueryjs.cn/jquery-2.1.3.min.js" 3. Add DataTables javascript script to your template using listing_scripts twig function. Example: ```html <html> <head> (...) <script src="{{ asset('bundles/exapmlebundle/js/jquery/jquery.min.js') }}" type="text/javascript"></script> {{ listing_scripts() }} (...) </head> <body> (...) </body> </html>
- 您的列表已准备就绪 :)
使用
- 在控制器中创建新表格。
要创建列表,您只需在控制器中获取 listing 服务并将其传递给您的列表类型对象。示例
/** * @Route("/user/list") * @Template() */ public function listAction(Request $request) { // Creates new listing object: $list = $this->get('listing')->createListing(new UserListing(), array( 'request' => $request )); // Handle ajax request that provide data to listing: if ($request->isXmlHttpRequest()) { return $list->createResponse($request); } // Pass ListView object to your template: return array( 'list' => $list->createView() ); }
如您所见,列表的使用与 Symfony 表单组件非常相似。在 createListing 方法中传递的选项之一是请求对象。请求对象用于获取来自您网站的任何数据,例如过滤器、按列排序等...
- 创建自己的 ListingType
创建新的列表类型类似于创建 symfony 表单。示例
namespace Td\UserBundle\Listing; use PawelLen\DataTablesListing\Type\AbstractType; use PawelLen\DataTablesListing\Filters\FilterBuilderInterface; use PawelLen\DataTablesListing\Listing\ListingBuilderInterface; class UserListing extends AbstractType { public function buildFilters(FilterBuilderInterface $builder, array $options) { $builder->add('name', 'text', array( 'label' => 'User name', 'required' => false, 'filter' => array( 'property' => 'name', 'expression' => 'c.name LIKE :name' ) )); $builder->add('email', 'text', array( 'label' => 'Email', 'required' => false, 'filter' => array( 'expression' => 'c.shortName LIKE :shortName' ) )); } public function buildListing(ListingBuilderInterface $builder, array $options) { $builder->add('id', 'column', array( 'label' => 'Id' )); $builder->add('name', 'column', array( 'label' => 'User name' )); $builder->add('email', 'column', array( 'label' => 'Email' )); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'class' => 'TdUserBundle:User' )); } public function getName() { return 'my_list'; } }
这将创建具有两个过滤器字段和三个列的用户列表。在 setDefaultOptions 方法中指定数据源。在 "class" 选项中传递单个实体时,您也可以使用 "query_builder" 选项并提供查询构建器接口以访问更复杂的查询(例如连接)。
- 模板
要渲染创建的列表,您必须将 ListingView 对象传递到您的模板:示例
{% extends "PanelBundle::base_template.html.twig" %} {% form_theme list.filters _self %} {% block _my_list_widget %} <div class="row"> <div class="col-md-6"> {{ form_row(form.name) }} </div> <div class="col-md-6"> {{ form_row(form.email) }} </div> </div> {% endblock _my_list_widget %} {% block content_body %} {{ listing(list) }} {% endblock %}
要渲染整个列表,您可以使用 listing() twig 函数。此示例还展示了如何覆盖过滤器模板。请注意,块名称前有一个下划线。
函数
- 创建链接
要创建链接,您需要在 buildListing 方法内部添加 link 选项。
$builder->add('name', 'column', array( 'label' => 'User name', 'link' => array( 'route' => 'user_edit', 'params' => array( 'user_id' => 'id' ) ) ));
其中: id 是 propertyPath 字符串。 route 是路由名称,params 是生成Url函数的参数
- 使用 QueryBuilder
要使用查询构建器,请使用 query_builder 选项而不是类。
public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'query_builder' => function(QueryBuilder $builder) { $builder->select('u, a, t') ->from('TdUserBundle:Contractor', 'u') ->leftJoin('u.address', 'a') ->leftJoin('u.type', 't') ->where('u.deletedAt IS NULL'); } )); }
或
public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'class' => 'TdUserBundle:User', 'query_builder' => function(EntityRepository $er) { return $er->createQueryBuilder('u') ->where('u.deletedAt IS NULL'); } )); }
- 使用过滤器
默认情况下,在构建过滤器表单时,您不需要定义任何过滤器,您可以将空数组作为过滤器选项传递,在这种情况下将执行默认搜索。默认搜索使用 "name LIKE %PHRASE%" SQL 查询,其中 name 是过滤器名称,PHRASE 是输入的值。要使用自定义过滤器,请将 DQL 表达式传递给过滤器选项。示例
$builder->add('name', 'text', array( 'label' => 'User name', 'required' => false, 'filter' => array( 'expression' => 'u.name LIKE :name', 'eval' => '%like%' ) ))
其中: expression 是 DQL 表达式,您可以使用参数多次,例如:"u.firstname LIKE :name OR u.lastname LIKE :name"。 eval 是非必需参数,用于修改从过滤器表单传递的值
注意: :name 必须始终与过滤器名称相同(在当前版本中)
- 在使用过滤器时使用查询修改
在某些情况下,您的列表非常简单,但在某些情况下,当您使用某些过滤器时,您必须添加一些复杂的连接,但在其他情况下,您不希望将连接应用于查询,因为这些连接非常昂贵。示例
$builder->add('languageCode', 'text', array( 'label' => 'Language code', 'required' => false, 'filter' => array( 'expression' => 'l.code LIKE :languageCode', 'eval' => '%like%', 'query_builder' => function(QueryBuilder $builder) { $builder->addSelect('l') ->join('c.language', 'l'); } ) ))
在此示例中,当用户填写 "语言代码" 过滤器时,将添加 join('c.language') 并将 languageCode 条件添加到查询中。
已弃用 参数连接(用于旧版本)
// DEPRECATED: $builder->add('country', 'text', array( 'label' => 'Country name', 'required' => false, 'filter' => array( 'expression' => 'c.name LIKE :country', 'eval' => '%like%', 'join' => array( array('field' => 'u.address', 'alias' => 'a'), array('field' => 'a.country', 'alias' => 'c'), ) ) ))
在这种情况下,只有当用户通过国家过滤器时,国家才会被加入,否则不使用连接。
- 按钮
在buildListing方法内部,您可以为列表位置添加操作按钮。例如:
->add('edit', 'button', array( 'label' => 'Edit', 'route' => 'user_edit', 'params' => array( 'contractor_id' => 'id' ) ))
- 事件
当您需要动态修改/扩展表格行或搜索过滤器时,您可以使用列表事件之一。
- 通过PropertyAccessor访问自定义属性
当使用query_bulder时,您可以使用property选项来访问从获取的实体中获取的任何数据。例如:如果您有相关实体,您可以通过属性访问器访问它的getter
$builder->add('status', 'text', array( 'label' => 'Status', 'property' => 'status.name', ));
或者您甚至可以访问集合中的第一个对象
$builder->add('user', 'text', array( 'label' => 'First user', 'property' => 'users[0].name', ));
列表允许您使用一些神奇的通配符[]*, 来收集集合中的所有值并显示为以逗号分隔的字符串
$builder->add('user', 'text', array( 'label' => 'Users', 'property' => 'users[*].name', ));
注意:您只能在属性选项中使用一个通配符。