idci/filter-form-bundle

Symfony FilterFormBundle

安装: 245

依赖者: 0

建议者: 0

安全: 0

星标: 6

关注者: 7

分支: 4

开放问题: 1

类型:symfony-bundle

dev-master 2013-07-24 13:47 UTC

This package is auto-updated.

Last update: 2024-08-24 20:30:06 UTC


README

Symfony2 过滤表单包

安装

要安装此包,请按照以下步骤操作

首先在您的 composer.json 文件中添加依赖项

"require": {
    ...
    "idci/filter-form-bundle": "dev-master"
},

然后使用以下命令安装包

php composer update

在您的应用程序内核中启用包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new IDCI\Bundle\FilterFormBundle\IDCIFilterFormBundle(),
    );
}

现在包已安装。

如何使用

此包的所有神奇功能都位于过滤器管理器中。提供了一个抽象的过滤器管理器,同时还有一个实体抽象过滤器管理器,可以管理所有我们的 Doctrine2 实体过滤器。

Filter Form UML schema

注意:要使用范围过滤器,您需要安装 jQuery 和 jQuery UI。注意2:要使用 RangeFilter 和 OrderByFilter,您需要在您的 app/config/config.yml 中导入包的 config.yml 配置

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: @IDCIFilterFormBundle/Resources/config/config.yml }

创建自己的过滤器管理器和过滤器

为了使用此包,您必须扩展一些现有类。例如,我们将为新闻实体创建一个过滤器

// TODO : 插入新闻 UML 模式

我们必须创建一个 NewsFilterManager(它扩展了 EntityAbstractFilterManager),它聚合了两个过滤器(这只是一个例子!)

  • AuthorFilter:允许根据作者名称进行过滤
  • TitleFilter:允许根据新闻标题进行过滤

对于作者来说,我们感兴趣的第一个过滤器是RelationFieldEntityAbstractFilter,它可以在连接表(在我们的案例中是作者)上选择和过滤。我们还可以使用SelectRelationFieldEntityAbstractFilter,它是第一个的子类,但以HTML输出的形式显示数据。一方面,我们必须构建我们的过滤器:<?php namespace MyApp\Bundle\MyBundle\Form\Filter; use IDCI\Bundle\FilterFormBundle\Form\Filter\SelectRelationFieldEntityAbstractFilter; class AuthorFilter extends SelectRelationFieldEntityAbstractFilter { // 要检索的实体 public function getEntityClassName() { return "MyAppMyBundle:Author"; } // 实体字段名,在我们的案例中是作者 public function getEntityFieldName() { return "author"; } // 过滤标签 public function getFilterFormLabel() { return "作者"; } // 过滤器名称 public function getFilterName() { return "news_author"; } } 第二个我们可以使用的过滤器是TextFieldEntityAbstractFilter,它可以对全文搜索进行过滤:<?php namespace MyApp\Bundle\MyBundle\Form\Filter; use IDCI\Bundle\FilterFormBundle\Form\Filter\TextFieldEntityAbstractFilter; class TitleFilter extends TextFieldEntityAbstractFilter { public function getEntityClassName() { return "MyAppMyBundle:News"; } public function getEntityFieldName() { return "title"; } public function getFilterFormLabel() { return "标题"; } public function getFilterName() { return "news_title"; } } 另一方面,我们必须创建新闻过滤器管理器,它将聚合我们的过滤器。我们的NewsFilterManager看起来应该是这样的:<?php namespace MyApp\Bundle\MyBundle\Form\FilterManager; use IDCI\Bundle\FilterFormBundle\Form\FilterManager\EntityAbstractFilterManager; use MyApp\Bundle\MyBundle\Form\Filter\AuthorFilter; use MyApp\Bundle\MyBundle\Form\Filter\TitleFilter; class NewsFilterManager extends EntityAbstractFilterManager { public function buildFilters($options = array()) { // 我们必须添加先前的过滤器 $this ->addFilter(new AuthorFilter()) ->addFilter(new TitleFilter()) ; } public function getEntityClassName() { return "MyApp\Bundle\MyBundle\Entity\News"; } } 我们提供了一些处理实体的现有过滤器,您可以在Filter目录中查看这些过滤器。如何在控制器中使用过滤器管理器作为服务 首先,您必须在bundle的service.yml中声明自己的过滤器作为服务: services: my_filter_manager: class: MyApp\Bundle\MyBundle\Form\FilterManager\MyFilterManager arguments: [@service_container] 然后,您必须在控制器中使用它: public function filterAction(Request $request) { // 获取服务 $filterManager = $this->get('my_filter_manager'); // 根据提供给过滤器管理器的过滤器创建过滤器表单 $filterForm = $filterManager->createForm(); // 数据是否已过滤? if ($request->query->has($filterForm->getName())) { $filterForm->bindRequest($request); } $filteredNews = $filterManager->filter(); // 将所有参数传递给视图 return array( 'news' => $filteredNews, 'filter_form' => $filterForm->createView(), 'form_action_route_name' => $request->get('_route'), 'is_filtered' => $filterManager->hasQueryingFilters() ); } 现在,我们只需要在视图中显示我们的过滤器表单: <form action="{{ path(form_action_route_name) }}" method="get"> {{ form_widget(filter_form) }} <button type="submit">过滤</button> </form> 就这样。这个包的逻辑和强大功能都位于过滤器管理器中。