deejff / data-grid-bundle
用于KnpPaginator的包装器。帮助创建带有过滤器的完整数据网格。
dev-master / 1.0.x-dev
2019-05-09 13:38 UTC
Requires
- php: >=5.3.2
- knplabs/knp-paginator-bundle: ^2.5
- symfony/framework-bundle: ~2.3|~3.0
This package is not auto-updated.
Last update: 2023-09-25 09:22:25 UTC
README
该Bundle使用symfony表单组件创建过滤器。
安装
- composer require deejff/data-grid-bundle
- 在AppKernel.php中添加Deejff\DataGridBundle\DeejffDataGridBundle()
示例控制器操作
public function indexAction(Request $request) { $em = $this->get('doctrine.orm.entity_manager'); $qb = $em->createQueryBuilder() ->from('ExampleBundle:User', 'u') ->select("u"); $dataGridBuilder = $this->get('deejff_data_grid.service.data_grid_builder'); $dataGrid = $dataGridBuilder->build( $request, $qb, $this->createForm(DataGrid\User\FilterType::class), new DataGrid\User\FilterQueryBuilder() ); return [ 'dataGrid' => $dataGrid ]; }
如你所见,要创建带有过滤器的数据网格,你必须传递FilterType和FilterQueryBuilder。过滤器类型是symfony表单的实例,例如:
class FilterType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'firstName', TextType::class, [ 'required' => false, 'attr' => [ 'label' => 'Name' ] ] ) ->add( 'lastName', TextType::class, [ 'required' => false, 'attr' => [ 'label' => 'Last name' ] ] ) ->add( 'email', TextType::class, [ 'required' => false, 'attr' => [ 'label' => 'Email' ] ] ); } /** * @return string */ public function getName() { return 'filter'; } /** * Configures the options for this type. * * @param OptionsResolver $resolver The resolver for the options. */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults( [ 'csrf_protection' => false ] ); } }
FilterQueryBuilder的目的是在提交过滤器后修改查询。你的自己的查询构建器必须实现FilterQueryBuilderInterface,例如:
class FilterQueryBuilder implements FilterQueryBuilderInterface { public function build(QueryBuilder $qb, $data) { if (!empty($data['firstName'])) { $qb->andWhere('u.firstName LIKE :firstName'); $qb->setParameter(':firstName', '%' . $data['firstName'] . '%'); } if (!empty($data['lastName'])) { $qb->andWhere('u.lastName LIKE :lastName'); $qb->setParameter(':lastName', '%' . $data['lastName'] . '%'); } if (!empty($data['email'])) { $qb->andWhere('u.email LIKE :email'); $qb->setParameter(':email', '%' . $data['email'] . '%'); } } }
要在视图中创建数据网格,你可以使用标准的嵌入视图DeejffDataGridBundle::data-grid.html.twig,或者使用你自己的。排序链接由knp_pagination_sortable辅助器创建。
{% embed "DeejffDataGridBundle::data-grid.html.twig" %} {% block data_grid_header %} <tr> <th>{{ knp_pagination_sortable(dataGrid.pagination, 'Id'|trans, 'u.id') }}</th> <th>{{ knp_pagination_sortable(dataGrid.pagination, 'First name'|trans, 'u.firstName') }}</th> <th>{{ knp_pagination_sortable(dataGrid.pagination, 'Last name'|trans, 'u.lastName') }}</th> <th>{{ knp_pagination_sortable(dataGrid.pagination, 'Email'|trans, 'u.email') }}</th> </tr> {% endblock %} {% block data_grid_content %} {% for entity in dataGrid.data %} <tr> <td>{{ entity.id }}</td> <td>{{ entity.firstName }}</td> <td>{{ entity.lastName }}</td> <td>{{ entity.email }}</td> </tr> {% endfor %} {% endblock %} {% endembed %}