dev-master
9999999-dev https://github.com/localinks/LocalinksDependentAutoCompleteBundleExtends Sonata Autocomplete Form Type and filters results using other form fields values
The Requires
filter symfony admin sonata
Extends Sonata Autocomplete Form Type and filters results using other form fields values
LocalinksDependentAutoCompleteBundle allows, in a Sonata Admin form, to filter the results of a "sonata_type_model_autocomplete" field using the value of one (or more) other field present in the same form., (*1)
Using Composer, (*2)
Add the following to the "require" section of your composer.json
file:, (*3)
"localinks/dependentautocompletebundle": "dev-master"
And update your dependencies, (*4)
php composer.phar update
Registers the bundle in your app/AppKernel.php
:, (*5)
<?php ... public function registerBundles() { $bundles = array( ... new Localinks\DependentAutoCompleteBundle\LocalinksDependentAutoCompleteBundle(), ... ); ...
Imagine that you have an autocomplete "country" form field and another one: "city". You want your "city" field to be filtered according to the content of the "country" field., (*6)
For this you need to update your Admin class:, (*7)
<?php ... protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add('country', 'sonata_type_model_autocomplete', array( 'label' => 'Country', 'property' => 'name', 'attr' => array('data-dependent-id' => 'country'), 'required' => false )) ->add('city', 'sonata_type_model_autocomplete', array( 'label' => 'City', 'dependencies' => array('country' => 'country_id'), 'property' => 'name', 'callback' => function (Admin $admin, $property, $value) { $request = Request::createFromGlobals(); $dependencies = $request->get('dependencies'); $datagrid = $admin->getDatagrid(); $queryBuilder = $datagrid->getQuery(); if(!is_null($dependencies['country_id']) && $dependencies['country_id'] !== "") { $queryBuilder ->leftJoin($queryBuilder->getRootAlias() . '.country', 'cco') ->where($queryBuilder->getRootAlias() . '.' .$property . ' LIKE :value') ->andWhere('cco.id = :country_id') ->setParameters(array( 'country_id' => $dependencies['country_id'], 'value' => $value . '%' )); } else { $queryBuilder ->where($queryBuilder->getRootAlias() . '.' .$property . ' LIKE :value') ->setParameters(array( 'value' => $value . '%' )); } }, 'required' => false )) ; }
Please note the "data-dependent-id" value in the "country" field. This value will be used to identify the field. To avoid any error, use the same value than the field name (for instance "country")., (*8)
In the "city" field, add a "dependencies" option, as above. In this array, use the same "data-dependent-id" value than above as key, and any variable name you want as value., (*9)
You still have to create the "callback" function: the variable that you named above is accessible via the Request object (see example). From there, you can create the query necessary to filter your field., (*10)
LocalinksDependentAutoCompleteBundle
needs SonataAdminBundle in order to work, (*11)
This bundle is under GNU GENERAL PUBLIC LICENSE 3 license, (*12)
Mathieu Hautenauve mathieu@proxymart.be www.localinks.be, (*13)
Extends Sonata Autocomplete Form Type and filters results using other form fields values
filter symfony admin sonata