avpretty / grid-bundle
允许您以表格的形式快速显示任何实体或数组的数据。
Requires
- php: >=5.5.0
- symfony/dependency-injection: ~2.3|~3.0
- symfony/framework-bundle: ~2.3|~3.0
- twig/twig: ~1.12|~2
This package is auto-updated.
Last update: 2024-08-25 18:37:09 UTC
README
概述
允许您以表格的形式快速显示任何实体或数组的数据。此表格已包含筛选、排序和分页。
安装
在项目中执行以下控制台命令来安装 GridBundle
$ composer require avpretty/grid-bundle
更新您的 AppKernel.php
$bundles = [ new AV\GridBundle\AVGridBundle(), ];
GridBundle 包含 js 和 css,您需要手动包含它们。要使用下面的代码示例,必须安装 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实体。我们有以下字段:firstName、lastName和created。现在在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。我们的实体包含以下字段:firstName、lastName、age、email和created。
简单示例
// 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'] - 必需:否
- 类型:
提供表格行的简单计数器。对于数据源 QueryDataSource 和 ArrayDataSource 都默认包含。
继承数据列的大部分属性。
示例
'columns' => [ [ 'service' => 'av_grid.counter_column', 'label' => 'My Custom Label' // # by default ] ]
操作列允许为每个网格行创建控制按钮。目前有两种按钮类型: show、edit。每个按钮均可配置。如果你使用的是 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 } ] ] ]
每个按钮有两个可配置的选项: url、visibility。这两个选项都接受标量值和回调函数。
如果你使用回调函数,则有两个可用参数
- 实体实例
- 默认按钮 URL
buttons 和 hiddenButtons 值是可选的。默认情况下,URL 创建将使用当前路由的 show 路径和 edit。
例如,如果当前 URL 是 .../admin/user/,则对于 show 按钮将生成以下 URL .../admin/user/{userId}/show,直到你更改它。
列数据格式
此组件允许将不同的格式类型应用于 Column 数据。有四种可用的格式
ColumnFormat::TEXT_FORMAT- 默认列单元格数据格式。对所有html、js或twig实体进行编码。ColumnFormat::RAW_FORMAT- 不进行任何编码。可以用于将一些html或js应用到列单元格数据。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 时,应仅使用数组键。
排序
排序组件允许您灵活地为特定属性设置和扩展排序参数。您可以使用此组件与数据源组件之一(QueryDataSource 或 ArrayDataSource)一起使用。
假设我们有一个具有以下字段的 User 实体
- firstName
- lastName
示例
$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 实例已包含分页实例。因此,无需手动指定分页实例并将其设置到 QueryDataSource 或 ArrayDataSource。相反,将使用默认的分页配置。
要显示分页块,请在模板中调用 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' : '›',
'prevPageLabel' : '‹',
'firstPageLabel' : '«',
'lastPageLabel' : '»',
'maxButtonCount' : 13,
'activePageCssClass' : 'active',
'disabledPageCssClass': 'disabled',
'firstPageCssClass' : 'first',
'lastPageCssClass' : 'last',
'prevPageCssClass' : 'prev',
'nextPageCssClass' : 'next',
}
)
}}