pawellen / data-tables-listing

提供轻松使用 datatables (http://www.datatables.net/) 的列表包

安装: 818

依赖: 0

建议: 0

安全性: 0

星标: 7

关注者: 4

分支: 4

开放问题: 1

类型: symfony-bundle

dev-master 2015-11-30 15:32 UTC

This package is auto-updated.

Last update: 2024-09-14 11:11:18 UTC


README

Codacy Badge Build Status

数据表列表插件允许您轻松创建记录列表,使用 Symfony 表单风格。此插件使用流行的 JQuery DataTables 插件 (http://www.datatables.net/)

安装

  1. 使用 composer 安装插件
{
    "pawellen/data-tables-listing": "dev-master"
}
  1. 更新您的 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>
  1. 您的列表已准备就绪 :)

使用

  1. 在控制器中创建新表格。

要创建列表,您只需在控制器中获取 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 方法中传递的选项之一是请求对象。请求对象用于获取来自您网站的任何数据,例如过滤器、按列排序等...

  1. 创建自己的 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" 选项并提供查询构建器接口以访问更复杂的查询(例如连接)。

  1. 模板

要渲染创建的列表,您必须将 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 函数。此示例还展示了如何覆盖过滤器模板。请注意,块名称前有一个下划线。

函数

  1. 创建链接

要创建链接,您需要在 buildListing 方法内部添加 link 选项。

    $builder->add('name', 'column', array(
        'label' => 'User name',
        'link' => array(
            'route' => 'user_edit',
            'params' => array(
                'user_id' => 'id'
            )
        )
    ));

其中: idpropertyPath 字符串。 route 是路由名称,params 是生成Url函数的参数

  1. 使用 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');
            }
        ));
    }
  1. 使用过滤器

默认情况下,在构建过滤器表单时,您不需要定义任何过滤器,您可以将空数组作为过滤器选项传递,在这种情况下将执行默认搜索。默认搜索使用 "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 必须始终与过滤器名称相同(在当前版本中)

  1. 在使用过滤器时使用查询修改

在某些情况下,您的列表非常简单,但在某些情况下,当您使用某些过滤器时,您必须添加一些复杂的连接,但在其他情况下,您不希望将连接应用于查询,因为这些连接非常昂贵。示例

    $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'),
             )
         )
     ))

在这种情况下,只有当用户通过国家过滤器时,国家才会被加入,否则不使用连接。

  1. 按钮

buildListing方法内部,您可以为列表位置添加操作按钮。例如:

    ->add('edit', 'button', array(
        'label' => 'Edit',
        'route' => 'user_edit',
        'params' => array(
            'contractor_id' => 'id'
        )
    ))
  1. 事件

当您需要动态修改/扩展表格行或搜索过滤器时,您可以使用列表事件之一。

  1. 通过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',
    ));

注意:您只能在属性选项中使用一个通配符。