pawellen/listing

提供在 symfony 项目中轻松使用 datatables (http://www.datatables.net/) 的列表组件的打包包

安装量: 4,237

依赖: 0

建议者: 0

安全性: 0

星标: 2

关注者: 2

分支: 0

开放问题: 0

语言:JavaScript

类型:symfony-bundle

v0.7.3 2023-07-22 12:27 UTC

README

datatables.net js 插件的构建风格数据表后端插件

版本 2,支持 Symfony 4.4

基于: https://github.com/pawellen/DataTablesListing

DataTables 列表插件

Codacy Badge Build Status

Data tables 列表插件允许您使用 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 方法的选项之一,Request 对象用于获取来自您站点的任何数据,例如筛选器、按列排序等...

  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';
    }
}

这将创建具有两个筛选字段和三个列的用户列表。在 setDataOptions 方法中指定数据源。您还可以使用 "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'
            )
        )
    ));

where: id 是一个 propertyPath 字符串。 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%'
        )
    ))

where: 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') 将被添加,并且语言代码条件将被添加到查询中。

已弃用 参数连接(用于旧版本)

     // 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',
    ));

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