avpretty/grid-bundle

允许您以表格的形式快速显示任何实体或数组的数据。

安装: 641

依赖项: 0

建议者: 0

安全: 0

星标: 9

关注者: 1

分支: 4

开放性问题: 1

类型:symfony-bundle

v1.0.8 2017-09-27 11:30 UTC

This package is auto-updated.

Last update: 2024-08-25 18:37:09 UTC


README

概述

允许您以表格的形式快速显示任何实体或数组的数据。此表格已包含筛选、排序和分页。

因此,只需9行代码即可构建类似这样的东西

安装

在项目中执行以下控制台命令来安装 GridBundle

$ composer require avpretty/grid-bundle

更新您的 AppKernel.php

$bundles = [
    new AV\GridBundle\AVGridBundle(),
];

GridBundle 包含 jscss,您需要手动包含它们。要使用下面的代码示例,必须安装 AsseticBundle

{% block stylesheets %}
    {% stylesheets '@AVGridBundle/Resources/public/css/grid-view.css' %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}
{% endblock %}

...

{% block javascripts %}
    {% javascripts '@AVGridBundle/Resources/public/js/grid-view.js' %}
        <script src="{{ asset_url }}"></script>
    {% endjavascripts %}
{% endblock %}

注意:GridBundle 使用 bootstrap 框架和 jQuery

网格视图

GridView 是主要的组件,允许您创建和管理网格。每个实体或数组的每个网格都需要新的 GridView 实例。

创建新网格的最短方式

// IN YOUR CONTROLLER
$em = $this->getDoctrine()->getManager();

$dataSource = $this->get('av_grid.query_data_source')
    ->setEntityName(User::class)->setRootAlias('u')
    ->setDataSource($em->getRepository('User')->createQueryBuilder('u'));

$gridData = [
    'dataSource' => $dataSource,
];

return $this->render('index.html.twig', [
    'paginationInstance' => $dataSource->getPagination(),
    'gridView' => $this->get('av_grid.grid_view_factory')
        ->prepareGridView($gridData),
]);

并更新您的模板

{{ gridView(gridView) }}
{{ gridPagination(paginationInstance) }}

完成!

GridViewBundle 为配置网格提供了很多选项。排序、筛选、分页和列选项的详细说明在文档的相应部分中。

扩展示例

$gridData = [
    'dataSource' => $dataSource,
    'filterEntity' => new User,
    'tableCaption' => 'Users',
    'emptyCell' => 'no data',
    'columns' => [
        [
            'label' => 'User ID',
            'attributeName' => 'id'
        ],
        [
            'label' => 'User Full Name',
            'content' => function($userEntity, $rowIndex) {
                return $userEntity->getFirstName().' '.$userEntity->getLastName(); 
            }
        ],
        [
            'attributeName' => 'created',
            'filterType' => DateType::class,
            'filterFieldOptions' => [
                'widget' => 'single_text'
            ]
        ]
    ]
];

return $this->render('index.html.twig', [
    'paginationInstance' => $dataSource->getPagination(),
    'gridView' => $this->get('av_grid.grid_view_factory')
        ->prepareGridView($gridData),
]);

GridView 选项:网格筛选选项

  • dataSource - 为网格提供数据。应实现 BaseDataSource 接口。
    • 类型:BaseDataSource
    • 必需:是
  • containerOptions - 将应用于网格容器的 HTML 属性列表。
    • 类型:array
    • 必需:否
    • 示例:['containerOptions' => ['data-type' => 'grid-container', 'class' => 'outer']]
  • tableOptions - 将应用于网格表格的 HTML 属性列表。在这里,您可以覆盖表格的 CSS 样式。
    • 类型:array
    • 必需:否
    • 示例:['tableOptions' => ['class' => 'table table-hover']]
  • tableCaption - 网格表格标题。
    • 类型:string
    • 必需:否
    • 示例:['tableCaption' => 'Table Caption']
  • showHeader - 是否显示表格标题行。
    • 类型:bool
    • 必需:否
  • headerRowOptions - 将应用于网格表格标题行的 HTML 属性列表。
    • 类型:array
    • 必需:否
  • rowOptions - 网格表格行的选项。
    • 类型:array
    • 必需:否
  • filterRowOptions - 包含筛选器的行的 HTML 属性列表。
    • 类型:array
    • 必需:否
  • emptyCell - 将用于空表格单元格的值。
    • 类型:string
    • 必需:否
  • filterEntity - 用于创建筛选字段的目标实体实例。
    • 类型:object
    • 必需:否
  • filterUrl - 接受筛选数据的目标 URL。默认情况下将使用当前路由。
    • 类型:string
    • 必需:否

嵌套网格

您可以将一个网格插入到另一个网格中。为此,您需要手动渲染嵌套网格。

// IN CONTROLLER
$ext = $this->get('twig')->getExtension(GridExtension::class);

$nestedGridData = [
    'dataSource' => $nestedGridDataSource,
]; 

$renderedNestedGrid = $ext->prepareGridView(
    $gridFactory->prepareGridView($nestedGridData)
);

$gridData = [
    'dataSource' => $dataSource,
    'filterEntity' => new User,
    'tableCaption' => 'Users',
    'emptyCell' => 'no data',
    'columns' => [
        ...
        [
            'content' => function($entity, $rowIndex) use ($renderedNestedGrid) {
                return $renderedNestedGrid;
            }
            'format' => ColumnFormat::RAW_FORMAT
        ]
    ]
];

return $this->render('index.html.twig', [
    'paginationInstance' => $dataSource->getPagination(),
    'gridView' => $this->get('av_grid.grid_view_factory')
        ->prepareGridView($gridData),
]);

网格过滤器

默认情况下,网格筛选器是禁用的。要启用它们,请将以下代码添加到您的网格配置中

$userEntity = new User;

$gridData = [
    'filterEntity' => $userEntity,
    ...
];

指定实体实例,允许您构建筛选字段。

默认情况下,将为每个实体属性创建过滤器字段。但您也可以为自定义列添加过滤器字段。

示例

$gridData = [
    'filterEntity' => $userEntity,
    'dataSource' => $dataSource,
    'columns' => [
        [
            'label' => 'User Name',
            'attributeName' => 'name',
            'filterType' => TextType::class,
        ]
    ],
];

注意:如果您没有指定过滤器类型,symfony将尝试猜测它。关于这一点,您可能会得到一个错误 无法转换属性路径...。这个错误的主要原因是因为doctrine字段验证,所以有两个选项:手动指定过滤器类型,如上所示,或者删除验证。

您可以在symfony的表单文档中找到所有可用的过滤器类型以及过滤器选项。

在使用ArrayDataSource的情况下,您仍然需要指定过滤器实体(任何实体)。

网格过滤器选项

  • filterEntity - 用于构建过滤器表单的实体实例。
    • 类型:object
    • 示例:'filterEntity' => new User,
  • filterUrl - 接受筛选数据的目标 URL。默认情况下将使用当前路由。
    • 类型:string
    • 示例:'filterUrl' => 'custom-url'

完整示例 对于User实体。我们有以下字段:firstNamelastNamecreated。现在在UserRepository中创建一个search方法

...
public function search(array $searchParams)
{
    $queryBuilder = $this->createQueryBuilder('u');

    if (!$searchParams) {
        return $queryBuilder;
    }
    
    $firstName = $searchParams['firstName'];
    
    $lastName = $searchParams['lastName'];
    
    $created = $searchParams['created']; // Date foramt - Y-m-d (in our case)
    
    if ($firstName) {
        $queryBuilder->andWhere('u.firstName LIKE :firstName')
            ->setParameter(':firstName', '%'.$firstName.'%');
    }
    
    if ($lastName) {
        $queryBuilder->andWhere('u.lastName LIKE :lastName')
            ->setParameter(':lastName', '%'.$lastName.'%');
    }

    // I'm sure you'll have time to write code better than this
    if ($created) {
        $queryBuilder->andWhere('u.created BETWEEN :start AND :end')
        ->setParameter(':start', $created)
        ->setParameter(
            ':end',
            (new \DateTime($created))->modify('+1 day')->format('Y-m-d')
        );
    }

    return $queryBuilder;
}
...

现在让我们在Controller中描述我们的过滤器

$gridFactory = $this->get('av_grid.grid_view_factory');

/** @var EntityManager $em */
$em = $this->getDoctrine()->getManager();

$dataSource = $this->get('av_grid.query_data_source')
    ->setEntityName(User::class)
    ->setRootAlias('u');

$dataSource->setDataSource(
    $em->getRepository('User')->search($request->get('User'))
);

$gridData = [
    'filterEntity' => new User,
    'dataSource' => $dataSource,
];
...
// render template

现在将显示过滤器表单,您可以处理传入的过滤器数据。

带有关系的过滤器

您还可以将过滤器应用于相关实体。例如,我们将使用User实体和相关Country实体。让我们创建一个按国家筛选的下拉列表。

注意!!!:要能够在相关实体上使用过滤功能,您应该在您的查询构建器中指定这些实体。不要使用代理对象。

示例

[
    'attributeName' => 'country',
    'content' => function($userEntity, $rowIndex) {
        return $entity->getCountry()->getTitle();
    },
    'filterType' => EntityType::class,
    'filterFieldOptions' => [
        'class' => Country::class,
        'choice_label' => 'title'
    ]
],

对上述示例的一些解释:attributeName是必填的,其值应在User实体中指定。您还可以指定任意attributeName的值,但是除非您将该字段添加到目标(User)实体中,否则表单字段将不会记住所选的过滤器值。

列提供了一种简单的接口来控制网格内的数据显示。有三种类型的列和一个基本接口BaseColumn

  • 操作列
  • 计数器列

负责在网格中渲染常见数据。此类列显示所有用户数据,如实体或数组。用户可以自定义一系列显示选项。

例如,我们将使用User实体的QueryDataSource。我们的实体包含以下字段:firstNamelastNameageemailcreated

简单示例

// To just display all fields of entity you can omit column configuration
'columns' => [
    ['attributeName' => 'firstName'],
    ['attributeName' => 'lastName'],
    ['attributeName' => 'age'],
    ['attributeName' => 'email'],
    ['attributeName' => 'created'],
]

注意:如果我们省略column配置,结果将相同。

在使用关系的情况下,您可以使用以下语法

'columns' => [
    [
        'label' => 'User Country'
        'content' => function($userEntity, $rowIndex) {
            return $userEntity->getCountry()->getTitle();
        }
    ]
]

OR YOU CAN USE SHORT SYNTAX

'columns' => [
    [
        'attributeName' => 'country.title'
    ]
]

扩展示例

'columns' => [
    [
        'label' => 'User Name'
        'sortable' => false
        'attributeName' => 'firstName',
        'filterType' => EntityType::class,
        'filterFieldOptions' => [
            'class' => User::class,
            'choice_label' => 'firstName',
            'placeholder' => 'Select name',
        ]
    ],
    [
        'label' => 'User Last Name'
        'attributeName' => 'lastName'
    ],
    [
        'attributeName' => 'fullName'
        'content' => function($userEntity, $rowIndex) {
            return $userEntity->getFirstName() . ' ' . $userEntity->getLastName(); 
        },
        'filterType' => TextType::class,
        'filterFieldOptions' => [
            'mapped' => false
        ]
    ],
    [
        'attributeName' => 'created',
        'format' => [ColumnFormat::DATE_FORMAT => 'Y-m-d']
    ],
    [
        'attributeName' => 'email',
        'visible' => function() use ($someExternalObject) {
            return // some permission check logic
        }
    ],
    [
        'label' => 'Custom column',
        'content' => function($userEntity) use ($someEntity) {
            return $someEntity->getDataByUserId($userEntity->getId());
        },
        'contentOptions' => ['width' => '100px']
    ]
]

列选项

  • attributeName - 实体字段名称或使用ArrayDataSource时的键名称。
    • 类型:string
    • 示例:'attributeName' => 'lastName'
    • 必需:如果没有content值,则为是。
  • label - 列表头标签。如果没有指定,则使用attributeName
    • 类型:string
    • 示例:'label' => '列标签'
    • 必需:如果没有attributeName值,则为是。
  • encodeLabel - 是否对标题进行编码。默认为False。
    • 类型:string
    • 示例:'encodeLabel' => true
    • 必需:否
  • content - 列单元格内容。此参数可以包含字符串值或回调函数。
    • 类型:string|callable
    • 示例:'content' => '自定义字符串内容'。回调函数示例已在上文展示。
    • 必需:否
  • contentOptions - 应用到内容单元格的选项列表。
    • 类型:array|callable
    • 示例: 'contentOptions' => ['width' => '100px']
    • 必需:否
  • format - 列单元格数据的格式。默认为 ColumnFormat::TEXT_FORMAT
    • 类型:string
    • 示例: 'contentOptions' => ['width' => '100px']
    • 必需:否
  • visible - 是否使列可见。参数可以接受布尔值或可调用函数。
    • 类型: bool|callable
    • 示例: 'visible' => false
    • 必需:否
  • sortable - 列是否可排序。
    • 类型:bool
    • 示例: 'sortable' => false
    • 必需:否
  • filterType - 过滤输入字段类型。可以应用 Symfony 表单输入 类型 之一。
    • 类型:string
    • 示例: 'filterType' => EmailType::class
    • 必需:否
  • filterFieldOptions - 将应用于过滤输入字段的选项列表。文本字段类型 选项
    • 类型:array
    • 必需:否
  • filterOptions - 将应用于过滤单元格的选项列表。
    • 类型:array
    • 示例: 'filterOptions' => ['class' => 'custom-filter-cell-class']
    • 必需:否

CounterColumn

提供表格行的简单计数器。对于数据源 QueryDataSourceArrayDataSource 都默认包含。

继承数据列的大部分属性。

示例

'columns' => [
    [
        'service' => 'av_grid.counter_column',
        'label' => 'My Custom Label' // # by default
    ]
]

ActionColumn

操作列允许为每个网格行创建控制按钮。目前有两种按钮类型: showedit。每个按钮均可配置。如果你使用的是 QueryDataSource,则默认包含 Action columns;否则,应手动指定。

注意:默认情况下,所有操作按钮都将可见,并使用当前路由。无需手动指定每个按钮。它们将默认显示。

示例

'columns' => [
    [
        // Custom configuration
        'service' => 'av_grid.action_column',
        'buttons' => [
            ActionColumn::SHOW => 'http://custom-url.com'
            ActionColumn::EDIT => function ($entity, $url) use ($router) {
                return $router->generate('compaign_show', ['id' => 4]);
            },
        ],
        'hiddenButtons' => [
            ActionColumn::EDIT => function ($entity, $url) {
                return $entity->getId() == 5; // If true then won't be shown
            }
        ]
    ]
]

每个按钮有两个可配置的选项: urlvisibility。这两个选项都接受标量值和回调函数。

如果你使用回调函数,则有两个可用参数

  • 实体实例
  • 默认按钮 URL

buttonshiddenButtons 值是可选的。默认情况下,URL 创建将使用当前路由的 show 路径和 edit

例如,如果当前 URL 是 .../admin/user/,则对于 show 按钮将生成以下 URL .../admin/user/{userId}/show,直到你更改它。

列数据格式

此组件允许将不同的格式类型应用于 Column 数据。有四种可用的格式

  • ColumnFormat::TEXT_FORMAT - 默认列单元格数据格式。对所有 htmljstwig 实体进行编码。
  • ColumnFormat::RAW_FORMAT - 不进行任何编码。可以用于将一些 htmljs 应用到列单元格数据。
  • ColumnFormat::TWIG_FORMAT - 允许使用任何 twig 构造。
  • ColumnFormat::DATE_FORMAT - 日期格式化。目前可以格式化的日期格式有两种:timestamp (int|string)\DateTime\DateInterval

示例

'columns' => [
    [
        'label' => 'Plain text'
        'content' => function ($entity) {
            return '<script>alert("hello");</script>'; // will be displayed as plain text
        },
    ],
    [
        'label' => 'Execute JS'
        'content' => function ($entity) {
            return '<script>alert("hello");</script>'; // alert message will be shown
        },
        'format' => ColumnFormat::RAW_FORMAT,
    ],
    [
        'label' => 'Format timestamp'
        'content' => function($entity) {
            // return $entity->getCreated(); // returns \DateTime 

            // return '1484204985'; // simple timestamp
        },
        'format' => [ColumnFormat::DATE_FORMAT => 'Y-m-d']
    ]
    [
        'label' => 'Twig construction'
        'content' => function($entity) {
            return "{{ 'CUSTOM TEXT'|lower }}";
        },
        'format' => ColumnFormat::FORMAT
    ]
]

数据源

此实体在 grid 和数据源之间充当中介。正是此组件创建最终的查询并将执行结果传递给工作于 BaseDataSource 接口的 grid 组件。

有两个实体实现了 BaseDataSource

  • QueryDataSource
  • ArrayDataSource

QueryDataSource

QueryDataSource 允许将你的 QueryBuilder 实例传递给网格。示例

// Get user entity query builder
$queryBuilder = $entityManager->getRepository('User')->createQueryBuilder('u');

// Initialize data source
$dataSource = $this->get('av_grid.query_data_source')
    ->setDataSource($queryBuilder)
    ->setRootAlias('u'); // Read below about root alias

// Create custom pagination. OPTIONAL
$pagination = $this->get('av_grid.pagination')
    ->setPageSize(5)
    ->setTotalCount(50);

// Create custom sort. OPTIONAL
$sortAttributes = [
    'u.email',
    // Custom configuration
    'name' => [
        Sort::ASC  => [
            'u.first_name' => Sort::ASC, 'u.last_name' => Sort::ASC
        ],
        Sort::DESC => [
            'u.first_name' => Sort::DESC, 'u.last_name' => Sort::DESC
        ],
    ],
]

$sort = $this->get('av_grid.sort')->setAttributes($sortAttributes);

$dataSource->setPagination($pagination)->setSort($sort);

注意:对于 QueryDataSource,无需手动配置排序和分页。每个 BaseDataSource 实例都是使用默认参数创建的,包含排序和分页。例如,如果我们没有指定排序参数,则 User 实体的所有字段都将可排序。

现在我们可以使用 fetchEntities 获取具有排序和分页设置的 user 实体。

// Get all user entities
$dataSource->fetchEntities();

// Get entities total count even if we did not call `setTotalCount` of pagiantion component
$dataSource->getTotalCount();

注意:如上所述,我们应该指定实体别名,就像我们对 User 所做的那样。关于这一点,我们应该始终为 QueryDataSource 指定实体别名。如果您不这样做,则别名将从实体名称中获取,并将是 User。这样做的原因是默认排序配置需要知道完整的字段名称。另一方面,您将使用如 JOIN 之类的构造。

ArrayDataSource

ArrayDataSource 允许将您的数组数据传递到网格。

示例

// Get user entity query builder
$userData = [
    ['first_name' => 'John', last_name => 'Doe', 'email' => 'john_doe@mail.com'],
    ['first_name' => 'Jane', last_name => 'Doe', 'email' => 'jane_doe@mail.com'],
    ['first_name' => 'Mike', last_name => 'Doe', 'email' => 'mike_doe@mail.com'],
];

// Initialize data source
$dataSource = $this->get('av_grid.array_data_source')
    ->setDataSource($userData);

// Create custom pagination. OPTIONAL
...

// Create custom sort. OPTIONAL
...

$sort = $this->get('av_grid.sort')->setAttributes($sortAttributes);

$dataSource->setPagination($pagination)->setSort($sort);

现在我们可以将我们的 $dataSource 传递给网格,它将被适当地显示。

注意:我们没有为排序设置别名 u,如 QueryDataSource 的情况。当我们使用 ArrayDataSource 时,应仅使用数组键。

排序

排序组件允许您灵活地为特定属性设置和扩展排序参数。您可以使用此组件与数据源组件之一(QueryDataSourceArrayDataSource)一起使用。

假设我们有一个具有以下字段的 User 实体

  • firstName
  • lastName
  • email

示例

$dataSource = $this->get('av_grid.data_source');
$dataSource->setDataSource(
    $entityManager->getRepository('User')->createQueryBuilder('u')
);

// Simple example
$sortAttributes = [
    'u.email',
    'u.first_name'
    'u.last_name'
]

// Extended example: sorting by multiple fields
$sortAttributes = [
    // Default sort params will be used
    'u.email',

    // Custom configuration
    'name' => [
        Sort::ASC  => [
            'u.first_name' => Sort::ASC, 'u.last_name' => Sort::ASC
        ],
        Sort::DESC => [
            'u.first_name' => Sort::DESC, 'u.last_name' => Sort::DESC
        ],
        'default' => Sort::DESC,
        'label'   => 'Name',
    ],
]

$sort = $this->get('av_grid.sort')->setAttributes($sortAttributes);

$dataSource->setSort($sort);

如果没有指定参数的属性名称,则将使用默认参数。下一个示例显示了 email 属性是如何被解释的。

[
    'u.email'  => [
        Sort::ASC  => ['u.email' => Sort::ASC],
        Sort::DESC => ['u.email' => Sort::DESC],
        
    ],
]

在配置中使用的属性名称是如果使用 QueryDataSource,则实体字段名称,如果使用 ArrayDataSource,则是数组键名称。

注意:在扩展属性配置中,我们使用了自定义字段标题 name,但使用了指定的别名 u 来指定可排序字段。在短记法的情况下,我们应该指定实体别名,就像我们在 u.email 中所做的那样。

属性选项

  • Sort::ASC - 升序排序配置。此参数定义按一个或多个属性排序。尽管此参数定义了升序排序,但允许对任何属性使用两种类型的排序。
    • 类型:array
    • 必需:否
    • 示例:Sort::ASC => ['first_name' => Sort::ASC, 'last_name' => Sort::ASC]
  • Sort::DESC - 查看 Sort::ASC
    • 类型:array
    • 必需:否
    • 示例:Sort::DESC => ['first_name' => Sort::DESC, 'age' => Sort::ASC]
  • default - 默认排序参数。此排序类型将默认使用。
    • 类型:string
    • 必需:否
    • 示例:['default' => Sort::DESC]
  • label - 用于请求字符串的属性名称。如果未定义标签,则将使用属性名称。
    • 类型:string
    • 必需:否
    • 示例:['label' => 'FullName']

还有几个可以配置的 Sort 实例的附加参数

  • sortParam - 包含查询字符串中排序数据的参数名称。此参数可以更改以允许在单个页面上使用多个排序实例。默认值为 sort
    • 类型:string
    • 示例:$sortInstance->setSortParam('customSortParam')
  • separator - 用于在查询字符串中分隔排序属性的分隔符。默认值为 ,
    • 类型:string
    • 必需:否
    • 示例:$sortInstance->setSeparator('.')
  • defaultOrder - 默认排序参数。
    • 类型:array
    • 必需:否
    • 示例:$sortInstance->setDefaultOrder(['email' => Sort::DESC])

关系排序

同样,您还可以根据相关实体的字段进行排序。例如,我们将使用 User 实体和相关 Country 实体。

注意!!!:要能够在相关实体上使用排序,您应该在您的查询构建器中指定这些实体。不要使用代理对象。

示例

$sort = $this->get('av_grid.sort');

$sort->setAttributes([
    'countryTitle' => [
        Sort::ASC  => ['c.title' => Sort::ASC],
        Sort::DESC => ['c.title' => Sort::DESC],
    ]
]);

$dataSource->setSort($sort);

对上述示例的某些说明:c 是您应在查询构建器中指定的 Country 实体别名。

分页

分页组件允许您轻松限制页面显示的数据量。此组件由三部分组成

  • 分页 - 负责管理 QueryBuilder 的限制和偏移参数。
  • PaginationView - 负责构建分页块。同时,此组件生成分页链接。
  • PaginationExtension - 用于渲染分页块的 twig 扩展。

分页示例

$pagination = $this->get('av_grid.pagination');

// Set amount of items per page
$pagination->setPageSize(3); // Or default value will be used
$pagination->setTotalCount(12); // required if used beyond `QueryDataSource` context.

// Set custom pagination instance to QueryDataSource and override default QueryDataSource pagination config
$dataSource->setPagination($pagination);

使用这些参数,分页组件能够根据查询参数生成限制和偏移的值。

// Let's assume that we have query string: .../admin/user/?per-page=3&page=3

echo $pagination->getLimit(); // 3
echo $pagination->getOffset(); // 6

注意:可能存在名称冲突。例如,您的某个路由已经使用了 page 查询参数名称。在这种情况下,您可以重命名页面参数名称。

$pagination->setPageParam('my-page-counter'); // .../admin/user/?per-page=3&my-page-counter=3

分页选项

  • pageSize - 每页的项目数量。
    • 类型:int
    • 示例:$pagination->setPageSize(10)
    • 必需:否
  • totalCount - 项目总数。
    • 类型:int
    • 必需:是
    • 示例:$pagination->setTotalCount(100)
  • pageParam - 包含页面数字的查询参数名称。此参数可以更改,以允许单页上的多个分页块。默认值 page
    • 类型:string
    • 必需:否
    • 示例:$pagination->setPageParam('customPageName') // .../?per-page=3&customPageName=3
  • pageSizeParam - 包含页面中项目数量的查询参数名称。此参数可以更改,以允许单页上的多个分页块。默认值 per-page
    • 类型:string
    • 必需:否
    • 示例:$pagination->setPageSizeParam('customPageSize')
  • route - 路由名称。如果未指定路由,则使用当前路由。
    • 类型:string
    • 必需:否
    • 示例:$pagination->setRoute('post_index')
  • defaultPageSize - 默认每页项目数量。如果未指定 pageSize,则将使用此值。默认 20。
    • 类型:int
    • 必需:否
    • 示例:$pagination->setDefaultPageSize(50)

注意:BaseDataSource 实例已包含分页实例。因此,无需手动指定分页实例并将其设置到 QueryDataSourceArrayDataSource。相反,将使用默认的分页配置。

要显示分页块,请在模板中调用 twig 扩展

// paginationInstance should be passed to template from controller
{{ gridPagination(paginationInstance) }}

gridPagination 扩展可以应用额外的参数。所有参数都是可选的

{{ gridPagination(
        paginationInstance,
        {
            'options'             : {'id': 'pagination-block-id', 'data-id': 'some-id'},
            'linkOptions'         : {'class': 'class-for-each-link'},
            'showFirstPageLink'   : true,
            'showLastPageLink'    : true,
            'showPrevPageLink'    : true,
            'showNextPageLink'    : true,
            'nextPageLabel'       : '&rsaquo;',
            'prevPageLabel'       : '&lsaquo;',
            'firstPageLabel'      : '&laquo;',
            'lastPageLabel'       : '&raquo;',
            'maxButtonCount'      : 13,
            'activePageCssClass'  : 'active',
            'disabledPageCssClass': 'disabled',
            'firstPageCssClass'   : 'first',
            'lastPageCssClass'    : 'last',
            'prevPageCssClass'    : 'prev',
            'nextPageCssClass'    : 'next',
        }
   )
}}