Skip to content

Instantly share code, notes, and snippets.

@webdevilopers
Last active March 29, 2016 21:52
Show Gist options
  • Save webdevilopers/08c82be3defd04976f5a to your computer and use it in GitHub Desktop.
Save webdevilopers/08c82be3defd04976f5a to your computer and use it in GitHub Desktop.
Using Sonata Admin sonata_type_model_autocomplete property and callback option to create custom query with datagrid querybuilder
<?php
namespace AppBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
class PersonAdmin extends Admin
{
protected function configureDatagridFilters(DatagridMapper $filterMapper)
{
$filterMapper
->add('full_text', 'doctrine_orm_callback', array(
'callback' => array($this, 'getFullTextFilter'),
'field_type' => 'text',
'show_filter' => true,
'global_search' => true
))
;
}
public function getFullTextFilter($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
$queryBuilder->andWhere($queryBuilder->expr()->orX(
$queryBuilder->expr()->like($alias.'.firstName', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like($alias.'.lastName', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like($queryBuilder->expr()->concat(
$alias.'.firstName', $queryBuilder->expr()->concat(
$queryBuilder->expr()->literal(' '), $alias.'.lastName'
)
),
$queryBuilder->expr()->literal($value['value'] . '%')
),
$queryBuilder->expr()->like($alias.'.email', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like($alias.'.street', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like($alias.'.postcode', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like($alias.'.city', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like($alias.'.country', $queryBuilder->expr()->literal('%' . $value['value'] . '%'))
));
return true;
}
}
<?php
namespace AppBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Form\FormMapper;
class TimekeepingEntryAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->with('Entry')
->add('employee', 'sonata_type_model_autocomplete', array(
'property' => 'full_text',
'callback' => function ($admin, $property, $value) {
$datagrid = $admin->getDatagrid();
$queryBuilder = $datagrid->getQuery();
$queryBuilder->andWhere($queryBuilder->expr()->orX(
$queryBuilder->expr()->like($queryBuilder->getRootAlias() . '.firstName', $queryBuilder->expr()->literal('%' . $value . '%')),
$queryBuilder->expr()->like($queryBuilder->getRootAlias() . '.lastName', $queryBuilder->expr()->literal('%' . $value . '%')),
$queryBuilder->expr()->like($queryBuilder->expr()->concat(
$queryBuilder->getRootAlias() . '.firstName', $queryBuilder->expr()->concat(
$queryBuilder->expr()->literal(' '), $queryBuilder->getRootAlias() . '.lastName'
)
),
$queryBuilder->expr()->literal($value . '%')
)
));
$queryBuilder
->andWhere('SIZE(' . $queryBuilder->getRootAlias() . '.employmentContracts) > 0')
;
$datagrid->setValue($property, null, $value);
},
));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment