docdigital / filter-type-guesser
Integrates Lexik Filter types with FormTypes generated by generator-bundle
Installs: 218
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 3
Forks: 1
Open Issues: 1
Type:symfony-bundle
Requires
- lexik/form-filter-bundle: ~2.0
This package is not auto-updated.
Last update: 2024-04-13 11:40:03 UTC
README
This Symfony2 Bundle Integrates Lexik Filter types with FormTypes generated by Sensio generator-bundle or any AbstractType that relies on Dcotrine ORM's Type Guessing (i.e. don't assign hardcoded type to its form fields.)
It works by changing Doctrine GuessedTypes for the lexikFormFilter best filter_type fit in the given form.
Instalation
Update your composer.json
"require": { ... "docdigital/filter-type-guesser": "dev-master" }, ...
Then run the composer update command in your project root dir
$ php composer.phar update docdigital/filter-type-guesser
After composer finish, register the Bundel in app/appKernel.php
class AppKernel extends Kernel { public function registerBundles() { $bundles = array( ... new Lexik\Bundle\FormFilterBundle\LexikFormFilterBundle(), new DocDigital\Bundle\FilterTypeGuesserBundle\DdFilterTypeGuesserBundle(), ); ... return $bundles; } ... }
Usage
In your Controller add a method like this, to create the FilterForm, out of the regular Entity's FormType.
/** * Creates a Filter form to search for Entities. * * @param AbstractType|string $formType The `generate:doctrine:form` generated Type or its FQCN. * * @return \Symfony\Component\Form\Form The filter Form */ private function createFilterForm($formType) { $adapter = $this->get('dd_form.form_adapter'); $form = $adapter->adaptForm( $formType, $this->generateUrl('document_search'), array('fieldToRemove1', 'fieldToRemove2') ); return $form; }
Then, the query building process is lexik's
/** * Collects filterForm filled params and builds a Query. * * @Route("/find", name="document_search") * @Method("POST") * @template("DdDocumentBundle:Document:index.html.twig") */ public function searchAction(Request $request) { // $docType = new FormType/FQCN() could do too. $docType = 'FormType/FQCN'; $filterForm = $this->createFilterForm($docType); $filterForm->handleRequest($request); $filterBuilder = $this->getDocRepo($docType) ->createQueryBuilder('e'); $this->get('lexik_form_filter.query_builder_updater') ->addFilterConditions($filterForm, $filterBuilder); $entities = $filterBuilder->getQuery()->execute(); return array( 'entities' => $entities, 'filterForm' => $filterForm->createView(), ); }
Events for changing the default filterTypes
New since commit 2689659a6109b512c786ab6472fcc7eaa1c72a7b
class KernelEvents implements EventSubscriberInterface { public static function getSubscribedEvents() { return array( 'kernel.request' => 'handleRequest', ); } public function handleRequest(GetResponseEvent $event) { /** * Adds {@link FilterFormTypeGuesser} overrider to change default filter dates. */ $event->getDispatcher()->addListener( FilterFormTypeGuesserEvents::FILTER_TYPE_GUESSER_LOADED, array(new TypeGuesserOverriderListener(), 'override') ); } } class TypeGuesserOverriderListener { /** * Overrides the default filter types associated with some Doctrine Guessed types. * * This code replaces ugly 3 Selects Date by a Bootstrap Date Time picker implementation. * * @param FilterFormTypeGuesserEvent $event the event containing the TypesMap. * / public function override(FilterFormTypeGuesserEvent $event) { $event->typesMap['date'] = 'dd_filter_date_range'; $event->typesMap['datetime'] = 'dd_filter_date_range'; $event->typesMap['time'] = 'dd_filter_date_range'; } }