idci / filter-form-bundle
Symfony FilterFormBundle
Requires
- php: >=5.3.2
- symfony/framework-bundle: >=2.1
- twig/twig: *
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 实体过滤器。
注意:要使用范围过滤器,您需要安装 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> 就这样。这个包的逻辑和强大功能都位于过滤器管理器中。